19.08.2009Бинарные операции для работы с цветом в ActionScript
Введение
Закончился период отпусков и авральных возвращений к работе. Акклиматизация пройдена успешно, и настала пора возобновить ведение блога.
Задача
Возможно, это уже давно всем известно, но тем не менее, мне бы хотелось об этом написать. В ActionScript существует как минимум два способа обращаться с цветом. Если мы работаем с BitmapData, то используется ARGB, то есть прозрачность и цвет задаются одним числом типа uint. Кстати, 0xffffffff — непрозрачный белый цвет — максимальное число этого типа.
Когда же мы работаем с, например, Graphics, то цвет и прозрачность задаются отдельно друг от друга. Причём прозрачность в диапазоне от 0 до 1. Хотелось бы быстро раскладывать ARGB на части и снова собирать.
Решение
В одну сторону:
var argb:uint = 0xccabcdef;
var a:Number = (argb >>> 24) / 255.0;
var rgb:uint = argb & 0xffffff;
Аналогично, кстати, можно выделить и каналы по отдельности:
var red:uint =(argb & 0xff0000) >>> 16;
var green:uint =(argb & 0xff00) >>> 8;
var blue:uint =(argb & 0xff);
Оператор >>> вместо >> используется чтобы избежать проблем со знаком.
В обратную сторону, соответственно:
argb = (uint(a*255) << 24) | rgb;
argb = (uint(a*255) << 24) | (red << 16) | (green << 8) | blue;
Всё совершенно логично. Чтобы разделить, используется бинарное и, а чтобы объединить — бинарное или.
Для возобновления трансляции, как мне кажется, этого материала достаточно.