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

Анализ основных полей заголовка

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

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

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

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

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

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

Пример А.4. Вычисление значений переменных fwidth и rmndr.

Part_3: xor cl, cl; cl = 0, значение константы сдвига
add ax, 03; ax = ax + 3 (ax содержит iwidth)
and al, OFCh очищаем 2 младших разряда ах
cmp bitcnt, 08 bitcnt = 8?
je @F › да, переход на локальную метку @@
add ах, 04 ах = ах + 4
and al, OF8h очищаем 3 младших разряда ах
inc cl cl = 1, значение константы сдвига
cmp bitcnt, 04 bitcnt = 4?
je @F › да, переход на локальную метку @@
add ax, 18h ах = ах + 24
and al, OEOh очищаем 5 младших разрядов ах
mov cl, 03 cl = 3, значение константы сдвига
?: mov bx, ax bx = ах (округленное значение iwidth)
sub bx, iwidth bx = bx – \width
shr bx, cl сдвиг bx вправо на содержимое cl
mov rmndr, bx количество дополнительных байтов
shr ax, cl сдвиг ах вправо на содержимое cl
mov fwidth, ax сохраняем значение fwidth

Рисунок не помещается па экране

Вполне вероятно, что размеры (или один из размеров) рисунка превышают размеры рабочей области экрана, соответствующие установленному видеорежиму. В таких случаях возможны, по крайней мере, три варианта действий, не считая отказа от построения рисунка:

  • выводится только часть рисунка, помещающаяся на экране;
  • увеличивается логический размер строки (функция 4F06h);
  • устанавливается видеорежим с большим геометрическим разрешением.

В двух первых случаях на экране будет видна только часть, а в третьем случае – все изображение, если удастся подобрать подходящий видеорежим. Наиболее универсален второй способ, но для получения всех его преимуществ в задачу надо включить механизм перемещения области видеопамяти, отображаемой на экране. В приложениях для Windows таким механизмом являются горизонтальный и вертикальный "лифты".

Изменять установленный видеорежим или его характеристики в описываемой здесь подпрограмме не целесообразно, это надо делать на более высоком уровне. Если же вас устраивает построение части рисунка, размер которой зависит от установленного видеорежима, то в данной подпрограмме можно принудительно изменить значения iwidth и iheight.

Дополнение к примеру А.3
Для выполнения описанных действий, в тексте примера А.3 команда, выполняющая проверку размера кода точки mр ci, I8h), заменяется группой команд, приведенных в примере А.3
.

Пример А.5. Ограничение значений переменных iwidth и iheight.

mov bx, horsize bx = размер экрана по горизонтали
cmp bx, ax iwidth > horsize?
jae @F › нет
mov iwidth, bx iwidth = horsize (уменьшаем iwidth)
@@: mov bx, versize bx = размер экрана по вертикали
cmp bx, iheight iheight > versize?
jae @F › нет
mov iheight, bx iheight = versize (уменьшаем iheight)
@@: cmp cl, 18h cl = 18h?

При построении рисунка с таким ограничением значений iwidth и iheight на экране будет видна его левая нижняя часть размером horsize*versize. Мы не включили эти команды в текст примера А.3 потому, что ограничение размера рисунков не относится к основным действиям, выполняемым при обработке заголовка файла.

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