Drukowanie grafiki
Drukowanie grafiki
Choć na pierwszy rzut oka temat może wydawać się skomplikowany to jednak okazuje się w miarę prosty. Żeby drukować grafikę, trzeba wydruk skierować na drukarkę posiadającą możliwość druku w takim trybie. W przypadku większości współczesnych drukarek taki tryb uzyskamy wysyłając uprzednio do drukarki odpowiedni kod sterujący. Wykorzystuje się to często np. w celu uzyskania na wydruku polskich liter – jesli drukarka takowych nie ma w sobie. Jeśli w tekście pojawia się polski znak – to program drukujący przełącza drukarkę w tryb druku grafiki a następnie wysyła do niej obraz litery, np. Ń. Jeśli drukujemy przez centronics – to pierwszą ważną rzeczą jest przełączenie go w tryb natywny – bez konwersji kodów. W przypadku drukarek igłowych trzeba dostosować program drukujący do potrzeb drukarki. Najczęściej spotykane igłówki mają 7 lub 9 igieł, a interfejsy centronics mają bitów 8. To niedopasowanie można rozwiązać programowo.
Pierwszy przykład wydruku grafiki skieruję na drukarkę nie wymagającą interfejsu centronics, posiadającą możliwość druku graficznego i … mającą 7 igieł czyli Atari 1029.
W podręczniku drukarki znajduję się tablica kodów sterujących i wyczytamy z niej, że aby rozpocząć druk grafiki należy drukarkę „przygotować” wysyłając do niej dwa kody sterujące:
ESC 9 – włącza tryb 9 LPI, czyli gęste drukowanie linii poziomych ESC A – włącza tryb wydruku grafiki |
Następną czynnością jest wysłanie do drukarki informacji o ilości danych do druku w formacie dwubajtowym: MSB, LSB tworzących zależność MSB*256+LSB. I tak: jeśli chcemy wydrukować 10 bajtów, to wysyłamy bajty danych o wartościach: 0 i 10, jeśli danych ma być 480 to będzie to 1 i 224. Po tym wysyłamy do drukarki bajty do drukowania. Proces druku linni obrazu kończy się po prawej stronie, więc zapraszamy głowicę drukarki do powrotu wysyłając kod RETURN. Dla porządku jeszcze raz pełny zbiór kodów:
ESC 9 ESC A MSB LSB bajty_danych RETURN |
i przykład wydruku 8 bajtów danych:
ESC 9 ESC A 0 8 12345678 155 |
Tyle z podręcznika użytkownika. Do testów druku grafiki przygotowałem logo programu SONDA:
Obraz ma 320×192 punkty. Korzystając z języka Turbo Basix XL załadujemy go na ekran trybu Graphics 8:
10 GRAPHICS 8+16 11 OPEN #1,4,0,”D:SONDA.PIC”: BGET #1,DPEEK(88),7680: CLOSE #1 |
Mamy obraz na ekranie, teraz zaczynają się schody. Orientacja bitowa z racji ułożenia igieł w drukarce jest pionowa, a Atari generuje obraz rysując linie poziome. To niedopasowanie uniemożliwia bezpośrednie przesłanie danych z pamięci ekranu do drukarki.
Na dodatek mamy 7 igłową drukarkę. Żeby przesłać bajt danych trzeba pobrać z ekranu Atari 7 punktów z kolejnych linii ekranu w 1 kolumnie, scalić je w bajt i wysłać do drukarki.
Następnie przesuwamy się o jedną kolumnę ekranu w prawo i tak do ostatniej kolumny ekranu. Następnie kolejne 7 linii i tak do ostaniej linii ekranu. Istotne jest, że dolna igła w drukarce to bit 0 – opowiadać jej będzie punkt na przecięciu kolumny1 i linii 7 z powyższego obrazka. Pora na kod:
12 OPEN #1,4,0,”P:”:P=6 13 FOR Y=0 TO 191 STEP 7 14 PUT #1,27:PUT #1,57:PUT #1,27:PUT #1,65 :PUT #1,1:PUT #1,64 15 IF Y=189 THEN P=2 16 FOR X=0 TO 319 17 FOR R=0 TO P 18 LOCATE X,Y+R,C:G=G+G+C 19 NEXT R 20 IF P=2 THEN G=G*16 21 PUT #1,G:G=0 22 NEXT X 23 PUT #1,155 24 NEXT Y 25 CLOSE #1:END |
Linia 14 wysyła kody sterujące: ESC 9 ESC A 1 64 ( drukujemy 320 kolumn: 1*256+64 )
Linia 15 i 20 koryguje brakujące linie ekranu, wynikające z podziału 192/7
W linii 23 przesuwamy papier i wracamy głowicą drukarki na lewą stronę.
RUN i efekt działania:
Procedura przekształcania danych jest wspólnym dziełem użytkowników serwisu atarionline.pl
2014-06-30 Aktualizacja: drukowanie grafiki
Wolny weekend nastroił mnie do napisania niewielkiego programu niwelującego wadę programu z góry – czasu drukowania. „Drukarz” czyta jednokolorowe pliki PIC i BMP w rozdzielczości 320×192 punktów. Wydruk obrazu na drukarkę trwa około minuty, na dysk kilka sekund.
Programik działa tak: