|
Declareert een PDF 1.3+-vrijvormige Gouraud-geshade triangle mesh shading (ISO 32000-1 8.7.4.5.4, /ShadingType 4) en verpakt die in een inline Pattern Type 2-item in de Resources/Pattern-dictionary van de pagina. Gebruik de teruggegeven patroonnaam met THPDFPage.SetFillPattern of THPDFPage.SetStrokePattern om een vectorverloop te tekenen waarvan de kleur soepel over elke driehoek verloopt
Delphi-syntaxis:
function RegisterFreeFormGouraudShading(XMin, YMin, XMax, YMax: Single; NumComponents: Integer; const Vertices: array of Extended): AnsiString;
C++-syntaxis:
AnsiString RegisterFreeFormGouraudShading(float XMin, float YMin, float XMax, float YMax, int NumComponents, const Extended* Vertices, int VertexElementCount);
Beschrijving
De shading wordt uitgegeven als één indirecte stream met /ShadingType 4, /BitsPerCoordinate 16, /BitsPerComponent 8 en /BitsPerFlag 8. Elke vertex wordt in streamvolgorde verpakt als 8 + NumComponents − 3 bytes - een vlagbyte van 1 byte (altijd 0 voor onafhankelijke driehoeken), 2 big-endian bytes voor de X-coördinaat, 2 big-endian bytes voor de Y-coördinaat en NumComponents kleurcomponenten van 8 bit. 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]
Vertices worden drie tegelijk verbruikt als onafhankelijke driehoeken. Het aantal Extended-waarden dat u in Vertices doorgeeft, moet exact (2 + NumComponents) * 3 * TriangleCount zijn; de helper geeft een uitzondering wanneer de arraylengte geen veelvoud van de stapgrootte is of wanneer het aantal vertices geen veelvoud van drie is
XMin, YMin, XMax, YMax - de gebruikersruimte-rechthoek die het mesh begrenst. Deze vier waarden worden de eerste vier items van /Decode, zodat de 16-bits gecodeerde vertexcoördinaten terugmappen naar PDF-gebruikersruimte. 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 vertex. Geef 1 op voor DeviceGray, 3 voor DeviceRGB of 4 voor DeviceCMYK. Elke andere waarde geeft een uitzondering. Het /ColorSpace-item van de resulterende shading wordt overeenkomstig ingesteld
Vertices - platte array van Extended-waarden in de volgorde (X, Y, c1...cN), herhaald voor elke vertex. Coördinaten worden afgekapt op het vak [XMin, XMax] x [YMin, YMax] en gequantiseerd naar 16-bits gehele getallen; kleurcomponenten worden afgekapt op [0, 1] en gequantiseerd naar 8-bits gehele getallen. Aangrenzende driehoeken die een rand moeten delen, moeten de gedeelde vertices letterlijk herhalen, omdat de geregistreerde shading voor elke vertex vlag 0 gebruikt (onafhankelijke driehoeken)
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
// Four-corner colour quad split into two independent triangles
// along the top-left -> bot-right diagonal. The colours blend
// smoothly across the mesh; the diagonal is the ridge where the
// two triangles meet
//
// top-left red -- top-right green
// | |
// bot-left blue -- bot-right yellow
var
Doc: THotPDF;
PatName: AnsiString;
Verts: array[0..29] of Extended;
H, XMin, YMin, XMax, YMax: 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;
// triangle A: top-left red, top-right green, bot-right yellow
Verts[ 0] := XMin; Verts[ 1] := YMax; Verts[ 2] := 1.0; Verts[ 3] := 0.0; Verts[ 4] := 0.0;
Verts[ 5] := XMax; Verts[ 6] := YMax; Verts[ 7] := 0.0; Verts[ 8] := 1.0; Verts[ 9] := 0.0;
Verts[10] := XMax; Verts[11] := YMin; Verts[12] := 1.0; Verts[13] := 1.0; Verts[14] := 0.0;
// triangle B: top-left red, bot-right yellow, bot-left blue
Verts[15] := XMin; Verts[16] := YMax; Verts[17] := 1.0; Verts[18] := 0.0; Verts[19] := 0.0;
Verts[20] := XMax; Verts[21] := YMin; Verts[22] := 1.0; Verts[23] := 1.0; Verts[24] := 0.0;
Verts[25] := XMin; Verts[26] := YMin; Verts[27] := 0.0; Verts[28] := 0.0; Verts[29] := 1.0;
PatName := Doc.RegisterFreeFormGouraudShading(
XMin, YMin, XMax, YMax, 3, Verts);
Doc.CurrentPage.SetFillPattern(PatName);
Doc.CurrentPage.Rectangle(0, 0, 200, 200);
Doc.CurrentPage.Fill;
Doc.EndDoc;
finally
Doc.Free;
end;
end;
Zie ook
RegisterDeviceN, RegisterSeparation, RegisterLabColorSpace, Version, PDF-filterondersteuning
|