THotPDF.RegisterCoonsPatchMesh Method

 

THotPDF.RegisterCoonsPatchMesh

THotPDF

 

Topo

Declara um shading de malha de patches Coons do PDF 1.3+ (ISO 32000-1 8.7.4.5.6, /ShadingType 6) e o envolve em uma entrada inline de Pattern Type 2 no dicionário Resources/Pattern da página. Cada patch é delimitado por quatro curvas de Bézier cúbicas e carrega uma cor por canto; o renderizador ajusta a superfície de Coons entre as quatro arestas, dando um quadrilátero curvo arbitrário portador de cor. Use isto quando malhas de triângulos de arestas retas (RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading) precisariam de muitos triângulos para aproximar fronteiras curvas — gradientes de folha metálica em paths curvos, malhas de gradiente derivadas de SVG e qualquer quadrilátero com arestas curvas.

 

Sintaxe Delphi:

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

 

Sintaxe C++:

AnsiString RegisterCoonsPatchMesh(float XMin, float YMin, float XMax, float YMax, int NumComponents, const Extended* Patches, int PatchesElementCount);

 

Descrição

O shading é emitido como um stream indireto com /ShadingType 6, /BitsPerCoordinate 16, /BitsPerComponent 8 e /BitsPerFlag 8. Cada patch é empacotado como 1 byte de flag (sempre 0 para patches independentes) seguido de 12 pontos de controle (cada um com 4 bytes: 2 X big-endian + 2 Y big-endian) e 4 cores de canto (cada uma com NumComponents bytes), totalizando 1 + 48 + 4 * NumComponents bytes por patch. O array /Decode mapeia as coordenadas de 16 bits de volta ao retângulo de espaço de usuário [XMin, XMax] x [YMin, YMax] fornecido e cada componente de cor de volta a [0, 1].

Os 12 pontos de controle são numerados c1..c12 em ordem horária ao redor da fronteira do patch começando do canto 1. Os quatro cantos são c1 / c4 / c7 / c10, e os oito restantes (c2, c3 entre c1 e c4; c5, c6 entre c4 e c7; c8, c9 entre c7 e c10; c11, c12 entre c10 e c1) são os handles Bezier internos de cada aresta cúbica. Quando os handles internos ficam a 1/3 e 2/3 ao longo da linha reta entre cantos adjacentes, a superfície de Coons degenera para interpolação bilinear — visualmente equivalente a uma malha Type 4 de 4 vértices.

 

XMin, YMin, XMax, YMax - o retângulo de espaço de usuário que limita as coordenadas codificadas. Estes quatro valores viram as primeiras quatro entradas de /Decode. Pontos de controle fora deste retângulo são limitados no momento da codificação. Coloque-os nas mesmas coordenadas de espaço de usuário em que você pintará — para o Rectangle de coordenadas de tela do HotPDF em (X, Y, W, H), o retângulo de espaço de usuário PDF correspondente é (X, PageHeight - Y - H) a (X + W, PageHeight - Y).

NumComponents - número de componentes de cor por canto. Passe 1 para DeviceGray, 3 para DeviceRGB ou 4 para DeviceCMYK. Qualquer outro valor dispara exceção.

Patches - array plano de valores Extended. Cada patch contribui com 24 + 4 * NumComponents valores: 24 floats para os 12 pontos de controle (X, Y, X, Y, ..., 12 pares na ordem c1..c12 no sentido horário), seguidos de 4 * NumComponents floats para as cores dos cantos (canto 1 / 2 / 3 / 4 = c1 / c4 / c7 / c10 em ordem cíclica). O tamanho do array deve ser um múltiplo positivo desse stride. Todos os patches emitidos levam flag = 0 (patch independente); as flags de continuação 1 / 2 / 3 (compartilhamento de borda com o patch anterior) não são expostas nesta sobrecarga de conveniência.

 

Return value: um nome de padrão gerado automaticamente (Sh1, Sh2, ...) registrado no dicionário Resources/Pattern da página atual. Retorna uma string vazia quando StrictVersionLock está ligado e o Version ativo está abaixo do PDF 1.3 (caso contrário a versão do documento é promovida automaticamente para 1.3).

 

Exemplo de código

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

 

See Also

RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, RegisterDeviceN, Version, PDF Filter Support