PDF čije zaglavlje sadrži pozadinu s gradijentom u stilu Word-a ili Excel-a, kada se iscrta u sliku, obično bi se vratio s praznim bijelim pravokutnikom na mjestu gdje bi trebala biti mješavina boja. HotPDF-ov iscrtavač stranica sada poštuje PDF operator sh (sjenčanje) za aksijalne gradijente tipa 2 i radijalne gradijente tipa 3: procjenjuje funkciju sjenčanja duž osi gradijenta i crta mješavinu, dok su ranije verzije tiho odbacivale taj operator i ostavljale područje potpuno bijelim. Uključene su dvije vrste sjenčanja koje pokrivaju gotovo svaki gradijent u uredskim dokumentima; vrste sjenčanja s mrežom nisu uključene, a ovaj članak iskreno govori o tome gdje se ta granica nalazi
Sjenčani gradijent je vektorska struktura, a ne bitmapa koju iscrtavač može prenijeti (blit). Rječnik sjenčanja (ISO 32000-1 §8.7.4.5) opisuje geometriju — os ili par krugova u polju Coords — uz funkciju boje, a operator sh crta to sjenčanje preko trenutačnog područja isijecanja (clip region), što je isti grafički model koji HotPDF izlaže kada crtate putanje i ispune na platnu stranice. HotPDF-ov iscrtavač stranica prolazi kroz tok sadržaja operator po operator, a svaki operator za koji nema kôd preskače se, pa se ostatak stranice i dalje iscrtava. Prije verzije 2.335.0, operator sh nalazio se u tom preskočenom skupu: gradijent zaglavlja ili cijele stranice nije pridonosio ništa izlazu, pa se pozadina prikazivala kao bijela. Datoteka nikada nije bila oštećena. Iscrtavač jednostavno nije imao rukovatelj za taj jedan operator, a bijeli okvir je upravo ono kako izgleda nedostajući rukovatelj
Zašto se PDF gradijent iscrtava kao bijeli okvir?
Lanac procjene funkcija iza sjenčanja
Sjenčanje se ne može nacrtati dok se ne procijeni njegova funkcija, pa je taj mehanizam morao biti ugrađen prvi. I aksijalno sjenčanje tipa 2 i radijalno sjenčanje tipa 3 nose /Function koja mapira parametarski položaj duž gradijenta u boju (ISO 32000-1 §7.10), a HotPDF-ov procjenitelj funkcija razrješava FunctionType i raspoređuje rad prema njemu. Eksponencijalna interpolacija tipa 2 (§7.10.3) izračunava C0 + t^N * (C1 - C0) s ograničavanjem za Domain i Range; uzorkovane funkcije tipa 0 (§7.10.2) čitaju mrežu 8-, 16- ili 32-bitnih uzoraka i odabiru najbliži kroz mapu Encode, što je slučaj detaljno opisan u našem pregledu uzorkovanih pretraga boja tipa 0; funkcije spajanja (stitching) tipa 3 (§7.10.4) odabiru podfunkciju prema polju Bounds i rekurzivno ulaze u nju. Funkcije kalkulatora PostScript tipa 4 (§7.10.5) se ne procjenjuju — one se graciozno degradiraju na neuspjelu procjenu umjesto pogrešne boje, što odgovara konzervativnoj politici koju HotPDF provodi duž putanje iscrtavanja. Ovaj procjenitelj isporučen je u verziji 2.334.0, jedno izdanje prije samog operatora, jer je crtanje sjenčanja dobro samo onoliko koliko je dobra funkcija ispod njega
Kako HotPDF pretvara neprekidni gradijent u piksele?
HotPDF približno prikazuje neprekidno miješanje s konačnim nizom traka jednobojnih boja. Slikar sjenčanja prolazi duž osi gradijenta, dijeli je na do 64 trake — manje kada je os kratka u pikselima uređaja — procjenjuje funkciju na parametarskom položaju svake trake i ispunjava pravokutnik okomit na os jednobojnim kistom. Kompromis je broj traka naspram glatkoće: više traka preciznije prati miješanje, ali zahtijeva više ispuna, a 64 je namjerna gornja granica. Budući da se broj traka također skalira s duljinom osi u pikselima uređaja, razlučivost je važna. Iscrtavanje iste stranice pri višem DPI-ju produljuje os, pa kratki gradijent dobiva više traka, a njegove se pruge ublažavaju dok se ne dosegne gornja granica
Iscrtavanje sjenčane stranice u bitmapu
Javna ulazna točka je nepromijenjena: RenderLoadedPageToBitmap prima indeks stranice koji počinje od nule i DPI vrijednost, vraća 24-bitnu bitmapu u vlasništvu pozivatelja i vraća nil u slučaju neuspjeha umjesto podizanja iznimke, tako da je podrška za sjenčanje transparentna za kôd koji već imate. Stranica koja je prije iscrtavala svoje zaglavlje s gradijentom kao prazno sada vraća istu bitmapu s naslikanom mješavinom boja, i nije potrebna nikakva promjena API-ja da bi se to postiglo. Jedina stvar koju vrijedi zapamtiti je vlasništvo: pozivatelj oslobađa vraćenu bitmapu. Cijeli cjevovod iscrtavanja — tumačenje toka sadržaja, ugrađeni glifovi i predmemoriranje stranica — opisan je u vodiču za iscrtavanje PDF stranica u bitmapu u Delphiju
var
Pdf: THotPDF;
Bmp: TBitmap;
begin
Pdf := THotPDF.Create(nil);
try
if Pdf.LoadFromFile('quarterly-report.pdf') > 0 then
begin
// Page 1 (zero-based) at 150 DPI. A gradient-filled header that
// used to come back blank now carries its color blend.
Bmp := Pdf.RenderLoadedPageToBitmap(0, 150);
if Assigned(Bmp) then
try
Bmp.SaveToFile('page1.bmp');
finally
Bmp.Free;
end;
end;
finally
Pdf.Free;
end;
end;
Jeftina zaštita od regresije proizlazi iz istog poziva. Iscrtajte stranicu, uzorkujte piksel na mjestu gdje se nalazi gradijentna traka i potvrdite da to više nije potpuno bijela boja na koju bi se iscrtavač prije vratio — provjera od jednog retka koja sprječava tihi povratak na staro ponašanje bez operacija
Bmp := Pdf.RenderLoadedPageToBitmap(0, 150);
if Assigned(Bmp) then
try
// True when the sh operator painted; False if the region fell back to white.
HeaderPainted := Bmp.Canvas.Pixels[Bmp.Width div 2, 8] <> clWhite;
finally
Bmp.Free;
end;
Što HotPDF ne crta: sjenčanje s mrežom i rubovi isijecanja
Četiri vrste sjenčanja s mrežom su izvan opsega, i to bi trebalo znati prije početka rada s dokumentom. Slobodne Gouraud trokutaste mreže (tip 4), rešetkaste Gouraud mreže (tip 5), Coons krpne mreže (tip 6) i tenzorske krpne mreže (tip 7), definirane u ISO 32000-1 §8.7.4.5.5 do §8.7.4.5.8, se ne iscrtavaju; stranica koja ih koristi i dalje se iscrtava, samo se to područje ostavlja onakvim kakvo jest. Vrijedi jasno istaknuti još dvije granične točke. Pravokutnici traka pokrivaju cijelu prugu sjenčanja umjesto da budu izrezani točno prema trenutačnoj putanji isijecanja, pa se gradijent maskiran u zaobljeni ili nepravilni oblik iscrtava kao njegova granična pruga sve dok precizno isijecanje regija ne stigne u kasnijoj verziji. HotPDF također pretpostavlja da je izlaz funkcije RGB ili siva skala, pa se sjenčanje stvoreno u CMYK ili nekom egzotičnom prostoru boja približno procjenjuje umjesto upravljanja bojama. Za dokumente koje većina Delphi i C++Builder timova stvarno obrađuje — izvješća, računi, izvatci i prezentacije izvezene u PDF — aksijalni i radijalni gradijenti pokrivaju praktički sve gradijente na koje ćete naići, dok su dizajnerski predlošci s mnogo mreža slučajevi koje treba tretirati kao pregled, a ne kao gotov dokaz
HotPDF-ov iscrtavač stranica, podrška za operator sh koja je ovdje opisana i procjenitelj funkcija tipa 0/2/3 ispod njega isporučuju se kao dio komponente HotPDF Component za Delphi i C++Builder — izvorne VCL knjižnice bez vanjskih DLL ovisnosti koja pokriva stvaranje, uređivanje, izdvajanje teksta i iscrtavanje PDF-a u jednom paketu