THotPDF.RegisterSeparationLUT Method

 

THotPDF.RegisterSeparationLUT

THotPDF

 

Top

Declares a PDF 1.3+ Separation colour space (ISO 32000-1 8.6.6.4) whose tint transform is a Function Type 0 sampled lookup table (ISO 32000-1 7.10.2). Use this when the spot-ink colour curve is non-linear - PANTONE Hexachrome-style tint ramps, gamma-corrected density curves, hand-drawn tone curves matching a press characterisation, sRGB-to-spot conversion ICC LUTs without the full ICC profile machinery. For the simple linear ramp from zero to a single full-strength colour endpoint, the v2.45.0 RegisterSeparation entry point still applies.

 

Delphi syntax:

function RegisterSeparationLUT(const ColorantName: AnsiString; const AlternateCS: AnsiString; const Samples: array of byte): AnsiString;

 

C++ syntax:

AnsiString RegisterSeparationLUT(const AnsiString& ColorantName, const AnsiString& AlternateCS, const unsigned char* Samples, int SamplesCount);

 

Description

HotPDF internally calls RegisterSampledFunction to build the Function Type 0 stream with /Domain [0 1], /Range covering each alt-CS channel in [0, 1], /Size [S] where S = Length(Samples) / M, /BitsPerSample 8 and /Order 1 (linear interpolation). The function is wired into a fresh [/Separation /ColorantName /AltCS <FuncRef>] colour-space array shared across pages, matching the layout RegisterSeparation produces - downstream SetFillColorSpace + SetFillColor code paths see no API surface change between the two registrar variants.

 

ColorantName - PDF Name of the ink (e.g. 'PANTONE 185 C', 'CutContour', 'White'). Spaces are escaped to #20 per PDF 1.7 7.3.5 by the existing name-writer path.

AlternateCS - 'DeviceGray' (M = 1), 'DeviceRGB' (M = 3), or 'DeviceCMYK' (M = 4). The sample stream supplies M output bytes per grid point. Any other value raises an exception.

Samples - raw 8-bit sample bytes ordered (c0_0, c1_0, ..., cM-1_0, c0_1, ..., cM-1_S-1) for S grid points. Length(Samples) must be a positive multiple of M; S is inferred as Length(Samples) / M and must be at least 2 so the function has interpolable range. Linear interpolation between grid points is the default (PDF 1.7 /Order 1).

 

Return value: an auto-generated colour-space name (Sep1, Sep2, ...). The Separation entry is shared with the v2.45.0 RegisterSeparation registry, so names increment monotonically across the two variants. Returns an empty string when StrictVersionLock is on and the active Version is below PDF 1.3 (otherwise the document version auto-bumps to 1.3).

 

Code Example

// Register a 'HeatLUT' Separation over DeviceRGB whose tint -> RGB
// curve is a 256-sample blue -> green -> red heatmap.
var
  CSName: AnsiString;
  Samples: array[0..767] of byte;     // 256 * 3 RGB
  I: Integer;
  T: Single;
begin
  HPDF.BeginDoc;
  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;
  CSName := HPDF.RegisterSeparationLUT('HeatLUT', 'DeviceRGB', Samples);
  HPDF.CurrentPage.SetFillColorSpace(CSName);
  HPDF.CurrentPage.SetFillColor([0.5]);    // midpoint -> pure green
  HPDF.CurrentPage.Rectangle(100, 100, 40, 40);
  HPDF.CurrentPage.Fill;
  HPDF.EndDoc;
end;

 

See Also

RegisterSeparation, RegisterSampledFunction, RegisterDeviceN, Version, PDF Filter Support