THotPDF.RegisterTensorProductPatchMesh Method

 

THotPDF.RegisterTensorProductPatchMesh

THotPDF

 

الأعلى

/ShadingType 7) ويلفه في مدخل Pattern Type 2 داخلي على قاموس Resources/Pattern الخاص بالصفحة. كل رقعة شبكة كاملة بمقاس 4 x 4 من نقاط تحكم Bezier التكعيبية p[i][j]يعلن tensor product patch mesh shading في PDF 1.3+ (ISO 32000-1 8.7.4.5.7, /ShadingType 7) ويلفه في Pattern Type 2 inline ضمن Resources/Pattern. كل patch شبكة كاملة 4 x 4 من نقاط تحكم bicubic Bezier p[i][j] مع لون في كل زاوية. استخدمه عندما لا يستطيع RegisterCoonsPatchMesh التعبير عن شكل الداخل

 

Delphi syntax:

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

 

C++ syntax:

AnsiString RegisterTensorProductPatchMesh(float XMin, float YMin, float XMax, float YMax, int NumComponents, const Extended* Patches, int PatchesElementCount);

 

الوصف

/ShadingType 7 و/BitsPerCoordinate 16 و/BitsPerComponent 8 و/BitsPerFlag 8. تُعبَّأ كل رقعة كبايت علم واحد (قيمته 0 دائمًا للرقع المستقلة) يليه 16 نقطة تحكم (كل منها 4 بايتات: 2 big-endian لـ X + 2 big-endian لـ Y، بترتيب التدفق الموصوف في المواصفة أدناه) و4 ألوان زوايا (كل منها بعدد بايتات NumComponents)، بإجمالي 1 + 64 + 4 * NumComponents بايت للرقعة.

تشكّل نقاط التحكم الـ 16 شبكة p[i][j] بمقاس 4 x 4 حيث i فهرس الصف (0 = أعلى بصريًا / YMax، 3 = أسفل بصريًا / YMin) وj فهرس العمود (0 = يسار / XMin، 3 = يمين / XMax). يجتاز ترتيب التدفق في المواصفة (الجدول 88) نقاط الحدود الـ 12 أولًا باتجاه عقارب الساعة (الصف العلوي من اليسار إلى اليمين، العمود الأيمن من الأعلى إلى الأسفل، الصف السفلي من اليمين إلى اليسار، العمود الأيسر من الأسفل إلى الأعلى)، ثم يسرد نقاط الداخل الأربع بترتيب عقارب الساعة بدءًا من نقطة الداخل العلوية اليسرى: p[1][1], p[1][2], p[2][2], p[2][1]. أما Patches التي يقدمها المستخدميصدر shading كتدفق غير مباشر مع /ShadingType 7 و/BitsPerCoordinate 16 و/BitsPerComponent 8 و/BitsPerFlag 8. يحزم كل patch كـ flag byte ثم 16 نقطة تحكم وأربعة ألوان للزوايا، بإجمالي 1 + 64 + 4 * NumComponents bytes لكل patch

تشكل نقاط التحكم الـ 16 شبكة 4 x 4 حيث i هو row index وj هو column index. يتبع ترتيب stream في المواصفة Table 88 النقاط الحدودية الـ 12 أولًا باتجاه عقارب الساعة ثم النقاط الداخلية الأربع p[1][1] وp[1][2] وp[2][2] وp[2][1]. تتبع مصفوفة Patches المقدمة من المستخدم الترتيب نفسه

عندما تقع نقاط التحكم الـ 16 على lattice منتظمة 1/3 / 2/3، تتحول bicubic Bezier surface إلى مستوى مسطح ويتحول استيفاء اللون إلى bilinear، وهو مكافئ بصريًا لـ RegisterCoonsPatchMesh بحواف مستقيمة أو RegisterFreeFormGouraudShading بأربع زوايا

/Decode. ضعها في نفس إحداثيات فضاء المستخدم التي سترسم فيها - فبالنسبة إلى Rectangle الخاص بـ HotPDF بإحداثيات الشاشة عند (X, Y, W, H) يكون مستطيل فضاء المستخدم المطابق في PDF من (X, PageHeight - Y - H) إلى (X + W, PageHeight - Y).

NumComponents - عدد مكوّنات اللون لكل زاوية. مرر 1 لجهاز DeviceGray، أو 3 لجهاز DeviceRGB، أو 4 لجهاز DeviceCMYK. وأي قيمة أخرى ترفع استثناء.

