double arrow

Вывод графической информации на иголочный принтер

Вывод как текстовой так и графической информации на иголочный принтер осуществляется следующим образом.

1) На уровне MS-DOS. На этом уровне вывод данных осуществляется в специальный символьный файл PRN (LPT1 - LPT3). Для вывода на принтер используются функции библиотеки языка Си: fwrite (), fprintf (), fputs (), pute (), printf (), а также функция префиксивного вывода write () в файл с префиксом 4. Достоинством вывода на уровне MS-DOS является следующее:

а) все данные проходят через драйвер принтера, что позволяет использовать для вывода программное обеспечение любых принтеров - иголочных, лазерных, капельных.

б) стандартные средства MS-DOS обеспечивают высокую мобильность вывода и выдачу сообщений об ошибках вывода.

2) При выводе на уровне BIOS вначале выполняется инициализация принтера. Для этого необходимо выполнить функции AH = 1, DX = 0 прерывания 17h. Вывод символа ch на принтер осуществляется функциями: AL = ch, AH = 0, DX = 0 прерывания 17h.

3) Вывод непосредственно через порты вывода. Этот вариант вывода используется функциями MS-DOS и BIOS.

Рассмотрим теперь вывод графики с использованием средств языка Си на уровне BIOS. Для этого вначале запишем используемую в программе функцию вывода символа на принтер:

prchar (char ch)

{_AL = ch;

_AH = 0;

_DX = 0;

geninterrupt (0x17); }

При составлении программы вывода будем полагать, что графическое изображение уже выведено на экран. Теперь его необходимо вывести на принтер. Начальной будет следовать команда инсталляции принтера, состоящая из двух инструкций:

prchar (27); prchar (64);

Следующей будет выполняться группа инструкций, устанавливающих расстояние между выводимыми точками изображения. В данном случае целесообразно взять расстояние, равное толщине точки на принтере, т.е 7/72 дюйма. Это осуществляется контрольным (управляющим) кодом ESC “1”. На языке Си этому коду соответствуют следующие инструкции

prchar (27); prchar (“1”);

В дальнейшем будем предполагать восьмибитовую графику. Это значит, что головкой принтера будет печататься полоса, состоящая из восьми битовых строк. Кроме этого необходимо выбрать соответствующую плотность графики (табл.123).

Таблица 123. Плотность графики для иголочного принтера.

Название Команда Характеристика
Одинарная Двойная Высокоскоростная двойная Четырехкратная ESC “K” n1n2 ESC “L” n1n2 ESC “Y” n1n2 ESC “Z” n1n2 60 точек / дюйм. Строка n1+(256 x n2) 120 точек / дюйм. Строка n1+(256 x n2) 120 точек / дюйм. Строка n1+(256 x n2) 240 точек / дюйм. Строка n1+(256 x n2)

Теперь, задаваясь длиной строки l = 352, запишем продолжение программы вывода графики.

n1=352%256; n2=352/256

for (i=0; i<=400; i+=7)

{ prchar (27); prchar (‘K’); prchar (n1); prchar (n­2);

for (x=0; x<=352; x++)

{val = 0;

for (y = i; y<i+7; y++)

{ val<<1; val/=(y>400? 0: pixlit (&x, &y);}

prchar (val);}

prchar (‘\n’);}

prchar (27); prchar (64);

getch ();

return 0:}

В основном настоящая программа заимствована с книги Л.Аммерал “Машинная графика на персональных компьютерах” М:, Сол Систем, 1992. Циклом for (i=0; i<=400; i+=7) осуществляется вывод восьмибитовых полос. Циклом for (x=0; x<=352; x++) осуществляется вывод конкретной i-й восьмибитовой полосы, координаты верхнего правого угла которой на экране равны: X=0; Y=i. Циклом for (y = i; y<i+7; y++) осуществляется вывод конкретного восьмибитового столбца, описываемого переменной val. Этот цикл фактически формирует переменную val, или другими словами битовую маску переменной val.

При формировании переменной val используется функция pixlit (&x, &y). Эта функция определяет состояние бита.

int pixlit (int *x, int *y)

{unsigned offset;

char per, ch1;

offset = 80*(*y) + (*x)/8;

per = 0x80 >> ((*x)%8);

ch1 = *(unsigned far *) MK_FP (0xA000, offset);

if (ch1 & per) return 1; else return 0;}

В ней определяется адрес байта (функция MK_FP) и содержимое байта ch1, которому принадлежит пиксел с координатами X, Y. Эдесь же переменной per определяется маска байта, в которой все биты нулевые, кроме бита, соответствующего координате Х. Оператор if осуществляет сравнение ch1 и per на предмет определения состояния указанного бита в байте ch1. Сравнение осуществляется побитовым умножением. Если результат сравнения равен 0, то этот бит нулевой, если результат отличен от 0, то бит - единичный. Значение этого бита передается в основную программу для формирования битовой маски в цикле for (y = i; y<i+7; y++).

Программное обеспечение принтера имеет следующие функции изменения режима графики.

1) ESC “*” m n1 n2

Настоящая команда выбирает восьмибитовую графику из следующих режимов, приведенных в табл.124.

Таблица 124. Режимы графики.

m                
режим K L Y Z CRT 80т/д плоттер CRT 90 т/д (т/д - точек на дюйм)

2) ESC “?” n m

Команда изменяет восьмибитовый режим n при n = “K”, “L”, “Y”, “Z” на режим m, значения которого приведены в таблице 124.

3) ESC “^” m n1 n2

Команда устанавливает 9 и 16- точечную графику. Приэтом m = 0, 1 или 17. При m = 0 9- точечная графика с одинарной плотностью, при m = 1 - с двойной плотностью. При m = 17 осуществляется 16- точечная графика одинарной плотности.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: