THotPDF.RegisterTensorProductPatchMesh-metoden

 

THotPDF.RegisterTensorProductPatchMesh

THotPDF

 

Øverst

Deklarerer en tensorprodukt-patchmesh for PDF 1.3+ (ISO 32000-1 8.7.4.5.7, /ShadingType 7) og pakker den inn i en innebygd Pattern Type 2-oppføring i sidens Resources/Pattern-ordbok. Hver patch er et fullt 4 x 4-rutenett av bikubiske Bezier-kontrollpunkter p[i][j] (12 randpunkter + 4 indre) pluss én farge per hjørne. Bruk dette når RegisterCoonsPatchMesh (Type 6) ikke kan uttrykke den indre formen - SVG-mesh-gradient-runde-reiser og annet materiale som trenger de fire ekstra kontrollpunktene for å bøye patchens indre

 

Delphi-syntaks:

function RegisterTensorProductPatchMesh(XMin, YMin, XMax, YMax: Single; NumComponents: Integer; const Patches: array of Extended): AnsiString;

 

C++-syntaks:

AnsiString RegisterTensorProductPatchMesh(float XMin, float YMin, float XMax, float YMax, int NumComponents, const Extended* Patches, int PatchesElementCount);

 

Beskrivelse

Shadingen sendes som en indirekte strøm med /ShadingType 7, /BitsPerCoordinate 16, /BitsPerComponent 8 og /BitsPerFlag 8. Hver patch pakkes som 1 flaggbyte (alltid 0 for uavhengige patcher), fulgt av 16 kontrollpunkter (hver på 4 byte: 2 big-endian X + 2 big-endian Y, i strømrekkefølgen som er beskrevet nedenfor) og 4 hjørnefarger (hver på NumComponents byte), til sammen 1 + 64 + 4 * NumComponents byte per patch

De 16 kontrollpunktene danner et 4 x 4-rutenett p[i][j] der i er radindeks (0 = visuell topp / YMax, 3 = visuell bunn / YMin) og j er kolonneindeks (0 = venstre / XMin, 3 = høyre / XMax). Strømrekkefølgen i spesifikasjonen (tabell 88) går først gjennom de 12 randpunktene med klokken (øverste rad venstre mot høyre, høyre kolonne topp mot bunn, nederste rad høyre mot venstre, venstre kolonne bunn mot topp), og lister deretter de 4 indre punktene i klokkeretning fra det øvre venstre indre punktet: p[1][1], p[1][2], p[2][2], p[2][1]. Brukerens Patches-tabell følger denne samme rekkefølgen ord for ord

Når alle 16 kontrollpunkter ligger på et vanlig 1/3 / 2/3-rutenett (randpunktene ved 1/3 / 2/3 langs hver kant, indre punkter ved de indre rutenettkryssene (1/3, 1/3) / (2/3, 1/3) / (2/3, 2/3) / (1/3, 2/3)), degenererer den bikubiske Bezier-flaten til et flatt plan og fargeinterpolasjonen degenererer til bilinear - visuelt identisk med RegisterCoonsPatchMesh med rette kanter eller RegisterFreeFormGouraudShading med fire hjørnevertekser

 

XMin, YMin, XMax, YMax - brukerroms-rektangelet som avgrenser de kodede koordinatene. Disse fire verdiene blir de fire første oppføringene i /Decode. Angi dem i de samme brukerromskoordinatene som du skal tegne inn i - for HotPDFs skjermkoordinat-Rectangle ved (X, Y, W, H) er det tilsvarende PDF-brukerromsrektangelet (X, PageHeight - Y - H) til (X + W, PageHeight - Y)

NumComponents - antall fargekomponenter per hjørne. Send inn 1 for DeviceGray, 3 for DeviceRGB eller 4 for DeviceCMYK. Alle andre verdier utløser et unntak

