Hlavní navigace

Grafika v UNIXu - postscriptové formáty a písma

22. 10. 2001
Doba čtení: 8 minut

Sdílet

Kolem Postscriptu se rojí tolik názvů, až se zdá, že se nejedná o jeden jazyk. Vysvětlíme si, čím se od běžného PostScriptu liší EPS, k čemu jsou soubory PPD, AFM a jaké existují formáty písem. Na ukázce si předvedeme, jak se jednotlivé formáty liší.
EPS, EPSF, EPSI

Obyčejný PostScriptový soubor, jaký se používá na tisk, není příliš vhodný pro zařazení do jiného dokumentu – v jeho hlavičce se totiž většinou nacházejí příkazy pro nastavení zařízení a souřadného systému, které by narušily celý zbytek dokumentu. Proto vznikl nový formát – je jím zapouzdřený PostScript (Encapsulated PostScript – EPS). Od normálního strukturovaného PostScriptu se příliš neliší – jediný zásadní rozdíl je v tom, že neobsahuje žádné příkazy pro nastavení zařízení či souřadného systému a nemanipuluje s interpretem tak, aby to ovlivnilo zpracování ostatních částí dokumentu. Některé PostScriptové příkazy tedy formát EPS zcela zakazuje, jiné omezuje. Aplikace pro EPS připraví prostředí (souřadný systém) tak, aby byl obrázek ve správné poloze a velikosti. K tomu jí napomáhá informace o ohraničujícím rámu (Bounding Box), která se nachází ve strukturovaných komentářích každého EPS souboru. Pokud nějaká aplikace jazyku PostScript nerozumí (většinou se to týká proprietárních programů), nedokáže zobrazit náhled PostScriptu, a ta, která mu rozumí, zobrazí předrastrovaný náhled rychleji. Proto vznikly varianty formátu EPS obsahující náhled. Jsou to EPI (přikládá náhled binárně v běžném obrázkovém formátu ve formě dalšího zapouzdření EPS souboru; umí s ním pracovat epstool, dnes součást balíku gsview), a EPSI (přidává náhled ve formě PostScriptového komentáře; umí jej např. pbmtoepsiNetPBM a hlavička ps2epsiGhostscriptu).

Pokud soubor začíná „%!PS-Adobe-verze EPSF-verze“, značí to, že se jedná o zapouzdřený PostScript. Protože EPS je formou strukturovaného PostScriptu, aplikace se mohou orientovat podle strukturovaných komentářů. Pokud například použijeme dva obrázky se stejnými definičními hlavičkami nebo písmy, aplikace může tyto přesunout mezi své vlastní hlavičky a do postscriptového souboru je zařadit pouze jednou.

PPD

Přestože PostScript je jazyk na zařízení nezávislý, je občas dobré znát možnosti a doporučené nastavení konkrétního zařízení. K tomu slouží speciální (i lidsky čitelný) formát popisu postscriptové tiskárny (PPD – PostScript Printer Description). V něm si aplikace najde informaci o velikosti a typu média, rozlišení, bitové hloubce, barevnosti, rastrech, osazené paměti, podavačích a podobně.

Na následujících řádcích ze souboru PPD se například dozvíme, že tiskárna tiskne implicitně na papír formátu Letter, ale v uvozovkách uvedená postscriptová sekvence ji přepne na formát A4.

*DefaultPageSize: Letter
*PageSize A4: "1 dict dup /PageSize [595 842] put setpagedevice"

Aplikace si tuto informaci přečte a do postscriptového souboru pak přidá následující řádky:

%%BeginFeature: *PageSize A4
1 dict dup /PageSize [595 842] put setpagedevice
%%EndFeature

AFM

Podobně jako u strukturovaného PostScriptu je i u písem potřebné, aby aplikace měly podrobné informace o postscriptovém písmu, které mají použít. Je třeba znát velikost jednotlivých písmen, páry pro jejich podřezávání (kerning), svaznicové skupiny, důležité písmové linie, doporučené mezerování, názvy znaků a jejich umístění v kódovém vektoru – souhrnně se všechny tyto informace nazývají metrika písma. K tomu slouží další formát – Adobe Font Metrics (AFM). Tento soubor je jediným zdrojem některých informací (svaznice, podřezávání), které vlastní postscriptový interpret nepoužívá. Proto by měl být (ale není) součástí distribuce všech písem.

