FUNCTION BGR2HSL : Type_HSL
VAR_INPUT
BGR_Color :DWORD;
END_VAR
VAR
Red :REAL;
Green :REAL;
Blue :REAL;
Minimum :REAL;
Maximum :REAL;
Delta :REAL;
Hue :REAL;
Saturation :REAL;
Lightness :REAL;
END_VAR
Red := DWORD_TO_REAL(SHR(SHL(BGR_Color,24),24)) / 255.0;
Green := DWORD_TO_REAL(SHR(SHL(BGR_Color,16),24)) / 255.0;
Blue := DWORD_TO_REAL(SHR( BGR_Color, 16)) / 255.0;
Minimum := Red;
IF (Green < Minimum)
THEN
Minimum := Green;
END_IF
IF (Blue < Minimum)
THEN
Minimum := Blue;
END_IF
Maximum := Red;
IF (Green > Maximum)
THEN
Maximum := Green;
END_IF
IF (Blue > Maximum)
THEN
Maximum := Blue;
END_IF
Delta := Maximum - Minimum;
(*Saturation := Delta / Maximum;*)
IF (Minimum = Maximum)
THEN
Hue := 0.0;
ELSE
IF (Red = Maximum)
THEN
Hue := INT_TO_REAL(REAL_TO_INT((60*((Green - Blue) / Delta)) + 0.0) MOD 360);
ELSIF (Green = Maximum)
THEN
Hue := ((60*((Blue - Red ) / Delta)) + 120.0);
ELSE
Hue := ((60*((Red - Green ) / Delta)) + 240.0);
END_IF
END_IF
IF (HUE < 0)
THEN
HUE := HUE + 360.0;
END_IF
Lightness := (Maximum+Minimum) * 0.5;
IF (Maximum = Minimum)
THEN
Saturation := 0;
ELSIF (Lightness <= 0.5)
THEN
Saturation := (Delta/(Maximum+Minimum));
ELSE
Saturation := (Delta/(2-Maximum-Minimum));
END_IF
BGR2HSL.Hue := Hue;
BGR2HSL.Saturation := Saturation;
BGR2HSL.Lightness := Lightness;
END_FUNCTION