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, но уже без ком-
ментариев.
 А  вот  чего  можно  добиться с помощью
этой процедурки.
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  




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

Похожие статьи:
FreeNews - Масту не дали!!
Poke's - подборка Poke's.
HARD - если ваш PENTAGON еще не умер,то вам читать ее не нужно =)

В этот день...   26 сентября