Hlavní navigace

Kreslíme v PostScriptu

10. 5. 2007
Doba čtení: 10 minut

Sdílet

V předchozím článku jsme si uvedli základní informace o grafickém metaformátu PostScript. Dnes si ukážeme, jak je možné v PostScriptu vykreslovat jednoduché vektorové obrázky. Uvidíme, že se i přes rozsáhlost jazyka nejedná o nic složitého. Výsledné soubory je možné si prohlédnout přímo na obrazovce počítače či vytisknout.

Obsah

1. Kreslíme v PostScriptu
2. Souřadnicový systém
3. Používané formáty tiskových stran
4. Struktura PostScriptového souboru
5. Základní příkazy pro tvorbu cest (path)
6. Domeček vykreslený pomocí příkazů moveto a lineto
7. Využití relativních souřadnic
8. Odkazy na další informační zdroje
9. Obsah dalšího pokračování tohoto seriálu

1. Kreslíme v PostScriptu

V minulém dílu tohoto seriálu jsme si řekli, že PostScript je metaformát, tj. souborový formát, ve kterém je možné ukládat jak vektorové obrázky, tak i bitmapy a pixmapy. Také jsme si uvedli, že se obsah tiskové stránky v PostScriptu programuje v zásobníkově orientovaném programovacím jazyce, který se v mnohém podobá programovacímu jazyku Forth. Na první pohled může tato informace mnoho zájemců o proniknutí do tajemství PostScriptu odradit (zvlášť, pokud si prohlédli nějaký soubor vygenerovaný například Wordem), dnes však uvidíme, že pro tiskové strany obsahující vektorové kresby složené z úseček a Bézierových křivek mohou být PostScriptové soubory velmi jednoduché a snadno pochopitelné.

Které softwarové nástroje vlastně budeme při „programování“ v PostScriptu potřebovat? Kupodivu si vystačíme s velmi jednoduchými prostředky. Pro tvorbu vektorové kresby nebudeme používat žádný grafický editor, vystačíme si pouze s textovým editorem, který umí vytvářet ASCII soubory. Můžete použít například vi, VIM, EMACS, JOE, mcedit, nano, pico, THE, Kate, Notepad (slavný Poznámkový blok), PSPad, UltraEdit, JEdit apod. – podle vlastního uvážení. Při tvorbě složitějších PostScriptových programů je vhodné použít takový editor, který umí zvýraznit syntaxi PostScriptu; takovým editorem je například VIM, EMACS a pravděpodobně i JEdit, UltraEdit a Kate (pokud je k dispozici příslušná definice syntaktických kategorií).

Dále budeme potřebovat program, kterým si můžeme výsledný PostScriptový soubor prohlédnout. Tento program je spojený s programovým RIPem (buď je jeho součástí nebo ho volá externě). Programů pro zobrazení PostScriptu je celá řada – tuto operaci je možné provést i v CorelDraw! nebo Adobe Illustratoru – z volně dostupných programů se nejvíce používá GhostView (prohlížeč vybavený grafickým uživatelským rozhraním) spojený s Ghostscriptem (softwarový RIP). Ghostscript i GhostView je dostupný pro většinu platforem, samozřejmě včetně Unixu a Microsoft Windows. Pro KDE existuje i upravený KGhostView. O tom, že Ghostscript už není žádné „ořezávátko“, svědčí i to, že ho některé firmy používají ve svých ovladačích.

2. Souřadnicový systém

První věcí, se kterou se při kreslení v PostScriptu musíme seznámit, je souřadnicový systém. Prakticky všechny příkazy pro kreslení jako své parametry vyžadují zadání souřadnic jednoho vrcholu nebo více vrcholů (například koncových bodů úseček); tyto souřadnice jsou zadány právě v souřadnicovém systému. Pro začátek si řekneme, jak vypadá souřadnicový systém při inicializaci vykreslování, později si ukážeme, že pomocí transformací je možné souřadnicový systém otočit, posunout či zrcadlit. Nejdůležitější informací je, že souřadnicový systém PostScriptu je nezávislý na daném tiskovém zařízení, tj. jsou použity délkové jednotky (i když poněkud neobvyklé) a nikoli tiskové body, pixely či podobné bezrozměrné (a na zařízení závislé) hodnoty.

