Kreslení prostého textu na HPGL plotrech.

Tento článek a software volně navazují na mé dřívější experimenty s HPGL plotry, včetně stavby vlastní varianty plotru Alfi a na pokusy o použití fontů pana A.V.Hersheyho v BASICu na ZX Spectrum.

Jedním z mých cílů bylo i psaní textu pomocí běžného PC s Linuxem ideálně na libvolném HPGL plotru. K tomu jsem potřeboval vytvořit několik nástrojů. Nejprve bylo potřeba napsat program, který z prostého textu udělá HPGL instrukce pro plotr. Protože se z různých důvodů nehodí používat přímo formát pana Hersheyho, napsal jsem jednoduchý konvertor do PHP. Abych mohl používat češtinu, bylo nutné přidat a dokreslit české znaky do nějakého písma. K tomu jsem potřeboval editor. A protože se žádné písmo nehodí pro cokoli, bylo nutné písem upravit několik. Mimo jiné jsem musel vytvořit nejméně jedno písmo neproporcionální s pevnou šířkou (monospace), abych mohl kreslit i výpisy programů a pod. No a při té příležitosti, když už jsem uměl pracovat s Hersheyho fonty, udělal jsem i konvertor, kterým jsem vytáhl písmo z ovladače MZXR pro plotr Minigraf Aritma 0507 a počeštil ho stejně jako ostatní písma do osmibitového kódování ISO8859-2.

Fakt je, že jsem nakonec vše vyvíjel současně, napřeskáčku i skrz naskrz a navzájem přizpůsoboval, jak bylo potřeba. Ale pro účely dokumentace bych začal prohlížečem/editorem fontů.

program font-viewer.py

Původně tento program měl být pouze zobrazovadlem písma napsaný na pár řádků v Pythonu. Jenomže se to postupně rozrostlo do jakéhosi primitivního editoru, který určitě není dokonalý, ale funguje, znaky se v něm upravovat dají a výsledek v Hersheyho formátu lze exportovat do konzole jako prostý text.

Napodruhé bych to nejspíš udělal jinak, ale program už existuje, víc od něj nepotřebuji a zdrojáky jsou k dispozici. Nikomu nebráním ve vylepšování, právě naopak, těším se, s čím přijde někdo další :).

screenshot

Program má základní obrazovku s rastrem ve kterém je nakreslený znak. V tomto okně lze znak upravovat kliknutím na uzly, nebo na pár souřadnic v tabulce pod znakem a zvolený uzel lze posouvat šipkami. Souřadnice lze přidávat klávesou insert, mazat klávesou delete a pohybovat se mezi páry souřadnic klávesami home a end.

V tomto režimu lze znak exportovat pomocí CTRL+E, nebo písmo uložit CTRL+S vypsáním do konzole odkud lze vložit do textového souboru (ano, bylo by fajn, kdyby se font ukládal do souboru, možná časem). Z tohoto základního okna se dá klávesou A přeskočit na výběr znaků, nebo jen klávesami page up/down přecházet mezi znaky. Pod klávesou F1 se ukrývá nápověda s kompletním ovládáním.

screenshot screenshot

Každý znak v Hersheyho písmu je ohraničený levým a pravým limitem, které určují šířku znaku a zároveň zarovnání znaku k levému, nebo pravému okraji. Souřadnice uzlů by neměly (nesmí?) limity přesahovat. V programu jsou limity vyznačené červenou svislou čarou.

Samotný rastr by měl být dost velký, aby se do něho vešel jakýkoli znak. Tabulka souřadnic pod znakem by ale u extrémně komplikovaných znaků stačit nemusela, některé se tomu blíží, zvláště u gotických znaků, které jsou složené z mnoha krátkých úseček.

screenshot screenshot

Rozšíření základního Hersheyho písma, které jsou původně pouze ASCII, resp. pouze v rozsahu znaků 32 až 127 se provádí klávesou X. Program přidá prázdnou kódovou stránku se znaky s kódy 160 až 255. Následně je ze základního písma potřeba nakopírovat základní znaky, doplnit diakritická znaménka a doplnit další znaky - viz dřívější dva screenshoty.

