Перевод цвета в RGB -
OFFREAL - 04.03.2011
Здравствуйте!!!
Недавно столкнулся с такой задачей: надо представлять цвета игроков (да и любые цвета) в вид RRGGBB для использования в Colour Embedding. В результате была написана такая функция:
Код:
stock HEX2STR(hex)
{
new str[8] = {48,48,48,48,48,48,0,0}, tmp[8], idx;
if(!hex) {return str;}
format(tmp,8,"%x",( (hex >> 8) | 0xFF000000 ) - 0xFF000000 );
idx = strlen(tmp);
for(new i = 0;i < idx;i++) {str[5-i] = tmp[idx-1-i];}
return str;
}
Есть предложения о том как можно оптимизировать эту функцию, или вообще по-другому написать?
Re: Перевод цвета в RGB -
OFFREAL - 04.03.2011
Добавлю:
format с использованием %x (или %h) криво работает со всеми "отрицательными цветами", то есть с теми старший разряд которых в бинарном виде равен 1
Например красный: hex: 0xFF0000FF bin:11111111000000000000000011111111 dec: -16776961
Re: Перевод цвета в RGB -
OKStyle - 05.03.2011
Начинай читать отсюда:
http://forum.sa-mp.com/showpost.php?...postcount=1739 и ниже.
Re: Перевод цвета в RGB -
OFFREAL - 05.03.2011
Куда ниже то? там одно сообщение))
Все это я знаю, и то что все числа 4-байтовые, а когда в старшем разряде 1 то число считается отрицательным, и format тупит при использовании %h %x для отрицательных чисел
Re: Перевод цвета в RGB -
Romanius - 05.03.2011
число 0xFFFFFFFF больше cellmax поэтому оно и переходит в отрицательное....
если б в павн был тип long то все было бы ок. Но тут нужно юзать оператор >>> или << (<<<) и вывода их поодельности как РГБ. Поже будет пример
Re: Перевод цвета в RGB -
OKStyle - 05.03.2011
Quote:
Originally Posted by OFFREAL
Куда ниже то? там одно сообщение))
|
Ах да...
http://forum.sa-mp.com/showpost.php?...postcount=1741
Re: Перевод цвета в RGB -
Romanius - 05.03.2011
PHP код:
new color = 0xAABBCCDD;
new R = color >>> 24;
new G = (color >> 16) & 0x00FF;
new B = (color >> 8) & 0x0000FF;
new A = color & 0x000000FF;
printf("%x %x %x %x", R, G, B, A);
0xFF = 0b11111111 т.е. 8 бинарных разрядов
цвет состоит у нас из 8 * 4 бинарных разрядов (32) поэтому 1 раз переносим цвет на 24 бинарных разряда, дабы получить первые 8 (0xAA красный цвет), далее получаем 16 разрядов (0xAABB красный и зеленый) далее бинарным И убираем уже существующий красный цвет, далее получаем 24 разряда (полностью цвет 0xAABBCC красный зеленый и синий) далее бинарным оператором И убираем уже 2 существующих цвета (красный и зеленый) и получаем синий цвет. Потом уже мы не будем передвигаться на 32 разряда т.к. цвет и так состоит из 32 разрядов (: поятому просто получим альфу