Základní délkovou jednotkou je jeden typografický bod (point), jehož délka je rovna 1/72 palce. Pojem „typografický bod“ je poněkud matoucí, protože existuje více těchto jednotek a o jejich významu se typografové mnohdy přou stejně vášnivě (a zbytečně) jako informatici o to, zda je lepší VIM či EMACS. Faktem zůstává, že PostScript (a zdaleka nejenom on, všimněte si způsobu zadávání velikosti písma v mnoha programech – „palcové titulky“ jsou sázeny 72bodovým fontem) považuje za svou jednotku právě 1/72 palce, tedy přibližně 0,3527 milimetru. To však v žádném případě neznamená, že by jeden bod byl tou nejmenší délkovou jednotkou, kterou je možné v PostScriptu použít. Norma předepisuje, že se délky mohou zapisovat i pomocí čísel s plovoucí řádovou čárkou, požadovaná přesnost je minimálně čtyři desetinná místa (přesností se tedy v tomto ohledu blížíme i k legendárnímu „superpřesnému“ TEXu).

Počátek souřadného systému leží v levém dolním rohu tiskové strany. Hodnoty na x-ové ose rostou směrem doprava a hodnoty na y-ové ose směrem nahoru. Pokud někomu takto nastavený souřadný systém nevyhovuje (třeba já jsem zvyklý na opačný smysl osy y), je možné použít příkazy pro zrcadlení, otáčení či změnu měřítka, kterými se mění obsah transformační matice. Takto definovaný souřadnicový systém se nazývá uživatelský prostor (user space). Tiskárna či osvitová jednotka používá svůj vlastní souřadnicový systém nazývaný prostor zařízení. Transformace souřadnic mezi uživatelským prostorem a prostorem zařízení je prováděna právě na základě nastavené transformační matice (CTM – Current Transformation Matrix).

Způsobem práce s transformační maticí se budeme podrobněji zabývat v dalším pokračování tohoto seriálu, protože se jedná o poměrně důležitou součást PostScriptu a nesprávná manipulace s touto maticí může případné tisky zcela znehodnotit, zejména při spojování více souborů, které neodpovídají specifikaci vloženého PostScriptu (EPS).

3. Používané formáty tiskových stran

Při specifikaci souřadnic v PostScriptu je nutné znát meze dané tiskové strany, protože nemá cenu kreslit mimo fyzické hranice výkresu. V následující tabulce jsou vypsány nejpoužívanější formáty tiskových stran (ať už běžných papírů či fólií určených především pro osvitové jednotky), se kterými se můžeme v praxi setkat (tučně je zvýrazněn u nás pravděpodobně nejpoužívanější rozměr papíru – A4). Formát Letter je používaný především v USA a jedná se o užší a delší obdobu „našeho“ formátu A4. Setkat se s ním můžete například při zpracovávání PostScriptových dokumentů připravených v zahraničí. Mírně odlišný formát může mít za následek to, že se část kresby nemusí vytisknout. Odstranění této vady si ukážeme v některém z dalších pokračování tohoto seriálu.

Formát Počet bodů horizontálně Počet bodů vertikálně
Comm #10 obálka 297 684
C5 obálka 461 648
DL obálka 312 624
Folio 595 935
Executive 522 756
Letter 612 792
Legal 612 1008
Ledger 1224 792
Tabloid 792 1224
A0 2384 3370
A1 1684 2384
A2 1191 1684
A3 842 1191
A4 595 842
A5 420 595
A6 297 420
A7 210 297
A8 148 210
A9 105 148
B0 2920 4127
B1 2064 2920
B2 1460 2064
B3 1032 1460
B4 729 1032
B5 516 729
B6 363 516
B7 258 363
B8 181 258
B9 127 181
B10 91 127

4. Struktura PostScriptového souboru

Pod pojmem standardní PostScriptový soubor si můžeme představit běžný textový soubor obsahující buď pouze znaky ze znakové sady ASCII (tj. znaky s nulovým osmým bitem) či obecně osmibitové znaky. ASCII PostScript („sedmibitový“) se často používá, zejména kvůli tomu, že se takto vytvořené soubory dají bez problémů přenášet mezi různými platformami i pomocí protokolů, které nezaručují plně osmibitový přenos (elektronická pošta apod.). Nárůst celkové velikosti ASCII souboru je oproti plně osmibitové verzi cca 25%, protože osmibitově jsou kódovány pouze bitmapy, pixmapy a fonty (o převod mezi ASCII a osmibitovými daty se mohou starat například makra naprogramovaná přímo v PostScriptu).

