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