THotPDF.RegisterSampledFunction Method

 

THotPDF.RegisterSampledFunction

THotPDF

 

Øverst

Deklarerer et indirekte strømningsobjekt av typen PDF 1.3+ Function Type 0 (Sampled) (ISO 32000-1 7.10.2). Samplede funksjoner uttrykker en vilkårlig inn-til-ut-mapping som et regulært N-dimensjonalt rutenett av M-dimensjonale ut-samples; rendereren interpolerer lineært mellom rutenettpunktene for å evaluere mellomverdier. Bruk dette når ICC-profilmaskineriet er overkill, men en håndjustert oppslagstabell er ønskelig - tonekurver for /TransferFunction (ExtGState /TR), samplede tint-transformasjoner for /Separation eller /DeviceN (et alternativ til de lineære Type 2 / aritmetiske Type 4-banene), halvtone-terskelkurver eller andre PDF-konstruksjoner som godtar en Function-ordbok

 

Delphi-syntaks:

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

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

 

Beskrivelse

Funksjonen sendes ut som en indirekte strøm med oppføringene /FunctionType 0, /Domain, /Range, /Size, /BitsPerSample og /Order som er angitt, pluss den rå bitpakkede sample-strømmen. /Encode og /Decode utelates slik at spesifikasjonens standardverdier gjelder: /Encode mapper hvert Domain-endepunkt til rutenettutstrekningene [0..Size[i]-1], og /Decode samsvarer med /Range (samples pakkes ut til heltall og remappes lineært tilbake til Range-endepunktene). For funksjoner med flere innganger følger sample-byte-rekkefølgen PDF 1.7-regelen "input coordinates increase fastest along the first input dimension", det vil si at byte-offseten for rutenettpunktet (i_0, i_1, ..., i_{N-1}) med M utganger er ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8

Order - valgfri, standard 1. Godtar 1 (lineær interpolasjon, standard i PDF 1.7) eller 3 (kubisk spline-interpolasjon) per PDF 1.7 tabell 38. Kubisk gir jevnere overganger ved lave sample-rutenett-tettheter (for eksempel ICC-tonekurver med 17 punkter), men noen eldre mobilvisere faller stille tilbake til lineær når de møter en Order-verdi de ikke implementerer. Tilgjengelig siden HotPDF v2.54.0

For ASCII-inndata-brukstilfeller - den typiske forfatterbanen - gir en enkelt 1-inngangs / M-utgangs-funksjon med BitsPerSample = 8 og Size = [256] en LUT med 256 samples der strømmen er nøyaktig 256 * M byte lagt ut som (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255)

 

Domain - 2N enkeltverdier, ordnet [in0Min in0Max in1Min in1Max ...]. Funksjonen klamper innkommende verdier til dette området før interpolasjon. N bestemmes fra Length(Domain) div 2

Range - 2M enkeltverdier med samme form for M utgangsdimensjonene; ut-samples klampes til dette området etter dekoding

Size - N heltall som angir antall rutenettpunkter langs hver inngangsakse. Length(Size) må være lik N. Totalt antall rutenettpunkter er produktet av alle Size-oppføringene

BitsPerSample - ett av 1, 2, 4, 8, 12, 16, 24 eller 32 per PDF 1.7 tabell 38. 8 er det mest praktiske valget (rå byte-strøm); 16 til 32 er bytejusterte big-endian-bredder; 1 / 2 / 4 / 12 krever MSB-først bitpakking med siste byte nullutfylt til en bytegrense. Enhver annen verdi utløser et unntak

Samples - den rå bitpakkede sample-strømmen. Lengden må være minst ceil(GridPoints * M * BitsPerSample / 8) byte. HotPDF kopierer de leverte bytene ordrett inn i det indirekte strømningsobjektet; korrekt bitpakking er kallers ansvar

 

Returverdi: den indirekte THPDFStreamObject-en, slik at kallere kan feste den der en Function-ordbok forventes (typisk ved å sende den indirekte referansen inn i en annen ordbok via AddValue, eller til en shading- eller separation-bygger). Objektet eies av dokumentets IndirectObjects-liste og frigjøres ved dokumentets slutt. Returnerer nil når StrictVersionLock er på og den aktive Version er under PDF 1.3 (ellers oppgraderes dokumentversjonen automatisk til 1.3)

 

Kodeeksempel

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

 

Se også

RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, Støtte for PDF-filtre