|
PDF 1.3+ Coons patch mesh shading (ISO 32000-1 8.7.4.5.6, /ShadingType 6) bildirir ve bunu sayfanın Resources/Pattern sözlüğünde inline Pattern Type 2 girdisi olarak sarar. Her patch dört cubic Bezier curve ile sınırlanır ve köşe başına bir renk taşır; renderer Coons surface değerini dört edge arasına uydurarak keyfi eğriliğe sahip renk taşıyan quad üretir. Straight-edge triangle meshler (RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading) curved boundaryleri yaklaşıklaştırmak için çok sayıda triangle gerektirdiğinde kullanın - bent pathler üzerindeki foil ve metallic gradientler, SVG-derived gradient meshler ve curved edge içeren her quad için.
Delphi sözdizimi:
function RegisterCoonsPatchMesh(XMin, YMin, XMax, YMax: Single; NumComponents: Integer; const Patches: array of Extended): AnsiString;
C++ sözdizimi:
AnsiString RegisterCoonsPatchMesh(float XMin, float YMin, float XMax, float YMax, int NumComponents, const Extended* Patches, int PatchesElementCount);
Açıklama
Shading, /ShadingType 6, /BitsPerCoordinate 16, /BitsPerComponent 8 ve /BitsPerFlag 8 ile indirect stream olarak yayılır. Her patch 1 flag byte (independent patchler için her zaman 0), ardından 12 kontrol noktası (her biri 4 byte: 2 big-endian X + 2 big-endian Y) ve 4 köşe rengi (her biri NumComponents byte) olarak paketlenir; patch başına toplam 1 + 48 + 4 * NumComponents byte. /Decode arrayi 16-bit koordinatları sağlanan [XMin, XMax] x [YMin, YMax] user-space dikdörtgenine ve her renk componentini [0, 1] aralığına geri map eder.
The 12 control points are numbered c1..c12 in clockwise order around the patch boundary starting from corner 1. The four corners are c1 / c4 / c7 / c10, and the remaining eight (c2, c3 between c1 and c4; c5, c6 between c4 and c7; c8, c9 between c7 and c10; c11, c12 between c10 and c1) are the inner Bezier handles of each cubic edge. When the inner handles sit at 1/3 and 2/3 along the straight line between adjacent corners, the Coons surface degenerates to bilinear interpolation - visually equivalent to a 4-vertex Type 4 mesh.
XMin, YMin, XMax, YMax - encoded koordinatları sınırlayan user-space dikdörtgeni. Bu dört değer /Decode içindeki ilk dört entry olur. Bu dikdörtgen dışındaki control pointler encoding sırasında clamp edilir. Bunları boyayacağınız aynı user-space koordinatlarına yerleştirin - HotPDF'nin (X, Y, W, H) ekran koordinatlı Rectangle değeri için eşleşen PDF user-space dikdörtgeni (X, PageHeight - Y - H) ile (X + W, PageHeight - Y) arasıdır.
NumComponents - köşe başına renk component sayısı. DeviceGray için 1, DeviceRGB için 3 veya DeviceCMYK için 4 geçirin. Başka her değer exception oluşturur.
Patches - Extended değerlerinden oluşan flat array. Her patch 24 + 4 * NumComponents değer ekler: 12 control point için 24 float (X, Y, X, Y, ..., c1..c12 clockwise order içinde 12 çift), ardından corner colour için 4 * NumComponents float (corner 1 / 2 / 3 / 4 = c1 / c4 / c7 / c10 cyclic order). Array length bu stride değerinin pozitif katı olmalıdır. Yayılan tüm patchler flag = 0 (independent patch) taşır; continuation flagleri 1 / 2 / 3 (önceki patch ile edge sharing) bu convenience overload içinde açığa çıkarılmaz.
Dönüş değeri: geçerli sayfanın Resources/Pattern sözlüğüne kaydedilen otomatik üretilmiş pattern adı (Sh1, Sh2, ...). StrictVersionLock açıkken ve aktif Version PDF 1.3 altındayken boş string döndürür (aksi halde belge sürümü otomatik olarak 1.3 değerine yükselir).
Kod Örneği
// 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;
Ayrıca bkz.
RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, RegisterDeviceN, Version, PDF Filter Support
|