THotPDF.RegisterSampledFunction Method

 

THotPDF.RegisterSampledFunction

THotPDF

 

Üst

PDF 1.2+ Function Type 0 (Sampled) dolaylı stream nesnesi bildirir (ISO 32000-1 7.10.2). Sampled işlevler, keyfi bir girdiden çıktıya eşlemeyi, M boyutlu çıktı örneklerinden oluşan düzenli bir N boyutlu ızgara olarak ifade eder; ara girdileri değerlendirmek için çizici ızgara noktaları arasında enterpolasyon yapar. ICC profili mekanizmasının fazla kaçtığı ama elle ayarlanmış bir arama tablosunun istendiği yerlerde bunu kullanın: /TransferFunction (ExtGState /TR) için ton eğrileri, /Separation veya /DeviceN için örneklenmiş tint dönüşümleri (doğrusal Type 2 / aritmetik Type 4 yollarının alternatifi), halftone eşik eğrileri veya Function sözlüğü kabul eden diğer herhangi bir PDF yapısı.

 

Delphi sözdizimi:

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++ sözdizimi:

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

 

Açıklama

İşlev, /FunctionType 0 ile birlikte verilen /Domain, /Range, /Size, /BitsPerSample ve /Order girdilerini ve ham bit paketli örnek stream'ini içeren bir dolaylı stream olarak yazılır. /Encode ve /Decode atlanır; böylece spec varsayılanları geçerli olur: /Encode her Domain ucunu ızgara sınırlarına [0..Size[i]-1] eşler, /Decode ise /Range ile eşleşir (örnekler tamsayıya açılır ve Range uçlarına doğru doğrusal olarak geri eşlenir). Çok girdili işlevlerde örnek bayt sırası, PDF 1.7'deki "girdi koordinatları ilk girdi boyunca en hızlı artar" kuralını izler; yani M çıktılı (i_0, i_1, ..., i_{N-1}) ızgara noktasının bayt ofseti ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8'dir.

Order - isteğe bağlı, varsayılan 1. PDF 1.7 Tablo 38 uyarınca 1 (doğrusal enterpolasyon, PDF 1.7 varsayılanı) veya 3 (kübik spline enterpolasyonu) kabul eder. Kübik, düşük örnek ızgara yoğunluklarında (örneğin 17 noktalı ICC ton eğrileri) daha yumuşak geçişler sağlar; ama bazı eski mobil okuyucular, uygulamadıkları bir Order değeriyle karşılaştıklarında sessizce doğrusala döner. HotPDF v2.54.0'dan beri mevcut.

ASCII girdili kullanım durumları için — tipik yazım yolu — BitsPerSample = 8 ve Size = [256] olan tek bir 1 girdili / M çıktılı işlev, stream'i tam olarak 256 * M bayt olan ve (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255) düzeninde dizilmiş 256 örnekli bir LUT verir.

 

Domain - [in0Min in0Max in1Min in1Max ...] sıralı 2N adet Single değer. İşlev, enterpolasyondan önce gelen değerleri bu aralığa kelepçeler. N, Length(Domain) div 2 üzerinden belirlenir.

Range - M çıktı boyutu için aynı biçimde 2M adet Single değer; çıktı örnekleri çözme işleminden sonra bu aralığa kelepçelenir.

Size - her girdi ekseni boyunca ızgara noktası sayısını veren N adet tamsayı. Length(Size), N'ye eşit olmalıdır. Toplam ızgara noktası sayısı, tüm Size girdilerinin çarpımıdır.

BitsPerSample - PDF 1.7 Tablo 38 uyarınca 1, 2, 4, 8, 12, 16, 24 veya 32'den biri. 8 en kullanışlı seçimdir (ham bayt stream'i); 16 ile 32 arası bayt hizalı big-endian genişliklerdir; 1 / 2 / 4 / 12, son baytı bayt sınırına kadar sıfırla doldurarak MSB-önce bit paketlemesi gerektirir. Diğer herhangi bir değer istisna fırlatır.

Samples - ham bit paketli örnek stream'i. Uzunluk, yalnızca gerektiğinde son bayt dolgusunu içermek kaydıyla ceil(GridPoints * M * BitsPerSample / 8) bayta eşit olmalıdır. HotPDF desteklenen her paketlenmiş derinliği doğrular ve verilen baytları dolaylı stream nesnesine birebir kopyalar; bit paketlemesinin doğruluğundan çağıran sorumludur.

Yüklenen sayfa değerlendirmesi; bir ila dört girdi ve çıktıyı, açık ileri veya ters /Encode'u, bağımsız /Decode'u, çok doğrusal /Order 1'i, çok boyutlu kübik /Order 3'ü ve tek boyutlu doğal kübik spline'ları destekler. Doğrulanmış örnek baytları ve enterpolasyon üst verisi, yinelenen tint, shading, yumuşak maske ve transfer işlevi çağrıları için sekiz girdili, 64 MiB'lik bir LRU'da tutulur. HotPDF v2.544.0'dan beri mevcut.

 

Dönüş değeri: dolaylı THPDFStreamObject; böylece çağıranlar, bir Function sözlüğünün beklendiği her yere ekleyebilir (tipik olarak dolaylı referansını AddValue ile başka bir sözlüğe ya da bir shading / separation kurucusuna geçirerek). Nesne, belgenin IndirectObjects listesine aittir ve belge sonunda serbest bırakılır. StrictVersionLock açıkken ve etkin Version PDF 1.2'nin altındayken nil döndürür (aksi hâlde belge sürümü otomatik olarak 1.2'ye yükselir).

 

Kod Örneği

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

 

Ayrıca bakın

RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, PDF filtre desteği