THotPDF.RegisterTensorProductPatchMesh Method

 

THotPDF.RegisterTensorProductPatchMesh

THotPDF

 

先頭

PDF 1.3+ のテンソル積パッチメッシュシェーディング(ISO 32000-1 8.7.4.5.7、/ShadingType 7)を宣言し、ページの Resources/Pattern ディクショナリーにインラインの Pattern Type 2 エントリーとして包み込みます。各パッチは双三次ベジエ制御点 p[i][j] の完全な 4 x 4 グリッド(境界 12 点 + 内部 4 点)と、角ごとの 1 色で構成されます。RegisterCoonsPatchMesh(Type 6)では内部の形状を表現できない場合、つまり SVG のメッシュグラデーションのラウンドトリップや、追加の 4 つの制御点でパッチ内部を曲げる必要があるアートワークで使ってください

 

Delphi 構文:

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

 

C++ 構文:

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

 

説明

シェーディングは、/ShadingType 7、/BitsPerCoordinate 16、/BitsPerComponent 8、/BitsPerFlag 8 を備えた間接ストリームとして出力されます。各パッチは 1 バイトのフラグ(独立パッチでは常に 0)に続き、16 個の制御点(各 4 バイト:2 バイトのビッグエンディアン X + 2 バイトのビッグエンディアン Y、後述の仕様のストリーム順)と 4 つの角の色(各 NumComponents バイト)としてパックされ、パッチあたり合計 1 + 64 + 4 * NumComponents バイトになります

16 個の制御点は 4 x 4 のグリッド p[i][j] を形成します。i は行インデックス(0 = 視覚上の上 / YMax、3 = 視覚上の下 / YMin)、j は列インデックス(0 = 左 / XMin、3 = 右 / XMax)です。仕様のストリーム順(Table 88)は、まず 12 個の境界点を時計回りにたどり(上の行は左から右、右の列は上から下、下の行は右から左、左の列は下から上)、次に 4 つの内部点を左上の内部点から始めて時計回りに列挙します。p[1][1], p[1][2], p[2][2], p[2][1] の順です。呼び出し側が渡す Patches 配列も、この同じ順にそのまま従います

16 個の制御点がすべて正規の 1/3 / 2/3 ラティス上に乗っている場合(境界点が各辺に沿って 1/3 / 2/3 の位置にあり、内部点が内側の (1/3, 1/3) / (2/3, 1/3) / (2/3, 2/3) / (1/3, 2/3) のグリッド交点にある)、双三次ベジエ曲面は平面へ退化し、色の補間は双線形へ退化します。これは直線辺の RegisterCoonsPatchMesh や、4 つの角の頂点を持つ RegisterFreeFormGouraudShading と見た目上同じになります

 

XMin, YMin, XMax, YMax - エンコードされる座標を囲むユーザー空間の矩形です。この 4 つの値が /Decode の先頭 4 エントリーになります。これから塗り込むのと同じユーザー空間座標に置いてください。HotPDF のスクリーン座標の Rectangle が (X, Y, W, H) のとき、対応する PDF ユーザー空間の矩形は (X, PageHeight - Y - H) から (X + W, PageHeight - Y) です

NumComponents - 角ごとのカラーコンポーネント数です。DeviceGray には 1、DeviceRGB には 3、DeviceCMYK には 4 を渡します。それ以外の値は例外を発生させます

Patches - Extended 値のフラット配列です。各パッチは 32 + 4 * NumComponents 個の値を渡します。16 個の制御点の 32 個の float(X, Y, X, Y, ...、仕様のストリーム順で 16 ペア)に続き、角の色の 4 * NumComponents 個の float(p[0][0] / p[0][3] / p[3][3] / p[3][0] の位置で、Coons の巡回順に一致)です。配列長はこのストライドの正の倍数でなければなりません。出力されるすべてのパッチは flag = 0(独立パッチ)です。連続フラグ 1 / 2 / 3(前のパッチとのエッジ共有)はこの簡易オーバーロードでは公開していません

 

戻り値: 自動生成のパターン名(Sh1、Sh2、...)。現在のページの Resources/Pattern 辞書に登録されます。StrictVersionLock がオンで、有効な Version が PDF 1.3 未満の場合は空文字列を返します(それ以外の場合、ドキュメントのバージョンは 1.3 に自動で引き上げられます)

 

コード例

// 200x200 の四角形を覆う、単一の双線形相当テンソル積パッチ。16 個の
// 制御点すべてが 1/3 / 2/3 ラティス上に乗るため =>
// 双三次曲面は双線形へ退化します。4 隅の色は
// 赤 / 緑 / 黄 / 青
var
  Doc: THotPDF;
  PatName: AnsiString;
  Patches: array[0..43] of Extended;   // 16 制御点 x 2 + 4 角 x 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;
    // 仕様のストリーム順:上の行は左から右、右の列は上から下、
// 下の行は右から左、左の列は下から上、その後内部 4 点を
// p[1][1] から始めて時計回りに
    Patches[ 0] := XMin;     Patches[ 1] := YMax;       // p[0][0] 左上
    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] 右上
    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] 右下
    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] 左下
    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 隅の色。p[0][0] / p[0][3] / p[3][3] / p[3][0] の順
    Patches[32] := 1.0; Patches[33] := 0.0; Patches[34] := 0.0;  // 赤
    Patches[35] := 0.0; Patches[36] := 1.0; Patches[37] := 0.0;  // 緑
    Patches[38] := 1.0; Patches[39] := 1.0; Patches[40] := 0.0;  // 黄
    Patches[41] := 0.0; Patches[42] := 0.0; Patches[43] := 1.0;  // 青
    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;

 

関連項目

RegisterCoonsPatchMesh, RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, Version, PDF フィルターサポート