|
Déclare un espace colorimétrique Separation PDF 1.3+ (ISO 32000-1 8.6.6.4) dont la transformation de teinte est une table de consultation échantillonnée Function Type 0 (ISO 32000-1 7.10.2). Utilisez-la lorsque la courbe de couleur de l'encre de ton direct n'est pas linéaire - rampes de teinte à la manière de PANTONE Hexachrome, courbes de densité corrigées gamma, courbes de tons dessinées à la main correspondant à la caractérisation d'une presse, LUT ICC de conversion sRGB vers ton direct sans toute la machinerie de profil ICC. Pour la rampe linéaire simple allant de zéro à une seule couleur finale à pleine intensité, le point d'entrée v2.45.0 RegisterSeparation s'applique toujours
Syntaxe Delphi :
function RegisterSeparationLUT(const ColorantName: AnsiString; const AlternateCS: AnsiString; const Samples: array of byte): AnsiString;
Syntaxe C++ :
AnsiString RegisterSeparationLUT(const AnsiString& ColorantName, const AnsiString& AlternateCS, const unsigned char* Samples, int SamplesCount);
Description
HotPDF appelle en interne RegisterSampledFunction pour construire le flux Function Type 0 avec /Domain [0 1], /Range couvrant chaque canal alt-CS dans [0, 1], /Size [S] où S = Length(Samples) / M, /BitsPerSample 8 et /Order 1 (interpolation linéaire). La fonction est branchée dans un nouveau tableau d'espace colorimétrique [/Separation /ColorantName /AltCS <FuncRef>] partagé entre les pages, selon la même structure que RegisterSeparation - les chemins de code SetFillColorSpace + SetFillColor ne voient aucun changement d'API entre les deux variantes d'enregistrement
ColorantName - nom PDF de l'encre (par exemple 'PANTONE 185 C', 'CutContour', 'White'). Les espaces sont échappés en #20 selon PDF 1.7 7.3.5 par le chemin d'écriture de nom existant
AlternateCS - 'DeviceGray' (M = 1), 'DeviceRGB' (M = 3) ou 'DeviceCMYK' (M = 4). Le flux d'échantillons fournit M octets de sortie par point de grille. Toute autre valeur déclenche une exception
Samples - octets d'échantillon bruts 8 bits ordonnés (c0_0, c1_0, ..., cM-1_0, c0_1, ..., cM-1_S-1) pour S points de grille. Length(Samples) doit être un multiple positif de M ; S est déduit comme Length(Samples) / M et doit valoir au moins 2 pour que la fonction dispose d'une plage interpolable. L'interpolation linéaire entre les points de grille est le comportement par défaut (PDF 1.7 /Order 1)
Valeur de retour : un nom d'espace colorimétrique généré automatiquement (Sep1, Sep2, ...). L'entrée Separation est partagée avec le registre v2.45.0 RegisterSeparation, de sorte que les noms s'incrémentent de manière monotone entre les deux variantes. Renvoie une chaîne vide lorsque StrictVersionLock est activé et que la Version courante est inférieure à PDF 1.3 (sinon la version du document est relevée automatiquement à 1.3)
Exemple de code
// 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;
Voir aussi
RegisterSeparation, RegisterSampledFunction, RegisterDeviceN, Version, Prise en charge des filtres PDF
|