Styly cest, fonty a řetězce v PostScriptu

24. 5. 2007
Doba čtení: 11 minut

Sdílet

Ilustrační obrázek
Autor: Depositphotos – stori
Ilustrační obrázek
Dnes si ukážeme, jakým způsobem je možné měnit styly vykreslovaných cest, tj. tloušťku a barvu čar i způsob napojení sousedních čar na sebe, včetně různých stylů ukončení cest. Také si přiblížíme problematiku PostScriptových fontů a vykreslování písma.

Obsah

1. Styly vykreslovaných cest
2. První demonstrační příklad – kresba cesty různou tloušťkou čáry
3. Druhý demonstrační příklad – kresba cesty různou barvou
4. Třetí demonstrační příklad – změna napojení čar a ukončení cesty
5. Podpora fontů v PostScriptu, různé formáty fontů
6. Standardní PostScriptová písma
7. Čtvrtý demonstrační příklad – jednoduchý text
8. Pátý demonstrační příklad – výběr více fontů
9. Obsah dalšího pokračování tohoto seriálu

1. Styly vykreslovaných cest

V předchozích dvou částech tohoto seriálu jsme si ukázali, jakým způsobem je v PostScriptu možné vykreslovat jednoduché tvary pomocí takzvaných cest (paths), které mohou být složeny z úseček (lineto, rlineto), Bézierových křivek (curveto) a kruhových oblouků (arc). V demonstračních příkladech jsme vykreslovali cesty s různým tvarem, které však měly jednu věc společnou – barva všech cest byla černá (na bílém pozadí) a jejich tloušťka byla rovna jednomu typografickému bodu, tj. 1/72 palce. Dnes si řekneme, jakým způsobem je možné změnit tloušťku vykreslovaných cest, jejich barvu a také způsob napojení jednotlivých čar na sebe, včetně stylu ukončení cesty (samozřejmě, pokud se nejedná cestu uzavřenou příkazem closepath).

2. První demonstrační příklad – kresba cesty různou tloušťkou čáry

Kresba cesty s různou tloušťkou čáry je velmi jednoduchá, protože tloušťka se nastavuje příkazem setlinewidth (samotné příkazy pro tvorbu cesty tak slouží ke specifikaci její osy). Jediným parametrem příkazu setlinewidth je číselná hodnota představující požadovanou tloušťku v typografických bodech (1/72 palce). Nesmíme zapomenout na to, že PostScript je založen na jazyce používajícím postfixovou notaci zápisu (podobně jako jazyk Forth), tj. nejprve musí být na zásobník požadovaná hodnota uložena a teprve poté se zavolá příkaz setlinewidth. V dnešním prvním demonstračním příkladu je vykresleno patnáct Bézierových kubických křivek, každá s jinou tloušťkou, která se pohybuje v rozsahu od 0,5 do 7,5 typografických bodů (0,5 typografického bodu představuje vlasovou čáru). Následuje výpis zdrojového kódu prvního demonstračního příkladu:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Prvni demonstracni priklad
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% sloupec 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% prvni krivka
0.5 setlinewidth % zmena sirky cesty
newpath
 50 700
moveto
 50 800
150 800
150 700
curveto
stroke

% druha krivka
1.0 setlinewidth % zmena sirky cesty
newpath
 50 550
moveto
100 650
100 650
150 550
curveto
stroke

% treti krivka
1.5 setlinewidth % zmena sirky cesty
newpath
 50 400
moveto
125 500
 75 500
150 400
curveto
stroke

% ctvrta krivka
2.0 setlinewidth % zmena sirky cesty
newpath
 50 250
moveto
150 350
 50 350
150 250
curveto
stroke

% pata krivka
2.5 setlinewidth % zmena sirky cesty
newpath
 75 100
moveto
150 200
 50 200
125 100
curveto
stroke

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% sloupec 2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% prvni krivka
3.0 setlinewidth % zmena sirky cesty
newpath
250 700
moveto
250 800
350 800
350 700
curveto
stroke

% druha krivka
3.5 setlinewidth % zmena sirky cesty
newpath
250 550
moveto
300 650
300 650
350 550
curveto
stroke

% treti krivka
4.0 setlinewidth % zmena sirky cesty
newpath
250 400
moveto
325 500
275 500
350 400
curveto
stroke

% ctvrta krivka
4.5 setlinewidth % zmena sirky cesty
newpath
250 250
moveto
350 350
250 350
350 250
curveto
stroke

% pata krivka
5.0 setlinewidth % zmena sirky cesty
newpath
275 100
moveto
350 200
250 200
325 100
curveto
stroke

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% sloupec 3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% prvni krivka
5.5 setlinewidth % zmena sirky cesty
newpath
450 700
moveto
450 800
550 800
550 700
curveto
stroke

% druha krivka
6.0 setlinewidth % zmena sirky cesty
newpath
450 550
moveto
500 650
500 650
550 550
curveto
stroke

% treti krivka
6.5 setlinewidth % zmena sirky cesty
newpath
450 400
moveto
525 500
475 500
550 400
curveto
stroke

% ctvrta krivka
7.0 setlinewidth % zmena sirky cesty
newpath
450 250
moveto
550 350
450 350
550 250
curveto
stroke

% pata krivka
7.5 setlinewidth % zmena sirky cesty
newpath
475 100
moveto
550 200
450 200
525 100
curveto
stroke

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% vykresleni cele stranky
showpage 

411
Obrázek 1: První demonstrační příklad po vykreslení Ghostscriptem

3. Druhý demonstrační příklad – kresba cesty různou barvou

Změna barvy cesty je stejně jednoduchá jako změna její šířky. Na tomto místě bych rád připomněl, že PostScript Level 1 (tedy původní norma PostScriptu) podporoval pouze tisk dokumentů v odstínech šedi, barevný tisk je zaveden až od PostScriptu Level 2. Při tisku barevných dokumentů na „černobílém“ zařízení se o převod barev do odstínů šedi v ideálním případě stará RIP na tomto zařízení, protože pouze výrobce zná přesně ty nejlepší tiskové vzorky (autotypické body). Nejprve si tedy řekněme, jak lze nastavit kresbu cesty v odstínech šedi. Pro tento účel je zaveden příkaz setgray, který na zásobníku očekává reálnou číselnou hodnotu v rozsahu 0–1, přičemž nulová hodnota značí černou barvu a jednička barvu bílou (na bílém pozadí samozřejmě neviditelnou).

Barva se (při práci s obrazovkou) většinou nastavuje příkazem setrgbcolor; tento příkaz na zásobníku očekává tři hodnoty v rozsahu 0–1, které představují hodnoty barvových složek červené, zelené a modré v barvovém prostoru RGB. Pro tisky je však lepší používat příkaz setcmykcolor pro nastavení barvy v barvovém prostoru CMYK. Mnohdy se setkáváme se snahou provádět barevný rozklad (spolu se separací podle CMYK) přímo v grafickém editoru na počítači, většinou je však lepší tuto operaci ponechat na DTP studiu či tiskárně, protože mnohé osvitové jednotky dokonce rozklad mohou provést automaticky, včetně natočení vzorků při ditheringu.

Ve druhém demonstračním příkladu je ukázáno použití příkazů setgray a setrgbcolor. Zdánlivě chybějící Bézierova křivka je nastavena na bílou barvu, jeví se tedy jako neviditelná. Ovšem v případě, že by se tato křivka vykreslovala na jiné pozadí (třeba podkladový obrázek), byl by její obraz patrný – bílá tedy neznamená průhlednost. Zdrojový text druhého demonstračního příkladu má obsah:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Druhy demonstracni priklad
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% sloupec 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% prvni krivka
5.0 setlinewidth % zmena sirky cesty
0.0 setgray      % zmena urovne sede
newpath
 50 700
moveto
 50 800
150 800
150 700
curveto
stroke

% druha krivka
0.1 setgray      % zmena urovne sede
newpath
 50 550
moveto
100 650
100 650
150 550
curveto
stroke

% treti krivka
0.2 setgray      % zmena urovne sede
newpath
 50 400
moveto
125 500
 75 500
150 400
curveto
stroke

% ctvrta krivka
0.3 setgray      % zmena urovne sede
newpath
 50 250
moveto
150 350
 50 350
150 250
curveto
stroke

% pata krivka
0.4 setgray      % zmena urovne sede
newpath
 75 100
moveto
150 200
 50 200
125 100
curveto
stroke

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% sloupec 2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% prvni krivka
0.5 setgray      % zmena urovne sede
newpath
250 700
moveto
250 800
350 800
350 700
curveto
stroke

% druha krivka
0.6 setgray      % zmena urovne sede
newpath
250 550
moveto
300 650
300 650
350 550
curveto
stroke

% treti krivka
0.7 setgray      % zmena urovne sede
newpath
250 400
moveto
325 500
275 500
350 400
curveto
stroke

