|
Déclare un maillage ombré à patchs tensoriels pour PDF 1.3+ (ISO 32000-1 8.7.4.5.7, /ShadingType 7) et l’enveloppe dans une entrée inline Pattern Type 2 du dictionnaire Resources/Pattern de la page Chaque patch est une grille complète 4 x 4 de points de contrôle Bézier bicubiques p[i][j] (12 en bordure + 4 internes) plus une couleur par coin Utilisez cela lorsque RegisterCoonsPatchMesh (Type 6) ne peut pas exprimer la forme interne - aller-retour de dégradés de maillage SVG et tout artwork qui a besoin des quatre points de contrôle supplémentaires pour plier l’intérieur du patch
Syntaxe Delphi :
function RegisterTensorProductPatchMesh(XMin, YMin, XMax, YMax: Single; NumComponents: Integer; const Patches: array of Extended): AnsiString;
Syntaxe C++ :
AnsiString RegisterTensorProductPatchMesh(float XMin, float YMin, float XMax, float YMax, int NumComponents, const Extended* Patches, int PatchesElementCount);
Description
L’ombrage est émis comme un flux indirect avec /ShadingType 7, /BitsPerCoordinate 16, /BitsPerComponent 8 et /BitsPerFlag 8 Chaque patch est empaqueté comme 1 octet de drapeau (toujours 0 pour les patches indépendants) suivi de 16 points de contrôle (chacun 4 octets : 2 X big-endian + 2 Y big-endian, dans l’ordre de flux décrit ci-dessous) et de 4 couleurs de coin (chacune NumComponents octets), soit 1 + 64 + 4 * NumComponents octets par patch
Les 16 points de contrôle forment une grille 4 x 4 p[i][j] avec i = indice de ligne (0 = haut visuel / YMax, 3 = bas visuel / YMin) et j = indice de colonne (0 = gauche / XMin, 3 = droite / XMax) L’ordre de flux de la spécification (Table 88) parcourt d’abord les 12 points de bordure dans le sens horaire (ligne du haut gauche vers droite, colonne de droite haut vers bas, ligne du bas droite vers gauche, colonne de gauche bas vers haut), puis énumère les 4 points internes dans l’ordre horaire en partant du point interne en haut à gauche : p[1][1], p[1][2], p[2][2], p[2][1] Le tableau Patches fourni par l’utilisateur suit exactement ce même ordre
Lorsque les 16 points de contrôle se trouvent sur une grille régulière 1/3 / 2/3 (points de bordure aux positions 1/3 / 2/3 le long de chaque arête, points internes aux intersections de grille internes (1/3, 1/3) / (2/3, 1/3) / (2/3, 2/3) / (1/3, 2/3)), la surface Bézier bicubique dégénère en plan plat et l’interpolation de couleur dégénère en bilinéaire - visuellement identique à RegisterCoonsPatchMesh avec des arêtes droites ou à RegisterFreeFormGouraudShading avec quatre sommets de coin
XMin, YMin, XMax, YMax - le rectangle d’espace utilisateur qui délimite les coordonnées encodées Ces quatre valeurs deviennent les quatre premières entrées de /Decode Placez-les dans les mêmes coordonnées d’espace utilisateur que celles dans lesquelles vous allez peindre - pour le Rectangle en coordonnées écran de HotPDF en (X, Y, W, H), le rectangle d’espace utilisateur PDF correspondant est (X, PageHeight - Y - H) à (X + W, PageHeight - Y)
NumComponents - nombre de composantes couleur par coin Passez 1 pour DeviceGray, 3 pour DeviceRGB ou 4 pour DeviceCMYK Toute autre valeur lève une exception
Patches - tableau plat de valeurs Extended Chaque patch contribue 32 + 4 * NumComponents valeurs : 32 flottants pour les 16 points de contrôle (X, Y, X, Y, ..., 16 paires dans l’ordre de flux de la spécification) suivis de 4 * NumComponents flottants pour les couleurs de coin (aux positions p[0][0] / p[0][3] / p[3][3] / p[3][0], en suivant l’ordre cyclique Coons) La longueur du tableau doit être un multiple positif de cette stride Tous les patches émis portent le drapeau = 0 (patch indépendant) ; les drapeaux de continuation 1 / 2 / 3 (partage d’arête avec le patch précédent) ne sont pas exposés dans cette surcharge pratique
Valeur de retour : un nom de motif généré automatiquement (Sh1, Sh2, ...) enregistré dans le dictionnaire Resources/Pattern de la page courante Renvoie une chaîne vide lorsque StrictVersionLock est activé et que la Version active est inférieure à PDF 1.3 (sinon la version du document passe automatiquement à 1.3)
Exemple de code
// Single bilinear-equivalent tensor-product patch covering a 200x200
// quad. All 16 control points sit on the 1/3 / 2/3 lattice =>
// bicubic surface degenerates to bilinear; four corner colours
// red / green / yellow / blue
var
Doc: THotPDF;
PatName: AnsiString;
Patches: array[0..43] of Extended; // 16 ctrl pts * 2 + 4 corners * 3 = 44
H, XMin, YMin, XMax, YMax: Single;
XThird, X2Third, YThird, Y2Third: 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;
XThird := XMin + 200 / 3; X2Third := XMin + 2 * 200 / 3;
YThird := YMin + 200 / 3; Y2Third := YMin + 2 * 200 / 3;
// Spec stream order: top row LtoR, right column TtoB, bottom row RtoL,
// left column BtoT, then interior 4 clockwise starting at p[1][1]
Patches[ 0] := XMin; Patches[ 1] := YMax; // p[0][0] TL
Patches[ 2] := XThird; Patches[ 3] := YMax; // p[0][1]
Patches[ 4] := X2Third; Patches[ 5] := YMax; // p[0][2]
Patches[ 6] := XMax; Patches[ 7] := YMax; // p[0][3] TR
Patches[ 8] := XMax; Patches[ 9] := Y2Third; // p[1][3]
Patches[10] := XMax; Patches[11] := YThird; // p[2][3]
Patches[12] := XMax; Patches[13] := YMin; // p[3][3] BR
Patches[14] := X2Third; Patches[15] := YMin; // p[3][2]
Patches[16] := XThird; Patches[17] := YMin; // p[3][1]
Patches[18] := XMin; Patches[19] := YMin; // p[3][0] BL
Patches[20] := XMin; Patches[21] := YThird; // p[2][0]
Patches[22] := XMin; Patches[23] := Y2Third; // p[1][0]
Patches[24] := XThird; Patches[25] := Y2Third; // p[1][1]
Patches[26] := X2Third; Patches[27] := Y2Third; // p[1][2]
Patches[28] := X2Third; Patches[29] := YThird; // p[2][2]
Patches[30] := XThird; Patches[31] := YThird; // p[2][1]
// 4 corner colours at p[0][0] / p[0][3] / p[3][3] / p[3][0]
Patches[32] := 1.0; Patches[33] := 0.0; Patches[34] := 0.0; // red
Patches[35] := 0.0; Patches[36] := 1.0; Patches[37] := 0.0; // green
Patches[38] := 1.0; Patches[39] := 1.0; Patches[40] := 0.0; // yellow
Patches[41] := 0.0; Patches[42] := 0.0; Patches[43] := 1.0; // blue
PatName := Doc.RegisterTensorProductPatchMesh(
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;
Voir aussi
RegisterCoonsPatchMesh, RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, Version, Prise en charge des filtres PDF
|