Pro začátek se budu zabývat tiskem monochromatických obrázků, které jsou schopny výstupu na papír bez úprav. Jako kreslicí zařízení uvažuji jehličkové tiskárny umožňující osmibodovou grafiku. Jsou to samozřejmě devítijehličkové, ale ověřoval jsem i 64 tryskovou bublinku a podle příruček jsou 24 jehličkové také vhodné.
Tisková hlava je vybavena svisle umístěnou řadou jehliček. Uvažujeme-li jich osm, pak na tisk jednoho sloupečku je potřebný právě jeden bajt. Normální obrazová data (ZX je vyjímka) popisují horizontální řádky. V principu je tedy nutné nejen přeskládat datové bajty, ale i jednotlivé bity.
Uvedený příklad je zaměřený na formát obrázku 320 * 192, což je náš monochromatický formát. Situaci zjednodušuje dělitelnost počtu řádek osmi, takže není třeba ošetřovat nějaké zbytky. Tím se ovšem algoritmus stává nepoužitelným pro tiskárny se sedmi bodovým tiskem a formáty obrázků s nedělitelným počtem řádků.
Uvažoval jsem například i o možnosti tisku velkých obrázků kreslených na ST, ale zde jsem narazil na jejich velikost 32000 bajtů. Nebýt toho, uvedený program by je po přepsání pár konstant tisknul také.
V principu se musí na převod brát osmice bajtů, popisující body obrázku ležící nad sebou, tedy vlastně čtverec 8*8 a v nich přeházet jednotlivé bity. Uvedený příklad v C programu využívá možnosti přímé rotace bitů. Celý čvereček převádím najednou v jednom (nejvnitřnějším) cyklu. Dochází zde proto k dvojí rotaci.
V prvním kroku je třeba vzít nejvýznamější bity, což se provede logickým součinem s hodnotou 128. Tím jsou všechny ostatní bity vynulované, nejvýznamější zůstal v původním stavu. Těchto osm bitů je třeba poskládat do výsledného bajtu do řady za sebou a k tomu je použita rotace doprava, postupně o 1 až 7 bitů. Bity skládám tak, že nejvýznamější bit popisuje nejhornější bod v uvažované svislé lince. Předpokládám, že se jím standartně ovládá nejhořejší jehlička.
Existují podle příruček snad tiskárny, které mají ovládání jehliček obrácené, ale nikdy jsem takovou neviděl, ani o žádném konkrétním typu nečetl.
V druhém kroku jsou na řadě bity za nějvýznamějšími, tedy vlastně s číslem 6 při jejich popisování od 0 do 7. Proto je potřeba provést rotaci doleva o jedno místo. Před tím je ale vymaskován šestý bit logickým součinem s hodnotu 64. A tak to jde dál až k nejméně významnému bitu.
V celém převodním algoritmu je řada rezerv pro jeho zlepšení, k čemuž vybízí jeho pomalost. Například zarazí na první pohled dvojí, zdánlivě nesmyslná rotace. Bylo by možné odečíst hodnoty pro posuv a provádět pak jediný. Jenže posuvy jsou pravděpodobně z hlediska procesoru mnohem rychlejší než matematické operace, proto jsem je nechal raději dvojí.
Užitečnější by zřejmě bylo vypustit vnitřní cyklus úplně a rozepsat prácí s kazdým bitem zvlášť. Prostě obsah cyklu rozepsat osmkrát s dosazením konkrétních hodnot pro každý bit.
Při jiném uspořádání sledu operací nebude nutné maskovat každý bit jinou hodnotou, která se zbytečně počítá v cyklu dělením 128/2, ale používat pouze 128. Poslední bit je zřejmě maskovaný zbytečně, protože jeho rotací o sedm míst doleva se všechny předchozí asi vynulují sami od sebe. Tuto úvahu by ale bylo nutné nejdřívě ověřit, protože chování této operace může být závislé na druhu programovacího jazyka.
Skládání výsledného bajtu by asi bylo chytřejší dělat logickým součtem, protože bude rychlejší než aritmetické sčítání.
Všechny tyto úpravy mě napadly několik hodin před dokončením magazínu, takže jsem je sám již nezkoušel. Jsem vůbec rád, že se mě program po doplnění dalších funkcí vůbec podařilo znovu zprovoznit. Nakonec kurs Céčka je psaný pro programátory, tak se snažte.
Výsledkem převodu jsou nachystaná grafická data pro tiskárnu, která jsou na rozdíl od jiných hardkopírek trvale nachystána v paměti pro opakovaný tisk. (Ona taky jejich příprava je o dost pomalejší než u jiných programů.)
K provedení vlastního tisku je třeba posílat na tiskárnu řadu povelů. Úplně na začátku se musí nastavit odřádkování takové velikosti, aby mezi grafickými řádky nevznikaly mezery. Ze svislé vzdálenosti jehliček 3/216 vychází velikost posuvu na 24/216. Proto před tiskem posílám povel ESC 3 (24). Závorkami zde naznačuji skutečnou hodnotu, na rozdíl od předchozích znaků. Řada hardkopírek používá nastavení povelem ESC A n/72 s parametrem 8. Pak nefungují například na D100M, protože jej nezná.
Slušná hardkopírka pro tisku nastaví odřádkování vhodné pro tisk textu, nejlépe na standartní hodnotu 1/6". Já na to úplně zapoměl. Pokud bude někdo chtít zkusit použít produkované obrázky do Čapka, opravte si to ve zdrojovém výpisu, nebo dopište ručně kód do textu v Čapkovi. Tedy hned za povel k natažení obrázku takto: 3$. Zde znak $ představuje hodnotu 36.
Řada hardkopírek používá povel pro nastavení jednosměrného tisku, protože při obousměrném dochází k rozházení svislých čar. Zde je vynechán záměrně ze dvou důvodů. Především většina tiskáren po grafickém povelu sama přepne na jednosměrný tisk. Vím jen o D100M, která to nedělala. To může být vítané při dvojprůchodovém tisku.
Každý tiskový řádek grafiky se skládá z grafického povelu a jeho dat. Použil jsem univerzální kód ESC * m, n1, n2 jehož parametrem m se nastavují různé druhy grafik. Je ale třeba vědět, jaké daná tiskárna umožňuje.
Parametry n1 a n2 určují počet sloupců na tisk, v našem případě jde o 320.
Za každým řádkem se posílá povel pro návrat tiskové hlavy, popřípadě pro odřádkování. Ten není použitý, protože u tiskárny připojené k malému ATARI předokládám trvalé nastavení na automatické odřádkování.
Pozice obrázku se určuje nastavením levého okraje nebo posíláním mezer před grafickým příkazem. Tuto možnost jsem ponechal, protože nevím, kolik tiskáren akceptuje povel nastavení levého okraje ESC l n.
Jako hlavní rys programu jsem od začátku předpokládal možnost kvalitnějšího tisku pomocí dvojího průchodu řádků. Hrozně mi totiž vadí, tisknu-li texty v režimu NLQ a teď do toho přijde vybledlý obrázek. A to prosím i v texťáku na ST!
Situaci u našeho systému komplikuje automatický LF, takže jsem byl nucen provádět inverzní posun pomocí ESC j n. Žádná jiná možnost k návratu hlavy na začátek řádku mě nenapadla. Nevím ale, nakolik je povel u tiskáren rozšířený. Samozřejmě, že ve FLOPu popisovaná SP-180 jej má.
Před opětovným tiskem řádku provádím posun o 1/216, čímž by se měl docílit efekt zvýrazněného tisku. Totéž by mohl provádět již zmiňovaný obousměrný tisk na D100M automaticky, což bych chtěl vidět.
Ovládání hardkopírky je velmi primitivní, protože se skládá z řady dotazů. Zadání hodnot se potvrzuje stiskem RETURN.
Načtení obrázku by mělo být pro každého bez problémů, jen se pak musí čekat na přepočet. Potom je možné volit opakovaně tisk.
Nejdříve se volí výstupní zařízení, kde je možné zadat tisk do souboru. Pozor, tisk na obrazovku je také možný, ale poničí načtený obrázek.
Druhý dotaz je na patrametr grafiky, myslí se tím pro povel ESC *. Další je kvalita, 0 a 1 určuje obyčejný nebo dvojprůchodový tisk. Levý okraj je jasný, jeho hodnota je omezena na 150. Někteří totiž mohou mít i tiskárny na formát A2. Ovšem pro A4 je vhodným maximem 40.
Poslední dotaz je na použití přímého povelu nastavení levého okraje. Jinak se použijí mezery.
Možnost výstupu do souboru umožňuje začlenit obrázky do tisku pomocí Čapka. Je tu ale další problémek, nejen zapomenutý kód pro zpětné nastavení odřádkování. Některé tiskárny totiž rozumí běžným grafickým povelům jen v módu Standart, kdežto češtinu Kamenických tiskneme v módu IBM. Ke své vlastní tiskárně nemám příručku, že by v ní třeba byl alternativní povel pro tento mód.
Podle příručky pojede SP-180, SEP-510, je ověřená i STAR LC-20, dokonce i CANON BJ-230 a pokud si pamatuji na D100M, tak fungovat bude také.
Ve vývoji harkopírek bych chtěl, bude-li čas pokračovat. V plánu mám (již dlouho) připravit program vhodný k tisku orientačních přehledů archivovaných obrázků.
-ZB-