|
Khai báo một shading Gouraud triangle mesh dạng tự do của PDF 1.3+ (ISO 32000-1 8.7.4.5.4, /ShadingType 4) 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. Dùng tên pattern trả về cùng THPDFPage.SetFillPattern hoặc THPDFPage.SetStrokePattern để tô một gradient vector có màu chuyển mượt qua từng tam giác
Cú pháp Delphi:
function RegisterFreeFormGouraudShading(XMin, YMin, XMax, YMax: Single; NumComponents: Integer; const Vertices: array of Extended): AnsiString;
C++ syntax:
AnsiString RegisterFreeFormGouraudShading(float XMin, float YMin, float XMax, float YMax, int NumComponents, const Extended* Vertices, int VertexElementCount);
Mô tả
Shading được phát ra dưới dạng một stream gián tiếp duy nhất với /ShadingType 4, /BitsPerCoordinate 16, /BitsPerComponent 8 và /BitsPerFlag 8. Mỗi đỉnh được đóng gói theo thứ tự stream thành 8 + NumComponents − 3 byte - một byte cờ (luôn là 0 cho các tam giác độc lập), 2 byte big-endian cho tọa độ X, 2 byte big-endian cho tọa độ Y và NumComponents thành phần màu 8-bit. Mảng /Decode ánh xạ các tọa độ 16-bit trở lại hình chữ nhật user-space [XMin, XMax] x [YMin, YMax] đã cung cấp và từng thành phần màu trở lại [0, 1]
Các đỉnh được tiêu thụ theo nhóm ba như những tam giác độc lập. Số giá trị Extended bạn truyền vào Vertices phải đúng bằng (2 + NumComponents) * 3 * TriangleCount; helper sẽ ném ngoại lệ khi độ dài mảng không phải bội số của stride hoặc khi số đỉnh không phải bội số của ba
XMin, YMin, XMax, YMax - hình chữ nhật user-space bao quanh mesh Bốn giá trị này trở thành bốn mục đầu tiên của /Decode để các tọa độ đỉnh mã hóa 16-bit ánh xạ ngược về user space PDF Hãy đặt chúng trong cùng hệ tọa độ user-space mà bạn sẽ vẽ vào - với Rectangle tọa độ màn hình của HotPDF tại (X, Y, W, H) thì hình chữ nhật user-space PDF tương ứng là (X, PageHeight - Y - H) đến (X + W, PageHeight - Y)
NumComponents - số thành phần màu trên mỗi đỉnh Chọn 1 cho DeviceGray, 3 cho DeviceRGB hoặc 4 cho DeviceCMYK Mọi giá trị khác sẽ gây ngoại lệ Mục /ColorSpace của shading kết quả sẽ được đặt tương ứng
Vertices - mảng phẳng các giá trị Extended theo thứ tự (X, Y, c1...cN) cho mỗi đỉnh, lặp lại cho từng đỉnh. Tọa độ được giới hạn trong hộp [XMin, XMax] x [YMin, YMax] và lượng tử hóa thành số nguyên 16-bit; thành phần màu được giới hạn trong [0, 1] và lượng tử hóa thành số nguyên 8-bit. Các tam giác kề nhau cần chia sẻ cạnh phải lặp lại nguyên văn các đỉnh chung vì shading đã đăng ký dùng cờ 0 cho mọi đỉnh (tam giác độc lập)
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ã
// Four-corner colour quad split into two independent triangles
// along the top-left -> bot-right diagonal. The colours blend
// smoothly across the mesh; the diagonal is the ridge where the
// two triangles meet
//
// top-left red -- top-right green
// | |
// bot-left blue -- bot-right yellow
var
Doc: THotPDF;
PatName: AnsiString;
Verts: array[0..29] of Extended;
H, XMin, YMin, XMax, YMax: 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;
// triangle A: top-left red, top-right green, bot-right yellow
Verts[ 0] := XMin; Verts[ 1] := YMax; Verts[ 2] := 1.0; Verts[ 3] := 0.0; Verts[ 4] := 0.0;
Verts[ 5] := XMax; Verts[ 6] := YMax; Verts[ 7] := 0.0; Verts[ 8] := 1.0; Verts[ 9] := 0.0;
Verts[10] := XMax; Verts[11] := YMin; Verts[12] := 1.0; Verts[13] := 1.0; Verts[14] := 0.0;
// triangle B: top-left red, bot-right yellow, bot-left blue
Verts[15] := XMin; Verts[16] := YMax; Verts[17] := 1.0; Verts[18] := 0.0; Verts[19] := 0.0;
Verts[20] := XMax; Verts[21] := YMin; Verts[22] := 1.0; Verts[23] := 1.0; Verts[24] := 0.0;
Verts[25] := XMin; Verts[26] := YMin; Verts[27] := 0.0; Verts[28] := 0.0; Verts[29] := 1.0;
PatName := Doc.RegisterFreeFormGouraudShading(
XMin, YMin, XMax, YMax, 3, Verts);
Doc.CurrentPage.SetFillPattern(PatName);
Doc.CurrentPage.Rectangle(0, 0, 200, 200);
Doc.CurrentPage.Fill;
Doc.EndDoc;
finally
Doc.Free;
end;
end;
Xem thêm
RegisterDeviceN, RegisterSeparation, RegisterLabColorSpace, Version, PDF Filter Support
|