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



 

Заключительные замечания

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

Установка палитры

В файлах, содержащих образы точечных рисунков, обязательно хранится палитра, в которой находятся коды использованных в рисунке цветов, иногда ее называют таблицей цветов. Коды точек рисунка являются порядковыми номерами входящих в палитру цветов (или строк таблицы цветов). Поэтому перед построением рисунка палитра должна быть установлена, т. е. коды перечисленных цветов должны быть записаны в DAC-регистры видеокарты. Если при этом изменится порядок расположения или номера цветов палитры, то перед записью в видеопамять должны быть изменены коды некоторых или всех точек рисунка. Установка палитры и различные манипуляции с ней описаны в следующей главе книги.

Изменение состояния курсора

Трудно представить графическую задачу, при выполнении которой не используется курсор — специальный рисунок, указывающий на экране текущее положение манипулятора "мышь". Обычно курсор перемещается так, что находящееся на экране изображение не портится. Если же вновь добавленный рисунок закроет изображение курсора, то при перемещении последнего на месте старой позиции возникнет прямоугольник, содержащий фрагмент изображения исходного фона, а не нового рисунка. Для исключения таких случаев изображение курсора удаляется с экрана перед построением нового рисунка, а затем вновь восстанавливается на экране.
Можно организовать анализ взаимного расположения курсора и добавляемого рисунка и удалять курсор только в тех случаях, когда рисунок закрывает часть его изображения. Однако проще удалить курсор на время выполнения любых изменений находящегося на экране изображения. Работа с курсором описана в главе 6.
I
Сохранение исходного фона. Для того чтобы рисунок можно было удалить с экрана или переместить на экране с одного места на другое, перед его построением надо сохранить содержимое тех адресов видеопамяти, в которые записываются коды точек строящегося рисунка. Иначе говоря, надо сохранить исходную картинку (исходный фон) на той части экрана, которую займет новый рисунок. В главе 5 (см. раздел) описаны подпрограммы для сохранения и восстановления исходного фона на месте информационных строк, содержащих различные текстовые сообщения.

Обычно исходный фон сохраняется в оперативной памяти. Размер буфера, в котором сохраняется исходный фон, зависит от размеров рисунка и может оказаться достаточно большим. Фоновые рисунки большого размера приходится сохранять в файлах на внешних носителях. В приложении Б данной книги приведена подпрограмма, выполняющая сохранение или восстановление изображения заполняющего все пространство рабочей области экрана.

Важно
Перед сохранением исходного фона с экрана обязательно удаляется изображение курсора, в противном случае после восстановления фона на экране окажутся два изображения курсора — неподвижное и перемещаемое.

Маскировка

Существует особая категория рисунков, при построении которых используется маска. Маска может храниться в готовом виде в файле, содержащем рисунок, например она обязательно прилагается к рисункам курсоров и пиктограмм (значков). Другую категорию рисунков в англоязычной литературе принято называть "спрайтами" (sprite). Маска для них формируется динамически, в зависимости от значений кодов точек рисунка, но в любом случае маскировка преследует одну цель.

Какой бы формы не был сам рисунок, например треугольник, стрелка, песочные часы и т. д., его образ всегда дополняется до прямоугольника, для того чтобы все строки имели одинаковый размер. Это существенно упрощает хранение и воспроизведение рисунков и одновременно вынуждает применять маскировку, исключающую вывод на экран той части прямоугольной области, которая не относится к рисунку. За счет наложения маски вы видите на экране, например изображение стрелки курсора, а не черный прямоугольник, на фоне которого она нарисована. Более подробно мы поговорим о маскировке при рассмотрении способов построения курсора в главе 6 и продолжим эту тему при описании видеорежимов direct color.

Перемещение рисунков

Простейшим примером перемещаемого рисунка является изображение курсора. Работа с ним подробно описана в главе 6.

В общем случае при первом построении перемещаемого рисунка надо сохранить исходный фон на занятом им месте. Для перемещения рисунок удаляется с экрана и воспроизводится на новом месте. Перед перемещением сохраняется исходный фон на новой позиции, а после перемещения на месте удаленного рисунка восстанавливается исходный фон. Если адреса точек старой и новой позиции рисунка относятся к одному сегменту видеопамяти (точки расположены в одном окне), то для перемещения достаточно простого копирования содержимого одних байтов видеопамяти в другие.

Однако в общем случае при таком способе перемещения перед чтением и записью кода каждой точки придется проверять принадлежность адреса нужному сегменту видеопамяти и при несоответствии изменять текущее окно. В результате перемещение будет происходить крайне медленно.

Если в распоряжении задачи имеется достаточный объем видеопамяти, то имеет смысл копировать исходный рисунок в оперативную память, а оттуда в нужное место видеопамяти. При такой схеме перемещения затраты на работу с окнами видеопамяти будут минимальными. Если доступное задаче пространство оперативной памяти ограничено, то через оперативную память можно перемещать отдельные строки рисунка. Это упростит работу с окнами видеопамяти в пределах каждой строки.

Идентификация находящихся на экране объектов

Из опыта работы с компьютером вы наверняка знаете, что с помощью манипулятора "мышь" можно не только перемещать изображение курсора по экрану, но и выполнять различные преобразования объектов, на которые указывает курсор. Например, можно перемещать рисунок вместе с курсором, вызывать появление выпадающих или всплывающих меню, выполнять действия, указанные в окнах меню и т. п. Для выполнения подобных действий задача должна формировать структуру данных, содержащую исчерпывающую информацию обо всех расположенных на экране объектах.

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

Описание объектов обычно оформляется в виде таблицы или списка. Таблица состоит из строк одинакового размера, расположенных в оперативной памяти последовательно друг за другом. Поэтому возможен прямой доступ к любой строке. Элементы списка могут иметь переменный размер и располагаться в памяти в произвольном порядке. Прямое обращение к произвольному элементу списка невозможно, он находится по цепочке ссылок Каждый элемент содержит указатель адреса следующего элемента (ссыл на следующий элемент), что и позволяет перемещаться по списку впер Если при работе возникает необходимость перемещаться в обратном направлении, то используется еще одна ссылка, указывающая адрес предыдущего элемента списка.

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

 
Назад Начало