ColorToRGB - фича?

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

ColorToRGB - фича?

Сообщение Maxizar » 01.09.2010 20:11:36

Насколько я понял в Free Pascal TColor - есть представление цвета в BGR формате. Ну покрайней мере это видно из этой процедуры:
Код: Выделить всё
procedure RedGreenBlue(rgb: TColor; out Red, Green, Blue: Byte);
begin
  Red := rgb and $000000ff; //Красный на последнем месте
  Green := (rgb shr 8) and $000000ff;
  Blue := (rgb shr 16) and $000000ff;
end;       

По этому нужно переделать процедуру ColorToRGB вот так:
Код: Выделить всё
function ColorToRGB(Color: TColor): TColor;
begin
  //if (Cardinal(Color) and Cardinal(SYS_COLOR_BASE)) <> 0
  //then Result := GetSysColor(SysColorToSysColorIndex(Color))
  //else Result := Color;
  //Result := Result and $FFFFFF;
  Result:= ((Color and $0000FF) shl 16) or (Color and $00FF00) or ((Color and $FF0000) shr 16);
end;   

Тогда код типа:
Код: Выделить всё
Caption:=ColorToString(ColorToRGB((clRed)));


вернет правильно синий цвет, да потому что clRed = TColor($0000FF); а в RGB это и есть синий или я что то не понимаю??
Если так то я нашел багу.. при переписывании кода данной функции увидел что на ней много завязано и походу нужно переписывать и обратную ей функцию... потому что вылезли неприятности с цветами во всем Лазарусе.. включая редактор кода. Но ведь зато выше указанный код дает верный результат..
Или я всетаки все перепутал и ничего не понял?? Возможно данная функция ColorToRGB не играет роль перевода BGR в RGB формат?
Полюбому одно из двух Бага или Моя Ошибка.
Заранее СПАСИБО.
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: ColorToRGB - фича?

Сообщение Sergei I. Gorelkin » 01.09.2010 23:11:03

Функция ColorToRGB предназначена не для изменения порядка компонент цвета, а для преобразования системно-зависимых цветов (clWindow, clBorder и т.д.) в "обычные", т.е. выраженные значениями r,g,b.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1406
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: ColorToRGB - фича?

Сообщение Odyssey » 01.09.2010 23:26:41

Точно. Если записать структуру TColor как SSBBGGRR, то SS <> 00 означает, что в переменной хранится один из системных цветов. И ColorToRGB получает абсолютное значение этого системного цвета (если он задан), не меняя порядка байт.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru