Заключительные замечания
Маскировка
Существует особая категория рисунков, при построении которых используется маска. Маска может храниться в готовом виде в файле, содержащем рисунок, например она обязательно прилагается к рисункам курсоров и пиктограмм (значков). Другую категорию рисунков в англоязычной литературе принято называть "спрайтами" (sprite). Маска для них формируется динамически, в зависимости от значений кодов точек рисунка, но в любом случае маскировка преследует одну цель.
Какой бы формы не был сам рисунок, например треугольник, стрелка, песочные часы и т. д., его образ всегда дополняется до прямоугольника, для того чтобы все строки имели одинаковый размер. Это существенно упрощает хранение и воспроизведение рисунков и одновременно вынуждает применять маскировку, исключающую вывод на экран той части прямоугольной области, которая не относится к рисунку. За счет наложения маски вы видите на экране, например изображение стрелки курсора, а не черный прямоугольник, на фоне которого она нарисована. Более подробно мы поговорим о маскировке при рассмотрении способов построения курсора в Главе 6 и продолжим эту тему при описании видеорежимов direct color.
Перемещение рисунков
Простейшим примером перемещаемого рисунка является изображение курсора. Работа с ним подробно описана в Главе 6.
В общем случае при первом построении перемещаемого рисунка надо сохранить исходный фон на занятом им месте. Для перемещения рисунок удаляется с экрана и воспроизводится на новом месте. Перед перемещением сохраняется исходный фон на новой позиции, а после перемещения на месте удаленного рисунка восстанавливается исходный фон. Если адреса точек старой и новой позиции рисунка относятся к одному сегменту видеопамяти (точки расположены в одном окне), то для перемещения достаточно простого копирования содержимого одних байтов видеопамяти в другие.
Однако в общем случае при таком способе перемещения перед чтением и записью кода каждой точки придется проверять принадлежность адреса нужному сегменту видеопамяти и при несоответствии изменять текущее окно. В результате перемещение будет происходить крайне медленно.
Если в распоряжении задачи имеется достаточный объем видеопамяти, то имеет смысл копировать исходный рисунок в оперативную память, а оттуда в нужное место видеопамяти. При такой схеме перемещения затраты на работу с окнами видеопамяти будут минимальными. Если доступное задаче пространство оперативной памяти ограничено, то через оперативную память можно перемещать отдельные строки рисунка. Это упростит работу с окнами видеопамяти в пределах каждой строки.
Идентификация находящихся на экране объектов
Из опыта работы с компьютером вы наверняка знаете, что с помощью манипулятора "мышь" можно не только перемещать изображение курсора по экрану, но и выполнять различные преобразования объектов, на которые указывает курсор. Например, можно перемещать рисунок вместе с курсором, вызывать появление выпадающих или всплывающих меню, выполнять действия, указанные в окнах меню и т. п. Для выполнения подобных действий задача должна формировать структуру данных, содержащую исчерпывающую информацию обо всех расположенных на экране объектах.
Элемент структуры может содержать координаты конкретного объекта, его размер, указание назначения и другие сведения об особенностях работы с объектом. Например, если объект является перемещаемым рисунком, то понадобится адрес буфера, содержащего исходный фон, а если это один из элементов оформления "рабочего стола", то важно знать адрес процедуры, выполняющей связанные с ним действия.
Описание объектов обычно оформляется в виде таблицы или списка. Таблица состоит из строк одинакового размера, расположенных в оперативной памяти последовательно друг за другом. Поэтому возможен прямой доступ к любой строке. Элементы списка могут иметь переменный размер и располагаться в памяти в произвольном порядке. Прямое обращение к произвольному элементу списка невозможно, он находится по цепочке ссылок. Каждый элемент содержит указатель адреса следующего элемента (ссылка на следующий элемент), что и позволяет перемещаться по списку впер Если при работе возникает необходимость перемещаться в обратном направлении, то используется еще одна ссылка, указывающая адрес предыдущего элемента списка.
Механизм ссылок делает список гибкой и легко изменяемой структурой, но одновременно замедляет процесс поиска нужных элементов. Поиск в таблице осуществляется быстрее, но изменить порядок расположения ее строк, если это понадобится, сложнее, чем изменить последовательность доступа к элементам списка.
Выбор конкретной структуры для хранения описания объектов зависит, в основном, от стиля программирования, которого вы придерживаетесь, ваших практических навыков и, в меньшей степени, от программируемой задачи.