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


Пример А З Формирование исходных



Пример А.З. Формирование исходных значений основных переменных

Part 2 : mov ax, fs: [si+12h] ax = biwidth, формат Windows и OS/2
mov bx, fs: [si+16h] bx = biHeight, формат Windows
mov ex, fs: [si+ ICh] ex = biBitCnt, формат Windows
cmp byte ptr fs: [si+01 ]h) , 28h; заголовок формата Windows ?
je @F -> да, переходим на запись значений
mov bx, fs: [si+14h] bx = biHeight, формат OS/2
mov ex, fs: [si+18h] сх = biBitCnt, формат OS/2
Э @ : mov iwidth, ax iwidth = biwidth
mov f width, ax fwidth = biwidth
mov iheight, bx iheight = biHeight
mov bitcnt, cl bitcnt = biBitCnt
cmp cl, 18h cl = 18h ?
jne Part_3 -> нет, переход на продолжение
ret возврат из подпрограммы

При выполнении примера А.З переменным iwidth и fwidth присваиваются эдинаковые значения, но в общем случае они различаются. Поэтому цель мльнейших шагов — уточнить значение fwidth.

Здесь уместно напомнить, что в стандарте PCX значение переменной fwidth фанится в заголовке файла и вычислять его не надо (см. раздел).

Наиболее простой способ определения значения fwidth следующий. В соответствии со стандартом в полях заголовка хранятся размер файла и адрес начала образа рисунка. Размер образа рисунка в байтах равен разности указанных величин. При делении этой разности на количество строк получается размер строки в байтах.

К сожалению, этот способ на практике не применим. Проверка достаточно большого количества файлов показала, что поле bfsize (его смешение 02) в котором должен находиться размер файла в байтах, может содержать ошибочное значение или нуль. Размер файла можно определить программно, но для этого придется обращаться к DOS со специальными запросами.

Следующие 4 шага. Мы опишем более простой способ, основанный на том что адрес начала строки в файле должен быть кратен четырем. Поэтому если количество точек в строке рисунка не кратно четырем, то при записи в файл после каждой строки добавляется необходимое количество байтов, содержимое которых не определено. При построении образа рисунка эти байты не используются, их просто пропускают. Таким образом, одна из причин различия значений переменных iwidth и fwidth связана с возможным наличием дополнительных байтов в строке файла. Кроме того, вследствие упаковки точек 2- и 16-цветных рисунков, строка в файле будет в 2 или в 8 раз короче строки рисунка (без учета дополнительных байтов).

Для получения нужного результата выполняются следующие 4 шага.

Шаг 4. Предполагаем, что fwidth = iwidth. Округляем это значение до ближайшего целого числа, кратного четырем. Очищаем константу сдвига. Если bitcnt = 8, то переходим к шагу 7, иначе следующий шаг.

Шаг 5. Полученное на предыдущем шаге значение округляем до ближайшего целого, кратного 8. Присваиваем константе сдвига значение 1. Если bitcnt = 4, то переходим к шагу 7, иначе следующий шаг.

Шаг 6. Если мы дошли до этого шага, то bitcnt = 1, т. е. рисунок двухцветный (но не обязательно черно-белый). Округляем полученное на предыдущем шаге значение fwidth до ближайшего целого, кратного 32. Константе сдвига присваиваем значение 3.

Шаг 7. Округленное значение сдвигаем вправо на константу, значение которой выбиралось на предыдущих шагах, и присваиваем его переменной fwidth. Вычисляем количество дополнительных байтов в строке файла (значение переменной rmndr). Нужные величины сформированы.

Программная реализация описанных шагов показана в примере А.4, который является продолжением примеров А.2 и А.З.









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


Книжный магазин