./font-viewer.py -i font.jhf

Proč v Pythonu?

Protože Python je součástí dnes už každé Linuxové distribuce, snadno se používá a snadno se v něm tvoří programy, které něco kreslí v grafice, což byl původní cíl - zobrazovat náhledy znaků.

Proč editace pomocí kurzorů?

Protože to bylo nejjednodušší a protože to překvapivě stačí.

Jak jsou Hersheyho znaky kódované?

Na první pohled záhadně. Na druhý pohled překvapivě jednoduše. Ale i tak to je na krátký samostatný článek. Snad se k tomu někdy dostanu. Pokud ano, přibude tu odkaz.

Proč ISO8859-2?

Protože jsem hledal vhodné osmibitové kódování a ISO8859-2 mi vyhovuje. ISO8859-2 už jsem na ZX Spectrum používal dříve při výpisu textů v češtině pomocí rastrových fontů, ISO8859-2 lze snadno nastavit ve většině textových editorů (kromě neschopných, jako je Notepad... a příliš nakynutých jako jsou _něco_ Office), nebo se do něj dá text snadno zkonvertovat. Osmibitové kódování pro tento účel bohatě stačí a velmi zjednodušuje program oproti komplexnímu UTF-8 a zároveň dovoluje uchovat formát písma kompatibilní, to znamená, že není třeba přidávat informaci o kodu znaku, stačí, když je sekvence znaku na správném řádku.

recode utf8..iso8859-2 text.txt

Pro jazyky, které se do IS8859-2 nevejdou tu máme mnoho dalších standardů a modifikace editoru na jiná kódování je triviální, v podstatě stačí přepsat tabulku, jaké znaky se mají zobrazovat pro konkrétní kódy. Připomínám, že zdrojový kód programu je v UTF-8.

Proč mi program nechce načíst JHF soubor a spadne?

Pravděpodobně proto, protože se po internetu potulují JHF fonty, které nejsou správně. Z nějakého důvodu se v nich vyskytují zalomené řádky. Tak to být nemá. Správně má být jeden Hersheyho glyph na jednom řádku, protože nejsnazší je rozlišit glyph podle konce řádku. Asi by šlo detekovat číslo glyphu (může být různé - začínat mezerami), ale není zaručeno, že bude mezerou oddělené od počtu párů, pokud počet přesáhne 99. Viz screenshot H z gothiceng.jhf.

V podstatě všechna písma jsem před použitím musel opravit. U některých šlo jen o několik znaků, u složitých písem jich byla zalomená většina.

Příklad zalomených znaků v astrology.jhf od mezery.

