THotPDF.RegisterCoonsPatchMesh Method

 

THotPDF.RegisterCoonsPatchMesh

THotPDF

 

Đầu trang

Khai báo một shading Coons patch mesh của PDF 1.3+ (ISO 32000-1 8.7.4.5.6, /ShadingType 6) 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 được giới hạn bởi bốn đường Bezier bậc ba và mang một màu cho mỗi góc; bộ render khớp mặt Coons giữa bốn cạnh, tạo ra một hình tứ giác có màu và có cạnh cong tùy ý. Dùng khi các lưới tam giác cạnh thẳng (RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading) sẽ cần quá nhiều tam giác để xấp xỉ biên cong - các gradient lá kim và kim loại trên đường uốn, mesh gradient sinh từ SVG, và mọi tứ giác có cạnh cong

 

Delphi syntax:

function RegisterCoonsPatchMesh(XMin, YMin, XMax, YMax: Single; NumComponents: Integer; const Patches: array of Extended): AnsiString;

 

C++ syntax:

AnsiString RegisterCoonsPatchMesh(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 6, /BitsPerCoordinate 16, /BitsPerComponent 8 và /BitsPerFlag 8. Mỗi patch được đóng gói bằng 1 byte cờ (luôn là 0 cho patch độc lập) rồi đến 12 điểm điều khiển (mỗi điểm 4 byte: 2 byte X big-endian + 2 byte Y big-endian) và 4 màu ở góc (mỗi màu NumComponents byte), tổng cộng 1 + 48 + 4 * NumComponents byte cho mỗi patch. 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]

12 điểm điều khiển được đánh số c1..c12 theo chiều kim đồng hồ quanh biên patch bắt đầu từ góc 1. Bốn góc là c1 / c4 / c7 / c10, còn tám điểm còn lại (c2, c3 giữa c1 và c4; c5, c6 giữa c4 và c7; c8, c9 giữa c7 và c10; c11, c12 giữa c10 và c1) là các tay nắm Bezier bên trong của mỗi cạnh bậc ba. Khi các tay nắm bên trong nằm ở 1/3 và 2/3 trên đường thẳng nối giữa các góc kề nhau, mặt Coons suy biến thành nội suy bilinear - trực quan tương đương một mesh Type 4 có 4 đỉnh

 

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. Các điểm điều khiển nằm ngoài hình chữ nhật này sẽ được kẹp khi mã hóa. 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 24 + 4 * NumComponents giá trị: 24 số thực cho 12 điểm điều khiển (X, Y, X, Y, ..., 12 cặp theo thứ tự c1..c12 theo chiều kim đồng hồ) rồi đến 4 * NumComponents số thực cho màu ở các góc (góc 1 / 2 / 3 / 4 = c1 / c4 / c7 / c10 theo thứ tự vòng). Độ 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 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;

 

Xem thêm

RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, RegisterDeviceN, Version, PDF Filter Support