|
Khai báo một shading tensor product patch mesh của PDF 1.3+ (ISO 32000-1 8.7.4.5.7, /ShadingType 7) và bọc nó trong một mục Pattern Type 2 nội tuyến trên từ điển Resources/Pattern của trang. Mỗi patch là một lưới 4 x 4 đầy đủ của các điểm điều khiển Bezier bậc ba p[i][j] (12 điểm biên + 4 điểm trong) cùng với một màu cho mỗi góc. Dùng khi RegisterCoonsPatchMesh (Type 6) không diễn đạt được hình dạng phần trong - các round-trip mesh-gradient từ SVG và mọi tác phẩm cần thêm bốn điểm điều khiển để uốn phần trong của patch
Delphi syntax:
function RegisterTensorProductPatchMesh(XMin, YMin, XMax, YMax: Single; NumComponents: Integer; const Patches: array of Extended): AnsiString;
C++ syntax:
AnsiString RegisterTensorProductPatchMesh(float XMin, float YMin, float XMax, float YMax, int NumComponents, const Extended* Patches, int PatchesElementCount);
Mô tả
Shading được phát ra dưới dạng một stream gián tiếp với /ShadingType 7, /BitsPerCoordinate 16, /BitsPerComponent 8 và /BitsPerFlag 8. Mỗi patch được đóng gói bằng 1 byte cờ (luôn là 0 cho các patch độc lập), sau đó là 16 điểm điều khiển (mỗi điểm 4 byte: 2 byte X big-endian + 2 byte Y big-endian, theo thứ tự stream của đặc tả mô tả bên dưới) và 4 màu ở các góc (mỗi màu NumComponents byte), tổng cộng 1 + 64 + 4 * NumComponents byte cho mỗi patch
16 điểm điều khiển tạo thành một lưới 4 x 4 p[i][j] với i là chỉ số hàng (0 = đỉnh trực quan / YMax, 3 = đáy trực quan / YMin) và j là chỉ số cột (0 = trái / XMin, 3 = phải / XMax). Thứ tự stream của đặc tả (Table 88) đi qua 12 điểm biên theo chiều kim đồng hồ trước (hàng trên từ trái sang phải, cột phải từ trên xuống dưới, hàng dưới từ phải sang trái, cột trái từ dưới lên trên), rồi liệt kê 4 điểm trong theo chiều kim đồng hồ bắt đầu từ điểm trong trên-trái: p[1][1], p[1][2], p[2][2], p[2][1]. Mảng Patches do người dùng cung cấp đi theo đúng thứ tự này
Khi cả 16 điểm điều khiển nằm trên một lưới đều 1/3 / 2/3 (các điểm biên ở 1/3 / 2/3 trên mỗi cạnh, các điểm trong ở các giao điểm lưới bên trong (1/3, 1/3) / (2/3, 1/3) / (2/3, 2/3) / (1/3, 2/3)), mặt Bezier bậc ba suy biến thành một mặt phẳng và phép nội suy màu suy biến thành bilinear - trực quan giống hệt RegisterCoonsPatchMesh với cạnh thẳng hoặc RegisterFreeFormGouraudShading với bốn đỉnh ở góc
XMin, YMin, XMax, YMax - hình chữ nhật user-space bao quanh các tọa độ đã mã hóa. Bốn giá trị này trở thành bốn mục đầu tiên của /Decode. Hãy đặt chúng trong cùng hệ tọa độ user-space mà bạn sẽ vẽ vào - với Rectangle theo tọa độ màn hình của HotPDF tại (X, Y, W, H), hình chữ nhật PDF user-space tương ứng là (X, PageHeight - Y - H) tới (X + W, PageHeight - Y)
NumComponents - số thành phần màu cho mỗi góc. Truyền 1 cho DeviceGray, 3 cho DeviceRGB hoặc 4 cho DeviceCMYK. Mọi giá trị khác sẽ ném ngoại lệ
Patches - mảng phẳng các giá trị Extended. Mỗi patch đóng góp 32 + 4 * NumComponents giá trị: 32 số thực cho 16 điểm điều khiển (X, Y, X, Y, ..., 16 cặp theo thứ tự stream của đặc tả) rồi đến 4 * NumComponents số thực cho màu ở các góc (tại p[0][0] / p[0][3] / p[3][3] / p[3][0], khớp thứ tự vòng của Coons). Độ dài mảng phải là bội số dương của stride này. Tất cả patch được phát ra đều mang cờ = 0 (patch độc lập); các cờ tiếp nối 1 / 2 / 3 (chia sẻ cạnh với patch trước) không được phơi trong overload tiện dụng này
Giá trị trả về: một tên pattern tự sinh (Sh1, Sh2, ...) đã được đăng ký trong từ điển Resources/Pattern của trang hiện tại. Trả về chuỗi rỗng khi StrictVersionLock đang bật và Version hiện tại thấp hơn PDF 1.3 (ngược lại phiên bản tài liệu sẽ tự nâng lên 1.3)
Ví dụ mã
// 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;
Xem thêm
RegisterCoonsPatchMesh, RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, Version, PDF Filter Support
|