Inferno
#02
01 мая 2001 |
|
For Coderz - алгоритм перевода цветного Спекрумовского изображения в градации серого.
Серое небо (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, но уже без ком- ментариев. А вот чего можно добиться с помощью этой процедурки.
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября