THotPDF.RegisterSampledFunction Method

 

THotPDF.RegisterSampledFunction

THotPDF

 

Vrh

Definira PDF 1.3+ funkciju tipa 0 (Sampled) kao neizravni stream objekt (ISO 32000-1 7.10.2). Sampled funkcije izražavaju proizvoljno preslikavanje ulaza u izlaz kao pravilnu N-dimenzionalnu mrežu M-dimenzionalnih izlaznih uzoraka; renderer linearno interpolira između točaka mreže kako bi izračunao međuvrijednosti ulaza. Koristite ovo kada je ICC profile machinery pretjeran, a želi se ručno podešena lookup tablica - tone curves za /TransferFunction (ExtGState /TR), sampled tint transformi za /Separation ili /DeviceN (alternativa linearnoj Type 2 / arithmetic Type 4 putanji), halftone threshold curves ili bilo koji drugi PDF construct koji prihvaća Function rječnik

 

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

Funkcija se emitira kao indirektni stream sa /FunctionType 0, zadanim zapisima /Domain, /Range, /Size, /BitsPerSample i /Order, plus sirovim bit-pakiranim sample streamom /Encode i /Decode se izostavljaju pa vrijede zadane vrijednosti specifikacije: /Encode mapira svaki krajnji punkt Domaina na opseg mreže [0..Size[i]-1], a /Decode odgovara /Range (sampleovi se raspakiravaju u cijele brojeve i linearno preslikavaju natrag na krajnje točke Rangea) Za funkcije s više ulaza redoslijed bajtova uzorka slijedi PDF 1.7 pravilo "input coordinates increase fastest along the first input dimension", tj. pomak bajta za točku mreže (i_0, i_1, ..., i_{N-1}) s M izlaza iznosi ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8

Order - opcionalno, zadano 1. Prihvaća 1 (linearna interpolacija, PDF 1.7 zadano) ili 3 (cubic-spline interpolacija) prema PDF 1.7 Tablici 38. Cubic daje glađe prijelaze pri malim gustoćama sample mreže (npr. 17-točkovne ICC tone curves) ali se neki stariji mobilni čitači tiho vraćaju na linearnu interpolaciju kada naiđu na Order vrijednost koju ne implementiraju. Dostupno od HotPDF v2.54.0

Za slučajeve s ASCII unosom - tipičnu autorsku putanju - jedna funkcija s 1 ulazom / M izlaza uz BitsPerSample = 8 i Size = [256] daje LUT s 256 uzoraka čiji je stream točno 256 * M bajtova raspoređen kao (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 pojedinačne vrijednosti istog oblika za M izlaznih dimenzija; izlazni uzorci klampaju se na ovaj raspon nakon dekodiranja

Size - N cijelih brojeva koji daju broj točaka mreže uz svaku ulaznu os. Duljina(Size) mora biti N. Ukupan broj točaka mreže je umnožak svih Size unosa

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 - sirovi bit-packed sample stream. Duljina mora biti najmanje ceil(GridPoints * M * BitsPerSample / 8) bajtova. HotPDF kopira zadane bajtove doslovno u neizravni stream objekt; ispravnost bit-packa odgovornost je pozivatelja

 

Povratna vrijednost: neizravni THPDFStreamObject tako da ga pozivatelji mogu priključiti gdje god se očekuje Function rječnik (najčešće prosljeđivanjem njegove neizravne reference u drugi dict preko AddValue ili shading / separation builderu). Objekt je u vlasništvu dokumentove IndirectObjects liste i oslobađa se na kraju dokumenta. Vraća nil kada je StrictVersionLock uključen i aktivna Version je ispod PDF 1.3 (inače se verzija dokumenta automatski podiže 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