متد THotPDF.RegisterLatticeFormGouraudShading

 

THotPDF.RegisterLatticeFormGouraudShading

THotPDF

 

بالا

یک shading مش‌بندی triangle mesh از نوع Gouraud با فرم lattice در PDF 1.3+ تعریف می‌کند (ISO 32000-1 8.7.4.5.5، /ShadingType 5) و آن را به‌صورت یک ورودی inline از نوع Pattern Type 2 در دیکشنری Resources/Pattern صفحه می‌پیچد. renderer هر جفت ردیف مجاور را به‌طور خودکار به triangle strip تبدیل می‌کند، بنابراین فراخواننده فقط grid رأس‌ها را می‌دهد - وقتی دادهٔ مبدأ از قبل روی یک sample grid منظم قرار دارد مفید است (terrain، نتایج FEA، heatmapهای علمی). وقتی triangulation نامنظم است و flagهای per-triangle لازم‌اند، به‌جای آن از RegisterFreeFormGouraudShading استفاده کنید

 

Delphi syntax:

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);

 

توضیح

این shading به‌صورت یک جریان غیرمستقیم با /ShadingType 5، /BitsPerCoordinate 16، /BitsPerComponent 8 و /VerticesPerRow N صادر می‌شود. برخلاف Type 4، هیچ flag byteی برای هر vertex وجود ندارد و /BitsPerFlag در دیکشنری shading غایب است؛ هر vertex فقط 4 + NumComponents بایت اشغال می‌کند (2 X big-endian + 2 Y big-endian + N مؤلفهٔ رنگ). آرایهٔ /Decode مختصات 16 بیتی را به مستطیل فضای کاربرِ [XMin, XMax] x [YMin, YMax] و هر مؤلفهٔ رنگ را به [0, 1] برمی‌گرداند

Vertices به ترتیب row-major چیده می‌شوند: نخستین VerticesPerRow vertex یک ردیف می‌سازند، VerticesPerRow بعدی ردیف 1 را می‌سازند و به همین ترتیب ادامه می‌یابد. renderer هر جفت ردیف مجاور (row i و row i+1) را به یک triangle strip وصل می‌کند - بدون flag و بدون triangle list صریح. تعداد مقدارهای Extended که در Vertices پاس می‌دهید باید مضربی از (2 + NumComponents) * VerticesPerRow باشد و شمار ردیف‌های حاصل باید دست‌کم 2 باشد

 

XMin, YMin, XMax, YMax - مستطیل user-space که lattice را محدود می‌کند. این چهار مقدار چهار ورودی نخست /Decode می‌شوند. آن‌ها را در همان مختصات user-space‌ای قرار دهید که می‌خواهید روی آن رسم کنید - برای Rectangle با مختصات صفحه‌ای HotPDF در (X, Y, W, H)، مستطیل متناظر PDF user-space برابر (X, PageHeight - Y - H) تا (X + W, PageHeight - Y) است

NumComponents - تعداد مؤلفه‌های رنگ برای هر رأس. برای DeviceGray مقدار 1، برای DeviceRGB مقدار 3 و برای DeviceCMYK مقدار 4 را پاس کنید. هر مقدار دیگری exception ایجاد می‌کند

VerticesPerRow - تعداد رأس N در هر ردیف lattice، N >= 2. ورودی دیکشنری /VerticesPerRow این مقدار را بدون تغییر می‌گیرد. تعداد ردیف‌ها M از طول آرایه به‌صورت VertexCount / VerticesPerRow استنتاج می‌شود و باید دست‌کم 2 باشد

Vertices - آرایهٔ تختی از مقادیر Extended در ترتیب (X, Y, c1...cN) برای هر رأس، با تکرار row-major (ابتدا ردیف 0، سپس ردیف 1، ...). مختصات به [XMin, XMax] x [YMin, YMax] محدود و به integerهای 16 بیتی quantise می‌شوند؛ مؤلفه‌های رنگ به [0, 1] محدود و به integerهای 8 بیتی quantise می‌شوند

 

مقدار بازگشتی: نام patternی که به‌طور خودکار تولید می‌شود (Sh1، Sh2، ...) و در دیکشنری Resources/Pattern صفحهٔ جاری ثبت می‌شود. وقتی StrictVersionLock روشن باشد و Version فعال پایین‌تر از PDF 1.3 باشد، یک رشتهٔ خالی برمی‌گرداند (در غیر این صورت نسخهٔ سند به‌طور خودکار به 1.3 می‌رود)

 

نمونه کد

// 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;

 

همچنین ببینید

RegisterFreeFormGouraudShading, RegisterDeviceN, RegisterSeparation, RegisterLabColorSpace, Version, PDF Filter Support