Серое небо.
Именно такого цвета вы бы увидели небо,
если бы люди не имели цветового анализа
тора глаза. По-моему я гоню.
Ну так, вот предлагаю вышему вниманию
описание алгоритма перевода цветного
Спекрумовского изображения в градации
серого. Вы наверное спросите: "А почему
именно спектрумовского?" А все очень
просто - потому что у Спекрума особое
построение экрана, а алгоритм именно на
этом и основан. Но если понять суть де
ла, то такую фичу можно реализовать для
любой платформы, но это еще не факт.
Итак, начнем.
Для начала нам необходимо решить сколь
ко градаций серого будет соответствовать
нашим цветам и построить таблицу из 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
>>