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

Предварительная подготовка рисунка

Сокращение рисунка и маски

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

Как правило, размеры рисунка меньше стандартного поля 32x32 точки. Например, изображение стрелки, хранящейся в файле Left_00.cur (см. Пример 6.1) помещается в прямоугольнике шириной в 14 и высотой в 21 точку. Следовательно, для его хранения в памяти достаточно выделить не 1024, а всего 294 байта. Очевидно, что при сокращении рисунка не только уменьшается занимаемое им пространство оперативной памяти, но и ускоряется процесс его построения и удаления. Рисунок и маска взаимосвязаны, поэтому при исключении строки пли столбца рисунка надо исключить соответствующую строку или столбец маски.

Пример описания рисунка и маски

В примере 6.3 заготовка рисунка и маска описаны на языке ассемблера. Это распакованный файл из примера 6.1, в котором переставлены не только строки, но и столбцы, для того чтобы стрелка курсора была наклонена влево, а не вправо.

Пример 6.3. Описание рисунка и маски курсора.

Pnt image db 00, 00, 00.00, 00, 00, 00 00.00, no, nn nn no oo
db 00, 00, 00.00, 00, 00, 00, 00.00, 00, 00, 00, 00.00
db 00, 00, FF, 00, 00, 00, 00, 00.00, 00, 00, 00, 00.00
db 00, 00, FF, FF, 00, 00, 00, 00.00, 00, 00, 00, 00.00
db 00, 00, FF,FF, FF, 00, 00, 00.00, 00, 00, 00, 00.00
db 00, 00, FF,FF, FF, FF, 00, 00.00, 00, 00, 00, 00.00
db 00, 00, FF, FF, FF, FF, FF, 00.00, 00, 00, 00, 00.00
db 00, 00, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00.00
db 00, 00, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00.00
db 00, 00, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00.00
db 00, 00, FF,FF, FF, FF, FF, FF, FF, FF, FF, 00, 00.00
db 00, 00, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, 00.00
db 00, 00, FF, FF, FF, 00, FF, FF, 00, 00, 00, 00, 00.00
db 00, 00, FF, FF, 00, 00, FF, FF, 00, 00, 00, 00, 00.00
db 00, 00, FF, 00, 00, 00, 00 FF, FF, nn 00 nn ПП ПО
db 00, 00, 00.00, 00, 00, 00, FF,FF, 00, 00, 00, 00.00
db 00, 00, 00.00, 00, 00, 00, 00, FF, FF, 00, 00, 00.00
db 00, 00, 00.00, 00, 00, 00, 00, FF, FF, 00, 00, 00.00
db 00, 00, 00, 00, 00, 00, 00, 00.00, FF, FF, 00, 00.00
db 00, 00, oo on nn nn nn 00.00, FF, FF, 00, 00.00
db 00, 00, 00.00, 00, 00, 00, 00.00, 00, 00, 00, 00.00

pntmask db FF, 00, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF
db FF, 00, 00, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF, FF
db FF, 00, 00.00, FF, FF, FF, FF, FF, FF, FF, FF, FF,FF
db FF, 00, 00.00, 00, FF, FF, FF,FF, FF, FF, FF, FF,FF
db FF, 00, 00.00, 00, 00, FF, FF, FF, FF, FF, FF, FF,FF
db FF, 00, 00.00, 00, 00, 00, FF, FF, FF, FF, FF, FF, FF
db FF, 00, 00.00, 00, 00, 00, 00, FF, FF, FF, FF, FF,FF
db FF, 00, 00.00, 00, 00, 00, 00.00, FF, FF, FF, FF,FF
db FF nn 00.00, nn nn nn 00.00, on FF FF FF FF
db FF, 00, 00.00, 00, 00, 00, 00.00, 00, 00, FF, FF, FF
db FF, 00, 00.00, 00, 00, 00, 00.00, 00, 00, 00, FF, FF
db FF, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, FF
db FF, 00, 00, 00, 00, 00, 00, 00, 00, FF, FF, FF, FF, FF
dc FF, 00, 00, 00, 00, 00, 00, 00, 00,:-:-, FF, FF, FF, FF
db FF, 00, 00, 00, FF, FF, 00, 00, 00, 00, FF, FF, FF, FF
db FF, ou, 00, FF, FF, FF, 00, 00, 00, 00, FF, FF, FF, FF
db FF, 00, FF, FF, FF, FF, t F, 00, 00, 00, 00, FF, FF, FF
db FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, FF, FF, FF
db FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, 00, 00, FF, FF
db FF, FF, F"F FF, FF, FF, FF, FF, 00, 00, 00, 00, FF, b г
db FF, FF, FF, FF, FF, FF, FF, FF, FF, 00, 00, FF, FF, FF

В примере 6.3 метки pntimage и pntmask предшествуют директиве db, поэтому двоеточие после них не ставится. Если вы будете включать текст примера в свою программу, то все коды FF надо заменить на OFFh или на десятичное число – 1. Здесь это не сделано только из соображений наглядности, чтобы можно было увидеть образованный из цифр рисунок. Текст примера лучше всего включить в сегмент данных вашей программы. Для того чтобы рисунок курсора был черно-белым, нулевой регистр цвета видеокарты должен быть очищен, а в последнем (255-м) регистре должен находиться код белого цвета (3F,3F,3F).

Подведем итог всему сказанному в данном разделе. Курсор, хранящийся в файле формата icon, не удобно использовать без предварительного преобразования рисунка и маски и установки палитры используемых цветов. Если вы хотите, чтобы ваша задача могла работать с файлами формата icon, то в нее придется включить специальную процедуру, выполняющие описанные в данном разделе действия. Если же нужен только один рисунок курсора, то его преобразование проще выполнить вне задачи, а в ее исходный текст включить результат, как это сделано в примере 6.3.

Преобразования выполняются вручную или с помощью специально составленной программы, поскольку стандартные графические редакторы не работают с файлами формата icon. Преобразование вручную занимает сравнительно немного времени. Сначала исходный файл преобразуется в символьную форму, т. е. в файл, содержащий шестнадцатеричные коды (дамп). А затем символьный файл редактируют с помощью любого текстового редактора, например, входящего в Norton Commander и вызываемого нажатием функциональной клавиши F4.

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