|
Mendeklarasikan objek stream tak langsung Function Type 0 (Sampled) PDF 1.3+ (ISO 32000-1 7.10.2). Fungsi sampled mengekspresikan pemetaan input-ke-output arbitrer sebagai grid N dimensi yang teratur dari sampel output M dimensi; renderer menginterpolasi secara linear di antara titik grid untuk mengevaluasi input perantara. Gunakan ini saat mesin profil ICC terlalu berat tetapi tabel lookup yang disetel manual diinginkan - tone curves untuk /TransferFunction (ExtGState /TR), transform tint sampled untuk /Separation atau /DeviceN (alternatif untuk jalur Type 2 / arithmetic Type 4 yang linear), kurva ambang halftone, atau konstruksi PDF lain yang menerima dictionary Function
Sintaks Delphi:
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;
Sintaks C++:
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);
Deskripsi
Fungsi ini dikeluarkan sebagai stream tak langsung dengan entri /FunctionType 0, /Domain, /Range, /Size, /BitsPerSample, dan /Order yang diberikan, plus stream sampel mentah yang dipacking bit. /Encode dan /Decode dihilangkan sehingga default spesifikasi berlaku: /Encode memetakan setiap endpoint Domain ke ekstensi grid [0..Size[i]-1], dan /Decode cocok dengan /Range (sampel di-unpack menjadi integer lalu dipetakan ulang secara linear ke endpoint Range). Untuk fungsi multi-input, urutan byte sampel mengikuti aturan PDF 1.7 "koordinat input bertambah paling cepat di sepanjang dimensi input pertama", yaitu offset byte untuk titik grid (i_0, i_1, ..., i_{N-1}) dengan M output adalah ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8
Order - opsional, default 1. Menerima 1 (interpolasi linear, default PDF 1.7) atau 3 (interpolasi cubic-spline) menurut Tabel 38 PDF 1.7. Cubic memberi transisi yang lebih halus pada kerapatan grid sampel yang rendah (misalnya tone curve ICC 17 titik) tetapi beberapa pembaca mobile lama diam-diam kembali ke linear ketika menemukan nilai Order yang tidak mereka implementasikan. Tersedia sejak HotPDF v2.54.0
Untuk kasus input ASCII - jalur authoring yang umum - satu fungsi 1-input / M-output dengan BitsPerSample = 8 dan Size = [256] menghasilkan LUT 256 sampel dengan stream tepat berukuran 256 * M byte yang disusun sebagai (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255)
Domain - 2N nilai Single, diurutkan sebagai [in0Min in0Max in1Min in1Max ...]. Fungsi membatasi nilai masuk ke rentang ini sebelum interpolasi. N ditentukan dari Length(Domain) div 2
Range - 2M nilai Single dengan bentuk yang sama untuk dimensi keluaran M; sampel keluaran dibatasi ke rentang ini setelah decoding
Size - N integer yang memberikan jumlah titik grid di setiap sumbu input. Length(Size) harus sama dengan N. Total titik grid adalah hasil kali semua entri Size
BitsPerSample - salah satu dari 1, 2, 4, 8, 12, 16, 24, atau 32 menurut Tabel 38 PDF 1.7. 8 adalah pilihan yang paling praktis (stream byte mentah); 16 hingga 32 adalah lebar big-endian yang sejajar byte; 1 / 2 / 4 / 12 memerlukan packing bit MSB-first dengan byte terakhir diisi nol hingga batas byte. Nilai lain akan memunculkan pengecualian
Samples - stream sampel mentah yang dipacking bit. Panjangnya harus minimal ceil(GridPoints * M * BitsPerSample / 8) byte. HotPDF menyalin byte yang diberikan apa adanya ke objek stream tak langsung; kebenaran packing bit menjadi tanggung jawab pemanggil
Nilai kembali: objek tak langsung THPDFStreamObject sehingga pemanggil dapat memasangnya di mana pun dictionary Function diharapkan (biasanya dengan meneruskan referensi tak langsungnya ke dict lain melalui AddValue, atau ke pembuat shading / separation). Objek ini dimiliki oleh daftar IndirectObjects dokumen dan dibebaskan saat akhir dokumen. Mengembalikan nil ketika StrictVersionLock aktif dan Version aktif berada di bawah PDF 1.3 (jika tidak, versi dokumen dinaikkan otomatis ke 1.3)
Contoh kode
// 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;
Lihat juga
RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, PDF Filter Support
|