Системное программное обеспечение персональных ЭВМ


Пример 6 - часть 2


При печати в графическом режиме за один проход каретки печатается строка (полоса) высотой 8 точек. Таким образом, графическое изображение составляется из таких строк-полос. Размер битового образа одной строки в памяти (в байтах) равен ширине строки (в точках). Каждый байт образа описывает один столбик изображения высотой в 8 и шириной в 1 точку (старший разряд байта соответствует верхней точке изображения). Для выдачи образа на печать следует выдать на принтер такую Esc-последовательность:

  • первые 3 байта задают переключение принтера в графический режим и всегда одинаковы: 0x1B, 0x2A, 0;
  • два следующих байта содержат число n - размер (в байтах) графического образа, причем первым следует младший байт этого числа;
  • далее выдается побайтно графический образ, принтер выводит на печать в графическом режиме n выдаваемых ему байт.

В примере 8.8 приведена программа, которая строит изображение на экране, а затем выводит на принтер его твердую копию. Для нас здесь представляет интерес функция prtgraph, обеспечивающая вывод твердой копии (разобраться в функции paint, строящей изображение на экране, читатель сможет, ознакомившись с главой, посвященной видеоадаптеру).

Параметрами функции prtgraph являются экранные координаты левого верхнего и правого нижнего углов того окна экрана, копию которого следует вывести на печать, и код цвета, которым построено изображение. Поскольку изображение будет выводиться построчно, следует обеспечить, чтобы строки на печати располагались плотно, без промежутков между ними, этому удовлетворяет расстояние между строками 25/216 дюйма, которое устанавливается специальной Esc-последовательностью. Определяется ширина окна, размер битового образа будет равен этой ширине, в соответствии с этим выделяется память для размещения битового образа, заодно размер образа заносится в третий и четвертый байты Esc-последовательности установки графического режима. Формирование образа происходит построчно: последовательно считываются (функцией 0x0D прерывания 0x10, см.раздел 9.7) точки первой строки экранного обpаза; x-координата внутри окна опеределяет номер байта печатного образа, y-координата - номер формируемого разряда в этом байте. Если точка на экране имеет заданный цвет, то в соответствующий разряд заносится 1. (Мы считываем образ по строкам, и это соответствует представлению графической информации в видеоадаптере, но вы можете организовать и считывание образа по вертикали.) Когда очередные 8 строк экранного образа будут считаны и преобразованы в образ печати, информация выводится на принтер - вначале заголовок Esc-последовательности, а затем сам образ, после чего начинается формирование следующей строки образа для печати. Поскольку высота заданного окна не обязательно кратна 8, после перебо- ра всех экранных строк может остаться невыведенным на печать образ печатной строки, высота которого менее 8 точек. Этот образ выводится после выхода из цикла.




- Начало -  - Назад -  - Вперед -