|
Ilmoittaa PDF 1.3+ Function Type 0 (Sampled) epäsuoran virtalähdeobjektin (ISO 32000-1 7.10.2). Näytefunktiot (sampled functions) ilmaisevat mielivaltaisen syöte-ulostulo-kartoituksen säännöllisenä N-ulotteisena ruudukkona M-ulotteisia ulostulonäytteitä; renderöijä interpoloi lineaarisesti ruudukon pisteiden välillä arvioidakseen välituloksia. Käytä tätä, kun ICC-profiilikoneisto on liioittelua, mutta halutaan käsin säädetty hakutaulukko - sävykäyrät /TransferFunction-kohteelle (ExtGState /TR), näytetyt sävymuunnokset kohteelle /Separation tai /DeviceN (vaihtoehto lineaarisille Type 2- / aritmeettisille Type 4 -poluille), rasterikynnyksen käyrät tai mikä tahansa muu PDF-rakenne, joka hyväksyy Function-sanakirjan
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);
Kuvaus
Funktio tuotetaan epäsuorana virtana, jossa on /FunctionType 0, annetut /Domain-, /Range-, /Size-, /BitsPerSample- ja /Order-merkinnät sekä raaka bittipakattu näytevirta. /Encode ja /Decode jätetään pois, joten määrityksen oletusarvot pätevät: /Encode kartoittaa jokaisen Domain-päätepisteen ruudukon ulottuvuuksiin [0..Size[i]-1], ja /Decode vastaa kohdetta /Range (näytteet puretaan kokonaisluvuiksi ja kartoitetaan lineaarisesti takaisin Range-päätepisteisiin). Monisyötteisille funktioille näytetavujen järjestys noudattaa PDF 1.7 -sääntöä "syötteen koordinaatit kasvavat nopeimmin ensimmäisen syöteulottuvuuden mukaan", eli tavujen siirtymä ruudukon pisteelle (i_0, i_1, ..., i_{N-1}) M ulostulolla on ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8
Order - valinnainen, oletus 1. Hyväksyy arvon 1 (lineaarinen interpolointi, PDF 1.7 -oletus) tai 3 (kuutiollinen spline-interpolointi) standardin PDF 1.7 taulukon 38 mukaisesti. Kuutiollinen tuottaa tasaisemmat siirtymät alhaisissa näyteruudukon tiheyksissä (esim. 17 pisteen ICC-sävykäyrät), mutta jotkut vanhemmat mobiililukijat siirtyvät hiljaa käyttämään lineaarista kohdatessaan Order-arvon, jota ne eivät toteuta. Saatavilla HotPDF v2.54.0 alkaen
ASCII-syötteen käyttötapauksissa - tyypillinen luontipolku - yksittäinen 1-syötteinen / M-ulostuloinen funktio arvoilla BitsPerSample = 8 ja Size = [256] antaa 256-näytteisen LUT-taulukon, jonka virta on tarkalleen 256 * M tavua asettelulla (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255)
Domain – 2N Single-arvoa, järjestettynä [in0Min in0Max in1Min in1Max ...]. Funktio rajoittaa saapuvat arvot tälle välille ennen interpolointia. N määritetään kaavalla Length(Domain) div 2
Range - 2M Single-arvoa, joilla on sama muoto M-lähtöulottuvuuksille; lähtönäytteet rajataan tälle alueelle dekoodauksen jälkeen
Size - N kokonaislukua, jotka antavat ruudukonpisteiden määrän kutakin syöteakselia kohti. Lausekkeen Length(Size) on oltava yhtä suuri kuin N. Ruudukonpisteiden kokonaismäärä on kaikkien Size-merkintöjen tulo
BitsPerSample – jokin arvoista 1, 2, 4, 8, 12, 16, 24 tai 32 standardin PDF 1.7 Table 38 mukaan. 8 on ergonominen valinta (raaka tavuvirta); arvot välillä 16 ja 32 ovat tavukohdistettuja big-endian-leveyksiä; arvot 1 / 2 / 4 / 12 vaativat MSB-first-bittipakkausta, jossa viimeinen tavu nollatäytetään tavurajaan asti. Mikä tahansa muu arvo aiheuttaa poikkeuksen
Samples - raaka bittipakattu näytevuo. Pituuden on oltava vähintään ceil(GridPoints * M * BitsPerSample / 8) tavua. HotPDF kopioi annetut tavut sellaisenaan epäsuoraan virtakohteeseen; bittipakkauksen oikeellisuus on kutsujan vastuulla
Paluuarvo: epäsuora THPDFStreamObject, jotta kutsujat voivat liittää sen minne tahansa, missä Function-sanakirjaa odotetaan (yleensä välittämällä sen epäsuoran viitteen toiseen sanakirjaan AddValue-metodilla tai varjostuksen / Separation-rakentajalle). Dokumentin IndirectObjects-luettelo omistaa objektin, ja se vapautetaan dokumentin lopussa. Palauttaa arvon nil, kun StrictVersionLock on käytössä ja aktiivinen Version on alle PDF 1.3 (muussa tapauksessa dokumentin versio korotetaan automaattisesti arvoon 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-suodatintuki
|