|
یک 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
|