|
Declara un sombreado de malla triangular Gouraud de tipo lattice para PDF 1.3+ (ISO 32000-1 8.7.4.5.5, /ShadingType 5) y lo envuelve en una entrada inline de Pattern Type 2 en el diccionario Resources/Pattern de la página El renderizador triangula automáticamente cada par de filas adyacentes en una tira de triángulos, así que el llamador solo proporciona la cuadrícula de vértices, útil cuando los datos de origen ya viven en una cuadrícula regular de muestreo (terreno, resultados FEA, mapas de calor científicos) Use RegisterFreeFormGouraudShading en su lugar cuando la triangulación sea irregular y se necesiten banderas por triángulo
Sintaxis Delphi:
function RegisterLatticeFormGouraudShading(XMin, YMin, XMax, YMax: Single; NumComponents: Integer; VerticesPerRow: Integer; const Vertices: array of Extended): AnsiString;
Sintaxis C++:
AnsiString RegisterLatticeFormGouraudShading(float XMin, float YMin, float XMax, float YMax, int NumComponents, int VerticesPerRow, const Extended* Vertices, int VertexElementCount);
Descripción
El sombreado se emite como un flujo indirecto con /ShadingType 5, /BitsPerCoordinate 16, /BitsPerComponent 8 y /VerticesPerRow N A diferencia del tipo 4, no existe un byte de bandera por vértice y /BitsPerFlag no aparece en el diccionario de sombreado; cada vértice ocupa 4 + NumComponents bytes (2 bytes X big-endian + 2 bytes Y big-endian + N componentes de color) El arreglo /Decode mapea las coordenadas de 16 bits de vuelta al rectángulo del espacio de usuario [XMin, XMax] x [YMin, YMax] suministrado y cada componente de color de vuelta a [0, 1]
Los vértices se ordenan por filas: los primeros VerticesPerRow vértices forman la fila 0, los siguientes VerticesPerRow forman la fila 1 y así sucesivamente El renderizador conecta cada par de filas adyacentes (fila i y fila i+1) en una tira de triángulos, sin banderas ni lista explícita de triángulos La cantidad de valores Extended que pase en Vertices debe ser un múltiplo de (2 + NumComponents) * VerticesPerRow y el recuento resultante de filas debe ser al menos 2
XMin, YMin, XMax, YMax - el rectángulo del espacio de usuario que delimita la cuadrícula Estos cuatro valores se convierten en las cuatro primeras entradas de /Decode Colóquelos en las mismas coordenadas del espacio de usuario en las que va a pintar; para el Rectangle de coordenadas de pantalla de HotPDF en (X, Y, W, H) el rectángulo coincidente del espacio de usuario PDF es (X, PageHeight - Y - H) a (X + W, PageHeight - Y)
NumComponents - número de componentes de color por vértice Pase 1 para DeviceGray, 3 para DeviceRGB o 4 para DeviceCMYK Cualquier otro valor genera una excepción
VerticesPerRow - número de vértices N por fila de la cuadrícula, N >= 2 La entrada de diccionario /VerticesPerRow toma este valor literalmente El número de filas M se infiere de la longitud del arreglo como VertexCount / VerticesPerRow y debe ser al menos 2
Vertices - arreglo plano de valores Extended en orden (X, Y, c1...cN) por vértice, repetido por filas (fila 0 primero, luego fila 1, ...) Las coordenadas se limitan a [XMin, XMax] x [YMin, YMax] y se cuantizan a enteros de 16 bits; los componentes de color se limitan a [0, 1] y se cuantizan a enteros de 8 bits
Valor devuelto: un nombre de patrón generado automáticamente (Sh1, Sh2, ...) registrado en el diccionario Resources/Pattern de la página actual Devuelve una cadena vacía cuando StrictVersionLock está activado y la Version activa es inferior a PDF 1.3 (de lo contrario, la versión del documento sube automáticamente a 1.3)
Ejemplo de código
// 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;
Véase también
RegisterFreeFormGouraudShading, RegisterDeviceN, RegisterSeparation, RegisterLabColorSpace, Version, Soporte de filtros PDF
|