% ctvrta krivka
0.8 setgray      % zmena urovne sede
newpath
250 250
moveto
350 350
250 350
350 250
curveto
stroke

% pata krivka
0.9 setgray      % zmena urovne sede
newpath
275 100
moveto
350 200
250 200
325 100
curveto
stroke

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% sloupec 3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% prvni krivka
1.0 setgray      % zmena urovne sede
newpath
450 700
moveto
450 800
550 800
550 700
curveto
stroke

% druha krivka
1 0 0 setrgbcolor % nastaveni barvy podle RGB
newpath
450 550
moveto
500 650
500 650
550 550
curveto
stroke

% treti krivka
0 1 0 setrgbcolor % nastaveni barvy podle RGB
newpath
450 400
moveto
525 500
475 500
550 400
curveto
stroke

% ctvrta krivka
0 0 1 setrgbcolor % nastaveni barvy podle RGB
newpath
450 250
moveto
550 350
450 350
550 250
curveto
stroke

% pata krivka
1 0 1 setrgbcolor % nastaveni barvy podle RGB
newpath
475 100
moveto
550 200
450 200
525 100
curveto
stroke

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% vykresleni cele stranky
showpage 

412
Obrázek 2: Druhý demonstrační příklad po vykreslení Ghostscriptem

4. Třetí demonstrační příklad – změna napojení čar a ukončení cesty

Zejména při kresbě cest většími tloušťkami pera stojíme před problémem, jakým způsobem vykreslovat napojení jednotlivých čar a jakým stylem cestu začít a ukončit. Nejprve se budeme věnovat způsobu napojení čar (úseček) v cestě. Úsečky, při jejichž napojení se vytvoří jiný úhel než 180°, je možné v PostScriptu spojit třemi různými způsoby: buď jsou okraje úseček protaženy až do místa svého protnutí (vzniká „špička“), úsečky jsou zakončeny obloukem (nemění se tloušťka cesty), nebo je možné zakončit napojení rovným okrajem tak, aby byla v co největší míře zachována tloušťka cesty. Přímo při vytváření obrázku se tedy můžeme rozhodnout, jak lomené čáry vykreslit.

Pro tento účel je v PostScriptu zabudován příkaz setlinejoin, který na zásobníku očekává celočíselnou hodnotu 0, 1 nebo 2. Hodnota 0 značí napojení „do špičky“, hodnota 1 zakončení napojení obloukem a konečně hodnota 2 oříznutí napojení. Všechny tři možnosti si prakticky ukážeme ve třetím demonstračním příkladu; předtím si však ještě povíme, jak lze nastavit styl začátku a konce cesty. V tomto případě také máme na výběr tři možnosti: cestu ukončit kolmým řezem v prvním a posledním bodě cesty, cestu na konci zaoblit (střed zaoblení leží v prvním a posledním bodě cesty) nebo cestu opět ukončit kolmým řezem, který je však tentokrát vzdálený od prvního a posledního bodu o hodnotu, která odpovídá polovině její šířky (například kvůli snadnému připojení dalších cest).

Styl ukončení cesty se nastavuje příkazem setlinecap. Ten má jeden celočíselný parametr: 0-ukončení cesty kolmým řezem v místě koncových bodů, 1-ukončení cesty kruhovým obloukem, 2-ukončení cesty kolmým řezem vzdáleným od koncových bodů o 1/2 šířky cesty. Efekty příkazů setlinejoin a setlinecap je samozřejmě možné kombinovat, což je ukázáno na třetím demonstračním příkladu. V něm je provedeno vykreslení devíti cest, každá cesta má nastavenu jinou kombinaci napojení čar a způsobu jejich ukončení. Následuje výpis zdrojového kódu tohoto příkladu:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Treti demonstracni priklad
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% sloupec 1
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

5.0 setlinewidth

% nastaveni zpusobu ukonceni usecek
0 setlinecap

% prvni krivka
% nastaveni zpusobu napojeni usecek
0 setlinejoin
newpath
 50 700
moveto
150 800
lineto
 50 800
lineto
150 700
lineto
stroke

% druha krivka
% nastaveni zpusobu napojeni usecek
1 setlinejoin
newpath
 50 550
moveto
150 650
lineto
 50 650
lineto
150 550
lineto
stroke

% treti krivka
% nastaveni zpusobu napojeni usecek
2 setlinejoin
newpath
 50 400
moveto
150 500
lineto
 50 500
lineto
150 400
lineto
stroke



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% sloupec 2
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% nastaveni zpusobu ukonceni usecek
1 setlinecap

