THotPDF.RegisterLatticeFormGouraudShading 메서드

 

THotPDF.RegisterLatticeFormGouraudShading

THotPDF

 

Top

PDF 1.3+ lattice-form Gouraud 셰이딩 삼각형 메시 셰이딩(ISO 32000-1 8.7.4.5.5, /ShadingType 5)을 선언하고, 페이지 Resources/Pattern 사전 안의 인라인 Pattern Type 2 항목으로 감쌉니다. 렌더러가 인접한 두 행마다 자동으로 삼각형 스트립으로 삼각분할하므로 호출자는 꼭짓점 그리드만 넘기면 됩니다. 지형, FEA 결과, 과학용 히트맵처럼 원본 데이터가 이미 규칙적인 샘플 그리드에 놓여 있을 때 유용합니다. 삼각분할이 불규칙하고 삼각형별 플래그가 필요하면 대신 RegisterFreeFormGouraudShading을 사용하세요.

 

Delphi syntax:

function RegisterLatticeFormGouraudShading(XMin, YMin, XMax, YMax: Single; NumComponents: Integer; VerticesPerRow: Integer; const Vertices: array of Extended): AnsiString;

 

C++ syntax:

AnsiString RegisterLatticeFormGouraudShading(float XMin, float YMin, float XMax, float YMax, int NumComponents, int VerticesPerRow, const Extended* Vertices, int VertexElementCount);

 

Description

셰이딩은 /ShadingType 5, /BitsPerCoordinate 16, /BitsPerComponent 8, /VerticesPerRow N을 갖는 indirect 스트림으로 출력됩니다. Type 4와 달리 꼭짓점별 플래그 바이트가 없고 셰이딩 사전에 /BitsPerFlag도 없습니다. 각 꼭짓점은 4 + NumComponents바이트(big-endian X 2바이트 + big-endian Y 2바이트 + 색 성분 N개)를 차지합니다. /Decode 배열은 16비트 좌표를 전달된 [XMin, XMax] x [YMin, YMax] user-space 사각형으로, 각 색 성분을 [0, 1]로 되돌려 매핑합니다.

꼭짓점은 행 우선으로 정렬합니다. 처음 VerticesPerRow개가 행 0, 다음 VerticesPerRow개가 행 1을 이루는 식입니다. 렌더러는 인접한 두 행(행 i와 행 i+1)을 삼각형 스트립으로 연결하며, 플래그도 명시적 삼각형 목록도 없습니다. Extended 값을 Vertices로 전달할 때 그 개수는 (2 + NumComponents) * VerticesPerRow의 배수여야 하고, 그 결과 행 수는 2 이상이어야 합니다.

 

XMin, YMin, XMax, YMax - lattice의 경계가 되는 user-space 사각형입니다. 이 네 값이 /Decode의 처음 네 항목이 됩니다. 실제로 그릴 user-space 좌표와 같은 좌표계로 지정하세요. HotPDF의 화면 좌표 Rectangle (X, Y, W, H)에 대응하는 PDF user-space 사각형은 (X, PageHeight - Y - H)에서 (X + W, PageHeight - Y)까지입니다.

NumComponents - 꼭짓점당 색 성분 수입니다. DeviceGray는 1, DeviceRGB는 3, DeviceCMYK는 4를 전달하세요. 다른 값은 예외를 발생시킵니다.

VerticesPerRow - lattice 행당 꼭짓점 수 N이며, N >= 2입니다. 사전 항목 /VerticesPerRow에 이 값이 그대로 들어갑니다. 행 수 M은 배열 길이에서 VertexCount / VerticesPerRow로 추정되며 2 이상이어야 합니다.

Vertices - Extended 값의 평탄한 배열이며, 꼭짓점마다 (X, Y, c1...cN) 순서를 갖고 행 우선(행 0 먼저, 그다음 행 1, ...)으로 반복됩니다. 좌표는 [XMin, XMax] x [YMin, YMax]로 클램프한 뒤 16비트 정수로 양자화하고, 색 성분은 [0, 1]로 클램프한 뒤 8비트 정수로 양자화합니다.

 

반환 값: 자동 생성된 패턴 이름(Sh1, Sh2, ...)이며, 현재 페이지의 Resources/Pattern 사전에 등록됩니다. StrictVersionLock이 켜져 있고 현재 Version이 PDF 1.3 미만이면 빈 문자열을 반환합니다(그렇지 않으면 문서 버전이 1.3으로 자동 상향됩니다).

 

Code Example

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

 

See Also

RegisterFreeFormGouraudShading, RegisterDeviceN, RegisterSeparation, RegisterLabColorSpace, Version, PDF Filter Support