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