% prvni krivka
% nastaveni zpusobu napojeni usecek
0 setlinejoin
newpath
250 700
moveto
350 800
lineto
250 800
lineto
350 700
lineto
stroke

% druha krivka
% nastaveni zpusobu napojeni usecek
1 setlinejoin
newpath
250 550
moveto
350 650
lineto
250 650
lineto
350 550
lineto
stroke

% treti krivka
% nastaveni zpusobu napojeni usecek
2 setlinejoin
newpath
250 400
moveto
350 500
lineto
250 500
lineto
350 400
lineto
stroke



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% sloupec 3
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% nastaveni zpusobu ukonceni usecek
2 setlinecap

% prvni krivka
% nastaveni zpusobu napojeni usecek
0 setlinejoin
newpath
450 700
moveto
550 800
lineto
450 800
lineto
550 700
lineto
stroke

% druha krivka
% nastaveni zpusobu napojeni usecek
1 setlinejoin
newpath
450 550
moveto
550 650
lineto
450 650
lineto
550 550
lineto
stroke

% treti krivka
% nastaveni zpusobu napojeni usecek
2 setlinejoin
newpath
450 400
moveto
550 500
lineto
450 500
lineto
550 400
lineto
stroke



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% vykresleni cele stranky
showpage 

413
Obrázek 3: Třetí demonstrační příklad po vykreslení Ghostscriptem

5. Podpora fontů v PostScriptu, různé formáty fontů

Velmi důležitou a přitom propracovanou součástí PostScriptu je podpora pro vykreslování znaků. Je to ostatně logické, protože hlavní aplikací PostScriptu byl DTP a pre-press. PostScript podporuje velké množství formátů zápisu znaků (obrysové, vektorové, bitmapové), touto problematikou se však kvůli její rozsáhlosti budeme podrobněji zabývat v některé další části tohoto seriálu. Dnes si pouze řekneme, že PostScriptová zařízení odpovídající Levelu 1 by měla interně obsahovat celkem třináct základních fontů (obrysových a vektorových), jejichž tvarový popis i metriky dodává firma Adobe, v některých případech se však musíme smířit s náhradou (Ghostscript). PostScript Level 2 již předepisuje 35 standardních (interních) fontů rozdělených do 8 rodin (každá rodina obsahuje čtyři varianty) s přidanými třemi samostatnými fonty.

Interní fonty jsou uloženy v takzvaném slovníku (dictionary), který si můžeme představit jako asociativní pole. Ve slovníku se fonty hledají podle svého názvu; po nalezení se na zásobník uloží identifikátor zvoleného fontu. Při práci s externími fonty si musíme dát pozor na to, aby jejich název neobsahoval mezeru – to je typický problém mnoha (zejména starších) aplikací, které například vyžadovaly zavedení fontu „Arial CE“. Výsledkem je samozřejmě PostScriptový soubor, který tiskárna či osvitová jednotka odmítne (hlásí se, že příkaz CE neexistuje). Někteří odborníci si za uvedení takového souboru do tisknutelného stavu účtují tisíce korun, ve skutečnosti však mnohdy postačuje úprava jednoho znaku pomocí textového editoru.

6. Standardní PostScriptová písma

V následující tabulce jsou vypsány všechny standardní fonty, které by měly být k dispozici na každém zařízení podporujícím PostScript Level 2. Teoreticky by tyto fonty měly být dostupné i v počeštěné podobě („z“ na konci označení souboru s fontem, v Levelu 3 již vyžadované), v praxi je však jistější se na interní „počeštěné fonty“ raději nespoléhat a využít možnosti downloadu fontů do tiskárny či osvitové jednotky, popř. fonty rozrastrovat přesně na rozlišení daného tiskového zařízení. Tímto způsobem se například chová původní utilita dvips, která veškeré fonty nejprve nechá rozrastrovat pomocí METAFONTu a posléze jejich bitmapy uloží přímo do vytvářeného PostScriptového souboru. Předností tohoto postupu je skutečný WYSIWYG a také kratší doba osvitu, protože se nemusí provádět převod outline fontů až na tiskárně či osvitové jednotce.

