THotPDF.RegisterSampledFunction Methode

 

THotPDF.RegisterSampledFunction

THotPDF

 

Boven

Declareert een indirect streamobject van Function Type 0 (Sampled) voor PDF 1.3+ (ISO 32000-1 7.10.2). Gesamplede functies drukken een willekeurige invoer-naar-uitvoer-mapping uit als een regelmatig N-dimensionaal raster van M-dimensionale uitvoersamples; de renderer interpoleert lineair tussen gridpunten om tussenliggende invoerwaarden te evalueren. Gebruik dit wanneer ICC-profielmachinerie te zwaar is, maar een handafgestelde lookup table gewenst is - tooncurves voor /TransferFunction (ExtGState /TR), gesamplede tinttransformaties voor /Separation of /DeviceN (als alternatief voor de lineaire Type 2- of rekenkundige Type 4-paden), halftoondrempelcurves of elk ander PDF-object dat een Function-dictionary accepteert

 

Delphi-syntaxis:

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++-syntaxis:

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

 

Beschrijving

De functie wordt uitgegeven als een indirecte stream met de opgegeven /FunctionType 0-, /Domain-, /Range-, /Size-, /BitsPerSample- en /Order-waarden, plus de ruwe bitgepakte sample stream. /Encode en /Decode worden weggelaten zodat de standaardwaarden uit de specificatie gelden: /Encode projecteert elk domeineinde naar de gridbereiken [0..Size[i]-1], en /Decode volgt /Range (samples worden uitgepakt naar integers en lineair teruggeschaald naar de Range-eindpunten). Voor functies met meerdere inputs volgt de bytevolgorde van samples de PDF 1.7-regel dat inputcoördinaten het snelst toenemen langs de eerste inputdimensie; de byte-offset voor gridpunt (i_0, i_1, ..., i_{N-1}) met M outputs is ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8

Order - optioneel, standaard 1. Accepteert 1 (lineaire interpolatie, standaard in PDF 1.7) of 3 (kubische spline-interpolatie) volgens PDF 1.7 tabel 38. Kubisch geeft vloeiendere overgangen bij lage sample-rasterdichtheden, bijvoorbeeld ICC-tooncurves met 17 punten, maar sommige oudere mobiele readers vallen stilzwijgend terug op lineair wanneer ze een Order-waarde tegenkomen die ze niet implementeren. Beschikbaar sinds HotPDF v2.54.0

Voor gebruikssituaties met ASCII-input, het gebruikelijke authoringpad, levert een enkele functie met 1 input en M outputs, BitsPerSample = 8 en Size = [256], een LUT met 256 samples op waarvan de stream exact 256 * M bytes groot is en is opgebouwd als (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255)

 

Domain - 2N Single-waarden, geordend als [in0Min in0Max in1Min in1Max ...]. De functie begrenst inkomende waarden tot dit bereik vóór interpolatie. N wordt bepaald uit Length(Domain) div 2

Range - 2M Single-waarden met dezelfde vorm voor de M-uitvoerdimensies; uitvoersamples worden na het decoderen tot dit bereik begrensd

Size - N gehele getallen die het aantal gridpunten langs elke inputas geven. Length(Size) moet gelijk zijn aan N. Het totale aantal gridpunten is het product van alle Size-waarden

BitsPerSample - een van 1, 2, 4, 8, 12, 16, 24 of 32 volgens PDF 1.7 tabel 38. 8 is de praktische keuze, als ruwe bytestring; 16 tot en met 32 zijn byte-uitgelijnde big-endian breedtes; 1 / 2 / 4 / 12 vereisen bitpakken met MSB eerst en een laatste byte die met nullen wordt opgevuld tot aan de bytegrens. Elke andere waarde leidt tot een uitzondering

Samples - de ruwe bitgepakte samplestring. De lengte moet ten minste ceil(GridPoints * M * BitsPerSample / 8) bytes zijn. HotPDF kopieert de opgegeven bytes letterlijk naar het indirecte streamobject; de juistheid van het bitpakken is de verantwoordelijkheid van de aanroeper

 

Retourwaarde: de indirecte THPDFStreamObject, zodat aanroepers die kunnen koppelen waar een Function-dictionary wordt verwacht, meestal door de indirecte referentie via AddValue door te geven aan een andere dictionary, of aan een shading- / separation-builder. Het object behoort tot de IndirectObjects-lijst van het document en wordt aan het einde van het document vrijgegeven. Geeft nil terug wanneer StrictVersionLock aan staat en de actieve Version onder PDF 1.3 ligt, anders wordt de documentversie automatisch naar 1.3 verhoogd

 

Codevoorbeeld

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

 

Zie ook

RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, PDF-filterondersteuning