Прикладная графика 1992 г.

Растровая графика - печать шаблона 8x8. Печать шаблона произвольного формата без атрибутов. Координата в знакоместах, в пикселах. Печать произвольного шаблона с атрибутами.


2. РАСТРОВАЯ ГРАФИКА

При работе с растровой граФйкой программисту приходится
решать следующие задачи:

1. Выбрать формат, в котором шаблоны будут храниться в Ва-
шей програнне Нохет быть. Вы примете решение о тон, что все
шаблоны будут у Вас иметь одинаковый размер. Если хе Вы решите,
что различные шаблоны могут иметь различные размеры, то очевид-
но, что вместе с картой битов шаблона Вам надо будет сохранять '
и данные о его размерах по горизонтали и вертикали. Иногда
оказывается важным вместе с изображением сохранять и координаты
левого верхнего угла окна экрана, из которого оно было взято.
Тогда его можно будет при восстановлении на экране поместить
точно на свое место.

Здесь же надо решить для себя, как поступить с пветовыми
атрибутами то ли Вы будете хранить в памяти только битовую
карту своего изображения, а назначение цвета выполнять при вы-
даче его на экран, то ли Вы будете хранить данные по атрибутам
вместе со своими шаблонами. При этом следует помнить, что раз
минимальный размер квадрата атрибутов на "Спектруме" равен 6X6.
то данные по атрибутам пелесообразно хранить только для таких
шаблонов, вертикальный и горизонтальный размер которых кратен
8. напринер 16X24. 32X32 и т.п. Приняв решение о совместной
хранении атрибутов. Вы также ограничите себя в способах выдачи
Ваших шаблонов на экран. Перед тем. как изобразить шаблон на
экране. Ван надо будет четко рассчитать координату положения
его левого верхнего угла с тем, чтобы Ваше изображение точно
вписалось в квадраты сетки низкого разрешения экрана (32X24).
иначе если хоть какая-то часть изображения выйдет за пределы
своих знакомест, произойдет переключение цветовых атрибутов в
соседних знакоместах и могут нарушиться цвета картинки, ранее
имевшейся на экране. Это явление называется "клэшингон* атри-
бутов. Всякий, кто работал с цветом в графическом редакторе
"ARTSTUDIO", конечно хе сталкивался с этим явлением и знает,
насколько оно неприятно.

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

2. Подготовить шаблон (шаблоны) изображения с помощью гра
Фического редактора или какого-либо другого программного
средства.

3. Отгрузить шаблон (шаблоны) на внешний носитель.

Организовать свои шаблоны в библиотеку (таблицу) в со-
ответствии с избранным Форматом, это нужно для того, чтобы впо-
следствии Ваша программа могла быстро находить в памяти данные
для шаблона по его номеру. Если все шаблоны в Вашей программе
имеют одинаковые размеры, то проблем с выбором Н-ного шаблона
из таблицы не будет, но если у Вас шаблоны произвольные, да к
тону же их битовая карта хранится внесте с атрибутами, то при-
дется решить вопрос о тон. как отделять шаблоны друг от друга.

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

Возможно, Вам придется написать свою служебную программу
"Библиотекарь", которая соберет с ленты отгруженные Вами кар
тинки. измерит их длину, предложит Вам ввести атрибуты для каж-
дого знакоместа и расположит картинки в памяти одну за другой
вместе с префиксными байтами в виде единого цельного файла.

5. Может быть. Вы предполагаете использовать в програнне
очень мнбго графики. Тогда рано или поздно перед Вами встанет
вопрос о необходимости компрессии (архивации) Ваших изображе-
ний и чем более крупные шаблоны Вы применяете, тем скорее нас-
тупит этот момент. Придется написать програнму "Архиватор*,
которая сожмет размеры Файла шаблонов. Поскольку никакой ско-
рости от нее не требуется, она вполне может быть написана и на
БЕИСИКе.

