THotPDF.RegisterTensorProductPatchMesh-Methode

 

THotPDF.RegisterTensorProductPatchMesh

THotPDF

 

Oben

Deklariert eine PDF 1.3+ Tensor-Product-Patch-Mesh-Schattierung (ISO 32000-1 8.7.4.5.7, /ShadingType 7) und bettet sie als inline Pattern Type 2-Eintrag in das Resource-Wörterbuch Resources/Pattern der Seite ein; jedes Patch besteht aus einem vollständigen 4 x 4 Gitter aus bikubischen Bezier-Kontrollpunkten p[i][j] (12 Randpunkte + 4 Innenpunkte) sowie einer Farbe pro Ecke; verwenden Sie diese Methode, wenn RegisterCoonsPatchMesh (Typ 6) die innere Form nicht darstellen kann — zum Beispiel bei SVG-Mesh-Gradient-Importen und allen Grafiken, die die zusätzlichen vier Kontrollpunkte benötigen, um das Innere des Patches zu biegen

 

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

 

Beschreibung

Die Schattierung wird als indirekter Stream mit /ShadingType 7, /BitsPerCoordinate 16, /BitsPerComponent 8 und /BitsPerFlag 8 ausgegeben; jedes Patch wird als 1 Flag-Byte (immer 0 für unabhängige Patches), gefolgt von 16 Kontrollpunkten (jeweils 4 Bytes: 2 Big-Endian X + 2 Big-Endian Y in der unten beschriebenen Stream-Reihenfolge der Spezifikation) und 4 Eckfarben (jeweils NumComponents Bytes) verpackt, was insgesamt 1 + 64 + 4 * NumComponents Bytes pro Patch ergibt

Die 16 Kontrollpunkte bilden ein 4 x 4 Gitter p[i][j] mit i = Zeilenindex (0 = oben / YMax, 3 = unten / YMin) und j = Spaltenindex (0 = links / XMin, 3 = rechts / XMax); die Stream-Reihenfolge der Spezifikation (Tabelle 88) durchläuft zuerst die 12 Randpunkte im Uhrzeigersinn (obere Zeile von links nach rechts, rechte Spalte von oben nach unten, untere Zeile von rechts nach links, linke Spalte von unten nach oben) und listet dann die 4 Innenpunkte im Uhrzeigersinn auf, beginnend beim oberen linken Innenpunkt: p[1][1], p[1][2], p[2][2], p[2][1]; das vom Benutzer übergebene Patches-Array folgt exakt dieser Reihenfolge

Wenn alle 16 Kontrollpunkte auf einem regelmäßigen 1/3- / 2/3-Gitter liegen (Randpunkte bei 1/3 / 2/3 entlang jeder Kante, Innenpunkte an den inneren Gitterkreuzungen (1/3, 1/3) / (2/3, 1/3) / (2/3, 2/3) / (1/3, 2/3)), degeneriert die bikubische Bezier-Fläche zu einer flachen Ebene und die Farbinterpolation zu einer bilinearen — visuell identisch mit RegisterCoonsPatchMesh mit geraden Kanten oder RegisterFreeFormGouraudShading mit vier Eckpunkten

 

XMin, YMin, XMax, YMax - das Koordinatensystem-Rechteck im Benutzerbereich (User Space), das die kodierten Koordinaten begrenzt; diese vier Werte werden die ersten vier Einträge von /Decode; platzieren Sie diese in denselben Benutzerbereichs-Koordinaten, in die Sie zeichnen — für ein Bildschirmkoordinaten-Rechteck Rectangle bei (X, Y, W, H) in HotPDF entspricht das passende PDF-Benutzerbereichs-Rechteck (X, PageHeight - Y - H) bis (X + W, PageHeight - Y)

NumComponents - Anzahl der Farbkomponenten pro Ecke; übergeben Sie 1 für DeviceGray, 3 für DeviceRGB oder 4 für DeviceCMYK; jeder andere Wert löst eine Ausnahme aus

Patches - flaches Array von Extended-Werten; jedes Patch trägt 32 + 4 * NumComponents Werte bei: 32 Floats für die 16 Kontrollpunkte (X, Y, X, Y, ..., 16 Paare in der Stream-Reihenfolge der Spezifikation), gefolgt von 4 * NumComponents Floats für die Eckfarben (bei p[0][0] / p[0][3] / p[3][3] / p[3][0] entsprechend der zyklischen Coons-Reihenfolge); die Array-Länge muss ein positives Vielfaches dieses Schrittes sein; alle ausgegebenen Patches tragen das Flag = 0 (unabhängiges Patch); Fortsetzungs-Flags 1 / 2 / 3 (Kantenfreigabe mit dem vorherigen Patch) werden in dieser vereinfachten Überladung nicht bereitgestellt

 

Rückgabewert: ein automatisch generierter Mustername (Sh1, Sh2, ...), der im Wörterbuch Resources/Pattern der aktuellen Seite registriert ist; gibt eine leere Zeichenkette zurück, wenn StrictVersionLock aktiviert ist und die aktive Version unter PDF 1.3 liegt (andernfalls wird die Dokumentversion automatisch auf 1.3 erhöht)

 

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;

 

Siehe auch

RegisterCoonsPatchMesh, RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, Version, PDF Filter Support