THotPDF.RegisterSampledFunction Method

 

THotPDF.RegisterSampledFunction

THotPDF

 

Vrh

Razglasi posredni tokovni objekt PDF 1.3+ Function Type 0 (Sampled) (ISO 32000-1 7.10.2). Vzorčene funkcije izrazijo poljubno preslikavo vhod-v-izhod kot pravilno N-dimenzionalno mrežo vzorcev izhodov M-dimenzionalnih; izrisovalnik linearnno interpolira med mrežnimi točkami za izračun vmesnih vhodov. Uporabite to, kadar je mehanizem profilov ICC preveč obsežen, vendar želite ročno prilagojeno iskalno tabelo - tončne krivulje za /TransferFunction (ExtGState /TR), vzorčene preobrazbe odtenkov za /Separation ali /DeviceN (alternativa linearnim potem Type 2 / aritmetičnim potem Type 4), krivulje pragov halftone ali kateri koli drugi PDF konstrukciji, ki sprejme slovar Function

 

Delphi syntax:

function RegisterSampledFunction(const Domain: array of Single; const Range: array of Single; const Size: array of Integer; BitsPerSample: Integer; const Samples: array of byte; Order: Integer = 1): THPDFStreamObject;

 

C++ syntax:

THPDFStreamObject* RegisterSampledFunction(const float* Domain, int DomainCount, const float* Range, int RangeCount, const int* Size, int SizeCount, int BitsPerSample, const unsigned char* Samples, int SamplesCount, int Order = 1);

 

Description

The function is emitted as an indirect stream with /FunctionType 0, the supplied /Domain, /Range, /Size, /BitsPerSample and /Order entries, plus the raw bit-packed sample stream. /Encode and /Decode are omitted so the spec defaults apply: /Encode maps each Domain endpoint to grid extents [0..Size[i]-1], and /Decode matches /Range (samples are unpacked to integers and linearly remapped back to the Range endpoints). For multi-input functions the sample byte order follows the PDF 1.7 rule "input coordinates increase fastest along the first input dimension", i.e. the byte offset for grid point (i_0, i_1, ..., i_{N-1}) with M outputs is ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8.

Order - neobvezno, privzeto 1. Sprejme 1 (linearna interpolacija, privzeto PDF 1.7) ali 3 (kubično-spline interpolacija) po PDF 1.7 tabeli 38. Kubična daje bolj gladke prehode pri nizki gostoti vzorčne mreže (npr. 17-točkovne ICC tončne krivulje), vendar se nekateri starejši mobilni bralniki ob vrednosti Order, ki je ne podpirajo, tiho vrnejo na linearno. Na voljo od HotPDF v2.54.0 naprej

For ASCII-input use cases - the typical authoring path - a single 1-input / M-output function with BitsPerSample = 8 and Size = [256] gives a 256-sample LUT whose stream is exactly 256 * M bytes laid out as (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255).

 

Domain - 2N Single values, ordered [in0Min in0Max in1Min in1Max ...]. The function clamps incoming values to this range before interpolation. N is determined from Length(Domain) div 2.

Range - 2M posameznih vrednosti iste oblike za M izhodnih dimenzij; izhodni vzorci se po razkodiranju pripnejo na ta razpon

Size - N celih števil, ki podajajo število mrežnih točk vzdolž vsake vhodne osi. Dolžina(Size) mora biti enaka N. Skupno število mrežnih točk je produkt vseh vnosov Size

BitsPerSample - one of 1, 2, 4, 8, 12, 16, 24, or 32 per PDF 1.7 Table 38. 8 is the ergonomic choice (raw byte stream); 16 through 32 are byte-aligned big-endian widths; 1 / 2 / 4 / 12 require MSB-first bit packing with the final byte zero-padded to a byte boundary. Any other value raises an exception.

Samples - surovi bitno zapakirani tok vzorcev. Dolžina mora biti najmanj ceil(GridPoints * M * BitsPerSample / 8) bajtov. HotPDF podane bajte nespremenjeno skopira v posredni tokovni objekt; pravilnost bitnega pakiranja je odgovornost klicatelja

 

Povratna vrednost: posredni THPDFStreamObject, ki ga lahko klicatelji pritrdijo kjer koli, kjer se pričakuje slovar Function (običajno tako, da njegov posredni sklic prek AddValue predajo drugemu slovarju ali graditelju senčenja / separacije). Objekt je v lasti seznama IndirectObjects dokumenta in se sprosti ob koncu dokumenta. Vrne nil, kadar je StrictVersionLock vklopljen in je aktivna Version pod PDF 1.3 (sicer se različica dokumenta samodejno poviša na 1.3)

 

Code Example

// 256-sample 1-input / 3-output (RGB) heatmap LUT. The LUT maps a
// scalar t in [0..1] to a blue -> green -> red gradient through the
// midpoint
uses
  HPDFObjs;

var
  Func: THPDFStreamObject;
  Domain: array[0..1] of Single;
  Range: array[0..5] of Single;
  Size: array[0..0] of Integer;
  Samples: array[0..767] of byte;   // 256 grid points * 3 outputs
  I: Integer;
  T: Single;
begin
  HPDF.BeginDoc;
  // 1 input dim: t in [0..1]
  Domain[0] := 0; Domain[1] := 1;
  // 3 output dims: each in [0..1]
  Range[0] := 0; Range[1] := 1;
  Range[2] := 0; Range[3] := 1;
  Range[4] := 0; Range[5] := 1;
  // 256 sample points along the single input axis
  Size[0] := 256;

  for I := 0 to 255 do
  begin
    T := I / 255.0;
    if T < 0.5 then
    begin
      Samples[I*3 + 0] := 0;
      Samples[I*3 + 1] := byte(Round(2.0 * T * 255.0));
      Samples[I*3 + 2] := byte(Round((1.0 - 2.0*T) * 255.0));
    end
    else
    begin
      Samples[I*3 + 0] := byte(Round(2.0 * (T - 0.5) * 255.0));
      Samples[I*3 + 1] := byte(Round((1.0 - 2.0*(T - 0.5)) * 255.0));
      Samples[I*3 + 2] := 0;
    end;
  end;
  Func := HPDF.RegisterSampledFunction(Domain, Range, Size, 8, Samples);
  // Func is now an indirect THPDFStreamObject the caller can attach
  // to any PDF dict slot that accepts a Function reference
  HPDF.EndDoc;
end;

 

Glejte tudi

RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, PDF Filter Support