THotPDF.RegisterCoonsPatchMesh Method

 

THotPDF.RegisterCoonsPatchMesh

THotPDF

 

Vrh

Deklariše PDF 1.3+ Coons patch mesh shading (ISO 32000-1 8.7.4.5.6, /ShadingType 6) i smešta ga kao inline Pattern Type 2 unos u rečnik Resources/Pattern stranice. Svaka zakrpa je ograničena četiri kubična Bezier krive i nosi jednu boju po ćošku; renderer prilagođava Coons površinu između četiri ivice, omogućavajući šareni kvadrat proizvoljno krive ivice. Koristite ovo kada bi mreže trouglova sa ravnim ivicama (RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading) zahtevale mnogo trouglova da aproksimiraju krive granice, na primer foliju i metalik gradijente po iskrivljenim putanjama, SVG izvedene gradijentne mreže i bilo koji kvadrat sa krivim ivicama

 

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

 

Opis

Sjenčenje se emituje kao indirektni tok sa /ShadingType 6, /BitsPerCoordinate 16, /BitsPerComponent 8 i /BitsPerFlag 8. Svaka zakrpa je upakovana kao 1 bajt zastavice (uvek 0 za nezavisne zakrpe) praćen 12 kontrolnih tačaka (svaka 4 bajta: 2 big-endian X + 2 big-endian Y) i 4 boje uglova (svaka po NumComponents bajtova), ukupno 1 + 48 + 4 * NumComponents bajtova po zakrpi. /Decode niz mapira 16-bitne koordinate nazad u prosleđeni [XMin, XMax] x [YMin, YMax] user-space pravougaonik, a svaku komponentu boje vraća u opseg [0, 1]

The 12 control points are numbered c1..c12 in clockwise order around the patch boundary starting from corner 1. The four corners are c1 / c4 / c7 / c10, and the remaining eight (c2, c3 between c1 and c4; c5, c6 between c4 and c7; c8, c9 between c7 and c10; c11, c12 between c10 and c1) are the inner Bezier handles of each cubic edge. When the inner handles sit at 1/3 and 2/3 along the straight line between adjacent corners, the Coons surface degenerates to bilinear interpolation - visually equivalent to a 4-vertex Type 4 mesh.

 

XMin, YMin, XMax, YMax - korisnički pravougaonik koji ograničava kodirane koordinate. Ove četiri vrednosti postaju prva četiri unosa /Decode. Kontrolne tačke izvan ovog pravougaonika se na nivou kodiranja klampuju. Postavite ih u iste korisničke koordinate u kojima ćete slikati - za HotPDF screen-coordinate Rectangle na (X, Y, W, H) odgovarajući PDF korisnički pravougaonik je (X, PageHeight - Y - H) do (X + W, PageHeight - Y)

NumComponents - broj komponenti boje po uglu. Prosledite 1 za DeviceGray, 3 za DeviceRGB ili 4 za DeviceCMYK. Svaka druga vrednost izaziva izuzetak

Zakrpice - ravan niz Extended vrednosti. Svaka zakrpa doprinosi 24 + 4 * NumComponents vrednosti: 24 float vrednosti za 12 kontrolnih tačaka (X, Y, X, Y, ..., 12 parova u redosledu c1..c12 u smeru kazaljke na satu) zatim 4 * NumComponents float vrednosti za boje uglova (ugao 1 / 2 / 3 / 4 = c1 / c4 / c7 / c10 u cikličnom redosledu). Dužina niza mora biti pozitivan višekratnik ovog koraka. Sve emitovane zakrpe imaju flag = 0 (nezavisna zakrpa); zastavice nastavka 1 / 2 / 3 (deljenje ivice sa prethodnom zakrpom) nisu izložene u ovom convenience overload-u

 

Povratna vrednost: automatski generisano ime uzorka (Sh1, Sh2, ...) registrovano u Resources/Pattern rečniku tekuće stranice. Vraća prazan niz kada je StrictVersionLock uključen a aktivna Version je ispod PDF 1.3 (inače se verzija dokumenta automatski podiže na 1.3)

 

Code Example

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

 

Vidi i

RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, RegisterDeviceN, Version, PDF Filter Support