|
Mendeklarasikan shading mesh patch Coons PDF 1.3+ (ISO 32000-1 8.7.4.5.6, /ShadingType 6) dan membungkusnya dalam entri Pattern Type 2 inline pada dictionary Resources/Pattern halaman. Setiap patch dibatasi oleh empat kurva Bezier kubik dan membawa satu warna per sudut; renderer memasangkan permukaan Coons di antara keempat sisi, menghasilkan quad berwarna dengan kurva bebas. Gunakan ini ketika mesh segitiga bertepi lurus (RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading) membutuhkan banyak segitiga untuk mendekati batas yang melengkung - gradien foil dan metalik pada jalur yang bengkok, mesh gradien turunan SVG, dan quad apa pun dengan tepi melengkung
Sintaks Delphi:
function RegisterCoonsPatchMesh(XMin, YMin, XMax, YMax: Single; NumComponents: Integer; const Patches: array of Extended): AnsiString;
Sintaks C++:
AnsiString RegisterCoonsPatchMesh(float XMin, float YMin, float XMax, float YMax, int NumComponents, const Extended* Patches, int PatchesElementCount);
Deskripsi
Shading dikeluarkan sebagai stream indirek dengan /ShadingType 6, /BitsPerCoordinate 16, /BitsPerComponent 8 dan /BitsPerFlag 8. Setiap patch dikemas sebagai 1 byte flag (selalu 0 untuk patch independen) diikuti 12 control point (masing-masing 4 byte: 2 X big-endian + 2 Y big-endian) dan 4 warna sudut (masing-masing NumComponents byte), total 1 + 48 + 4 * NumComponents byte per patch. Array /Decode memetakan koordinat 16-bit kembali ke persegi user-space [XMin, XMax] x [YMin, YMax] yang diberikan dan setiap komponen warna kembali ke [0, 1]
Kedua belas control point diberi nomor c1..c12 dalam urutan searah jarum jam mengelilingi batas patch mulai dari sudut 1. Keempat sudut adalah c1 / c4 / c7 / c10, dan delapan sisanya (c2, c3 di antara c1 dan c4; c5, c6 di antara c4 dan c7; c8, c9 di antara c7 dan c10; c11, c12 di antara c10 dan c1) adalah handle Bezier dalam dari setiap sisi kubik. Saat handle dalam berada di 1/3 dan 2/3 sepanjang garis lurus antara sudut yang berdekatan, permukaan Coons terdegradasi menjadi interpolasi bilinear - secara visual setara dengan mesh Type 4 ber-vertex 4
XMin, YMin, XMax, YMax - persegi user-space yang membatasi koordinat yang dienkode. Empat nilai ini menjadi empat entri pertama /Decode. Control point di luar persegi ini dijepit pada saat encoding. Letakkan dalam koordinat user-space yang sama dengan area yang akan Anda gambar - untuk Rectangle koordinat layar HotPDF pada (X, Y, W, H), persegi user-space PDF yang cocok adalah (X, PageHeight - Y - H) hingga (X + W, PageHeight - Y)
NumComponents - jumlah komponen warna per sudut. Berikan 1 untuk DeviceGray, 3 untuk DeviceRGB, atau 4 untuk DeviceCMYK. Nilai lain apa pun akan memunculkan exception
Patches - array datar dari nilai Extended. Setiap patch menyumbang 24 + 4 * NumComponents nilai: 24 float untuk 12 control point (X, Y, X, Y, ..., 12 pasangan dalam urutan searah jarum jam c1..c12) diikuti 4 * NumComponents float untuk warna sudut (sudut 1 / 2 / 3 / 4 = c1 / c4 / c7 / c10 dalam urutan siklik). Panjang array harus kelipatan positif dari stride ini. Semua patch yang dikeluarkan membawa flag = 0 (patch independen); flag kelanjutan 1 / 2 / 3 (berbagi sisi dengan patch sebelumnya) tidak diekspos dalam overload praktis ini
Nilai kembali: nama pattern yang dihasilkan otomatis (Sh1, Sh2, ...) yang didaftarkan pada dictionary Resources/Pattern halaman saat ini. Mengembalikan string kosong ketika StrictVersionLock aktif dan Version yang aktif berada di bawah PDF 1.3 (jika tidak, versi dokumen dinaikkan otomatis menjadi 1.3)
Contoh kode
// Single straight-edge Coons patch covering a 200x200 quad. Inner
// control points placed at 1/3 / 2/3 along each edge => bilinear
// surface. Four corner colours = red / green / yellow / blue
var
Doc: THotPDF;
PatName: AnsiString;
Patches: array[0..35] of Extended; // 12 ctrl pts * 2 + 4 corners * 3 = 36
H, XMin, YMin, XMax, YMax, W: 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;
W := 200;
// c1..c12 clockwise. Inner handles at 1/3 / 2/3 => straight edges
Patches[ 0] := XMin; Patches[ 1] := YMax; // c1 TL
Patches[ 2] := XMin + W / 3; Patches[ 3] := YMax; // c2
Patches[ 4] := XMin + 2*W / 3; Patches[ 5] := YMax; // c3
Patches[ 6] := XMax; Patches[ 7] := YMax; // c4 TR
Patches[ 8] := XMax; Patches[ 9] := YMax - W / 3; // c5
Patches[10] := XMax; Patches[11] := YMax - 2*W / 3; // c6
Patches[12] := XMax; Patches[13] := YMin; // c7 BR
Patches[14] := XMax - W / 3; Patches[15] := YMin; // c8
Patches[16] := XMax - 2*W / 3; Patches[17] := YMin; // c9
Patches[18] := XMin; Patches[19] := YMin; // c10 BL
Patches[20] := XMin; Patches[21] := YMin + W / 3; // c11
Patches[22] := XMin; Patches[23] := YMin + 2*W / 3; // c12
// 4 corner colours (c1 / c4 / c7 / c10)
Patches[24] := 1.0; Patches[25] := 0.0; Patches[26] := 0.0; // red
Patches[27] := 0.0; Patches[28] := 1.0; Patches[29] := 0.0; // green
Patches[30] := 1.0; Patches[31] := 1.0; Patches[32] := 0.0; // yellow
Patches[33] := 0.0; Patches[34] := 0.0; Patches[35] := 1.0; // blue
PatName := Doc.RegisterCoonsPatchMesh(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
RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, RegisterDeviceN, Version, PDF Filter Support
|