Konce řádků mohou být v PostScriptových souborech zapsány libovolně podle zvyků použité platformy, tj. na Unixech znakem [CR], na MaxOS a jeho „X“-ových pokračovatelích znakem [LF] a na systémech MS-DOS či Microsoft Windows dvojicí znaků [CR]+[LF]. PostScriptové soubory však i přes rozdílné konce řádků zůstávají bezezbytku přenositelné mezi různými platformami, protože programové i hardwarové RIPy by měly akceptovat všechny tři způsoby kódování konců řádků (ve skutečnosti mají konce řádků v těchto souborech pouze malý význam a mnohdy je můžeme vynechat). Při našich pokusech s PostScriptem tedy bude jedno, zda soubor vytvoříme na Linuxu či pomocí nějakého textového editoru pracujícího pod Microsoft Windows.

PostScriptový soubor musí samozřejmě dodržovat nějaký předepsaný formát, nejedná se o náhodný shluk znaků. Rozeznáváme dvě hlavní sekce: prolog a skript/popis stránky. V prologu se nachází záhlaví a případné definice procedur. Ve druhé sekci jsou uloženy příkazy pro nastavení dokumentu, programový kód popisující způsob vykreslení jednotlivých tiskových stran (většinou oddělených příkazem showpage) a poslední částí je ukončující blok. V našich testovacích příkladech budeme zapisovat především programový kód pro vykreslení objektů na tiskových stranách, tj. část druhé sekce. Ostatní části většinou nebudeme uvádět, RIPy si i s takto „neúplným“ PostScriptovým souborem poradí, pouze v některých případech mají problémy s volbou vhodného formátu papíru či fólie.

5. Základní příkazy pro tvorbu cest (path)

Velmi důležitým objektem v PostScriptu je takzvaná cesta (path). Pod pojmem cesta si můžeme představit množinu bodů, úseček a křivek, které mohou být navzájem napojeny (není to však nutné, cesta může obsahovat i mezery, tj. části, ve kterých se mezi dvěma body nic nevykresluje). Cesta se může vykreslit třemi různými způsoby: buď jako obrys (obtažení, outline), vyplněná oblast (fill) či kombinace předchozích dvou způsobů (obrys+výplň). S cestami se můžeme setkat v mnoha vektorových editorech, například v Adobe Illustratoru (ten je postavený právě na PostScriptu), CorelDraw či stále dokonalejším Inkscape. Kromě toho je možné cesty použít i pro tvorbu výřezů, slouží tedy jako vektorově zadané masky (tuto techniku si však vysvětlíme až v následujících částech tohoto seriálu).

Při vytváření cesty je před jejich vykreslením možné nastavit mnoho vlastností. Typicky to bývá barva (v PostScriptu Level 1 pouze úroveň šedi) a tloušťka obrysové čáry a také způsob napojení dvou čar na sebe (zda má být „roh“ ostrý, oříznutý se zachováním stejné tloušťky křivky či zaoblený – vše si opět ukážeme příště). I vlastnosti výplně – pokud je ovšem cesta vyplněná – se dají plně nastavit, od její barvy až po vzorek. Dnes si však ukážeme pouze základ práce s cestami, tj. jejich definici a vykreslení obrysu. V následující tabulce je vypsáno sedm základních příkazů pro práci s cestami, se kterými si v dnešních demonstračních příkladech vystačíme (a kupodivu si s nimi mnohdy vystačíme i v praxi, například při tvorbě různých technických výkresů s rozloženými vektorovými fonty):

Příkaz Význam
newpath vytvoření nové cesty, která tak nenavazuje na cestu předchozí
moveto přesun aktivního bodu na zadané absolutní souřadnice bez kreslení
lineto přesun aktivního bodu na zadané absolutní souřadnice s kreslením
rmoveto přesun aktivního bodu na zadané relativní souřadnice bez kreslení
rlineto přesun aktivního bodu na zadané relativní souřadnice s kreslením
closepath uzavření cesty, poslední bod je spojen s bodem prvním
stroke vykreslení cesty nastaveným stylem (implicitně vlasová čára)

6. Domeček vykreslený pomocí příkazů movetolineto

První demonstrační příklad je velmi jednoduchý. Pomocí základních příkazů pro práci s cestami je vykreslen domeček jedním tahem (oblíbená dětská hádanka). Nejprve je vytvořena nová cesta pomocí příkazu newpath. První bod této cesty leží na souřadnicích [100, 100], o přesun se postará příkaz moveto. Všimněte si postfixového zápisu příkazů: nejdříve jsou uvedeny souřadnice (ty se uloží na zásobník) a teprve poté se zavolá příslušný příkaz, který si souřadnice ze zásobníku vyzvedne a použije.

