Аппаратное обеспечение IBM PC© Александр Фролов, Григорий ФроловТом 2, книга 1, М.: Диалог-МИФИ, 1992. 7.8. Печать в графическом режимеДо сих пор мы использовали принтер только для печати символьной информации - буквы, цифры, символы псевдографики и т.д. Коды символов мы тем или иным способом выводили на принтер, принтер распечатывал их с использованием внутренних шрифтов, записанных в ПЗУ принтера, или с использованием загружаемых шрифтов. Однако печать символов - это не все, на что способен матричный принтер. Вспомним, как происходит печать букв. Принтерная головка содержит 9 или 24 иголки, расположенных вертикально. Печатающая головка движется в горизонтальном направлении вдоль листа бумаги, причем между головкой и листом находится красящая лента. Каждая иголка управляется отдельным электромагнитом, при включении которого она "выстреливается" в направлении красящей ленты, оставляя на бумаге маленькую точку. Цвет этой точки определяется красящей лентой. Цветные матричные принтеры (например, LQ2550) заряжаются многоцветной лентой. Эта лента напоминает черно-красную ленту для механических пишущих машинок, но на ней больше цветов. Обычно используются четырехцветные ленты, раскрашенные следующими цветами - желтый, красный, синий, черный. В процессе печати кассета с цветной лентой может перемещаться в вертикальном направлении, поэтому перед печатающей головкой может оказаться участок ленты с одним из четырех цветов. При наложении цветов возможно получение различных цветовых комбинаций, поэтому хотя цветов на ленте всего четыре, цветной принтер может печатать достаточно качественные и многоцветные изображения. Когда принтер печатает алфавитно-цифровой символ, он, передвигая печатающую головку слева направо (или справа налево, что тоже возможно), "выстреливает" теми иголками, которые соответствуют заданному шрифтом изображению символа. Очевидно, что если бы у нас была возможность самостоятельно управлять иголками и перемещением кассеты с цветной красящей лентой, мы могли бы самостоятельно формировать цветное графическое изображение, так, как это делается в полиграфии. Если вы внимательно посмотрите на фотографии, напечатанные в газетах или журналах, вы заметите, что графическое изображение состоит из отдельных точек разного цвета и очень маленького размера. Практически любые матричные принтеры позволяют печатать графические изображения. Девяти иголочные принтеры Epson FX используют для графической печати 8 верхних иголок. При этом за один проход можно напечатать одну графическую "строку", послав в принтер битовый образ строки. Если печатаемое графическое изображение по высоте превышает 8 точек, оно выводится в несколько приемов, построчно. После вывода очередной строки программа должна продвинуть бумагу на одну строку вперед. Для того чтобы между графическими строками не оставалось свободного места, необходимо правильно установить межстрочный интервал - не более 8/72 дюйма. Как перевести принтер в режим графической печати? Для этого принтер Epson FX-1050 использует следующую команду: ESC "*" m n1 n2 data Печать в графическом режиме В этой команде m задает режим печати: Значение m Режим 0 Одинарная плотность, 60 точек на дюйм 1 Двойная плотность, 120 точек на дюйм 2 Двойная плотность, печать с высокой скоростью, 120 точек на дюйм 3 Учетверенная плотность, 240 точек на дюйм 4 Режим CRT I, плотность 80 точек на дюйм 5 Режим плоттера (1:1), плотность 72 точки на дюйм 6 Режим CRT II, плотность 90 точек на дюйм 7 Режим плоттера с двойной плотностью, 144 точки на дюйм Параметры n1 и n2 определяют длину печатаемой графической строки в точках. При определении длины графической строки необходимо учитывать, что в режиме одинарной плотности на строке длиной 8 дюймов можно разместить 480 точек, в режиме учетверенной плотности - около 2000. Так как передача данных в принтер выполняется по байтам, для представления длины строки приходится использовать два байта информации. Для вычисления параметров n1 и n2 можно использоваться следующей схемой действий:
Например, пусть нам надо распечатать строку из 1234 точек. Тогда параметр n2 будет равен 1234 / 256 = 4. Остаток от деления составит 1234 - 256 * 4 = 210. Это и есть параметр n1. Проверяем: 4 * 256 + 210 = 1234 Команда должна всегда содержать два параметра, даже если параметр n2 получился равным нулю. Вслед за параметрами n1 и n2 должны следовать байты графических данных, предназначенные для печати. Должно быть передано точно n2 * 256 + n1 байтов. Если вы передатите меньше графических данных, чем это было определено в команде ESC "*", следующие вводимые в принтер команды или данные будут интерпретироваться как графические данные. Если вы передадите больше графических данных чем нужно, лишние данные будут напечатаны как обычный текст. Для представления одного восьмиточечного
столбца графической строки используется один
байт данных, причем верхней точке в столбце
соответствует старший разряд байта, а нижней -
младший: 7 Этому столбцу соответствует o 6 байт 10011011b или 9Bh o 5 * 4 * 3 o 2 * 1 * 0 На этом рисунке "*" означает точку в столбце графической строки, "o" - отсуствие точки. Вам необходимо подготовить таким образом байты для всех столбцов, входящих в распечатываемую графическую строку. Цветной 24-игольчатый принтер Epson LQ-2550 может работать в описанном выше 8-битовом графическом режиме. Это сделано для обеспечения совместимости со старым программным обеспечением, рассчитанным на принтеры серий FX, RX, LX и EX. Однако все возможности этого принтера раскрываются только при использовании всех его 24 иголок. В этом случае графическое изображение печатается отдельными строчками, высота которых составляет 24 точки. При этом для представления одного столбца графической строки требуется три байта данных. Каждый байт должен готовиться отдельно, при этом можно считать, что 24-битовая графическая строка состоит из трех 8-битовых. Формат команды графической печати для этого принтера расширен по сравнению с описанным выше: ESC "*" m n1 n2 data Печать в графическом режиме В этой команде m, как и раньше, задает режим печати. Однако для этого параметра определено больше значений: Значение m Режим 0 Одинарная плотность, 60 точек на дюйм, 8-битовая графика 1 Двойная плотность, 120 точек на дюйм, 8-битовая графика 2 Двойная плотность, печать с высокой, скоростью, 120 точек на дюйм, 8-битовая графика 3 Учетверенная плотность, 240 точек на дюйм, 8-битовая графика 4 Режим CRT I, плотность 80 точек на дюйм, 8-битовая графика 6 Режим CRT II, плотность 90 точек на дюйм, 8-битовая графика 32 Одинарная плотность, 60 точек на дюйм, 24-битовая графика 33 Двойная плотность, 120 точек на дюйм, 24-битовая графика 38 Режим CRT III, плотность 90 точек на дюйм, 24-битовая графика 39 Тройная плотность, 180 точек на дюйм, 24-битовая графика 40 Шестикратное увеличение плотности, 360 точек на дюйм, 24-битовая графика Учтите, что для команды 24-битового графического вывода требуется массив графических данных в три раза больше по размеру, чем для 8-битовой команды. Приведем пример программы, выводящей на принтер в режиме 8-битовой графики строку, состоящую из 40 столбцов: #include <dos.h> #include <stdio.h> union REGS rg; int main() { int i; // Переводим строку printchar(0x0d); printchar(0x0a); // Выдаем на принтер команду графической // печати (ESC "*" m n1 n2 data) printchar(27); printchar('*'); // Выбираем режим 0 - 8-битовая графика, // одинарная плотность printchar(0); // Задаем длину графической строки: // n1 = 40; n2 = 0 printchar(40); printchar(0); // Выводим в цикле 40 раз байт DBh for(i=0; i<40; i++) printchar(0xdb); // Переводим строку printchar(0x0d); printchar(0x0a); } // ------------------------------------ // Эта функция выводит один символ // на стандартный принтер (LPT1) // ------------------------------------ int printchar(int chr) { // Вызываем функцию 5 прерывания INT 21h - // распечатка символа на принтере. rg.h.ah = 5; rg.h.dl = chr; int86(0x21, &rg, &rg); } Аналогичная программа, использующая 24-битовую графику на принтере Epson LQ-2550: #include <dos.h> #include <stdio.h> union REGS rg; int main() { int i; // Переводим строку printchar(0x0d); printchar(0x0a); // Выдаем на принтер команду графической // печати (ESC "*" m n1 n2 data) printchar(27); printchar('*'); // Выбираем режим 32 - 24-битовая графика, // одинарная плотность printchar(32); // Задаем длину графической строки: // n1 = 40; n2 = 0 printchar(40); printchar(0); // Выводим в цикле 120 раз байт DBh. Для вывода // строки из 40 столбцов в 24-битовом режиме // требуется в три раза больше графических данных, // чем для 8-битового режима. for(i=0; i<120; i++) printchar(0xdb); // Переводим строку printchar(0x0d); printchar(0x0a); } // ------------------------------------ // Эта функция выводит один символ // на стандартный принтер (LPT1) // ------------------------------------ int printchar(int chr) { // Вызываем функцию 5 прерывания INT 21h - // распечатка символа на принтере. rg.h.ah = 5; rg.h.dl = chr; int86(0x21, &rg, &rg); } Для вывода на принтер сложных графических изображений ваша программа должна сначала подготовить массив данных для построчной 8-битовой или 24-битовой печати. Затем готовый массив можно вывести на принтер, используя несколько команд графического вывода (по одной команде на одну графическую строку). |