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

         

Чтение заголовка файла и палитр

Действия, предшествующие построению рисунка, описаны ниже по шагам. На каждом шаге приводится обоснование действий и их программная реа-лизация. Это сделано для того, чтобы описание и программирование кон-кретных действий были расположены близко друг к другу.

Описание двух первых шагов

После того как файл открыт, в буфер обмена считываются его заголовок и палитра используемых цветов. В разделе мы условились, что сегмент, содержащий буфер обмена, хранится в переменной swpseg, а смешение в нем — в переменной swpoffs. Чтение порции данных в буфер обмена выполняет подпрограмма Readf, описанная в примере 3.23. Она располагает считанные данные в сегменте swpseg, начиная с адреса (смешения), указанного з Swpoffs. Чтение заголовка и палитры производится в два приема.

Шаг 1. Считываем из файла первые 16 байтов и располагаем их в начале буфера обмена, начиная с адреса о. Проверяем содержимое двух первых байтов буфера. В них должны находиться коды заглавных латинских


букв вм 42h и 4оь). Если это не так, то файл не соответствует стандарту BMP и его обработка не имеет смысла.

Если в начале файла находятся буквы вм, то слово 10 (DAh) указывает сме-щение образа рисунка от начала файла (bioffBits). Напомним, что образ рисунка расположен после палитры, поэтому значение, указанное в сло-вe 10, можно использовать для вычисления размера второй порции данных.

Шаг 2. Читаем следующие 16 байтов (bioffBits) и располагаем их в буфере обмена начиная с 16-го байта (счет начинается с нуля), т. е. сразу после данных, прочитанных на первом шаге. После чтения в буфере находятся заголовок файла и палитра. В зависимости от принадлежности файла стандарту Windows или OS/2, размер и структура заголовка соответствуют табл. А.1 или А.2.

Программная реализация двух описанных шагов показана в примере А.2. Это начало большой подпрограммы, которую мы будем описывать по частям, входные параметры у нее отсутствуют, но перед обращением должен быть покрыт файл, содержащий выбранный вами рисунок, а его идентификатор помещен в переменную handle, которая используется в подпрограмме Readf.

Пример А.2. Начало обработки заголовка BMP-файла

JitMap: mov ex, 16 ; размер порции для чтения
mov SwpOffs, 0 ; адрес начала считываемых данных
call Readf ; чтение первых 16-ти байтов файла
jnc FilType ; -> чтение без ошибрк ret ; возврат при ошибке чтения
i /рилижение А. Рисунки в сраилал и
FilType xor si, si очистка регистра si
mov fs, SwpSeg fs = сегмент буфера обмена
mov ax, fs: [si] ax = метка файла ("ВМ")
cmp ax, 4D42h файл типа BMP?
je bmpfil -> да
stc нет, установка С-разряда
ret возврат, файл не BMP
bmpfil: mov ex, fs: [si+OAh] сх = смещение области данных
sub ex , 16 сх = сх — 16, порция для чтения
mov SwpOffs, 16 адрес начала считываемых данных
call Readf чтение остатка заголовка и палитры
jnc part_2 -> чтение без ошибок
ret возврат при ошибке чтения

В примере А.2 выполняются достаточно простые действия, поэтому мы не будем останавливаться на их подробном описании.

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


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