Označení souboru písma Název Poznámka
pagk8z Avant Garde Book
pagd8z Avant Garde Demi
pagko8z Avant Garde Oblique
pagdo8z Avant Garde Demi Oblique
pbkl8z Bookman Light
pbkd8z Bookman Demi
pbkli8z Bookman Light Italic
pbkdi8z Bookman Demi Italic
pcrr8t Courier
pcrb8t Courier Bold
pcrro8t Courier Oblique
pcrbo8t Courier Bold Oblique
phvr8z Helvetica
phvb8z Helvetica Bold
phvro8z Helvetica Oblique
phvbo8z Helvetica Bold Oblique
phvrn8z Helvetica Narrow
phvbn8z Helvetica Narrow Bold
phvron8z Helvetica Narrow Oblique
phvbon8z Helvetica Narrow Bold Oblique
pncr8z New Century Schoolbook Roman
pncb8z New Century Schoolbook Bold
pncri8z New Century Schoolbook Italic
pncbi8z New Century Schoolbook Bold Italic
pplr8z Palatino
pplb8z Palatino Bold
pplri8z Palatino Italic
pplbi8z Palatino Bold Italic
ptmr8z Times Roman
ptmb8z Times Bold
ptmri8z Times Italic
ptmbi8z Times Bold Italic
psyr Symbol symboly pro matematiku, řečtina
pzcmi8z Zapf Chancery Medium Italic
pzdr Zapf Dingbats speciální symboly

7. Čtvrtý demonstrační příklad – jednoduchý text

V dnešním čtvrtém demonstračním příkladu je ukázán způsob vykreslení jednoduchého textu. Zhruba ve středu papíru formátu A4 je vykreslen text „42“ (blíží se přece Ručníkový den, že) fontem Helvetica ve velikosti 220 typografických bodů (cca 7,76 cm). Nejprve se pomocí příkazu findfont najde ve slovníku standardní font Helvetica (viz tabulka v předchozí kapitole), poté se příkazem scalefont nastaví jeho velikost na 220 typografických bodů a nakonec se pomocí příkazu setfont daný font stane aktuálním. Výpis textu je už jednoduchý: příkaz moveto zajistí posun začátku vykreslování na zvolené souřadnice a příkazem show se vypíše text uložený na zásobníku (řetězec je nutné vložit do závorek). Zdrojový text čtvrtého příkladu vypadá následovně:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ctvrty demonstracni priklad
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% nalezeni fontu ve slovniku
/Helvetica findfont
% nastaveni velikosti (v typografickych bodech)
220 scalefont
% nastaveni fontu jako aktivniho
setfont
% posun zhruba na stred papiru A4
200 350 moveto
% vypis textu "42"
(42) show



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% vykresleni cele stranky
showpage 

414
Obrázek 4: Čtvrtý demonstrační příklad po vykreslení Ghostscriptem

8. Pátý demonstrační příklad – výběr více fontů

V pátém demonstračním příkladu je vykresleno několik řetězců, každý jiným fontem (stále však používáme pouze základní fonty PostScriptu Level 2). Nejprve je vypsán „podkladový“ řetězec „42“, přičemž je nastavena bleděmodrá barva. Posléze je černou barvou pětkrát vypsán řetězec „Hello world!“, pokaždé jiným fontem. Pro jistotu jsem zvolil anglický text, s češtinou by mohly být, jak je ostatně v DTP zvykem, problémy. Všimněte si, že záleží na pořadí výpisu textů – pokud by se řetězec „42“ vykreslil jako poslední, překryl by ostatní texty. To je obecná vlastnost PostScriptu, která je často využívána, například při exportu kresby z vektorových editorů nebo při spojování EPS souborů. Zdrojový text pátého a současně i posledního příkladu má tvar:

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Paty demonstracni priklad
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% podkladovy text - musi byt uveden jako prvni

/Helvetica findfont
220 scalefont
setfont
200 350 moveto
0.8 0.8 1.0 setrgbcolor
(42) show

% ostatni text je zobrazen cernou barvou

0 0 0 setrgbcolor

/Helvetica findfont
40 scalefont
setfont
200 300 moveto
(Hello world!) show

/Times-Roman findfont
40 scalefont
setfont
200 350 moveto
(Hello world!) show

/Bookman findfont
40 scalefont
setfont
200 400 moveto
(Hello world!) show

/Palatino findfont
40 scalefont
setfont
200 450 moveto
(Hello world!) show

/Zapf-Chancery findfont
40 scalefont
setfont
200 500 moveto
(Hello world!) show

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% vykresleni cele stranky
showpage 

prace_s_linuxem_tip

415
Obrázek 5: Pátý demonstrační příklad po vykreslení Ghostscriptem

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

V následujícím pokračování tohoto seriálu si ukážeme způsob vyplňování cest, převody znaků na cesty a práci s transformační maticí, jejíž změnou je možné například vykreslovat různě natočené texty.

Autor článku

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