Построение рисунков, использующих палитру. Построение рисунка сверху вниз.
Если задача выполнила действия, описанные в предыдущих разделах, то остается только указать адрес начала рисунка в видеопамяти и можно начинать процедуру его построения. При работе с файлами формата BMP достаточно иметь одну универсальную процедуру, выполняющую построение изображения снизу вверх. Тем не менее, мы рассмотрим вариант построения сверху вниз с одновременным переворотом рисунка.
Нас будут интересовать универсальные процедуры построения рисунка, текст которых не зависит от установленного в задаче видеорежима. В первую очередь от него зависит размер кодов точек и, как следствие, размер строки и значение константы переадресации строк видеопамяти. В разделе 7.2 были введены следующие переменные, содержащие характеристики видеорежима:
- bperline – размер отображаемой на экране строки в байтах
- bytppnt – размер кода точки, выраженный в байтах
- wrdppnt – размер кода точки, выраженный в словах
Они используются в описанных ниже подпрограммах для автоматической настройки на установленный задачей видеорежим.
От видеорежима зависит не только размер кода точки, но и расположение в нем базовых цветов. Учет этих двух факторов будет производиться в подпрограммах нижнего уровня, выполняющих запись кодов точек рисунка в видеопамять. За счет этого достигается универсальность подпрограмм, выполняющих как построение рисунка в целом, так и его отдельных строк.
Здесь описан способ построения рисунка, при котором строки его образа выбираются в обратном порядке (начиная с последней строки), а на экран выводятся в естественном порядке сверху вниз.
Исходные предпосылки
Сразу отметим, что такой способ построения не является универсальным. Его можно использовать для воспроизведения рисунков небольшого размера, образы которых помещаются в одном сегменте оперативной памяти (не превышают 65 536 байтов).
При работе с большими файлами его использовать не целесообразно по следующей причине. Файл является структурой с последовательным доступом к данным. Это значит, что для обработки конкретной строки надо либо прочитать все предыдущие строки, либо просто пропустить их, выполнив принудительное позиционирование файла на начало нужной строки. Позиционирование связано с дополнительными обращениями к DOS. При обработке строк в обратном порядке потребуется многократное позиционирование файла, что существенно замедлит построение рисунка. Поэтому большие рисунки лучше строить по другой схеме.
При выборке строк из оперативной памяти в обратном порядке каждый раз надо вычислять адрес начала предыдущей строки. Возможны разные способы таких вычислений. Например, можно зарезервировать специальную переменную, содержащую адрес последней обработанной строки и уменьшать этот адрес для доступа к новой строке. В таком случае для вычисления адреса нужны три команды (пересылка, вычитание, пересылка). Мы покажем, как можно обойтись без специальной переменной.