В основном, что происходит, когда SDL определяет, сколько из каждого цвета отображается, он смотрит, какие биты установлены в маске, чтобы определить, какие биты нужно обратить внимание в цвете. Это не так просто, как поразрядное AND
, потому что значения сдвинуты. Например,
color = 0x00800000 = 00000000 10000000 00000000 00000000
и вы установили свои маски, чтобы быть
Rmask = 0xFF000000 = 11111111 00000000 00000000 00000000
Gmask = 0x00FF0000 = 00000000 11111111 00000000 00000000
Bmask = 0x0000FF00 = 00000000 00000000 11111111 00000000
Amask = 0x000000FF = 00000000 00000000 00000000 11111111
тогда цвет будет зеленым {R = 0, G = 128, B = 0}. Биты color
указанных Rmask
являются 0, битами, указанных Gmask
являются 0x80 == 128
, а биты, указанных Bmask
равны 0. Если вы должны были полностью изменить маски для одного цвета:
Rmask = 0x000000FF
Gmask = 0x0000FF00
Bmask = 0x00FF0000
Amask = 0xFF000000
теперь цвета будет быть синим {R = 0, G = 0, B = 128}. Похоже, что пример, который вы ищете, использует 16-битный цвет без альфа-канала. Поскольку 16 бит не делятся равномерно на 3 цветовых канала, зеленый получает дополнительный бит (поскольку человеческий глаз считается более чувствительным к зеленому).
Пример:
color = 0x1234 = 00010 010001 10100
Rmask = 0xF800 = 11111 000000 00000
Gmask = 0x07E0 = 00000 111111 00000
Bmask = 0x001F = 00000 000000 11111
Amask = 0
Цвет будет {R = 2, G = 17/2 = 8,5, В = 20}. (дополнительный бит для зеленого означает, что значение должно быть сокращено в два раза, чтобы нормализовать его).
Я не уверен, как именно это делает SDL, или какие типы сумасшедших масок вы можете использовать с SDL, но я бы предположил, что фактический алгоритм находится по строкам поразрядного AND
, а затем сдвигается вправо так, как многие биты, которые очищаются в наименее значимой части маски? Или же работая от наиболее значимого до младшего значащего бита, для каждого бит, установленного в маске, сдвиньте общее левое и добавьте 1, если установлен соответствующий бит цвета.
Спасибо user470379. Я очень ценю усилия, которые вы вложили в свой ответ! Когда вы говорите, что «он смотрит, какие биты установлены в маске, чтобы определить, какие биты нужно обратить внимание в цвете», означает ли это, например, если больше бит помещается в зеленый цвет, синий и красный цвета не отображаются очень хорошо или темнее, если для поверхности используются красные или синие цвета? – ShrimpCrackers