6. Подготовить процедуру для сканирования по Файлу шабло-
нов. которая по номеру нужного Ван шаблона найдет его начало.

7. Подготовить процедуру для дезархивации шаблона и печати
его на экране, здесь опять же нужно определиться, как Вам лучше
дезархивировать картинку - сразу на экран или сначала в отве-
денный для этой цели буфер, а потом оттуда перебрасывать ее на
экран. В чен здесь разница. Вы наверное догадались и сами. Если
сделать буфер, то увеличится размер использованной оперативной
памяти, но зато можно очень быстро производить освежение экра-
на. Если же дезархивашго выполнять прямо на экран, то экономит-
ся память, но процесс печати естественно замедлится. Так что Вы
сани должны решить, что для Вашей программы важнее - быстродей-
ствие или обьеи. Во многих случаях имеет смысл в качестве буфе-
ра иметь где-то в оперативной памяти полную копию экрана. Это
тем более целесообразно, что процедуры для печати на экран и
в буфер Фактически одни и те же. различия наиминимальнейшие.

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

2. 1. Печать шаблона 8X8.

это. конечно, наипростешая задача. Предположим, что нам
нужно поместить шаблон с порядковым номером ММ на экран в пози-
цию с координатами х и Y. Пусть таблица шаблонов расположена в
оперативной памяти, начиная с адреса ADDR.T. здесь может быть
разница в тон. как заданы координаты X и Y. Если они заданы в
знакоместах, то напечатать шаблон на экране надо с привязкой к
знакоместу и тогда печать производится КОПИРОВАНИЕМ БАЙТОВ шаб-
лона в область экрана. То есть шаблон копируется по восьмипик-
сельным линиям, каждую из которых представляет один байт. Если
же координаты заданы в пикселах, то тогда печать производится
КОПИРОВАНИЕМ БИТОВ шаблона в область экрана.

операция выполняется в три приема.

На первом этапе номер (индекс) нужного нам шаблона уста-
навливается в регистре L. Если у нас больше 256-ти шаблонов, то
в регистровой паре HL. В регистровой паре DE устанавливаем ба-
зовый адрес таблицы и ишен искомый результат в регистровой паре

HL.

LD DE. ADDR_T ; Базовый адрес таблицы шаблонов.

LD HL. КМ ; Номер нашего шаблона.

ADD HL. HL : Умножили его на 2.

ADD HL.HL ; Умножили его на ч.

ADD HL.HL ; Умножили его на В.

ADD HL.DE ; Нашли адрес начала нашего шаблона в HL.

PUSH HL ; Запомнили его на стке до востребования.

На втором этапе по координатам X и Y. установленным в ре-
гистровой паре DE находим соответствующий им адрес в дисплейном
Файле. При этом возможны два варианта, в первом случае коорди-
наты заданы в знакоместах, а во втором случае - в пикселах. И в
том и в другом случае можно воспользоваться процедурами, кото-
рые были нами подробно рассмотрены в книге "Элементарная гра-
фика" и кратко повторе™ в начале этой книги (раздел I. 3).

LD D. X
LD E. Y

CALL GET_ADR_S ; Си. 1.3
или

CALL GET_ADR_P ; CM. 1. 3

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

А: Координаты заданы в знакоместах.

Если координаты заданы в знакоместах, то задача сводится к
копированию 8-ми байтов и нам достаточно одного цикла на в
шагов.

POP DE ; Взяли со стека адрес нашего шаблона.
LD В. 8 ; Организация цикла в 8 шагов.
LOOP LD A. (DE) : Взяли байт из шаблона.

LD (HL).А ; Поместили его на экран.

IHC DE ; Переход к очередному байту шаблона.

IHC Н ; Переход к очередной линии

; знакоместа экрана.
DJNZ. LOOP ; Если не все 8 байтов скопированы.
; то возврат на LOOP.

В: Координаты заданы в пикселах.

