THotPDF.RegisterSampledFunction 메서드

 

THotPDF.RegisterSampledFunction

THotPDF

 

맨 위

PDF 1.3+ Function Type 0(Sampled) indirect stream object(ISO 32000-1 7.10.2)을 선언합니다. Sampled function은 임의의 input-to-output mapping을 M-dimensional output sample의 regular N-dimensional grid로 표현하며, renderer는 grid point 사이를 linear interpolation하여 intermediate input을 평가합니다. ICC profile machinery는 과하지만 hand-tuned lookup table이 필요한 경우에 사용하십시오. 예: /TransferFunction(ExtGState /TR)용 tone curve, /Separation 또는 /DeviceN용 sampled tint transform(linear Type 2 / arithmetic Type 4 path의 대안), halftone threshold curve, Function dictionary를 받는 기타 PDF construct

 

Delphi 구문:

function RegisterSampledFunction(const Domain: array of Single; const Range: array of Single; const Size: array of Integer; BitsPerSample: Integer; const Samples: array of byte; Order: Integer = 1): THPDFStreamObject;

 

C++ 구문:

THPDFStreamObject* RegisterSampledFunction(const float* Domain, int DomainCount, const float* Range, int RangeCount, const int* Size, int SizeCount, int BitsPerSample, const unsigned char* Samples, int SamplesCount, int Order = 1);

 

설명

The function is emitted as an indirect stream with /FunctionType 0, the supplied /Domain, /Range, /Size, /BitsPerSample and /Order entries, plus the raw bit-packed sample stream. /Encode and /Decode are omitted so the spec defaults apply: /Encode maps each Domain endpoint to grid extents [0..Size[i]-1], and /Decode matches /Range (samples are unpacked to integers and linearly remapped back to the Range endpoints). For multi-input functions the sample byte order follows the PDF 1.7 rule "input coordinates increase fastest along the first input dimension", i.e. the byte offset for grid point (i_0, i_1, ..., i_{N-1}) with M outputs is ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8.

Order - optional, default 1. Accepts 1 (linear interpolation, PDF 1.7 default) or 3 (cubic-spline interpolation) per PDF 1.7 Table 38. Cubic gives smoother transitions at low sample-grid densities (e.g. 17-point ICC tone curves) but some older mobile readers silently fall back to linear when they encounter an Order value they do not implement. Available since HotPDF v2.54.0.

For ASCII-input use cases - the typical authoring path - a single 1-input / M-output function with BitsPerSample = 8 and Size = [256] gives a 256-sample LUT whose stream is exactly 256 * M bytes laid out as (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255).

 

Domain - 2N Single values, ordered [in0Min in0Max in1Min in1Max ...]. The function clamps incoming values to this range before interpolation. N is determined from Length(Domain) div 2.

Range - M output dimension과 같은 shape의 2M Single value입니다. Output sample은 decoding 후 이 range로 clamp됩니다

Size - 각 input axis의 grid-point count를 제공하는 N개의 integer입니다. Length(Size)는 N과 같아야 합니다. Total grid point는 모든 Size entry의 곱입니다

BitsPerSample - one of 1, 2, 4, 8, 12, 16, 24, or 32 per PDF 1.7 Table 38. 8 is the ergonomic choice (raw byte stream); 16 through 32 are byte-aligned big-endian widths; 1 / 2 / 4 / 12 require MSB-first bit packing with the final byte zero-padded to a byte boundary. Any other value raises an exception.

Samples - raw bit-packed sample stream입니다. Length는 최소 ceil(GridPoints * M * BitsPerSample / 8) byte여야 합니다. HotPDF는 제공된 byte를 indirect stream object에 그대로 복사하며, bit-pack correctness는 호출자의 책임입니다

 

반환 값: Function dictionary가 필요한 곳에 attach할 수 있는 indirect THPDFStreamObject입니다. 일반적으로 AddValue를 통해 indirect reference를 다른 dict에 전달하거나 shading / separation builder에 전달합니다. Object는 document의 IndirectObjects list가 소유하며 document 종료 시 해제됩니다. StrictVersionLock이 켜져 있고 active Version이 PDF 1.3보다 낮으면 nil을 반환합니다. 그렇지 않으면 document version이 1.3으로 auto-bump됩니다

 

Code Example

// 256-sample 1-input / 3-output (RGB) heatmap LUT. The LUT maps a
// scalar t in [0..1] to a blue -> green -> red gradient through the
// midpoint
uses
  HPDFObjs;

var
  Func: THPDFStreamObject;
  Domain: array[0..1] of Single;
  Range: array[0..5] of Single;
  Size: array[0..0] of Integer;
  Samples: array[0..767] of byte;   // 256 grid points * 3 outputs
  I: Integer;
  T: Single;
begin
  HPDF.BeginDoc;
  // 1 input dim: t in [0..1]
  Domain[0] := 0; Domain[1] := 1;
  // 3 output dims: each in [0..1]
  Range[0] := 0; Range[1] := 1;
  Range[2] := 0; Range[3] := 1;
  Range[4] := 0; Range[5] := 1;
  // 256 sample points along the single input axis
  Size[0] := 256;

  for I := 0 to 255 do
  begin
    T := I / 255.0;
    if T < 0.5 then
    begin
      Samples[I*3 + 0] := 0;
      Samples[I*3 + 1] := byte(Round(2.0 * T * 255.0));
      Samples[I*3 + 2] := byte(Round((1.0 - 2.0*T) * 255.0));
    end
    else
    begin
      Samples[I*3 + 0] := byte(Round(2.0 * (T - 0.5) * 255.0));
      Samples[I*3 + 1] := byte(Round((1.0 - 2.0*(T - 0.5)) * 255.0));
      Samples[I*3 + 2] := 0;
    end;
  end;
  Func := HPDF.RegisterSampledFunction(Domain, Range, Size, 8, Samples);
  // Func is now an indirect THPDFStreamObject the caller can attach
  // to any PDF dict slot that accepts a Function reference
  HPDF.EndDoc;
end;

 

See Also

RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, PDF Filter Support