Patches - flat tabell med Extended-verdier. Hver patch bidrar med 32 + 4 * NumComponents verdier: 32 flyttall for de 16 kontrollpunktene (X, Y, X, Y, ..., 16 par i strømrekkefølgen i spesifikasjonen) fulgt av 4 * NumComponents flyttall for hjørnefargene (ved p[0][0] / p[0][3] / p[3][3] / p[3][0], i samsvar med Coons' sykliske rekkefølge). Tabellens lengde må være et positivt multiplum av denne steglengden. Alle sendte patcher har flagg = 0 (uavhengig patch); fortsettelsesflagg 1 / 2 / 3 (kantdeling med forrige patch) er ikke eksponert i denne praktiske overlasten

 

Returverdi: et automatisk generert mønster-navn (Sh1, Sh2, ...) registrert i den aktive sidens Resources/Pattern-ordbok. Returnerer en tom streng når StrictVersionLock er på og aktiv Version er under PDF 1.3 (ellers oppgraderes dokumentversjonen automatisk til 1.3)

 

Kodeeksempel

// Single bilinear-equivalent tensor-product patch covering a 200x200
// quad. All 16 control points sit on the 1/3 / 2/3 lattice =>
// bicubic surface degenerates to bilinear; four corner colours
// red / green / yellow / blue
var
  Doc: THotPDF;
  PatName: AnsiString;
  Patches: array[0..43] of Extended;   // 16 ctrl pts * 2 + 4 corners * 3 = 44
  H, XMin, YMin, XMax, YMax: Single;
  XThird, X2Third, YThird, Y2Third: Single;
begin
  Doc := THotPDF.Create(nil);
  try
    Doc.Version := pdf14;
    Doc.BeginDoc;
    H := Doc.CurrentPage.Height;
    XMin := 0; YMin := H - 200; XMax := 200; YMax := H;
    XThird  := XMin + 200 / 3;     X2Third := XMin + 2 * 200 / 3;
    YThird  := YMin + 200 / 3;     Y2Third := YMin + 2 * 200 / 3;
    // Spec stream order: top row LtoR, right column TtoB, bottom row RtoL,
    // left column BtoT, then interior 4 clockwise starting at p[1][1]
    Patches[ 0] := XMin;     Patches[ 1] := YMax;       // p[0][0] TL
    Patches[ 2] := XThird;   Patches[ 3] := YMax;       // p[0][1]
    Patches[ 4] := X2Third;  Patches[ 5] := YMax;       // p[0][2]
    Patches[ 6] := XMax;     Patches[ 7] := YMax;       // p[0][3] TR
    Patches[ 8] := XMax;     Patches[ 9] := Y2Third;    // p[1][3]
    Patches[10] := XMax;     Patches[11] := YThird;     // p[2][3]
    Patches[12] := XMax;     Patches[13] := YMin;       // p[3][3] BR
    Patches[14] := X2Third;  Patches[15] := YMin;       // p[3][2]
    Patches[16] := XThird;   Patches[17] := YMin;       // p[3][1]
    Patches[18] := XMin;     Patches[19] := YMin;       // p[3][0] BL
    Patches[20] := XMin;     Patches[21] := YThird;     // p[2][0]
    Patches[22] := XMin;     Patches[23] := Y2Third;    // p[1][0]
    Patches[24] := XThird;   Patches[25] := Y2Third;    // p[1][1]
    Patches[26] := X2Third;  Patches[27] := Y2Third;    // p[1][2]
    Patches[28] := X2Third;  Patches[29] := YThird;     // p[2][2]
    Patches[30] := XThird;   Patches[31] := YThird;     // p[2][1]
    // 4 corner colours at p[0][0] / p[0][3] / p[3][3] / p[3][0]
    Patches[32] := 1.0; Patches[33] := 0.0; Patches[34] := 0.0;  // red
    Patches[35] := 0.0; Patches[36] := 1.0; Patches[37] := 0.0;  // green
    Patches[38] := 1.0; Patches[39] := 1.0; Patches[40] := 0.0;  // yellow
    Patches[41] := 0.0; Patches[42] := 0.0; Patches[43] := 1.0;  // blue
    PatName := Doc.RegisterTensorProductPatchMesh(
      XMin, YMin, XMax, YMax, 3, Patches);
    Doc.CurrentPage.SetFillPattern(PatName);
    Doc.CurrentPage.Rectangle(0, 0, 200, 200);
    Doc.CurrentPage.Fill;
    Doc.EndDoc;
  finally
    Doc.Free;
  end;
end;

 

Se også

RegisterCoonsPatchMesh, RegisterFreeFormGouraudShading, RegisterLatticeFormGouraudShading, Version, Støtte for PDF-filtre