THotPDF.RegisterTensorProductPatchMesh Methode

 

THotPDF.RegisterTensorProductPatchMesh

THotPDF

 

Boven

Declareert een PDF 1.3+-tensor product patch mesh shading (ISO 32000-1 8.7.4.5.7, /ShadingType 7) en verpakt die in een inline Pattern Type 2-item in de Resources/Pattern-dictionary van de pagina. Elke patch is een volledig 4 x 4-raster van bicubische Bezier-controlepunten p[i][j] (12 randpunten + 4 binnenpunten) plus één kleur per hoek. Gebruik dit wanneer RegisterCoonsPatchMesh (Type 6) de binnenvorm niet kan uitdrukken - voor SVG mesh-gradient round-trips en elk artwork dat die vier extra controlepunten nodig heeft om het binnenste van de patch te buigen

 

Delphi-syntaxis:

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

 

C++-syntaxis:

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

 

Beschrijving

De shading wordt uitgegeven als een indirecte stream met /ShadingType 7, /BitsPerCoordinate 16, /BitsPerComponent 8 en /BitsPerFlag 8. Elke patch wordt verpakt als 1 vlagbyte (altijd 0 voor onafhankelijke patches), gevolgd door 16 controlepunten (elk 4 bytes: 2 big-endian X + 2 big-endian Y, in de hieronder beschreven streamvolgorde van de specificatie) en 4 hoekkleuren (elk NumComponents bytes), samen 1 + 64 + 4 * NumComponents bytes per patch

De 16 controlepunten vormen een 4 x 4-raster p[i][j], met i als rij-index (0 = visuele bovenkant / YMax, 3 = visuele onderkant / YMin) en j als kolom-index (0 = links / XMin, 3 = rechts / XMax). De streamvolgorde uit de specificatie (tabel 88) doorloopt eerst de 12 randpunten met de klok mee (bovenste rij LtoR, rechterkolom TtoB, onderste rij RtoL, linkerkolom BtoT) en noemt daarna de 4 binnenpunten in klokwijzerzin vanaf het linkerboven-binnenpunt: p[1][1], p[1][2], p[2][2], p[2][1]. De door de gebruiker geleverde Patches-array volgt exact dezelfde volgorde

Wanneer alle 16 controlepunten op een regelmatig 1/3 / 2/3-raster liggen (randpunten op 1/3 / 2/3 langs elke rand, binnenpunten op de binnenste rasterkruispunten (1/3, 1/3) / (2/3, 1/3) / (2/3, 2/3) / (1/3, 2/3)), degenereert het bicubische Bezier-oppervlak tot een vlak en de kleurinterpolatie tot bilineair - visueel gelijk aan RegisterCoonsPatchMesh met rechte randen of RegisterFreeFormGouraudShading met vier hoekpunten

 

XMin, YMin, XMax, YMax - de gebruikersruimte-rechthoek die de gecodeerde coördinaten begrenst. Deze vier waarden worden de eerste vier items van /Decode. Plaats ze in dezelfde gebruikersruimtecoördinaten die u gaat tekenen - voor HotPDF's schermcoördinaat Rectangle op (X, Y, W, H) is de bijbehorende PDF-gebruikersruimte-rechthoek (X, PageHeight - Y - H) tot (X + W, PageHeight - Y)

NumComponents - aantal kleurcomponenten per hoek. Geef 1 door voor DeviceGray, 3 voor DeviceRGB of 4 voor DeviceCMYK. Elke andere waarde veroorzaakt een exception

Patches - platte array van Extended-waarden. Elke patch levert 32 + 4 * NumComponents waarden op: 32 floats voor de 16 controlepunten (X, Y, X, Y, ..., 16 paren in de streamvolgorde van de specificatie), gevolgd door 4 * NumComponents floats voor de hoekkleuren (op p[0][0] / p[0][3] / p[3][3] / p[3][0], in de cyclische Coons-volgorde). De arraylengte moet een positief veelvoud van deze stapgrootte zijn. Alle uitgegeven patches krijgen vlag = 0 (onafhankelijke patch); voortzettingsvlaggen 1 / 2 / 3 (randdeling met de vorige patch) zijn in deze convenience-overload niet zichtbaar

 

Retourwaarde: een automatisch gegenereerde patroonnaam (Sh1, Sh2, ...) die in de Resources/Pattern-dictionary van de huidige pagina wordt geregistreerd. Geeft een lege tekenreeks terug wanneer StrictVersionLock aan staat en de actieve Version onder PDF 1.3 ligt (anders wordt de documentversie automatisch opgehoogd naar 1.3)

 

Codevoorbeeld

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

 

Zie ook

RegisterCoonsPatchMesh, RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, Version, PDF-filterondersteuning