THotPDF.RegisterSampledFunction Method

 

THotPDF.RegisterSampledFunction

THotPDF

 

Hore

Deklaruje nepriamy streamový objekt PDF 1.3+ Function Type 0 (Sampled) (ISO 32000-1 7.10.2). Sampled funkcie vyjadrujú ľubovoľné mapovanie vstup-výstup ako pravidelnú N-rozmernú mriežku M-rozmerných výstupných vzoriek; renderer lineárne interpoluje medzi bodmi mriežky pri vyhodnocovaní medzivstupov. Použite to vtedy, keď je mechanika ICC profilu zbytočne ťažká, ale chcete ručne ladenú lookup tabuľku - tónové krivky pre /TransferFunction (ExtGState /TR), sampled tint transformácie pre /Separation alebo /DeviceN (alternatíva k lineárnej ceste Type 2 / aritmetickej ceste Type 4), krivky prahu poltónu alebo akýkoľvek iný PDF konštrukt, ktorý prijíma slovník 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);

 

Opis

Funkcia sa emitne ako nepriamy stream s /FunctionType 0, dodanými položkami /Domain, /Range, /Size, /BitsPerSample a /Order spolu so surovým bitovo zabaleným streamom vzoriek. /Encode a /Decode sa vynechajú, takže platia predvolené hodnoty špecifikácie: /Encode mapuje každý koncový bod Domain na rozsah mriežky [0..Size[i]-1] a /Decode zodpovedá /Range (vzorky sa rozbalia na celé čísla a lineárne premapujú späť na konce Range). Pri viacvstupových funkciách poradie bajtov vzoriek sleduje pravidlo PDF 1.7 "input coordinates increase fastest along the first input dimension", teda bajtový offset pre bod mriežky (i_0, i_1, ..., i_{N-1}) s M výstupmi je ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8

Order - voliteľné, predvolene 1. Prijíma 1 (lineárna interpolácia, predvolené v PDF 1.7) alebo 3 (kubická spline interpolácia) podľa tabuľky 38 v PDF 1.7. Kubická verzia dáva hladšie prechody pri nízkej hustote vzorkovacej mriežky, napríklad pri 17-bodových ICC tónových krivkách, ale niektoré staršie mobilné čítačky potichu prejdú na lineárnu interpoláciu, keď narazia na hodnotu Order, ktorú neimplementujú. Dostupné od HotPDF v2.54.0

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 hodnôt Single usporiadaných ako [in0Min in0Max in1Min in1Max ...]. Funkcia pred interpoláciou oreže prichádzajúce hodnoty na tento rozsah. N sa určí ako Length(Domain) div 2

Range - 2M hodnôt Single s rovnakým tvarom pre M výstupných rozmerov; výstupné vzorky sa po dekódovaní orežú na tento rozsah

Size - N celých čísel udávajúcich počet bodov mriežky na každej vstupnej osi. Length(Size) musí byť rovné N. Celkový počet bodov mriežky je súčin všetkých položiek Size

BitsPerSample - jedna z hodnôt 1, 2, 4, 8, 12, 16, 24 alebo 32 podľa tabuľky 38 v PDF 1.7. 8 je ergonomická voľba (surový bajtový stream); 16 až 32 sú bajtovo zarovnané big-endian šírky; 1 / 2 / 4 / 12 vyžadujú bitové balenie MSB-first s posledným bajtom vyplneným nulami po hranicu bajtu. Akákoľvek iná hodnota vyvolá výnimku

Samples - surový bitovo zabalený stream vzoriek. Dĺžka musí byť aspoň ceil(GridPoints * M * BitsPerSample / 8) bajtov. HotPDF skopíruje dodané bajty verbatim do nepriameho streamového objektu; správnosť bitového balenia je zodpovednosťou volajúceho

 

Návratová hodnota: nepriamy THPDFStreamObject, aby ho volajúci mohli pripojiť všade tam, kde sa očakáva slovník Function (zvyčajne odovzdaním jeho nepriamej referencie do iného slovníka cez AddValue alebo do buildera tieňovania / separation). Objekt vlastní zoznam IndirectObjects dokumentu a uvoľní sa na konci dokumentu. Vracia nil, keď je StrictVersionLock zapnutý a aktívna Version je pod PDF 1.3 (inak sa verzia dokumentu automaticky zvýši 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;

 

See Also

RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, PDF Filter Support