Иллюстрированный самоучитель по SVGA

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

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

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

После того как файл открыт, в буфер обмена считываются его заголовок и палитра используемых цветов. Ранее мы условились, что сегмент, содержащий буфер обмена, хранится в переменной 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 выполняются достаточно простые действия, поэтому мы не будем останавливаться на их подробном описании.

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

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.