12345  1JZ
12345 48F^JHNJPLQOQRPUNWJY RJHMIOJQLRO RRRQUOWMXJY RZHWIUJSLRO RRRSUUWWX
ZY RZHVJTLSOSRTUVWZY RIP[P RIQ[Q
12345 22I[NFMGMM RNGMM RNFOGMM RWFVGVM RWGVM RWFXGVM
12345 38E`QFNGKIILHOHRIUKXNZQ[T[WZZX\U]R]O\LZIWGTFQF RROQPQQRRSRTQTPSORO
 RRPRQSQSPRP
12345 45J[PFNGOIQJ RPFOGOI RUFWGVITJ RUFVGVI RQJOKNLMNMQNSOTQUTUVTWSXQXN
WLVKTJQJ RRUR[ RSUS[ RNXWX
12345 27I\RFOGMILLLMMPORRSSSVRXPYMYLXIVGSFRF RRSR[ RSSS[ RNWWW

Takto to má být správně

12345  1JZ
12345 48F^JHNJPLQOQRPUNWJY RJHMIOJQLRO RRRQUOWMXJY RZHWIUJSLRO RRRSUUWWXZY RZHVJTLSOSRTUVWZY RIP[P RIQ[Q
12345 22I[NFMGMM RNGMM RNFOGMM RWFVGVM RWGVM RWFXGVM
12345 38E`QFNGKIILHOHRIUKXNZQ[T[WZZX\U]R]O\LZIWGTFQF RROQPQQRRSRTQTPSORO RRPRQSQSPRP
12345 45J[PFNGOIQJ RPFOGOI RUFWGVITJ RUFVGVI RQJOKNLMNMQNSOTQUTUVTWSXQXNWLVKTJQJ RRUR[ RSUS[ RNXWX
12345 27I\RFOGMILLLMMPORRSSSVRXPYMYLXIVGSFRF RRSR[ RSSS[ RNWWW

program hershey_PHP_convertor.php

Součástí kompletu programů je i konverzní utilita, která z Hersheyho formátu (používám příponu JHF, ale nejsem si jistý, jestli je to nějak standardizováno, pravděpodobně ne) vytvoří pole v PHP, resp. zdrojový kód s proměnnou $font, která se dá připojit k programu text2hpgl.php.

./hershey_PHP_convertor.php font.jhf > font.php

Znaky by měly být zarovnané tak, aby souřadnice nepřesahovaly 0 do záporných hodnot. K tomu slouží proměnné $cfg_xoffset a $cfg_yoffset. Pro každé písmo mohou být potřeba jiné. Jak moc je nutné znaky posunou lze zjistit podle komentářů na konci výpisu. Pro posunutí jsou důležité hodnoty min x a min y, které by měly být nulové.

// max width = 15
// min width = 15
// max x = 18
// min x = 0
// max y = 29
// min y = 0
// last character char = 256

Ano, program by to mohl dělat sám, ale nebyl jsem si jistý, jestli se mi posun někdy nebude hodit. Později jsem zvolil souřadnici [-1, -1] jako indikátor zdvihu pera. Takže toto čeká na dořešení, možná, někdy...

Proč je potřeba písmo konvertovat?

Protože každý Hersheyho znak je definovaný okolo středu [R,R]. Bylo to vhodnější pro promítání na CRT obrazovkách tiskových strojů, pro které pan Hershey písma vytvářel. Pro použití na HPGL plotrech je snazší levý okraj posunout na 0. Souřadnice Y taktéž může začínat na 0, případně lze definovat účaří a zarovnávat znaky podle něj, přičemž všechny "ocásky" pod řádkem budou mít Y souřadnici zápornou. To už záleží jen na tom, kde chci písmo použít. Protože nekombinuji více fontů na jedné stránce, zvolil jsem posun souřadnic všech znaků do kladných čísel. Kdybych kombinoval různé fonty v jednom textu, musel bych u každého fontu najít účaří a zarovnávat podle něj.

program mzxr_binary_font_to_Hershey-font.php

Když už jsem řešil konverzi fontů, chtěl jsem v Hersheyho formátu i písmo z ovladače MZXR. Měl jsem k tomu dva důvody, jednak je to písmo neproporcionální vhodné pro výpis zdrojových kódů a druhak je to písmo velmi jednoduché, složené z minima úseček, které plotry mohou kreslit rychleji než písma komplikovanější.

./mzxr_binary_font_to_Hershey-font.php mzxr_font_62232.bin > mzxr_font.jhf

Když se mi podařilo pochopit kódování fontu v ovladači MZXR - viz diskuze na OldCompu, nebyla konverze složitá. Je potřeba si dát pozor pouze na dva detaily. Konvertované písmo z MZXR je nutné zvětšit přibližně 3x, aby se přiblížilo typické velikosti Hersheyho fontů. A zároveň bylo nutné nějak zkonvertovat tečky na malý čtverec otočený o 45°, jak je u Herheyho fontů zvykem. Prostá tečka u některých (kuličkových) per není dost zřetelná. Je-li tam malý čtvereček, plotr perem "zavrtí" a tím je lépe zaručeno, že se tam něco nakreslí.

Zkonvertované písmo jsem stejně jako další písma rozšířil o diakritiku v ISO8859-2.

program text2hpgl.php

To nejlepší nakonec. Tento program umí zkonvertovat prostý text v ASCII, nebo ISO8859-2, příp. jiném osmibitovém kódování, pokud existuje font, do HPGL.

Jako obvykle, základem by takový "jednoduchý" nápad - že bych si občas mohl na plotru vytisknout nějaké poznámky, aniž bych k tomu musel zapínat ZX Spectrum, nebo text trapně konvertovat na HPGL v Inkscape. Což není ideální, protože výsledkem jsou obrysy znaků a ne vždy to vypadá správně a hezky.

Nyní program umí pracovat s proporcionálním i neproporcionálním písmem, zarovnávat odstavce k oběma okrajům volitelně s odsazeným prvním řádkem, automaticky zalamuje řádky na mezerách mezi slovy a umí pracovat s tabulátory.

screenshot screenshot

Následující snímky ukazují rozdíl mezi výchozím režimem, kdy program zarovnává k oběma okrajům a režimem pro výpis programů, ideálně monospace neproporcionálním písmem, jako je např. MZXR.

screenshot screenshot

Typické zamýšlené použití je zhruba tento postup. Vezmu jednoduchý text, spustím konvertor, nastavím sériový port pomocí stty a zkonvertovaný text pošlu do plotru (některé plotry mohou vyžadovat zároveň i čtení sériové linky, pokud reportují zpět svůj stav).

stty -F /dev/ttyUSB0 9600 cs8 clocal cread -cstopb -parenb parodd -echo crtscts raw
./text2hpgl.php readme.txt
cat readme_0.hpgl > /dev/ttyUSB0

Program při konverzi vytváří jednotlivé stránky, které čísluje od nuly. Viz příklad konverze přiloženého souboru readme.txt. V případě kolize jmen konvertor bude zvyšovat index na konci jména dokud není kolize vyřešena. Snažil jsem se, aby nedošlo k nezamýšlenému přepsání jakéhokoli souboru.

screenshot

Mělo by být možné překonfigurovat program pro libovolný HPGL plotr připojený libovolným způsobem. Já jsem při testování používal tři různé plotry, ale v generovaném HPGL není nic jiného než tyto instrukce.

IN = inicializace plotru, nastaví výchozí pozici [0,0]
SP0 = výběr prvního pera, můj plotr pípne, jiné plotry mohou instrukci zcela ignorovat
PU = pohyb se zdviženým perem
PD = pohyb s položeným perem

Instrukce IN a SP jsou použité na začátku a na konci stránky. Zbytek jsou pouze pozice pera instrukcemi PU a PD, jejichž souřadnice jsou absolutní a vždy kladné. Toto omezení vyplývá ze schopností importního fitru v mnou používaném Inkscape (aktuálně používám verzi 0.92), který jiné instrukce neumí a zároveň z omezení mého plotru RS232 Alfi.

A to je prozatím asi vše. Doufám, že program poslouží i někomu dalšímu. Jsem zvědavý na výsledky, které můžete posílat třeba do diskuze na OldComp.cz

Proč v PHP?

Protože je to docela dobře použitelný jazyk pro zpracování textů, na který jsem zvyklý a na svých PC ho často mám nainstalovaný.

Proč na PC a ne pro ZX Spectrum?

To si taky říkám, ale častěji se mi hodí vykreslit pár poznámek z PC. Pro ZX Spectrum chystám jiné věci.

Odkazy

Download

Historie změn článku

  • 2023-08-01 - zveřejněno

[ Zpět na hlavní stránku ]

Tento web je převážně o ZX Spectru, kompatibilních počítačích a jiném zajímavém hardwaru. Naleznete-li chybu, nebo byste rádi cokoliv co s tímto souvisí, můžete mi napsat email. Stručně o mém webu zde.