Patches - مصفوفة مسطحة من قيم Extended. تسهم كل رقعة 32 + 4 * NumComponents من القيم: 32 عددًا عائمًا لنقاط التحكم الـ 16 (بترتيب X, Y, X, Y, ... أي 16 زوجًا بترتيب التدفق في المواصفة) يليها 4 * NumComponents عددًا عائمًا لألوان الزوايا الأربع (عند p[0][0] / p[0][3] / p[3][3] / p[3][0] 

XMin وYMin وXMax وYMax - مستطيل user-space الذي يحد الإحداثيات المشفرة. تصبح هذه القيم أول مداخل /Decode، ويجب وضعها في إحداثيات user-space نفسها التي سيرسم فيها

NumComponents - عدد مكونات اللون لكل زاوية. مرر 1 لـ DeviceGray أو 3 لـ DeviceRGB أو 4 لـ DeviceCMYK. أي قيمة أخرى ترفع exceptionSh1، Sh2، ...) المسجلة في قاموس Resources/Pattern الخاص بالصفحة الحالية. يعيد سلسلة فارغة عندما يكون StrictVersionLockالقيمة المعادة: اسم pattern مولد تلقائيًا (Sh1, Sh2, ...) ومسجل في قاموس Resources/Pattern للصفحة الحالية. يعيد سلسلة فارغة عندما يكون StrictVersionLock مفعّلًا وVersion النشطة أقل من PDF 1.3؛ وإلا يرفع إصدار المستند تلقائيًا إلى 1.3

 

Code Example

// Single bilinear-equivalent tensor-product patch covering a 200x200
// quad. All 16 control points sit on the 1/3 / 2/3 lattice =>
// bicubic surface degenerates to bilinear; four corner colours
// red / green / yellow / blue
var
  Doc: THotPDF;
  PatName: AnsiString;
  Patches: array[0..43] of Extended;   // 16 ctrl pts * 2 + 4 corners * 3 = 44
  H, XMin, YMin, XMax, YMax: Single;
  XThird, X2Third, YThird, Y2Third: 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;
    XThird  := XMin + 200 / 3;     X2Third := XMin + 2 * 200 / 3;
    YThird  := YMin + 200 / 3;     Y2Third := YMin + 2 * 200 / 3;
    // Spec stream order: top row LtoR, right column TtoB, bottom row RtoL,
    // left column BtoT, then interior 4 clockwise starting at p[1][1]
    Patches[ 0] := XMin;     Patches[ 1] := YMax;       // p[0][0] TL
    Patches[ 2] := XThird;   Patches[ 3] := YMax;       // p[0][1]
    Patches[ 4] := X2Third;  Patches[ 5] := YMax;       // p[0][2]
    Patches[ 6] := XMax;     Patches[ 7] := YMax;       // p[0][3] TR
    Patches[ 8] := XMax;     Patches[ 9] := Y2Third;    // p[1][3]
    Patches[10] := XMax;     Patches[11] := YThird;     // p[2][3]
    Patches[12] := XMax;     Patches[13] := YMin;       // p[3][3] BR
    Patches[14] := X2Third;  Patches[15] := YMin;       // p[3][2]
    Patches[16] := XThird;   Patches[17] := YMin;       // p[3][1]
    Patches[18] := XMin;     Patches[19] := YMin;       // p[3][0] BL
    Patches[20] := XMin;     Patches[21] := YThird;     // p[2][0]
    Patches[22] := XMin;     Patches[23] := Y2Third;    // p[1][0]
    Patches[24] := XThird;   Patches[25] := Y2Third;    // p[1][1]
    Patches[26] := X2Third;  Patches[27] := Y2Third;    // p[1][2]
    Patches[28] := X2Third;  Patches[29] := YThird;     // p[2][2]
    Patches[30] := XThird;   Patches[31] := YThird;     // p[2][1]
    // 4 corner colours at p[0][0] / p[0][3] / p[3][3] / p[3][0]
    Patches[32] := 1.0; Patches[33] := 0.0; Patches[34] := 0.0;  // red
    Patches[35] := 0.0; Patches[36] := 1.0; Patches[37] := 0.0;  // green
    Patches[38] := 1.0; Patches[39] := 1.0; Patches[40] := 0.0;  // yellow
    Patches[41] := 0.0; Patches[42] := 0.0; Patches[43] := 1.0;  // blue
    PatName := Doc.RegisterTensorProductPatchMesh(
      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;

 

انظر أيضا

RegisterCoonsPatchMesh, RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, Version, PDF Filter Support