THotPDF.RegisterSampledFunction Method

 

THotPDF.RegisterSampledFunction

THotPDF

 

Sus

Declară un obiect flux indirect PDF 1.3+ Function Type 0 (Sampled) (ISO 32000-1 7.10.2). Funcțiile eșantionate exprimă o mapare arbitrară intrare-ieșire ca o grilă regulată N-dimensională de eșantioane de ieșire M-dimensionale; rendererul interpolează liniar între punctele grilei pentru a evalua intrările intermediare. Folosiți această abordare când mecanismul de profil ICC este prea mult, dar este dorită o tabelă de căutare ajustată manual - curbe de ton pentru /TransferFunction (ExtGState /TR), transformări de nuanță eșantionate pentru /Separation sau /DeviceN (alternativă la traseele liniare Type 2 / aritmetice Type 4), curbe de prag pentru semitonuri sau orice alt construct PDF care acceptă un dicționar 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);

 

Descriere

Funcția este emisă ca un flux indirect cu intrările /FunctionType 0, /Domain, /Range, /Size, /BitsPerSample și /Order furnizate, plus fluxul brut de eșantioane împachetate pe biți. /Encode și /Decode sunt omise, astfel că se aplică valorile implicite ale specificației: /Encode mapează fiecare capăt Domain la extinderile grilei [0..Size[i]-1], iar /Decode corespunde cu /Range (eșantioanele sunt despachetate în întregi și remapate liniar înapoi la capetele Range). Pentru funcțiile cu mai multe intrări, ordinea octeților eșantionului urmează regula PDF 1.7 "input coordinates increase fastest along the first input dimension", adică offsetul de octet pentru punctul de grilă (i_0, i_1, ..., i_{N-1}) cu M ieșiri este ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8

Order - opțional, implicit 1. Acceptă 1 (interpolare liniară, valoarea implicită PDF 1.7) sau 3 (interpolare cubic-spline) conform PDF 1.7 Tabelul 38. Cubicul oferă tranziții mai line la densități reduse ale grilei de eșantioane (de exemplu curbe de ton ICC cu 17 puncte), dar unele cititoare mobile mai vechi revin tăcut la liniar când întâlnesc o valoare Order pe care nu o implementează. Disponibil din HotPDF v2.54.0

Pentru cazurile de utilizare cu intrare ASCII - calea obișnuită de authoring - o singură funcție cu 1 intrare / M ieșiri, cu BitsPerSample = 8 și Size = [256], oferă o LUT cu 256 de eșantioane al cărei flux are exact 256 * M octeți dispuși ca (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255)

 

Domain - 2N valori Single, ordonate [in0Min in0Max in1Min in1Max ...]. Funcția limitează valorile de intrare la acest interval înainte de interpolare. N este determinat din Length(Domain) div 2

Range - 2M valori Single cu aceeași formă pentru cele M dimensiuni de ieșire; eșantioanele de ieșire sunt limitate la acest interval după decodare

Size - N întregi care dau numărul de puncte al grilei pe fiecare axă de intrare. Length(Size) trebuie să fie egal cu N. Numărul total de puncte al grilei este produsul tuturor intrărilor Size

BitsPerSample - una dintre valorile 1, 2, 4, 8, 12, 16, 24 sau 32 conform PDF 1.7 Tabelul 38. 8 este alegerea ergonomică (flux brut de octeți); 16 până la 32 sunt lățimi big-endian aliniate pe octeți; 1 / 2 / 4 / 12 cer împachetare a biților cu MSB primul și ultimul octet completat cu zerouri până la o limită de octet. Orice altă valoare generează o excepție

Samples - fluxul brut de eșantioane împachetate pe biți. Lungimea trebuie să fie de cel puțin ceil(GridPoints * M * BitsPerSample / 8) octeți. HotPDF copiază octeții furnizați verbatim în obiectul flux indirect; corectitudinea împachetării biților este responsabilitatea apelantului

 

Valoare returnată: obiectul indirect THPDFStreamObject, astfel încât apelanții să îl poată atașa oriunde este așteptat un dicționar Function (de obicei trecând referința sa indirectă într-un alt dicționar prin AddValue sau către un generator de shading / separation). Obiectul este deținut de lista IndirectObjects a documentului și este eliberat la sfârșitul documentului. Returnează nil când StrictVersionLock este activ și Version curentă este sub PDF 1.3 (în caz contrar versiunea documentului este ridicată automat la 1.3)

 

Exemplu de cod

// 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;

 

Vezi și

RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, PDF Filter Support