THotPDF.RegisterSampledFunction-metodi

THotPDF.RegisterSampledFunction

THotPDF

Ylös

Ilmoittaa PDF 1.3+ Function Type 0 (Sampled) epäsuoran virtalähdeobjektin (ISO 32000-1 7.10.2). Näytefunktiot (sampled functions) ilmaisevat mielivaltaisen syöte-ulostulo-kartoituksen säännöllisenä N-ulotteisena ruudukkona M-ulotteisia ulostulonäytteitä; renderöijä interpoloi lineaarisesti ruudukon pisteiden välillä arvioidakseen välituloksia. Käytä tätä, kun ICC-profiilikoneisto on liioittelua, mutta halutaan käsin säädetty hakutaulukko - sävykäyrät /TransferFunction-kohteelle (ExtGState /TR), näytetyt sävymuunnokset kohteelle /Separation tai /DeviceN (vaihtoehto lineaarisille Type 2- / aritmeettisille Type 4 -poluille), rasterikynnyksen käyrät tai mikä tahansa muu PDF-rakenne, joka hyväksyy Function-sanakirjan

Delphi syntax:

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++ syntax:

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

Kuvaus

Funktio tuotetaan epäsuorana virtana, jossa on /FunctionType 0, annetut /Domain-, /Range-, /Size-, /BitsPerSample- ja /Order-merkinnät sekä raaka bittipakattu näytevirta. /Encode ja /Decode jätetään pois, joten määrityksen oletusarvot pätevät: /Encode kartoittaa jokaisen Domain-päätepisteen ruudukon ulottuvuuksiin [0..Size[i]-1], ja /Decode vastaa kohdetta /Range (näytteet puretaan kokonaisluvuiksi ja kartoitetaan lineaarisesti takaisin Range-päätepisteisiin). Monisyötteisille funktioille näytetavujen järjestys noudattaa PDF 1.7 -sääntöä "syötteen koordinaatit kasvavat nopeimmin ensimmäisen syöteulottuvuuden mukaan", eli tavujen siirtymä ruudukon pisteelle (i_0, i_1, ..., i_{N-1}) M ulostulolla on ((((i_{N-1} * Size[N-2] + i_{N-2}) * ...) * Size[0] + i_0) * M * BitsPerSample / 8

Order - valinnainen, oletus 1. Hyväksyy arvon 1 (lineaarinen interpolointi, PDF 1.7 -oletus) tai 3 (kuutiollinen spline-interpolointi) standardin PDF 1.7 taulukon 38 mukaisesti. Kuutiollinen tuottaa tasaisemmat siirtymät alhaisissa näyteruudukon tiheyksissä (esim. 17 pisteen ICC-sävykäyrät), mutta jotkut vanhemmat mobiililukijat siirtyvät hiljaa käyttämään lineaarista kohdatessaan Order-arvon, jota ne eivät toteuta. Saatavilla HotPDF v2.54.0 alkaen

ASCII-syötteen käyttötapauksissa - tyypillinen luontipolku - yksittäinen 1-syötteinen / M-ulostuloinen funktio arvoilla BitsPerSample = 8 ja Size = [256] antaa 256-näytteisen LUT-taulukon, jonka virta on tarkalleen 256 * M tavua asettelulla (o0_0, o1_0, ..., oM-1_0, o0_1, ..., oM-1_255)

Domain – 2N Single-arvoa, järjestettynä [in0Min in0Max in1Min in1Max ...]. Funktio rajoittaa saapuvat arvot tälle välille ennen interpolointia. N määritetään kaavalla Length(Domain) div 2

Range - 2M Single-arvoa, joilla on sama muoto M-lähtöulottuvuuksille; lähtönäytteet rajataan tälle alueelle dekoodauksen jälkeen

Size - N kokonaislukua, jotka antavat ruudukonpisteiden määrän kutakin syöteakselia kohti. Lausekkeen Length(Size) on oltava yhtä suuri kuin N. Ruudukonpisteiden kokonaismäärä on kaikkien Size-merkintöjen tulo

BitsPerSample – jokin arvoista 1, 2, 4, 8, 12, 16, 24 tai 32 standardin PDF 1.7 Table 38 mukaan. 8 on ergonominen valinta (raaka tavuvirta); arvot välillä 16 ja 32 ovat tavukohdistettuja big-endian-leveyksiä; arvot 1 / 2 / 4 / 12 vaativat MSB-first-bittipakkausta, jossa viimeinen tavu nollatäytetään tavurajaan asti. Mikä tahansa muu arvo aiheuttaa poikkeuksen

Samples - raaka bittipakattu näytevuo. Pituuden on oltava vähintään ceil(GridPoints * M * BitsPerSample / 8) tavua. HotPDF kopioi annetut tavut sellaisenaan epäsuoraan virtakohteeseen; bittipakkauksen oikeellisuus on kutsujan vastuulla

Paluuarvo: epäsuora THPDFStreamObject, jotta kutsujat voivat liittää sen minne tahansa, missä Function-sanakirjaa odotetaan (yleensä välittämällä sen epäsuoran viitteen toiseen sanakirjaan AddValue-metodilla tai varjostuksen / Separation-rakentajalle). Dokumentin IndirectObjects-luettelo omistaa objektin, ja se vapautetaan dokumentin lopussa. Palauttaa arvon nil, kun StrictVersionLock on käytössä ja aktiivinen Version on alle PDF 1.3 (muussa tapauksessa dokumentin versio korotetaan automaattisesti arvoon 1.3)

Code Example

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

See Also

RegisterAxialGradient, RegisterDeviceN, RegisterSeparation, Version, PDF-suodatintuki