Во втором случае, когда координаты заданы в пикселах, при-
ходится решать вопрос о побитном копировании каждого байта и в
этом случае нам уже необходимы два цикла - внутренний и внеш-
ний каждый на восемь шагов. Благодаря тому, что координаты за-
даны в пикселах, мы можем использовать для печати точек на эк-
ране встроенную в ПЗУ процедуру PLOT (22Е5Н = 8933). Надо толь-
ко обеспечить наличие координаты X в регистре в. а координаты Y
- в регистре С и не забыть, что при своей работе эта процедура
"портит" регистровую пару HL. PLOT относится к быстроработаюшим
процедурам ПЗУ и ее применение в Ваших программах почти всегда
можно считать целесообразным, тогда алгоритм сводится к тому.

что наш шаблон сканируется по восьми рядам и в тех местах, где
бит включен, вызывается процедура PLOT для печати точки на эк-
ране. а там. где бит выключен, этот вызов не происходит. Скани-
рование производится врашением байта шаблона через Флаг перено-
са. При этом если бит включен, то включается Флаг переноса, что
и служит индикатором необходимости вызова PLOT.

POP HL .Взяли со стека адрес шаблона.

LD Е.У ; Координата 7 левого верхнего угла.

LD С. 8 ; Счетчик линий шаблона.

LOOP_2 LD D.х ;Координата X левого верхнего угла.

LD A.(HL) :очередной копируемый байт.
OR А ;принудительный сброс Флага переноса.

LD в.в ; Счетчик пикселов в линии. *

LOOP _l PUSH ВС ; Освободили ВС для работы с процедурой

; PLOT.

LD В. D ; Координаты левого

LD С, Е ; верхнего угла.

RLA ; Врашение влево через Флаг переноса.

JR NC.PASS ; Если бит погашен, то вызывать PLOT
;не надо.

PUSH HL ; Перед вызовом PLOT надо сохранить HL.

CALL 22Е5Н ;вызов процедуры ПЗУ PLOT.
POP HL ; Восстановление HL

PASS IHC D ; Переход к новой координате X.

POP ВС ; Восстановление счетчиков.

DJNZ LOOP_l ;Если не все восемь битов в байте

; проверены, возврат на 1.00Р_1.
DEC с :Переход к новой координате у.

IHC HL ; Переход к очередному байту шаблона.

LD А. В

OR С ;проверка регистра с на ноль.

JR HZ LOOP_2 ;Если не все восемь байтов просмотре-
;ны. следует возврат на LOOP_2 для
; повтора.
RET ; Выход из процедуры.

В заключение описания этого алгоритма мы должны высказать
одно замечание. Дело в том. что здесь ничего не сделано для
проверки координат позиции печати ни по X. ни no V. а вообше-то
надо проверять, а ложатся ли они в пределы экрана? Здесь этот
монент опушен для того, чтобы освободить алгоритм от излишних
подробностей, не имеющих отношения к обсуждаемому вопросу.

2. 3. Печать шаблона произвольного Формата
без атрибутов,

г. г. 1. Координаты заданы в знакоместах.

Для печати произвольного шаблона размером [m x п] знако-
мест мы можем воспользоваться тем же алгоритмом, которым печа
тали шаблон 8x8 пикселов. повторив его го раз по вертикали и п
раз по горизонтали. Таким образом, оказывается, что там, где
для печати шаблона 8X8 достаточно было одного цикла в 8 ша-
гов, теперь необходимы три вложенных цикла:

Для работы процедуры нам понадобятся несколько программных
переменных.

ADDR_S DEFW 0000 :Адрес в дисплейном Файле.

COORDS DEFW 0000 :Координаты X и У.

NUMBER DEFB 00 ; Номер шаблона.

BITMAP DEFW оооо ;Адрес начала Файла шаблонов

LENGTH DEFB 00 ;Длина стандартного шаблона.

SIZE.X DEFB 00 ;Размер шаблона по горизонтали