Následujících osm příkazů lineto vykreslí zbytek cesty složený z úseček. Nakonec se příkazem stroke cesta vykreslí a interpreter PostScriptu o cestě zapomene veškeré další údaje. Poslední příkaz showpage zajistí vykreslení či vytištění celé stránky na obrazovku či tiskárnu (v případě EPS by však tento příkaz být uveden nesměl – to si můžete vyzkoušet importem tohoto příkladu například do některého z vektorových editorů).

newpath
100 100 moveto
400 100 lineto
100 400 lineto
100 100 lineto
400 400 lineto
100 400 lineto
250 550 lineto
400 400 lineto
400 100 lineto
stroke
showpage 

ps1
Obrázek 1: Vykreslený první demonstrační soubor

Vzhledem k tomu, že jsou všechny parametry (v našem případě souřadnice) ukládány na zásobník, můžeme stejný domeček vykreslit i odlišným způsobem. Ve druhém demonstračním PostScriptovém souboru jsou nejprve všechny souřadnice uloženy na zásobník a teprve poté se volají příkazy pro konstrukci a vykreslení cesty. Jelikož je zásobník struktura typu LIFO (Last In, First Out), je poslední vložená souřadnice [100, 100] vyzvednuta a použita jako první. Ostatní souřadnice jsou uvedeny ve stejném pořadí jako v prvním příkladu, což však znamená, že je domeček vykreslen v opačném pořadí (na výsledný obrázek to však nemá žádný vliv). Tento způsob zápisu kódu je vhodné používat s rozumem, protože by při větším počtu bodů mohlo dojít k přeplnění zásobníku.

400 100
100 400
100 100
400 400
100 400
250 550
400 400
400 100
100 100
newpath
moveto
lineto
lineto
lineto
lineto
lineto
lineto
lineto
lineto
stroke
showpage 

ps2
Obrázek 2: Vykreslený druhý demonstrační soubor

7. Využití relativních souřadnic

Třetí a poslední demonstrační příklad nepoužívá při vykreslování cest absolutní souřadnice (v uživatelském prostoru), ale souřadnice relativní. Co to znamená? Místo mnohdy složitého počítání koncových bodů úseček z jejich známých délek a orientací, je možné použít příkazy rmoveto a rlineto, které pracují tak, že se zadané souřadnice přičtou k souřadnicím aktuálním. Pomocí těchto dvou příkazů je v následujícím PostScriptovém programu zkonstruován obrázek složený ze čtverce a zubaté čáry. Pokud by bylo místo relativních souřadnic použito souřadnic absolutních, byl by program mnohem složitější (a v případě zubaté čáry by se zkomplikovala i její možná konstrukce pomocí programové smyčky, ale to již předbíháme).

newpath
 100  100 moveto
 100    0 rlineto
   0  100 rlineto
-100    0 rlineto
   0 -100 rlineto
 150    0 rmoveto
 100   50 rlineto
-100   50 rlineto
 100   50 rlineto
-100   50 rlineto
 100   50 rlineto
-100   50 rlineto
 100   50 rlineto
stroke
showpage 

ps3
Obrázek 3: Vykreslený třetí demonstrační soubor

CS24_early

8. Odkazy na další informační zdroje

  1. Wikipedia: PostScript,
    http://en.wiki­pedia.org/wiki/Pos­tScript
  2. Paul Bourke: PostScript Tutorial,
    http://local.was­p.uwa.edu.au/~pbou­rke/dataformat­s/postscript/
  3. A First Guide to PostScript,
    http://www.ta­ilrecursive.or­g/postscript/pos­tscript.html
  4. Thomas Merz:
    PostScript & Acrobat/PDF : Applications, Troubleshooting, and Cross-Platform Publishing,
     1996

9. Obsah dalšího pokračování tohoto seriálu

V následujícím pokračování seriálu o grafických formátech si ukážeme složitější operace, které se dají s cestami provádět. Řekneme si, jakým způsobem se vykreslují Bézierovy křivky (ty v PostScriptu nahrazují složitější spline křivky) a jak se z vytvořené cesty dá vykreslit vyplněný objekt. Také se seznámíme s některými vlastnostmi zavedenými v PostScriptu Level 2, především s definicí barev.

Byl pro vás článek přínosný?

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.