Formát Multiple Master (umožňuje vygenerovat několik písmových řezů z jediného zdrojového kódu) má speciální formát metriky MMAFM. Pokud aplikace neumí písma Multiple Master použít přímo, lze pomocí mmtools vygenerovat jejich instanci.

Formáty písem

V závorce je vždy uvedena verze PostScriptu, ve které byl specifikován.

Type 0 (2)
Kompozitní písmo sestavené hierarchicky z jiných písem. Používá se hlavně pro složitá písma, japonštinu a čínštinu.

Type 1 (1)
Standardní kódovaný postscriptový formát. Běžný distribuční formát většiny písmolijen. Úsporný binární formát .pfb interpret PostScriptu nepřečte přímo, ale je jej třeba nejdříve dekódovat (Ghostscript to umí, pokud jej čte ze samostatného souboru). Na nízkoúrovňovou manipulaci s těmito písmy slouží t1utils.

Pokud písmo splňuje ještě další omezení, která umožní používat jej i v aplikacích bez kompletního postscriptového interpretu (např. rastrovací procesory okenních systémů), mohou nést příponu .pfa, binárně zapouzdřené .pfb. Podobně je omezen i formát Multiple Master. Obecné písmo Type 1 mívá příponu .gsf.

Písma Type 1 mohou být buď obrysová, kdy zadáváme obrysovou linii písma (většina běžných písem), nebo čárová, kdy zadáváme středovou linii písma a tloušťku čáry (např. písmo Courier).

Kódovaný binární formát je v podstatě velmi omezenou obdobou běžného PostScriptu, obsahuje však navíc některé speciální funkce. Nejdůležitější z nich je zeštíhlení (hinting) písma – pokud je obrysové písmo vykreslováno v malém rozlišení, mohlo by se snadno stát, že tloušťky dvou čar, které byly zamýšleny jako stejně tlusté, se budou vlivem numerických chyb lišit. Proto se do kvalitních písem vkládají speciální informace o zamýšlených tloušťkách důležitých čar.

Následující ukázka je dekryptovaná definice písmena „I“ v písmu Adobe Helvetica. Pro větší názornost jsem některé operátory rozepsal.

/I {
% znakový vektor (metrická informace)
        91 278 hsbw
% vertikální zeštíhlení, spodní okraj písmena (rozsah <0,21>)
        21 -21 hstem
% vertikální zeštíhlení, horní okraj písmena (rozsah <698,718>)
        718 -20 hstem
% horizontální zeštíhlení, dřík (rozsah <0,97>)
        0 97 vstem
% podobnými operátory jako v běžném PostScriptu vykreslíme obdélník
% (souřadnice jsou relativní)
        97 718 rmoveto
        -97 hlineto
        -718 vlineto
        97 hlineto
        closepath
% konec znaku
        endchar
        } def

Type 2 (3)
Compact Font Format (CFF)

Type 3 (1)
Formát písma popsaný standardními postscriptovými operátory. Je poměrně jednoduché jej vytvořit, a tak je oblíbeným formátem pro jednoduchá nebo bitmapová písma. V komerční oblasti se používá na barevná akcidenční písma. Ukázku tohoto písma najdete na konci tohoto dílu mezi příklady.

Type 9, 10, 11, 32 (3)
tzv. CIDFonts.

Type 14 (3)
Formát Chameleon.

Type 42 (3) a TrueType
Type 42 je zapouzdřený soubor TrueType. Type 42 se nepoužívá k distribuci, ale bývá většinou konvertovaný při tisku z nativních TrueType písem. Ghostscript k tomuto zapouzdření používá hlavičku gs_ttf.ps. Ke konverzi TrueType na Type 1 (potřebné pro nižší verze PostScriptu) pak slouží ttf2pt1. Písma TrueType jsou oblíbená zvlášť v desktopech. Zdá se, že pro zařízení s malým rozlišením mohou dávat lepší výsledky než Type 1.

Intellifont
Jde o starší vektorový formát firem Agfa a Compugraphic, používá křivky 2. stupně a v PostScriptu není přímo podporován. Místo podřezávání používá jakýsi „obrysový hřeben“, kterým odměřuje vhodnou vzdálenost mezi písmeny. Má podporu pro zeštíhlení. Kódování znaků je šestnáctibitové a zcela atypické. Stal se nativním formátem systému AmigaOS a tiskáren s jazykem PCL, dnes je však již na ústupu.

