THotPDF.RegisterLatticeFormGouraudShading Methode

 

THotPDF.RegisterLatticeFormGouraudShading

THotPDF

 

Boven

Declareert een PDF 1.3+-lattice-form Gouraud-geshade triangle mesh shading (ISO 32000-1 8.7.4.5.5, /ShadingType 5) en verpakt die in een inline Pattern Type 2-item in de Resources/Pattern-dictionary van de pagina. De renderer zet elk paar aangrenzende rijen automatisch om in een triangle strip, zodat de aanroeper alleen het vertexraster hoeft te leveren - handig wanneer de brondata al op een regelmatig sample-raster staat (terrein, FEA-resultaten, wetenschappelijke heatmaps). Gebruik RegisterFreeFormGouraudShading in plaats daarvan wanneer de triangulatie onregelmatig is en er per driehoek vlaggen nodig zijn

 

Delphi-syntaxis:

function RegisterLatticeFormGouraudShading(XMin, YMin, XMax, YMax: Single; NumComponents: Integer; VerticesPerRow: Integer; const Vertices: array of Extended): AnsiString;

 

C++-syntaxis:

AnsiString RegisterLatticeFormGouraudShading(float XMin, float YMin, float XMax, float YMax, int NumComponents, int VerticesPerRow, const Extended* Vertices, int VertexElementCount);

 

Beschrijving

De shading wordt uitgegeven als een indirecte stream met /ShadingType 5, /BitsPerCoordinate 16, /BitsPerComponent 8 en /VerticesPerRow N. In tegenstelling tot Type 4 is er geen vlagbyte per vertex en ontbreekt /BitsPerFlag in de shading-dictionary; elke vertex neemt 4 + NumComponents bytes in beslag (2 big-endian X + 2 big-endian Y + N kleurcomponenten). 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 in rij-volgorde opgeslagen: de eerste VerticesPerRow vertices vormen rij 0, de volgende VerticesPerRow vormen rij 1, enzovoort. De renderer verbindt elk paar aangrenzende rijen (rij i en rij i+1) tot een triangle strip - geen vlaggen, geen expliciete driehoekenlijst. Het aantal Extended-waarden dat u in Vertices doorgeeft, moet een veelvoud zijn van (2 + NumComponents) * VerticesPerRow en het resulterende aantal rijen moet ten minste 2 zijn

 

XMin, YMin, XMax, YMax - de gebruikersruimte-rechthoek die het raster 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 vertex. Geef 1 op voor DeviceGray, 3 voor DeviceRGB of 4 voor DeviceCMYK. Elke andere waarde geeft een uitzondering

VerticesPerRow - aantal vertices N per rasterrij, N >= 2. Het dictionary-item /VerticesPerRow neemt deze waarde letterlijk over. Het aantal rijen M wordt afgeleid uit de arraylengte als VertexCount / VerticesPerRow en moet ten minste 2 zijn

Vertices - platte array van Extended-waarden in de volgorde (X, Y, c1...cN) per vertex, herhaald in rij-volgorde (eerst rij 0, dan rij 1, ...). Coördinaten worden afgekapt op [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

 

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

// 3x3 lattice over a 200x200 quad. The renderer auto-triangulates
// adjacent rows into a triangle strip, giving 4 cells x 2 triangles
// = 8 triangles. Colour layout (visual):
//
//   row 0 (top, Y=YMax): red     yellow  green
//   row 1 (mid):         magenta gray    cyan
//   row 2 (bot, Y=YMin): blue    purple  orange
var
  Doc: THotPDF;
  PatName: AnsiString;
  Verts: array[0..44] of Extended;   // 9 vertices x 5 floats each
  H, XMin, YMin, XMax, YMax, XMid, YMid: 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;
    XMid := (XMin + XMax) / 2;
    YMid := (YMin + YMax) / 2;
    // row 0 (Y=YMax): red - yellow - green
    Verts[ 0] := XMin; Verts[ 1] := YMax; Verts[ 2] := 1.0; Verts[ 3] := 0.0; Verts[ 4] := 0.0;
    Verts[ 5] := XMid; Verts[ 6] := YMax; Verts[ 7] := 1.0; Verts[ 8] := 1.0; Verts[ 9] := 0.0;
    Verts[10] := XMax; Verts[11] := YMax; Verts[12] := 0.0; Verts[13] := 1.0; Verts[14] := 0.0;
    // row 1 (Y mid): magenta - gray - cyan
    Verts[15] := XMin; Verts[16] := YMid; Verts[17] := 1.0; Verts[18] := 0.0; Verts[19] := 1.0;
    Verts[20] := XMid; Verts[21] := YMid; Verts[22] := 0.5; Verts[23] := 0.5; Verts[24] := 0.5;
    Verts[25] := XMax; Verts[26] := YMid; Verts[27] := 0.0; Verts[28] := 1.0; Verts[29] := 1.0;
    // row 2 (Y=YMin): blue - purple - orange
    Verts[30] := XMin; Verts[31] := YMin; Verts[32] := 0.0; Verts[33] := 0.0; Verts[34] := 1.0;
    Verts[35] := XMid; Verts[36] := YMin; Verts[37] := 0.5; Verts[38] := 0.0; Verts[39] := 0.5;
    Verts[40] := XMax; Verts[41] := YMin; Verts[42] := 1.0; Verts[43] := 0.5; Verts[44] := 0.0;
    PatName := Doc.RegisterLatticeFormGouraudShading(
      XMin, YMin, XMax, YMax, 3, 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

RegisterFreeFormGouraudShading, RegisterDeviceN, RegisterSeparation, RegisterLabColorSpace, Version, PDF-filterondersteuning