Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

бленд-функции: какими они бывают?..

282
08 октября 2011 года
Bard
481 / / 26.02.2006
Пишу подобие фреймворка. Для отрисовки гуя использую руки. Решил упорядочить написанные макросы для бленда (у меня их три, работают с пикселами [FONT="Courier New"]A8R8G8B8[/FONT]):

Код:
#define PIXEL_ALPHABLEND_SRCALPHA_INVSRCALPHA(src,dest) \
    ( \
    ((((src >> 24)      * (src >> 24) + (dest >> 24)        * (255 - (src >> 24))) >> 8) & 0xff) << 24 | \
    ((((src >> 16 & 0xff)   * (src >> 24) + (dest >> 16 & 0xff) * (255 - (src >> 24))) >> 8) & 0xff) << 16 | \
    ((((src >> 8 & 0xff)    * (src >> 24) + (dest >> 8 & 0xff)  * (255 - (src >> 24))) >> 8) & 0xff) << 8 | \
    ((((src & 0xff)     * (src >> 24) + (dest & 0xff)       * (255 - (src >> 24))) >> 8) & 0xff) \
    )

#define PIXEL_ALPHABLEND_ALPHA_INVALPHA(src,dest,alpha) \
    ( \
    ((((src >> 24)      * (alpha) + (dest >> 24)    * (255 - alpha)) >> 8) & 0xff) << 24 | \
    ((((src >> 16 & 0xff)   * (alpha) + (dest >> 16 & 0xff) * (255 - alpha)) >> 8) & 0xff) << 16 | \
    ((((src >> 8 & 0xff)    * (alpha) + (dest >> 8 & 0xff)  * (255 - alpha)) >> 8) & 0xff) << 8 | \
    ((((src & 0xff)     * (alpha) + (dest & 0xff)   * (255 - alpha)) >> 8) & 0xff) \
    )

#define PIXEL_ALPHABLEND_SRCAa_INVSRCAa(src,dest,alpha) \
    ( \
    ((((src >> 24)      * ((src >> 24) * alpha >> 8) + (dest >> 24)     * (255 - (((src >> 24) * alpha) >> 8))) >> 8) & 0xff) << 24 | \
    ((((src >> 16 & 0xff)   * ((src >> 24) * alpha >> 8) + (dest >> 16 & 0xff)  * (255 - (((src >> 24) * alpha) >> 8))) >> 8) & 0xff) << 16 | \
    ((((src >> 8 & 0xff)    * ((src >> 24) * alpha >> 8) + (dest >> 8 & 0xff)   * (255 - (((src >> 24) * alpha) >> 8))) >> 8) & 0xff) << 8 | \
    ((((src & 0xff)     * ((src >> 24) * alpha >> 8) + (dest & 0xff)        * (255 - (((src >> 24) * alpha) >> 8))) >> 8) & 0xff) \
    )


Первый вопросов не вызывает. А вот последние два... Кто знает, что ето я такое написал?

Они фунциклируют так:

 
Код:
SRC_[A,R,G,B] * (alpha)         + DEST_[A,R,G,B] * (ONE - alpha)
SRC_[A,R,G,B] * (SRC_ALPHA * alpha) + DEST_[A,R,G,B] * (ONE - SRC_ALPHA * alpha)


[SIZE="1"][COLOR="#696969"]Последний ето фактически тоже что и [FONT="Courier New"]PIXEL_ALPHABLEND_SRCALPHA_INVSRCALPHA[/FONT] но альфаканал сурса кагбе блендитца отдельно и только после етого принимает участие в общем расщете. Задумывался он для блендинга пикселов с альфой (с png'шки например) на сурфейс но с возможностью задания глобальной прозрачности всего пикчера.[/COLOR][/SIZE]

Проблема - присудствие в етих макросах дополнительной компоненты [FONT="Courier New"]alpha[/FONT].

Почему проблема:

Допустим я имею в распоряжении канвас к которому можно применять различные атрибуты отрисовки (клипинг, атрибуты вывода текста, атрибуты блендинга...). К етому канвасу применима процедура типа [FONT="Courier New"]blt[/FONT], но продвинутая процедура. Такая что в зависимости от атрибутов канваса соответствующим образом обрабатывает копируемые блоки пикселов. Так, если я напишу [FONT="Courier New"]канвас->установить_бф(PIXEL_ALPHABLEND_SRCALPHA_INVSRCALPHA)[/FONT], то всё гуд. Но если ето будет [FONT="Courier New"]PIXEL_ALPHABLEND_SRCAa_INVSRCAa[/FONT], то откуда процедуре блитинга брать значение дополнительной альфы? делать что-то наподобии [FONT="Courier New"]канвас->установить_дополнительное_значение_фльфаканала(xxx);[/FONT] жутко нехочется.

Может я как-то криво продумал архитектуру?

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог