Часть типа (REDMASK * (r >> 24))
в исходном коде обрабатывает значения зажима, которые переполняются.Это работает с одной цветной частью, но не с двумя.Вам нужно будет разделить это на две части, одну для обработки красного переполнения и одну для синего.Обработка переполнения для красного цвета может быть выполнена так же, как и в оригинале, но переполнение синего цвета требует небольшой корректировки, чтобы игнорировать любой вклад красного цвета.
BLUE_MASK * ((rb & 0x100) >> 8)
Это приводит к
const unsigned rb1 = (rb & 0xff00ff) | (REDMASK * (r >> 24)) | (BLUE_MASK * ((rb & 0x100) >> 8));
Объединение двух цветов, как это работает, потому что есть промежуток между красным и синим, который может занимать переполнение (зеленые биты).Если вы попробуете это с красным / зеленым или зеленым / синим, переполнение для части, сохраненной в младшем байте, столкнется со значением для части, сохраненной в старшем байте.