Metoda THotPDF.RegisterTensorProductPatchMesh

 

THotPDF.RegisterTensorProductPatchMesh

THotPDF

 

Sus

Declară un shading tensor product patch mesh pentru PDF 1.3+ (ISO 32000-1 8.7.4.5.7, /ShadingType 7) și îl împachetează ca o intrare inline Pattern Type 2 în dicționarul Resources/Pattern al paginii. Fiecare patch este o grilă completă 4 x 4 de puncte de control Bezier cubice p[i][j] (12 de margine + 4 interioare), plus câte o culoare pentru fiecare colț. Folosiți această metodă atunci când RegisterCoonsPatchMesh (Type 6) nu poate exprima forma interioară - round-trip-urile SVG mesh-gradient și orice grafică ce are nevoie de cele patru puncte de control suplimentare pentru a curba interiorul patch-ului

 

Sintaxă Delphi:

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

 

Sintaxă C++:

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

 

Descriere

Shadingul este emis ca un stream indirect cu /ShadingType 7, /BitsPerCoordinate 16, /BitsPerComponent 8 și /BitsPerFlag 8. Fiecare patch este împachetat ca 1 byte de flag (mereu 0 pentru patch-uri independente), urmat de 16 puncte de control (fiecare câte 4 bytes: 2 X big-endian + 2 Y big-endian, în ordinea de stream descrisă mai jos) și 4 culori de colț (câte NumComponents bytes fiecare), în total 1 + 64 + 4 * NumComponents bytes per patch

Cele 16 puncte de control formează o grilă 4 x 4 p[i][j], cu i drept index de rând (0 = sus vizual / YMax, 3 = jos vizual / YMin) și j drept index de coloană (0 = stânga / XMin, 3 = dreapta / XMax). Ordinea de stream din specificație (Tabelul 88) parcurge mai întâi cele 12 puncte de margine în sens orar (rândul de sus LtoR, coloana din dreapta TtoB, rândul de jos RtoL, coloana din stânga BtoT), apoi listează cele 4 puncte interioare în ordinea orară, începând cu punctul interior stânga-sus: p[1][1], p[1][2], p[2][2], p[2][1]. Array-ul Patches furnizat de utilizator urmează exact aceeași ordine

Când toate cele 16 puncte de control se află pe o rețea regulată 1/3 / 2/3 (punctele de margine la 1/3 / 2/3 de-a lungul fiecărei muchii, iar punctele interioare la intersecțiile interioare ale grilei (1/3, 1/3) / (2/3, 1/3) / (2/3, 2/3) / (1/3, 2/3)), suprafața Bezier cubică se degradează într-un plan plat, iar interpolarea culorilor devine biliniară - vizual identică cu RegisterCoonsPatchMesh cu muchii drepte sau cu RegisterFreeFormGouraudShading cu patru vârfuri de colț

 

XMin, YMin, XMax, YMax - dreptunghiul din user space care delimitează coordonatele codificate. Aceste patru valori devin primele patru intrări din /Decode. Plasați-le în aceleași coordonate user-space în care veți desena - pentru Rectangle-ul cu coordonate de ecran din HotPDF la (X, Y, W, H), dreptunghiul PDF user-space corespunzător este (X, PageHeight - Y - H) până la (X + W, PageHeight - Y)

NumComponents - numărul de componente de culoare per colț. Transmiteți 1 pentru DeviceGray, 3 pentru DeviceRGB sau 4 pentru DeviceCMYK. Orice altă valoare ridică o excepție

Patches - array plat de valori Extended. Fiecare patch contribuie cu 32 + 4 * NumComponents valori: 32 de float-uri pentru cele 16 puncte de control (X, Y, X, Y, ..., 16 perechi în ordinea de stream din specificație), urmate de 4 * NumComponents float-uri pentru culorile de colț (la p[0][0] / p[0][3] / p[3][3] / p[3][0], în ordinea ciclică Coons). Lungimea array-ului trebuie să fie un multiplu pozitiv al acestui pas. Toate patch-urile emise au flag = 0 (patch independent); flag-urile de continuitate 1 / 2 / 3 (partajarea muchiei cu patch-ul anterior) nu sunt expuse în această supraincărcare convenabilă

 

Valoare returnată: un nume de pattern generat automat (Sh1, Sh2, ...) înregistrat în dicționarul Resources/Pattern al paginii curente. Returnează un șir gol când StrictVersionLock este activ și Version curentă este sub PDF 1.3 (altfel versiunea documentului este ridicată automat la 1.3)

 

Exemplu de cod

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

 

Vezi și

RegisterCoonsPatchMesh, RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, Version, Suport pentru filtre PDF