Графические устройства

         

Построение рисунка снизу вверх

При работе с BMP-файлами произвольного размера основным способом является построение изображения снизу вверх. В таком случае строки образа рисунка считываются в порядке их расположения в файле, а выводятся на экран начиная с последней строки рисунка.

Такой способ уже использовался для построения полноцветных рисунков формата BMP, он описан в разделе, а текст соответствующей подпрограммы показан в примере 7.25. Отличие рассматриваемого здесь случая только в том, образ рисунка использует палитру, а коды его точек могут занимать 1, 4 или 8 разрядов.

Описание предварительных действий

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



Адрес начала последней строки рисунка в видеопамяти вычисляется следующим способом. Расстояние между первой и последней строкой равно (iheight - i)*bperiine байтов. В общем случае произведение занимает два слова. Содержимое младшего слова прибавляется к адресу начала первой строки. Содержимое старшего слова преобразуется в номер окна, который прибавляется к номеру окна, в котором находится первая строка. Вычисленное значение окна надо установить.

Количество строк в порции считываемых данных (part) вычисляется как частное от деления числа 65 535 на размер строки в файле (f width). Умножив part на fwidth, получим размер порции для чтения в байтах.

Замечание
Вместо умножения можно вычесть остаток от деления из числа 65 535.

Константа переадресации строк, видеопамяти. После записи кодов точек текущей строки в видеопамять определяется адрес начала предыдущей. Для этого текущий адрес видеопамяти уменьшается на величину, вычисляемую по формуле (iwidth + horsize) *bytppnt. Если при вычитании вырабатывается признак переноса, то устанавливается предыдущее окно видеопамяти, в противном случае текущее окно не изменяется.

Подпрограмма BigBmp

Текст подпрограммы, выполняющей построение рисунка описанным способом, приведен в примере А.10. Перед ее вызовом адрес левого верхнего угла рисунка помещается в регистр di и устанавливается окно видеопамяти, которому принадлежит этот адрес. Регистр ез должен содержать код видеосегмента. Если в тексте вместо call drawiine записана команда call bx, то в регистре bх указывается адрес подпрограммы построения строки (см.

Содержание раздела