THotPDF.RegisterCoonsPatchMesh Methode

 

THotPDF.RegisterCoonsPatchMesh

THotPDF

 

Boven

Declareert een PDF 1.3+-Coons patch mesh shading (ISO 32000-1 8.7.4.5.6, /ShadingType 6) en verpakt die in een inline Pattern Type 2-item in de Resources/Pattern-dictionary van de pagina. Elke patch wordt begrensd door vier kubische Bezier-curven en heeft één kleur per hoek; de renderer vult het Coons-oppervlak tussen de vier randen, wat een willekeurig gekromde, kleurdragende vierhoek oplevert. Gebruik dit wanneer triangle meshes met rechte randen (RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading) veel driehoeken nodig zouden hebben om gebogen grenzen te benaderen - folio- en metaalverlopen op gebogen paden, van SVG afgeleide gradient meshes en elke vierhoek met gebogen randen

 

Delphi-syntaxis:

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

 

C++-syntaxis:

AnsiString RegisterCoonsPatchMesh(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 6, /BitsPerCoordinate 16, /BitsPerComponent 8 en /BitsPerFlag 8. Elke patch wordt verpakt als 1 vlagbyte (altijd 0 voor onafhankelijke patches), gevolgd door 12 controlepunten (elk 4 bytes: 2 big-endian X + 2 big-endian Y) en 4 hoekkleuren (elk NumComponents bytes), samen 1 + 48 + 4 * NumComponents bytes per patch. De /Decode-array zet de 16-bits coördinaten terug naar de opgegeven gebruikersruimte-rechthoek [XMin, XMax] x [YMin, YMax] en elke kleurcomponent terug naar [0, 1]

De 12 controlepunten worden met de klok mee genummerd als c1..c12 rond de patchrand, beginnend bij hoek 1. De vier hoeken zijn c1 / c4 / c7 / c10 en de overige acht (c2, c3 tussen c1 en c4; c5, c6 tussen c4 en c7; c8, c9 tussen c7 en c10; c11, c12 tussen c10 en c1) zijn de binnenste Bezier-handgrepen van elke kubische rand. Wanneer de binnenste handgrepen op 1/3 en 2/3 van de rechte lijn tussen aangrenzende hoeken liggen, degenereert het Coons-oppervlak tot bilineaire interpolatie - visueel gelijk aan een Type 4-mesh met 4 vertices

 

XMin, YMin, XMax, YMax - de gebruikersruimte-rechthoek die de gecodeerde coördinaten begrenst. Deze vier waarden worden de eerste vier items van /Decode. Controlepunten buiten deze rechthoek worden tijdens codering afgekapt. 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 24 + 4 * NumComponents waarden op: 24 floats voor de 12 controlepunten (X, Y, X, Y, ..., 12 paren in de met-de-klok-meevolgorde c1..c12), gevolgd door 4 * NumComponents floats voor de hoekkleuren (hoek 1 / 2 / 3 / 4 = c1 / c4 / c7 / c10 in cyclische 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 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;

 

Zie ook

RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, RegisterDeviceN, Version, PDF-filterondersteuning