Логотип.
 Разделы сайта Cтатьи.
Сайт в разработке!

Статистика сайта.

Посещений за день: 230
Посещений за месяц: 1872
Посещений за год: 13917


Баннеры.

DMconnect
Maksy's PWS


Статистика в картинках.

likes counter


  • Главная.
  • Новости.
  • Программы.
  • Файлы.
  • Контакты.
  • Чат "Пиво".
  • Форум.
  • Статьи.
  • Ссылки.
  • Гостевая.
  • Серое небо.

     Именно такого цвета вы бы увидели небо, если бы люди не имели цветового анализа тора глаза. По-моему я гоню.

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

      Итак, начнем.

      Для начала нам необходимо решить сколь ко градаций серого будет соответствовать нашим цветам и построить таблицу из 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
    

    >>

    BitByByte, 2000 г. (2026).