|
Объявляет цветовое пространство Separation в PDF 1.3+ (ISO 32000-1 8.6.6.4), у которого tint-преобразование — выборочная таблица Function Type 0 (ISO 32000-1 7.10.2). Используйте метод, когда цветовая кривая spot-краски нелинейна: tint-пандусы в стиле PANTONE Hexachrome, гамма-корректированные кривые плотности, рисованные тональные кривые под характеризацию печатной машины, ICC LUT конверсии sRGB в spot без полного ICC-механизма. Для простой линейной рампы от нуля до единственной конечной точки полной силы цвета по-прежнему годится RegisterSeparation из v2.45.0.
Синтаксис Delphi:
function RegisterSeparationLUT(const ColorantName: AnsiString; const AlternateCS: AnsiString; const Samples: array of byte): AnsiString;
Синтаксис C++:
AnsiString RegisterSeparationLUT(const AnsiString& ColorantName, const AnsiString& AlternateCS, const unsigned char* Samples, int SamplesCount);
Описание
Внутри HotPDF вызывает RegisterSampledFunction чтобы построить поток Function Type 0 с /Domain [0 1], /Range покрывающим каждый канал альтернативного CS в [0, 1], /Size [S], где S = Length(Samples) / M, /BitsPerSample 8 и /Order 1 (линейная интерполяция). Функция подключается в свежий [/Separation /ColorantName /AltCS <FuncRef>] массив цветового пространства, разделяемый между страницами, с той же компоновкой, что даёт RegisterSeparation, — нижележащий SetFillColorSpace + SetFillColor код не видит никаких изменений API-поверхности между двумя вариантами регистратора.
ColorantName — PDF Name краски (например, 'PANTONE 185 C', 'CutContour', 'White'). Пробелы экранируются как #20 согласно PDF 1.7 7.3.5 существующим путём записи имён.
AlternateCS - 'DeviceGray' (M = 1), 'DeviceRGB' (M = 3) или 'DeviceCMYK' (M = 4). Поток сэмплов подаёт M выходных байтов на точку сетки. Любое другое значение возбуждает исключение.
Samples — сырые 8-битные байты сэмплов в порядке (c0_0, c1_0, ..., cM-1_0, c0_1, ..., cM-1_S-1) для S точек сетки. Length(Samples) должна быть положительным кратным M; S выводится как Length(Samples) / M и должно быть не меньше 2, чтобы у функции был интерполируемый диапазон. Линейная интерполяция между точками сетки — значение по умолчанию (PDF 1.7 /Order 1).
Возвращаемое значение: автосгенерированное имя цветового пространства (Sep1, Sep2, ...). Запись Separation разделяет реестр с RegisterSeparation из v2.45.0, поэтому имена монотонно возрастают между двумя вариантами. Возвращает пустую строку, когда StrictVersionLock включён, а активная Версия ниже PDF 1.3 (иначе версия документа автоматически повышается до 1.3).
Пример кода
// 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;
См. также
RegisterSeparation, RegisterSampledFunction, RegisterDeviceN, Версия, Поддержка фильтров PDF
|