;(в знакойестах).
SIZE_Y DEFB 00 ; Размер шаблона в знакоместах

; по вертикали.

LD DE. (COORDS) ; Ввод координат левого верхнего
; угла;

LD А. Е
AHD 18Н

OR 10 I Расчет адреса в дисплейном

LD Н> А Файле по координате, задан-

LD А. Е I ной в знакоместах.

AHD 07

OR А

RRA

RRA I

RRA
RRA

ADD A. D Я

LD L. А

LD (ADDR S). HL fЗапомнили адрес в дисплейном
; Файле.

LD A. (NUHBER) ;Номер шаблона.
LD В. А : Организовали счетчик шаблонов.

LD DE. LENGTH ;Длина шаблона
LD HL. BITMAP ; Начало Файла шаблонов.
rLOOP ADD HL. DE ;Смешение на длину шаблона.

'- 0JNZ LOOP ; Повторяем столько раз, каков

;порядковый номер шаблона.

LD DE.(ADDR.S) ;Адрес в дисплейном Файле.

LD В. SIZE.V : счетчик знакомест по вертикали.

LD С.SIZE.X ; Счетчик знакомест по горизонтали.

LOOP_3 PUSH DE ; Сохранили адрес экрана.

LOOP_2 PUSH ВС ; Сохранили счетчики на стеке.

LD С, 8 ; организовали счетчик линий в

; знакоместе.

LD В. 8 ; Организовали счетчик пикселов в

; текущей линии знакоместа.

PUSH DE : Сохранили экранный адрес

; еше раз.

LOOP_i LD A.(HL) ; Загрузили в аккунулятор

;очередной байт шаблона.

LD (DE).A ;Перенос текущего байта из

; оперативной памяти в экранную.

INC Ъ : Переход к следующей линии

;знакоместа на экране снизу.

IHC HL ; Переход к следующему байту

. шаблона.

-DJHZ LOOP_i ; Конец цикла копирования шаблона

; 8 X 8.

POP DE ; Восстановили экранный адрес.

LD А. 20Н

ADD А. Е : Переход к следующему экранному

LD Е. А ;ряду

POP ВС ; Восстановили счетчики знакомест.

-DJHZ LOOP_2 ;Если не все знакоместа по

.'вертикали скопировали, возврат
; назад.

POP DE ;

IНС Е ;Переход к следующему знакоместу

; справа.

DEC С .'Уменьшили счетчик столбцов.

LD А. С ; Проверка счетчика

OR В :на ноль.

-JR HZ.LOOP_3 : Если не весь шаблон скопирован.

:возврат на LOOP3.

RET

2. 2. 2. Координаты заданы в пикселах.

Как и в случае с копированием шаблона 8X8. здесь встает
задача побитного копировании и наилучшим способом, как мы уже
говорили, является использование встроенной в ПЗУ процедуры
PLOT. С точки зрения удобства программирования, есть принципи-
альное отличие от случая, когда координаты заданы в знакомес-
тах. Оно состоит в порядке копирования байтов шаблона (сравни-
те рис. 1 и рис. 2):

Есть и еше одно отличие от случая, когда координаты заданы
в знакоместах. Здесь нам не надо определять адрес в дисплейном
Файле, соответствующий координатам левого верхнего угла, по-
скольку в стандартной процедуре PLOT уже все для этого есть,
если мы Предварительно задали координаты в регистровой паре ВС.

Программные переменные.

COORDS

DEFV

0000

; Координаты X и Y в пикселах.

NUHBER

DEFB

00

;Номер шаблона.

BITMAP

DEFW

0000

:Адрес начала Файла шаблонов.

LENGTH

DEFB

00

:Длина стандартного шаблона.

SIZE_X

DEFB

00

; Размер шаблона по горизонтали

;(в пикселах).

SIZE_Y

DEFB

00

;Размер шаблона в пикселах

