RGB -> HSL - где ошибка?

From
Alexey Tomin ()
To
All ()
Date
2003-03-14T15:10:22Z
Area
RU.ALGORITHMS
From: "Alexey Tomin" <alex@soniir.samara.ru>

День добрый!

Взял из журнала какого-то код для преобразования RGB в HSL.
Работает хорошо, кроме случай R=255, B>>0, G=0 (см. коментарий).

Где подправить надо?

procedure RGBtoHSL(R,G,B: byte; out H,S,L: byte);
  var
    CMax, CMin: Integer;
    RD, GD, BD: Integer;
    CDiff, CDiffD2, CSum, CSumD2: Integer;
begin
  CMin := Min( R, Min( G, B ));
  CMax := Max( R, Max( G, B ));
  L := (((CMax + CMin) * HSLMax) + RGBMax) div RGBMaxM2;
  if CMax = CMin then begin
    S := 0;
    H := Undefined;
   end else begin
    CDiff := CMax - CMin;
    CDiffD2 := CDiff div 2;
    CSum := CMax + CMin;
    CSumD2 := CSum div 2;
    if L <= HSLMaxD2 then
      S := (CDiff * HSLMax + CSumD2) div CSum
     else
      S := (CDiff * HSLMax + (RGBMaxM2-cDiff) div 2) div (RGBMaxM2-CDiff);
    RD := ((CMax - R) * HSLMaxD6 + CDiffD2) div CDiff;
    GD := ((CMax - G) * HSLMaxD6 + CDiffD2) div CDiff;
    BD := ((CMax - B) * HSLMaxD6 + CDiffD2) div CDiff;
    if R = CMax then
      H := BD - GD // ### Здесь ошибка - BD=0, GD=40
     else
      if G = CMax then
        H := HSLMaxD3 + RD - BD
       else
        H := HSLMaxM2D3 + GD - RD;
    CheckRange( H );
  end;
end;

--
  Алексей.


--- ifmail v.2.15dev5
 * Origin: Demos online service (2:5020/400)