|
Deklarál egy PDF 1.3+ Function Type 0 (mintavételezett) közvetett stream objektumot (ISO 32000-1 7.10.2). A mintavételezett függvények egy tetszőleges bemenet-kimenet leképezést fejeznek ki az M-dimenziós kimeneti minták szabályos N-dimenziós rácsaként; a renderelő lineárisan interpolál a rácspontok között a köztes bemenetek kiértékeléséhez. Használja ezt, ha az ICC-profil gépezet túlzás lenne, de kézzel hangolt keresőtáblát (LUT) szeretne - tónusgörbék a /TransferFunction-hoz (ExtGState /TR), mintavételezett árnyalati transzformációk a /Separation vagy /DeviceN elemekhez (a lineáris Type 2 / aritmetikai Type 4 utak alternatívájaként), félárnyék küszöbérték-görbék, vagy bármilyen más olyan PDF-konstrukció, amely Function szótárat fogad el
Delphi szintaxis:
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++ szintaxis:
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);
Leírás
A függvény közvetett streamként kerül kibocsátásra /FunctionType 0, a megadott /Domain, /Range, /Size, /BitsPerSample és /Order bejegyzésekkel, valamint a nyers bitcsomagolt minta-adatfolyammal. A /Encode és /Decode elhagyásra kerülnek, így a specifikáció alapértelmezései érvényesek: a /Encode leképezi az egyes Domain végpontokat a [0..Size[i]-1] rácsméretekre, és a /Decode megegyezik a /Range-dzsel (a minták egészekké lesznek kibontva, és lineárisan újra leképezve a Range végpontjaira). Több bemenetű függvények esetén a minták bájt-sorrendje követi a PDF 1.7 szabályt: "a bemeneti koordináták az első bemeneti dimenzió mentén növekednek a leggyorsabban", azaz az M kimenettel rendelkező (i_0, i_1, ..., i_{N-1}) rácspont bájteltolása: ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8
Order - opcionális, alapértelmezett értéke 1. Az 1-es (lineáris interpoláció, PDF 1.7 alapértelmezett) vagy 3-as (köbös-spline interpoláció) értéket fogadja el a PDF 1.7 38. táblázata szerint. A köbös simább átmeneteket biztosít alacsony mintavételi rácssűrűség esetén (pl. 17 pontos ICC tónusgörbék), de néhány régebbi mobil olvasó csendben visszaáll a lineárisra, ha olyan Order értékkel találkozik, amelyet nem implementál. Elérhető a HotPDF v2.54.0 óta
ASCII-bemenetű esetekre - a jellemző szerzői útvonalra - egyetlen 1-bemeneti / M-kimeneti függvény BitsPerSample = 8 és Size = [256] beállításokkal egy 256 mintás LUT-ot ad, amelynek streamje pontosan 256 * M bájt, a következő elrendezéssel: (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255)
Domain - 2N darab Single érték, [in0Min in0Max in1Min in1Max ...] sorrendben. A függvény interpoláció előtt erre a tartományra korlátozza a bejövő értékeket. N értéke a Length(Domain) div 2 kifejezésből adódik
Range - 2M darab Single érték ugyanazzal a formával az M kimeneti dimenzióhoz; a kimeneti minták dekódolás után erre a tartományra lesznek korlátozva
Size - N darab egész szám, amely megadja a rácspontok számát az egyes bemeneti tengelyek mentén. A Length(Size) értékének meg kell egyeznie N-nel. A teljes rácspontok száma az összes Size bejegyzés szorzata
BitsPerSample - az 1, 2, 4, 8, 12, 16, 24 vagy 32 értékek egyike a PDF 1.7 38. táblázata szerint. A 8 a legkényelmesebb választás (nyers bájtsorozat); a 16-tól 32-ig terjedők bájtigazított nagy-endian szélességek; az 1 / 2 / 4 / 12 értékek MSB-első bitcsomagolást igényelnek, ahol az utolsó bájt nulla-kitöltött a bájtigazításig. Bármely más érték kivételt vált ki
Samples - a nyers bitcsomagolt minta-adatfolyam. A hosszának legalább ceil(GridPoints * M * BitsPerSample / 8) bájtnak kell lennie. A HotPDF a megadott bájtokat szó szerint másolja a közvetett stream objektumba; a bitcsomagolás helyessége a hívó felelőssége
Visszatérési érték: a közvetett THPDFStreamObject, így a hívók csatolhatják azt bárhova, ahol Function szótár elvárt (jellemzően átadva a közvetett hivatkozását egy másik szótárba az AddValue segítségével, vagy egy árnyalás- / separation-építőnek). Az objektum a dokumentum IndirectObjects listájának tulajdonában van, és a dokumentum végén felszabadul. nil értékkel tér vissza, ha a StrictVersionLock be van kapcsolva, és az aktív Version a PDF 1.3 alatt van (egyébként a dokumentum verziója automatikusan 1.3-ra növekszik)
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;
Lásd még
RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, PDF Filter Support
|