; по вертикали.

здесь нам также достаточно трех вложенных циклов:

Внешний цикл LOOP-3 выполняет копирование строк шаблона.
Длина цикла равна высоте шаблона по вертикали. Промежуточный
цикл LOOP 2 копирует отдельную строку шаблона по восьнипик-
сельным линиям. Количество этих линий равно числу полных и
неполных знакомест, которые занимает шаблон по горизонтали (оно
вычисляется). Внутренний цикл копирования одной восьмипикселной
линии состоит из восьми шагов врашения байта шаблона и печати с
помошью процедуры PLOT точки на экране в тех случаях, когда
соответствующий пиксел в шаблоне включен.

LD A, (NUMBER) : Номер шаблона.

LD В. A ; Организовали счетчик шаблонов.

LD DE. LENGTH ; Длина шаблона

LD HL. BITHAP ; Начало Файла шаблонов.

LOOP ADD HL. DE ;Смешение на длину шаблона.

- DJNZ LOOP : Повторяем столько раз. каков

;порядковый номер шаблона.

LD DE,(COORDS);Координаты левого верхнего угла:
; Е - координата У;
;D - координата X.

LD С. SIZE.Y ; Счетчик линий по вертикали.

LD В. SIZE_X ; Размер по горизонтали в пикселах.

LD А. В

AND 0F8H ; Гашение трех младших битов.

CP В .-Проверяем не делится ли SIZE_X

; на 8 нацело.

RRCA .Три раза врашение вправо

RRCA ; эквивалентно делению на восемь.

RRCA ;То же самое можно сделать и

; командой сдвига SRL. но она может

; влиять на Флаг Z. а у нас он хранит
;результат операции cp в и портить
;его не надо.

JK Z. PASS ;Если SIZE_X делится на 8 нацело.

;то прибавлять единицу не нухно.

INC А :IHT (X.SIZE/8) ♦ I

PASS LD В,А ;Счетчик цикла по горизонтали, т.е.

; размер по горизонтали в знакоместах
; (как в полных, так и не в полных).
-loop_3 push ВС ; Сохранили счетчики на стеке.

-loop.г push ВС ; Сохранили счетчики на стеке.

LD A. (HL) ; Очередной копируемый байт.

OR А ; Принудительный сброс флага переноса.

LD В. в .-счетчик пикселов в линии.

-LOOP_l PUSH ВС ; Освободили ВС для работа с

; процедурой PLOT.

LD В. D ;Координаты левого

LD С. Е ; верхнего угла.

RLA ; Врашение влево через Флаг переноса.

JR НС.PASS.1 ; Если бит погашен, то вызывать PLOT
;не надо.

PUSH HL ; Перед вызовом PLOT сохранин HL.

CALL 22Е5Н : Вызов процедуры ПЗУ PLOT.

POP HL ;Восстановление HL

?ASS_l IHC D ; Переход к новой координате X.

POP ВС ; Восстановление счетчика пикселов.

-DJHZ LOOP_l . Е ли не все восемь битов в байте

; проверены, возврат на LOOP_l.

POP ВС :Восстановление счетчика линий.

-DJHZ LOOP_2 ;Если не все линии в ряду

; скопированы, возврат на LOOP.2.

POP ВС ;восстановление счетчика линий.

DEC с ;Если не все линии по вертикали
-JR HZ.LOOF_3 ;скопированы, то возврат на LOOP_3.

RET ; Возврат.

2. 3. Печать произвольного шаблона с атрибутами.

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




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Обратная связь - контакты редакции.
СС'99 - интервью: Wlodeck Black (организатор Funtop'98) и MMA.
Здесь и сейчас - Может показаться странным, но шикарный ужин в самом дорогом ресторане не так уж необходим для соблазнения.
Мнение - О состоянии отечественного журналостроения: иллюзия под названием журнал.
Реклама - Реклама и объявления ...

В этот день...   20 апреля