|
Mendeklarasikan shading tensor product patch mesh PDF 1.3+ (ISO 32000-1 8.7.4.5.7, /ShadingType 7) dan membungkusnya sebagai entri Pattern Type 2 inline di dictionary Resources/Pattern pada halaman. Setiap patch adalah grid 4 x 4 penuh dari titik kontrol Bezier kubik p[i][j] (12 titik batas + 4 titik interior) ditambah satu warna per sudut. Gunakan ini saat RegisterCoonsPatchMesh (Type 6) tidak bisa mengekspresikan bentuk interior - round-trip gradient mesh SVG dan karya apa pun yang membutuhkan empat titik kontrol ekstra untuk membengkokkan interior patch
Sintaks Delphi:
function RegisterTensorProductPatchMesh(XMin, YMin, XMax, YMax: Single; NumComponents: Integer; const Patches: array of Extended): AnsiString;
Sintaks C++:
AnsiString RegisterTensorProductPatchMesh(float XMin, float YMin, float XMax, float YMax, int NumComponents, const Extended* Patches, int PatchesElementCount);
Deskripsi
Shading dikeluarkan sebagai stream tidak-langsung dengan /ShadingType 7, /BitsPerCoordinate 16, /BitsPerComponent 8, dan /BitsPerFlag 8. Setiap patch dipadatkan sebagai 1 byte flag (selalu 0 untuk patch independen) diikuti 16 control point (masing-masing 4 byte: 2 X big-endian + 2 Y big-endian, dalam urutan stream spesifikasi yang dijelaskan di bawah) dan 4 warna sudut (masing-masing NumComponents byte), total 1 + 64 + 4 * NumComponents byte per patch.
16 titik kontrol itu membentuk grid 4 x 4 p[i][j] dengan i sebagai indeks baris (0 = atas visual / YMax, 3 = bawah visual / YMin) dan j sebagai indeks kolom (0 = kiri / XMin, 3 = kanan / XMax). Urutan stream spesifikasi (Table 88) terlebih dahulu menelusuri 12 titik batas secara searah jarum jam (baris atas kiri ke kanan, kolom kanan atas ke bawah, baris bawah kanan ke kiri, kolom kiri bawah ke atas), lalu mencantumkan 4 titik interior secara searah jarum jam mulai dari titik interior kiri atas: p[1][1], p[1][2], p[2][2], p[2][1]. Array Patches yang diberikan pengguna mengikuti urutan ini apa adanya
Ketika seluruh 16 control point berada di kisi teratur 1/3 / 2/3 (titik batas pada 1/3 / 2/3 di sepanjang tiap tepi, titik interior di perpotongan grid dalam (1/3, 1/3) / (2/3, 1/3) / (2/3, 2/3) / (1/3, 2/3)), permukaan Bezier bikubik degenerasi menjadi bidang datar dan interpolasi warna degenerasi menjadi bilinier - secara visual identik dengan RegisterCoonsPatchMesh ber tepi lurus atau RegisterFreeFormGouraudShading dengan empat vertex sudut.
XMin, YMin, XMax, YMax - persegi panjang ruang pengguna yang membatasi koordinat yang dienkode. Empat nilai ini menjadi empat entri pertama /Decode. Letakkan dalam koordinat ruang pengguna yang sama dengan area yang akan Anda gambar - untuk Rectangle koordinat layar HotPDF di (X, Y, W, H), persegi panjang ruang pengguna PDF yang cocok adalah (X, PageHeight - Y - H) sampai (X + W, PageHeight - Y)
NumComponents - jumlah komponen warna per sudut. Gunakan 1 untuk DeviceGray, 3 untuk DeviceRGB, atau 4 untuk DeviceCMYK. Nilai lain akan memunculkan exception
Patches - array datar berisi nilai Extended. Setiap patch menyumbang 32 + 4 * NumComponents nilai: 32 float untuk 16 titik kontrol (X, Y, X, Y, ..., 16 pasangan dalam urutan stream spesifikasi) diikuti 4 * NumComponents float untuk warna sudut (pada p[0][0] / p[0][3] / p[3][3] / p[3][0], sesuai urutan siklik Coons). Panjang array harus merupakan kelipatan positif dari stride ini. Semua patch yang dikeluarkan membawa flag = 0, yaitu patch independen; flag lanjutan 1 / 2 / 3 untuk berbagi tepi dengan patch sebelumnya tidak diekspos di overload praktis ini
Nilai balik: nama pattern yang dihasilkan otomatis (Sh1, Sh2, ...) yang terdaftar di dictionary Resources/Pattern halaman aktif. Mengembalikan string kosong saat StrictVersionLock aktif dan Version aktif berada di bawah PDF 1.3, jika tidak versi dokumen dinaikkan otomatis ke 1.3
Contoh kode
// Single bilinear-equivalent tensor-product patch covering a 200x200
// quad. All 16 control points sit on the 1/3 / 2/3 lattice =>
// bicubic surface degenerates to bilinear; four corner colours
// red / green / yellow / blue
var
Doc: THotPDF;
PatName: AnsiString;
Patches: array[0..43] of Extended; // 16 ctrl pts * 2 + 4 corners * 3 = 44
H, XMin, YMin, XMax, YMax: Single;
XThird, X2Third, YThird, Y2Third: Single;
begin
Doc := THotPDF.Create(nil);
try
Doc.Version := pdf14;
Doc.BeginDoc;
H := Doc.CurrentPage.Height;
XMin := 0; YMin := H - 200; XMax := 200; YMax := H;
XThird := XMin + 200 / 3; X2Third := XMin + 2 * 200 / 3;
YThird := YMin + 200 / 3; Y2Third := YMin + 2 * 200 / 3;
// Spec stream order: top row LtoR, right column TtoB, bottom row RtoL,
// left column BtoT, then interior 4 clockwise starting at p[1][1]
Patches[ 0] := XMin; Patches[ 1] := YMax; // p[0][0] TL
Patches[ 2] := XThird; Patches[ 3] := YMax; // p[0][1]
Patches[ 4] := X2Third; Patches[ 5] := YMax; // p[0][2]
Patches[ 6] := XMax; Patches[ 7] := YMax; // p[0][3] TR
Patches[ 8] := XMax; Patches[ 9] := Y2Third; // p[1][3]
Patches[10] := XMax; Patches[11] := YThird; // p[2][3]
Patches[12] := XMax; Patches[13] := YMin; // p[3][3] BR
Patches[14] := X2Third; Patches[15] := YMin; // p[3][2]
Patches[16] := XThird; Patches[17] := YMin; // p[3][1]
Patches[18] := XMin; Patches[19] := YMin; // p[3][0] BL
Patches[20] := XMin; Patches[21] := YThird; // p[2][0]
Patches[22] := XMin; Patches[23] := Y2Third; // p[1][0]
Patches[24] := XThird; Patches[25] := Y2Third; // p[1][1]
Patches[26] := X2Third; Patches[27] := Y2Third; // p[1][2]
Patches[28] := X2Third; Patches[29] := YThird; // p[2][2]
Patches[30] := XThird; Patches[31] := YThird; // p[2][1]
// 4 corner colours at p[0][0] / p[0][3] / p[3][3] / p[3][0]
Patches[32] := 1.0; Patches[33] := 0.0; Patches[34] := 0.0; // red
Patches[35] := 0.0; Patches[36] := 1.0; Patches[37] := 0.0; // green
Patches[38] := 1.0; Patches[39] := 1.0; Patches[40] := 0.0; // yellow
Patches[41] := 0.0; Patches[42] := 0.0; Patches[43] := 1.0; // blue
PatName := Doc.RegisterTensorProductPatchMesh(
XMin, YMin, XMax, YMax, 3, Patches);
Doc.CurrentPage.SetFillPattern(PatName);
Doc.CurrentPage.Rectangle(0, 0, 200, 200);
Doc.CurrentPage.Fill;
Doc.EndDoc;
finally
Doc.Free;
end;
end;
Lihat juga
RegisterCoonsPatchMesh, RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, Version, Dukungan Filter PDF
|