THotPDF.RegisterSampledFunction Méthode

 

THotPDF.RegisterSampledFunction

THotPDF

 

Haut

Déclare un objet de flux indirect de type Function Type 0 (Sampled) pour PDF 1.3+ (ISO 32000-1 7.10.2). Les fonctions échantillonnées expriment une correspondance arbitraire entrée-vers-sortie sous forme d'une grille régulière N dimensionnelle d'échantillons de sortie M dimensionnels; le moteur de rendu interpole linéairement entre les points de grille pour évaluer les entrées intermédiaires. Utilisez cette fonction lorsque l'infrastructure de profil ICC serait excessive mais qu'une table de consultation ajustée manuellement est souhaitée - courbes de tonalité pour /TransferFunction (ExtGState /TR), transformations de teinte échantillonnées pour /Separation ou /DeviceN (alternative aux chemins linéaires Type 2 / arithmétiques Type 4), courbes de seuil de demi-teinte ou tout autre objet PDF qui accepte un dictionnaire Function

 

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

 

Syntaxe 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);

 

Description

La fonction est émise sous forme de flux indirect avec les entrées /FunctionType 0, /Domain, /Range, /Size, /BitsPerSample et /Order fournies, plus le flux brut d'échantillons empaquetés au niveau des bits. /Encode et /Decode sont omis afin que les valeurs par défaut de la spécification s'appliquent : /Encode mappe chaque extrémité de Domain vers les étendues de grille [0..Size[i]-1], et /Decode correspond à /Range (les échantillons sont dépaquetés en entiers puis remappés linéairement vers les extrémités de Range). Pour les fonctions à plusieurs entrées, l'ordre des octets des échantillons suit la règle PDF 1.7 selon laquelle "les coordonnées d'entrée augmentent le plus vite le long de la première dimension d'entrée", c'est-à-dire que le décalage d'octet pour le point de grille (i_0, i_1, ..., i_{N-1}) avec M sorties est ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8

Order - optionnel, valeur par défaut 1. Accepte 1 (interpolation linéaire, valeur par défaut de PDF 1.7) ou 3 (interpolation par spline cubique) selon le tableau 38 de PDF 1.7. Le mode cubique donne des transitions plus douces à faible densité de grille d'échantillons (par exemple des courbes de tonalité ICC à 17 points), mais certains anciens lecteurs mobiles reviennent silencieusement à l'interpolation linéaire lorsqu'ils rencontrent une valeur Order qu'ils n'implémentent pas. Disponible depuis HotPDF v2.54.0

Pour les cas d'utilisation à entrée ASCII - le parcours de création habituel - une seule fonction à 1 entrée / M sorties avec BitsPerSample = 8 et Size = [256] donne une LUT de 256 échantillons dont le flux fait exactement 256 * M octets, disposés comme (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255)

 

Domain - 2N valeurs Single, ordonnées [in0Min in0Max in1Min in1Max ...]. La fonction limite les valeurs entrantes à cette plage avant interpolation. N est déterminé par Length(Domain) div 2

Range - 2M valeurs Single avec la même forme pour les M dimensions de sortie; les échantillons de sortie sont limités à cette plage après décodage

Size - N entiers donnant le nombre de points de grille sur chaque axe d'entrée. Length(Size) doit être égal à N. Le nombre total de points de grille est le produit de toutes les entrées Size

BitsPerSample - l'une des valeurs 1, 2, 4, 8, 12, 16, 24 ou 32 selon le tableau 38 de PDF 1.7. 8 est le choix ergonomique (flux d'octets bruts); 16 à 32 sont des largeurs alignées sur les octets en big-endian; 1 / 2 / 4 / 12 exigent un empaquetage des bits en commençant par le bit de poids fort, avec le dernier octet complété par des zéros jusqu'à la frontière d'octet. Toute autre valeur déclenche une exception

Samples - le flux brut d'échantillons empaquetés au niveau des bits. La longueur doit être d'au moins ceil(GridPoints * M * BitsPerSample / 8) octets. HotPDF copie les octets fournis à l'identique dans l'objet de flux indirect; la validité de l'empaquetage des bits relève de la responsabilité de l'appelant

 

Valeur de retour : l'THPDFStreamObject indirect afin que les appelants puissent le joindre partout où un dictionnaire Function est attendu (généralement en passant sa référence indirecte dans un autre dictionnaire via AddValue ou dans un générateur de dégradé / séparation). L'objet appartient à la liste IndirectObjects du document et est libéré à la fin du document. Renvoie nil lorsque StrictVersionLock est activé et que la Version active est inférieure à PDF 1.3, sinon la version du document passe automatiquement à 1.3

 

Exemple de code

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

 

Voir aussi

RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, Prise en charge des filtres PDF