ColorToRGB - фича?

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

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

Ответить
Maxizar
постоялец
Сообщения: 385
Зарегистрирован: 20.03.2010 18:48:14

ColorToRGB - фича?

Сообщение Maxizar »

Насколько я понял в 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 формат?
Полюбому одно из двух Бага или Моя Ошибка.
Заранее СПАСИБО.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Функция ColorToRGB предназначена не для изменения порядка компонент цвета, а для преобразования системно-зависимых цветов (clWindow, clBorder и т.д.) в "обычные", т.е. выраженные значениями r,g,b.
Odyssey
энтузиаст
Сообщения: 580
Зарегистрирован: 29.11.2007 16:32:24

Сообщение Odyssey »

Точно. Если записать структуру TColor как SSBBGGRR, то SS <> 00 означает, что в переменной хранится один из системных цветов. И ColorToRGB получает абсолютное значение этого системного цвета (если он задан), не меняя порядка байт.
Ответить