Серое небо
(c) Shaitan/Stars of Keladan
Именно такого цвета вы бы увидели небо,
если бы люди не имели цветового анализа-
тора глаза. По-моему я гоню.
Ну так, вот предлагаю вышему вниманию
описание алгоритма перевода цветного
_Спекрумовского_ изображения в градации
серого. Вы наверное спросите: "А почему
именно спектрумовского?" А все очень
просто - потому что у Спекрума особое
построение экрана, а алгоритм именно на
этом и основан. Но если понять суть де-
ла, то такую фичу можно реализовать для
любой платформы, но это еще не факт.
Итак, начнем.
Для начала нам необходимо решить сколь-
ко градаций серого будет соответствовать
нашим цветам и построить таблицу из 8
(16) тестур в следующем формате. Сначала
идут 8 байт нулевого цвета, затем 8 байт
второго и так далее до 8-го или 16-го. В
примере приводиться програмка, которая
использует 8 градаций серого, от черного
до белого включительно, но приложив не
много усилия можно легко ее передалать
на 16, то есть с учетом флага яркости.
Именно такой алгоритм, да и сама проце-
дура использовалась в модуле Grey Scale
Convertor версий 1.0 и 2.0 для рулезней-
шего графического редактора BGE.
А теперь надо слушать меня очень
внимательно, так как дальше следует
описание самого алгоритма.
Я надеюсь что вы уже знакомы со
строением спектрумовского экрана и для
вас не является новостью то, что мы та-
ким образом имеем 8 цветов + 2 градации
яркости каждого, итого 16 цветов на чер-
нила и 16 на фон, а в общем случае полу-
чается 256 цветовых комбинаций на знако-
место.
Работу алгоритма я вам продемонстрирую
на следующем графическом участке, у ко-
торого чернила зеленого цвета, а фон
красного.
Для удобства переваривания моего бреда
кроме изображения в натуральную величину
привожу изображение в восьмикратном
увеличении.
Значится так. Считываем атрибут
соответствующего знакоместа и по нему
определяем номера и начальные адреса
текстур для фона и чернил. Затем считы-
ваем первый байт знакоместа запоминаем
на стеке и кладем на байт маску первого
байта чернил. Полученный байт надо где-
нибудь запомнить для последующего вос-
становления. Теперь со стека снимаем
значение байта знакоместа, инвертируем
его и кладем на него маску так же перво-
го байта, но уже фона. А теперь, как
опофигей, нам надо сложить по OR'у оба
замаскированных байта, после чего мы мо-
жем полученный байт положить на место
оригинального байта. После всех указан-
ных этих действий мы можем переходить
уже ко второму байту знакоместа, только
уже не надо определять адреса текстур, а
в виде масочных байтов необходимо ис-
пользовать вторые байты этих же текстур.
После того, как мы прошлись по всему
знакоместу нам необходимо на него поло-
жить нужный атрибут с кодом #38, то есть
фон сделать белым, а чернила черными и
все это с отключеной яркостью. В резуль-
тате у вас получиться нечто подобное
(см. цветной пример).
После этого мы можем переходить к
следующему знакоместу и все действия на-
до производить повторно.
Для лучшего понимания привожу вам ис-
ходный текст процедура перевода в града-
ции серого, которая использовалась в мо-
дуле с версией 1.0 к BGE.
SCREEN EQU #4000
ATTR EQU #5800
LD HL,SCREEN
LD DE,ATTR
LD B,24 ;стpоки в экpане
M3 PUSH BC
PUSH HL
LINFIL LD B,32 ;знакомест в одной стpоке
M2 PUSH BC
LD A,(DE)
PUSH HL
PUSH DE
PUSH AF
RRA ;опpеделяем адpес фоновой текстуpы
RRA
RRA
LD DE,ATR_TBL
AND 7
ADD A,A
ADD A,A
ADD A,A
LD H,0
LD L,A
ADD HL,DE
LD (PAP),HL
POP AF
AND 7 ;опpеделяем адpес чеpнильной текстуpы
ADD A,A
ADD A,A
ADD A,A
LD H,0
LD L,A
ADD HL,DE
LD (INK),HL
POP DE
POP HL
PUSH HL
LD B,8 ;количество байт в знакоместе
M1 LD A,(HL) ;читаем байт из знакоместа
PUSH HL
PUSH AF
LD HL,(INK)
AND (HL) ;кладем чеpнильную маску
LD C,A ;запоминаем
INC HL
LD (INK),HL
LD HL,(PAP)
POP AF
CPL ;инвеpтиpуем оpигинальный байт
AND (HL) ;кладем фоновую маску
OR C ;соединяем два полученный байта
INC HL
LD (PAP),HL
POP HL
LD (HL),A ;кладем на место
CALL DOWN_HL ;пеpеходи на нижележащий байт
DJNZ M1
LD A,#38 ;кладем атpибут
LD (DE),A
POP HL
INC HL
INC DE
POP BC ;пеpеходим к следующему
;знакоместу
DJNZ M2
POP HL
CALL LOWERHL
POP BC ;пеpеодим к следующей стpоке
DJNZ M3
RET
DOWN_HL INC H
LD A,H
AND 7
RET NZ
LD L,A
ADD A,#20
LD L,A
RET C
LD A,H
SUB 8
LD H,A
RET
LOWERHL LD A,L
ADD A,#20
LD L,A
RET NC
LD A,H
ADD A,8
LD H,A
RET
ATR_TBL ; а это сами текстуpы
DEFB #FF,#FF,#FF,#FF;-BLACK
DEFB #FF,#FF,#FF,#FF
DEFB #77,#FF,#DD,#FF;-BLUE
DEFB #77,#FF,#DD,#FF
DEFB #AA,#FF,#AA,#FF;-RED
DEFB #AA,#FF,#AA,#FF
DEFB #55,#BB,#55,#EE;-MAGENTA
DEFB #55,#BB,#55,#EE
DEFB #55,#AA,#55,#AA;-GREEN
DEFB #55,#AA,#55,#AA
DEFB #55,#22,#55,#88;-CYAN
DEFB #55,#22,#55,#88
DEFB #55,#00,#55,#00;-YELLOW
DEFB #55,#00,#55,#00
DEFB #00,#00,#00,#00;-WHITE
DEFB #00,#00,#00,#00
INK DEFW #0000
PAP DEFW #0000
6 В приложении вы можете наити этот ис-
ходник в формате Alasm, но уже без ком-
ментариев.
А вот чего можно добиться с помощью
этой процедурки.