METAFONT
Jde o formát, který vznikl během vývoje programu TEX. V PostScriptu není přímo podporován – jeho možnosti jsou nesrovnatelně vyšší, než je tomu u kteréhokoliv jiného jazyka – jde nejen o plnohodnotný programovací jazyk, ale má i plnou podporu vektorové aritmetiky, všech typů Bézierových křivek, umí pracovat s dynamickými štětci libovolných tvarů, a tak písma, která je nutné jinde popisovat jako obrysová, lze v METAFONTu popsat jako vykreslená. Též možnosti zeštíhlení jsou lepší (popis písmena je svázán s jeho grafickým záměrem). Zatímco písma Multiple Master mají zřídkakdy více než dva stupně volnosti, rodina písem Computer Modern vytvořená v METAFONTu jich má 57! Za tyto možnosti ovšem platí výpočetně náročným rastrováním písmen a obtížným převodem do běžných vektorových formátů. Většina aplikací je dodnes převádí na bitové mapy pro příslušné koncové zařízení.

Většina písem ve formátu METAFONT je volně dostupná na Internetu (písma snad pro všechny jazyky i původní písmová tvorba, jakou je například Computer Modern, Concrete Roman, Pandora či Euler od Hermanna Zapfa). Komerčně jsou pak za rozumné ceny dostupná i písma pro tak speciální znakové sady, jakými jsou např. klasická arabština či starořečtina.

V našem seriálu se k METAFONTu ještě vrátíme. V roce 1978 byl zřejmě prvním digitálním písmovým formátem a dodnes je tím nejsilnějším nástrojem.

Kromě těchto formátů ještě existují některé speciální formáty (např. pro 3D písma), ty však v běžné typografii nevyužijeme.

Krátké příklady

Ti, kteří si zkusili zobrazit příklad telefonu z minulého dílu, zjistili, že některé postscriptové prohlížeče obrázek neukáží, zatímco samotný Ghostscript ano. Bylo to právě proto, že se jednalo o nestrukturovaný PostScript.

S tímto obrázkem telefonu jsem dnes připravil několik příkladů, které ilustrují, jak se kód mírně mění, aby vyhověl definici různých formátů. Zároveň ukazují, že manipulace s jednoduchým PostScriptovým kódem není žádná složitá magie.

Nestrukturovaný (ale komentovaný) PostScript jste viděli v minulém dílu.

Strukturovaný PostScript (obsahuje navíc strukturované komentáře, mezi nimi i informaci o ohraničujícím rámu, určenou pro prohlížeče):

%!PS-Adobe-3.0
%%Creator: hand made
%%Title: Telefon
%%Pages: 1
%%PageOrder: Ascend
%%BoundingBox: 0 0 40 40
%%HiResBoundingBox: 0 0 39.5444 39.355
%%EndComments
/c { curveto } def
%%EndProlog
%%BeginSetup
%%BeginFeature: *PageSize 40x40
1 dict dup /PageSize [40 40] put setpagedevice
%%EndFeature
%%EndSetup
%%Page: 1 1
-15.7606 -35 translate
newpath
46.3294 35 moveto
29.2607 39.8018 16.8406 59.5148 15.7606 65.2856 c
17.6206 70.885 22.9607 73.9362 25.5407 74.355 c
27.5207 73.0986 31.7207 67.0067 32.5607 64.2173 c
31.3007 62.3182 29.0207 61.0105 27.4007 60.3524 c
27.8207 58.6772 35.5594 48.1696 41.1854 46.6044 c
41.7839 48.2297 43.1597 50.5775 45.0735 51.8417 c
47.8843 51.0591 53.9883 46.8451 55.305 44.9188 c
54.9459 42.3302 51.8936 36.9724 46.3294 35 c
closepath
fill
showpage
%%Trailer
%%EOF

Zapouzdřený PostScript (EPS) bez náhledu (jiná hlavička, neobsahuje showpage – ačkoliv podle nové definice formátu EPS by mohl, mezi strukturovanými komentáři je volitelná definice přesné hodnoty ohraničujícího rámu, chybí příkaz pro nastavení stránky):

%!PS-Adobe-3.0 EPSF-3.0
%%Creator: hand made
%%Title: Telefon
%%Pages: 1
%%PageOrder: Ascend
%%BoundingBox: 0 0 40 40
%%HiResBoundingBox: 0 0 39.5444 39.355
%%EndComments
/c { curveto } def
%%EndProlog
%%Page: 1 1
-15.7606 -35 translate
newpath
46.3294 35 moveto
29.2607 39.8018 16.8406 59.5148 15.7606 65.2856 c
17.6206 70.885 22.9607 73.9362 25.5407 74.355 c
27.5207 73.0986 31.7207 67.0067 32.5607 64.2173 c
31.3007 62.3182 29.0207 61.0105 27.4007 60.3524 c
27.8207 58.6772 35.5594 48.1696 41.1854 46.6044 c
41.7839 48.2297 43.1597 50.5775 45.0735 51.8417 c
47.8843 51.0591 53.9883 46.8451 55.305 44.9188 c
54.9459 42.3302 51.8936 36.9724 46.3294 35 c
closepath
fill
%%Trailer
%%EOF

