Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Альфа канал для 16 битного цвета
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
DpInRock
Вот такая проблема.
Для 24 битного цвета легко менять яркость точки, ибо каждый цвет занимает ровно байт (а байт он и есть байт, его легко умножить на альфу - бери и умножай).
Для 16 битного цвета 5:6:5 уже голову сломал.
Выделять каждую составляющую, а потом паковать ее обратно - как-то не очень.
Пытался подобрать некое число, чтобы уможать сразу 16 битный цвет, а компоненты сами бы собой изменялись синхронно и правильно. (Тем более, я выбрал ширину альфа канала всего 4 бита и таких констант было бы не так много).
Неужто в виндах в 16 битном цвете вот так с каждым пикселом мучаются? Тогда он по идее, должен медленнее 24 битного работать? Вернее, процессорного времени больше отбирать...
aaarrr
Элементарно, если есть 32-битное умножение:
Код
typedef   unsigned short    DISP_COLOR
#define   DISP_MAX_ALPHA    0x20

DISP_COLOR disp_cl_blend(DISP_COLOR color0, DISP_COLOR color1, unsigned char alpha)
{
    unsigned int c0 = color0, c1 = color1, mask = 0x07e0f81f;

    c0 = (c0 | (c0 << 16)) & mask;
    c1 = (c1 | (c1 << 16)) & mask;
    c0 = ((c0 * alpha) >> 5) & mask;
    c1 = ((c1 * (DISP_MAX_ALPHA - alpha)) >> 5) & mask;
    c0 = c0 + c1;
    c0 |= c0 >> 16;

    return (DISP_COLOR)c0;
}
DpInRock
Да, до такого бы я своей головой не додумался бы.
Вернее, заранее не поверил бы, что если просто расчистить место, то можно получить такую красивую конструкцию.
Мерси.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.