|
Khai báo một shading Gouraud triangle mesh kiểu lattice-form của PDF 1.3+ (ISO 32000-1 8.7.4.5.5, /ShadingType 5) 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. Bộ render tự động tam giác hóa từng cặp hàng kề nhau thành một triangle strip, nên bên gọi chỉ cần cung cấp lưới đỉnh - hữu ích khi dữ liệu nguồn đã nằm trên một lưới mẫu đều (địa hình, kết quả FEA, heatmap khoa học). Dùng RegisterFreeFormGouraudShading thay vào đó khi việc tam giác hóa là bất quy tắc và cần cờ cho từng tam giác
Cú pháp Delphi:
function RegisterLatticeFormGouraudShading(XMin, YMin, XMax, YMax: Single; NumComponents: Integer; VerticesPerRow: Integer; const Vertices: array of Extended): AnsiString;
C++ syntax:
AnsiString RegisterLatticeFormGouraudShading(float XMin, float YMin, float XMax, float YMax, int NumComponents, int VerticesPerRow, const Extended* Vertices, int VertexElementCount);
Mô tả
Shading được phát ra dưới dạng một stream gián tiếp với /ShadingType 5, /BitsPerCoordinate 16, /BitsPerComponent 8 và /VerticesPerRow N. Không giống Type 4, ở đây không có byte cờ cho từng đỉnh và /BitsPerFlag không xuất hiện trong từ điển shading; mỗi đỉnh chiếm 4 + NumComponents byte (2 byte X big-endian + 2 byte Y big-endian + N thành phần màu). 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 sắp xếp theo row-major: VerticesPerRow đỉnh đầu tạo hàng 0, VerticesPerRow tiếp theo tạo hàng 1, và cứ thế tiếp tục. Bộ render nối từng cặp hàng kề nhau (hàng i và hàng i+1) thành một triangle strip - không có cờ, không có danh sách tam giác tường minh. Số giá trị Extended bạn truyền vào Vertices phải là bội số của (2 + NumComponents) * VerticesPerRow và số hàng thu được phải ít nhất là 2
XMin, YMin, XMax, YMax - hình chữ nhật user-space bao quanh lattice 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 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ệ
VerticesPerRow - số đỉnh N trên mỗi hàng của lưới, N >= 2. Mục từ điển /VerticesPerRow nhận nguyên giá trị này. Số hàng M được suy ra từ độ dài mảng là VertexCount / VerticesPerRow và phải ít nhất là 2
Vertices - mảng phẳng các giá trị Extended theo thứ tự (X, Y, c1...cN) cho mỗi đỉnh, lặp theo row-major (hàng 0 trước, rồi hàng 1, ...). Tọa độ được giới hạn trong [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
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ã
// 3x3 lattice over a 200x200 quad. The renderer auto-triangulates
// adjacent rows into a triangle strip, giving 4 cells x 2 triangles
// = 8 triangles. Colour layout (visual):
//
// row 0 (top, Y=YMax): red yellow green
// row 1 (mid): magenta gray cyan
// row 2 (bot, Y=YMin): blue purple orange
var
Doc: THotPDF;
PatName: AnsiString;
Verts: array[0..44] of Extended; // 9 vertices x 5 floats each
H, XMin, YMin, XMax, YMax, XMid, YMid: 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;
XMid := (XMin + XMax) / 2;
YMid := (YMin + YMax) / 2;
// row 0 (Y=YMax): red - yellow - green
Verts[ 0] := XMin; Verts[ 1] := YMax; Verts[ 2] := 1.0; Verts[ 3] := 0.0; Verts[ 4] := 0.0;
Verts[ 5] := XMid; Verts[ 6] := YMax; Verts[ 7] := 1.0; Verts[ 8] := 1.0; Verts[ 9] := 0.0;
Verts[10] := XMax; Verts[11] := YMax; Verts[12] := 0.0; Verts[13] := 1.0; Verts[14] := 0.0;
// row 1 (Y mid): magenta - gray - cyan
Verts[15] := XMin; Verts[16] := YMid; Verts[17] := 1.0; Verts[18] := 0.0; Verts[19] := 1.0;
Verts[20] := XMid; Verts[21] := YMid; Verts[22] := 0.5; Verts[23] := 0.5; Verts[24] := 0.5;
Verts[25] := XMax; Verts[26] := YMid; Verts[27] := 0.0; Verts[28] := 1.0; Verts[29] := 1.0;
// row 2 (Y=YMin): blue - purple - orange
Verts[30] := XMin; Verts[31] := YMin; Verts[32] := 0.0; Verts[33] := 0.0; Verts[34] := 1.0;
Verts[35] := XMid; Verts[36] := YMin; Verts[37] := 0.5; Verts[38] := 0.0; Verts[39] := 0.5;
Verts[40] := XMax; Verts[41] := YMin; Verts[42] := 1.0; Verts[43] := 0.5; Verts[44] := 0.0;
PatName := Doc.RegisterLatticeFormGouraudShading(
XMin, YMin, XMax, YMax, 3, 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
RegisterFreeFormGouraudShading, RegisterDeviceN, RegisterSeparation, RegisterLabColorSpace, Version, PDF Filter Support
|