Z tohoto souboru vytořené písmo ve formátu Adobe Type 3, které obsahuje jediný znak (komentováno, celý kód je vložen do definice písma):

%!
% slovník písma bude mít deset položek
10 dict dup begin
% Type 3
  /FontType 3 def
% základní velikost písma
  /FontMatrix [0.02 0 0 0.02 0 0 ] def
% ohraničující rám písma
  /FontBBox [0 0 39.5444 39.355] def
% kódování písma - pole 256 položek
  /Encoding 256 array def
% vyplníme jej hodnotou .notdef
  0 1 255 {Encoding exch /.notdef put} for
% dáme kódovací tabulku na zásobník
  Encoding
% pod písmenem "a" bude symbol telefon
    dup (a) 0 get /telefon put
% zrušíme ze zásobníku
% (pro jediný znak to lze napsat jednodušeji)
    pop
% slovník metriky bude obsahovat dva znaky
  /Metrics 2 dict def
  Metrics begin
    /.notdef 0 def
    /telefon 39.5444 def
  end

% ohraničující rámy jednotlivých znaků
  /BBox 5 dict def
  BBox begin
    /.notdef [0 0 0 0] def
    /telefon [0 0 39.5444 39.355] def
  end

% slovník vlastních definic znaků
  /CharacterDefs 2 dict def
  CharacterDefs begin
    /.notdef { } def
% vlastní definice znaku telefon
    /telefon
      {
    -15.7606 -35 translate
    newpath
    46.3294 35 moveto
    29.2607 39.8018 16.8406 59.5148 15.7606 65.2856 curveto
    17.6206 70.885 22.9607 73.9362 25.5407 74.355 curveto
    27.5207 73.0986 31.7207 67.0067 32.5607 64.2173 curveto
    31.3007 62.3182 29.0207 61.0105 27.4007 60.3524 curveto
    27.8207 58.6772 35.5594 48.1696 41.1854 46.6044 curveto
    41.7839 48.2297 43.1597 50.5775 45.0735 51.8417 curveto
    47.8843 51.0591 53.9883 46.8451 55.305 44.9188 curveto
    54.9459 42.3302 51.8936 36.9724 46.3294 35 curveto
    closepath
    fill
      } bind def
  end

% funkce BuildChar je vlastní výkonná funkce, vyhledává a kreslí znak
  /BuildChar
    { 0 begin
        /char exch def
        /fontdict exch def
        /charname fontdict /Encoding get char get def
        fontdict begin
          Metrics charname get 0
          BBox charname get aload pop
            setcachedevice
          CharacterDefs charname get exec
        end
      end
    } def

  /BuildChar load 0 3 dict put
% číselná identifikace v uživatelském rozsahu
  /UniqueID 4000001 def
end

% vlastní definice písma
/Telefon exch definefont pop

% a zde je zakomentovaný kód, který ověří, že písmo funguje
%/Telefon findfont 200 scalefont setfont 20 20 moveto (a) show showpage

Soubor AFM popisující toto písmo:

CS24_early

StartFontMetrics 3.0
FontName Telefon
FontBBox 0 0 790.888 787.1
EncodingScheme FontSpecific
StartCharMetrics 1
C  97 ; WX 790.888 ; N telefon ; B 0 0 790.888 787.1 ;
EndCharMetrics
EndFontMetrics

Poznámka k uvedenému písmu a jeho metrice: Standardní hodnota FontMatrix je [0.001 0 0 0.001 0 0]. Za takových podmínek by hodnoty v AFM souboru numericky odpovídaly hodnotám v definici písma, v našem případě jsou však 20× vyšší. Vzniklo to z praktických důvodů – velikost již hotového obrázku telefonu bychom jinak museli upravovat, aby odpovídala velikosti písma.

Na vývojářských stránkách firmy Adobe jsou všechny formáty popsány dostatečně na to, abychom si mohli takové soubory sami vytvářet.

Seriál: Grafika v UNIXu

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

Autor článku