diff --git a/Units/MMLAddon/PSInc/Wrappers/bitmap.inc b/Units/MMLAddon/PSInc/Wrappers/bitmap.inc index 111c7e7..f076069 100644 --- a/Units/MMLAddon/PSInc/Wrappers/bitmap.inc +++ b/Units/MMLAddon/PSInc/Wrappers/bitmap.inc @@ -186,3 +186,44 @@ begin; Bmp[Bitmap].RotateBitmap(angle,Bmp[result]); end; end; + +function Desaturate(Bitmap : integer) : integer; +begin; + with CurrThread.Client.MBitmaps do + begin; + result := CreateBMP(0,0); + Bmp[Bitmap].Desaturate(Bmp[result]); + end; +end; +procedure InvertBitmap(Bitmap : integer); +begin; + CurrThread.Client.MBitmaps.Bmp[Bitmap].Invert; +end; +function CopyBitmap(Bitmap : integer) : integer; +begin; + result := Currthread.Client.MBitmaps.CopyBMP(bitmap); +end; +function GreyScaleBitmap(Bitmap : integer) : integer; +begin; + with CurrThread.Client.MBitmaps do + begin; + result := CreateBMP(0,0); + Bmp[Bitmap].GreyScale(Bmp[result]); + end; +end; +function BrightnessBitmap(Bitmap,br : integer) : integer; +begin; + with CurrThread.Client.MBitmaps do + begin; + result := CreateBMP(0,0); + Bmp[Bitmap].Brightness(Bmp[result],br); + end; +end; +function ContrastBitmap(bitmap : integer; co : extended) : integer; +begin; + with CurrThread.Client.MBitmaps do + begin; + result := CreateBMP(0,0); + Bmp[Bitmap].Contrast(Bmp[result],co); + end; +end; diff --git a/Units/MMLAddon/PSInc/pscompile.inc b/Units/MMLAddon/PSInc/pscompile.inc index 4167cc8..1e0af80 100644 --- a/Units/MMLAddon/PSInc/pscompile.inc +++ b/Units/MMLAddon/PSInc/pscompile.inc @@ -106,4 +106,10 @@ Sender.AddFunction(@FindBitmapSpiral,'function FindBitmapSpiral(bitmap: Integer; Sender.AddFunction(@FindBitmapsSpiralTolerance,'function FindBitmapsSpiralTolerance(bitmap: integer; x, y: Integer; var Points : TPointArray; xs, ys, xe, ye,tolerance: Integer): Boolean;'); Sender.AddFunction(@FindBitmapSpiralTolerance,'function FindBitmapSpiralTolerance(bitmap: integer; var x, y: Integer; xs, ys, xe, ye,tolerance : integer): Boolean;'); Sender.AddFunction(@RotateBitmap,'function RotateBitmap(bitmap: Integer; angle: Extended): Integer;'); +Sender.AddFunction(@Desaturate,'function DesaturateBitmap(Bitmap : integer) : integer;'); +sender.AddFunction(@InvertBitmap,'procedure InvertBitmap(Bitmap : integer);'); +Sender.AddFunction(@CopyBitmap,'function CopyBitmap(Bitmap: integer) : integer)'); +Sender.AddFunction(@GreyScaleBitmap,'function GreyScaleBitmap(bitmap : integer) : integer'); +Sender.AddFunction(@BrightnessBitmap,'function BrightnessBitmap(Bitmap,br : integer) : integer;'); +Sender.AddFunction(@ContrastBitmap,'function ContrastBitmap(bitmap : integer; co : extended) : integer;'); diff --git a/Units/MMLCore/bitmaps.pas b/Units/MMLCore/bitmaps.pas index 3e7db2d..20fe169 100644 --- a/Units/MMLCore/bitmaps.pas +++ b/Units/MMLCore/bitmaps.pas @@ -60,6 +60,15 @@ type procedure FastReplaceColor(OldColor, NewColor: TColor); procedure CopyClientToBitmap(MWindow : TMWindow; xs, ys, xe, ye: Integer); procedure RotateBitmap(angle: Extended;TargetBitmap : TMufasaBitmap ); + procedure Desaturate;overload; + procedure Desaturate(TargetBitmap : TMufasaBitmap); overload; + procedure GreyScale(TargetBitmap : TMufasaBitmap);overload; + procedure GreyScale; + procedure Brightness(br: integer);overload; + procedure Brightness(TargetBitmap : TMufasaBitmap; br : integer); overload; + procedure Contrast(co: Extended);overload; + procedure Contrast(TargetBitmap : TMufasaBitmap; co : Extended);overload; + procedure Invert; constructor Create; destructor Destroy;override; end; @@ -76,6 +85,7 @@ type function GetBMP(Index : integer) : TMufasaBitmap; property Bmp[Index : integer]: TMufasaBitmap read GetBMP; function CreateBMP(w, h: integer): Integer; + function CopyBMP( Bitmap : integer) : Integer; function CreateMirroredBitmap(bitmap: Integer; MirrorStyle : TBmpMirrorStyle): Integer; function CreateBMPFromFile(const Path : string) : integer; function CreateBMPFromString(width,height : integer; Data : string) : integer;overload; @@ -89,7 +99,8 @@ type implementation uses - Windowutil,paszlib,DCPbase64,mmath,math; + Windowutil,paszlib,DCPbase64,mmath,math, + colour_conv; function Min(a,b:integer) : integer; begin @@ -134,6 +145,17 @@ begin BmpArray[Result].Index:= Result; end; +function TMBitmaps.CopyBMP(Bitmap: integer): Integer; +var + InputBMP : TMufasaBitmap; + OutputBMP : TMUfasaBitmap; +begin + InputBMP := GetBMP(Bitmap); + Result := CreateBMP(InputBmp.w,InputBMP.h); + OutputBMP := GetBMP(Result); + Move(InputBMP.FData[0],OutPutBMP.FData[0],InputBMP.w * InputBMP.h * SizeOf(TRGB32)); +end; + function TMBitmaps.CreateMirroredBitmap(bitmap: Integer; MirrorStyle: TBmpMirrorStyle): Integer; var @@ -516,11 +538,181 @@ begin if not ((Oldx <0) or (Oldx >= w) or (Oldy < 0) or (Oldy >= h)) then TargetBitmap.FData[ y * NewW + x] := Self.FData[OldY * W + OldX]; end; +end; - //NewX = Round(MiddlePoint.x + CosAngle * (x-MiddlePoint.x) - SinAngle * (y-MiddlePoint.y)) - MinX; - //NewY = Round(MiddlePoint.y + SinAngle * (x-MiddlePoint.x) + CosAngle * (y-MiddlePoint.y)) - MinY; -// Writeln(Format('(%d,%d) becomes (%d,%d)',[x,y,Round(MiddlePoint.x + CosAngle * (x-MiddlePoint.x) - SinAngle * (y-MiddlePoint.y)) - MinX, -// Round(MiddlePoint.y + SinAngle * (x-MiddlePoint.x) + CosAngle * (y-MiddlePoint.y))])); +procedure TMufasaBitmap.Desaturate; +var + I : integer; + He,Se,Le : extended; + Ptr : PRGB32; +begin + Ptr := FData; + for i := (h*w-1) downto 0 do + begin; + RGBToHSL(Ptr^.R,Ptr^.G,Ptr^.B,He,Se,Le); + HSLtoRGB(He,0.0,Le,Ptr^.R,Ptr^.G,Ptr^.B); + inc(ptr); + end; +end; + +procedure TMufasaBitmap.Desaturate(TargetBitmap: TMufasaBitmap); +var + I : integer; + He,Se,Le : extended; + PtrOld,PtrNew : PRGB32; +begin + TargetBitmap.SetSize(w,h); + PtrOld := Self.FData; + PtrNew := TargetBitmap.FData; + for i := (h*w-1) downto 0 do + begin; + RGBToHSL(PtrOld^.R,PtrOld^.G,PtrOld^.B,He,Se,Le); + HSLtoRGB(He,0.0,Le,PtrNew^.R,PtrNew^.G,PtrNew^.B); + inc(ptrOld); + inc(PtrNew); + end; +end; + +procedure TMufasaBitmap.GreyScale(TargetBitmap: TMufasaBitmap); +var + I : integer; + Lum : byte; + PtrOld,PtrNew : PRGB32; +begin + TargetBitmap.SetSize(w,h); + PtrOld := Self.FData; + PtrNew := TargetBitmap.FData; + for i := (h*w-1) downto 0 do + begin; + Lum := Round(PtrOld^.r * 0.3 + PtrOld^.g * 0.59 + PtrOld^.b * 0.11); + PtrNew^.r := Lum; + PtrNew^.g := Lum; + PtrNew^.b := Lum; + inc(ptrOld); + inc(PtrNew); + end; +end; + +procedure TMufasaBitmap.GreyScale; +var + I : integer; + Lum : Byte; + Ptr: PRGB32; +begin + Ptr := Self.FData; + for i := (h*w-1) downto 0 do + begin; + Lum := Round(Ptr^.r * 0.3 + Ptr^.g * 0.59 + Ptr^.b * 0.11); + Ptr^.r := Lum; + Ptr^.g := Lum; + Ptr^.b := Lum; + inc(ptr); + end; +end; + +function BrigthnessAdjust(Col: byte; br : integer): byte;inline; +var + temp : integer; +begin; + Temp := Col + Br; + if temp < 0 then + temp := 0 + else if temp > 255 then + temp := 255; + result := temp; +end; +procedure TMufasaBitmap.Brightness(br: integer); +var + I : integer; + Ptr: PRGB32; +begin + Ptr := Self.FData; + for i := (h*w-1) downto 0 do + begin; + Ptr^.r := BrigthnessAdjust(Ptr^.r,br); + Ptr^.g := BrigthnessAdjust(Ptr^.g,br); + Ptr^.b := BrigthnessAdjust(Ptr^.b,br); + inc(ptr); + end; +end; + +procedure TMufasaBitmap.Brightness(TargetBitmap: TMufasaBitmap; br: integer); +var + I : integer; + PtrOld,PtrNew : PRGB32; +begin + TargetBitmap.SetSize(w,h); + PtrOld := Self.FData; + PtrNew := TargetBitmap.FData; + for i := (h*w-1) downto 0 do + begin; + PtrNew^.r := BrigthnessAdjust(PtrOld^.r,br); + PtrNew^.g := BrigthnessAdjust(PtrOld^.g,br); + PtrNew^.b := BrigthnessAdjust(PtrOld^.b,br); + inc(ptrOld); + inc(PtrNew); + end; +end; + +const + Grey = 128; +function ContrastAdjust(Col: byte; co : extended): byte;inline; +var + temp : integer; +begin; + Temp := floor((col - Grey) * co) + grey; + if temp < 0 then + temp := 0 + else if temp > 255 then + temp := 255; + result := temp; +end; + +procedure TMufasaBitmap.Contrast(co: Extended); +var + I : integer; + Ptr: PRGB32; +begin + Ptr := Self.FData; + for i := (h*w-1) downto 0 do + begin; + Ptr^.r := ContrastAdjust(Ptr^.r,co); + Ptr^.g := ContrastAdjust(Ptr^.g,co); + Ptr^.b := ContrastAdjust(Ptr^.b,co); + inc(ptr); + end; +end; + +procedure TMufasaBitmap.Contrast(TargetBitmap: TMufasaBitmap; co: Extended); +var + I : integer; + PtrOld,PtrNew : PRGB32; +begin + TargetBitmap.SetSize(w,h); + PtrOld := Self.FData; + PtrNew := TargetBitmap.FData; + for i := (h*w-1) downto 0 do + begin; + PtrNew^.r := ContrastAdjust(PtrOld^.r,co); + PtrNew^.g := ContrastAdjust(PtrOld^.g,co); + PtrNew^.b := ContrastAdjust(PtrOld^.b,co); + inc(ptrOld); + inc(PtrNew); + end; +end; + +procedure TMufasaBitmap.Invert; +var + Ptr : PRGB32; + i : integer; +begin + ptr := Self.FData; + for i := (h*w-1) downto 0 do + begin; + Self.FData[i].r := not Self.FData[i].r; + Self.FData[i].g := not Self.FData[i].g; + Self.Fdata[i].b := not Self.FData[i].b; + end; end; constructor TMBitmaps.Create(Owner: TObject); diff --git a/Units/MMLCore/colour_conv.pas b/Units/MMLCore/colour_conv.pas index 299ed82..f37c84b 100644 --- a/Units/MMLCore/colour_conv.pas +++ b/Units/MMLCore/colour_conv.pas @@ -1,260 +1,304 @@ -{ - This file is part of the Mufasa Macro Library (MML) - Copyright (c) 2009 by Raymond van Venetiƫ and Merlijn Wajer - - MML is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - MML is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with MML. If not, see . - - See the file COPYING, included in this distribution, - for details about the copyright. - - Colour Conversion Utilities for the Mufasa Macro Library -} - -unit colour_conv; - -{$mode objfpc}{$H+} - -interface - -uses - Classes, SysUtils, - Graphics, - Math; - - -Function RGBtoColor(r,g,b : byte) : TColor; overload; inline; -Function RGBtoColor(r,g,b : integer) : TColor; overload; inline; -Procedure ColorToRGB(Color : integer;var r,g,b : byte); overload; inline; -Procedure ColorToRGB(Color : integer;var r,g,b : integer); overload; inline; -Procedure RGBToXYZ(R,G,B : integer;var x,y,z : Extended); inline; -Procedure XYZToRGB(X,Y,Z : Extended;var R,G,B: integer); inline; -Procedure RGBToHSL(RR,GG,BB : integer;var H,S,L : Extended); inline; -Procedure HSLtoRGB(H,S,L : extended;var R,G,B : Integer); inline; -Procedure ColorToHSL(Col: Integer; var h, s, l: Extended); inline; - -implementation - -Const - OneDivThree = 1/3.0; - TwoDivThree = 2 / 3.0; - OneDivTwoPointFour = 1 / 2.4; - -Function RGBtoColor(r,g,b : byte): TColor; overload; inline; -begin; - Result := R or g shl 8 or b shl 16; -end; - -{/\ - Translates the given Red (R), Green (G) and Blue (B) components to a TColor. - R, G and B are integers. -/\} - -Function RGBtoColor(r,g,b : integer): TColor; overload; inline; -begin; - Result := R or g shl 8 or b shl 16; -end; - -{/\ - Translates the given win-32 color in the Red (R), Green (G) and Blue (B) - components. R, G and B are bytes. -/\} - -Procedure ColorToRGB(Color : integer;var r,g,b : byte); overload; inline; -begin - R := Color and $ff; - G := Color shr 8 and $ff; - B := Color shr 16 and $ff; -end; - -{/\ - Translates the given win-32 color in the Red (R), Green (G) and Blue (B) - components. R, G and B are integers. -/\} - -Procedure ColorToRGB(Color : integer;var r,g,b : integer); overload; inline; -begin - R := Color and $ff; - G := Color shr 8 and $ff; - B := Color shr 16 and $ff; -end; - -{/\ - Translates the given Red (R), Green (G) and Blue (B) components to - X, Y and Z components. -/\} - -Procedure RGBToXYZ(R,G,B : integer;var x,y,z : Extended); inline; -var - Red,Green,Blue : Extended; -begin; - Red := R / 255; - Green := G / 255; - Blue := B / 255; - if Red > 0.04045 then - Red := Power( ( Red + 0.055 ) / 1.055 , 2.4) * 100 - else - Red := Red / 7.73994; - if Green > 0.04045 then - Green := Power( ( Green + 0.055 ) / 1.055 , 2.4) * 100 - else - Green := Green / 7.73994; - if Blue > 0.04045 then - Blue := Power( ( Blue + 0.055 ) / 1.055 , 2.4) * 100 - else - Blue := Blue / 7.73994; - X := Red * 0.4124 + Green * 0.3576 + Blue * 0.1805; - Y := Red * 0.2126 + Green * 0.7152 + Blue * 0.0722; - Z := Red * 0.0193 + Green * 0.1192 + Blue * 0.9505; -end; - -{/\ - Translates the given X, Y and Z components to - Red (R), Green (G) and Blue (B) components. -/\} - -Procedure XYZToRGB(X,Y,Z : Extended;var R,G,B: integer); inline; -var - TempR,TempG,TempB,Tempx,tempy,tempz : Extended; -begin; - Tempx := X / 100; - tempy := Y / 100; - tempz := Z / 100; - TempR := Tempx * 3.2406 + tempy * -1.5372 + tempz * -0.4986; - TempG := Tempx * -0.9689 + tempy * 1.8758 + tempz * 0.0415; - TempB := Tempx * 0.0557 + tempy * -0.2040 + tempz * 1.0570; - if TempR > 0.0031308 then - TempR := 1.055 * ( Power(TempR, (OneDivTwoPointFour)) ) - 0.055 - else - TempR := 12.92 * TempR; - if TempG > 0.0031308 then - TempG := 1.055 * ( Power(TempG, ( OneDivTwoPointFour)) ) - 0.055 - else - TempG := 12.92 * TempG; - if TempB > 0.0031308 then - TempB := 1.055 * ( Power(TempB , ( OneDivTwoPointFour )) ) - 0.055 - else - TempB := 12.92 * TempB; - R := Round(TempR * 255); - G := Round(TempG * 255); - B := Round(TempB * 255); -end; - -{/\ - Translates the given Red (R), Green (G) and Blue (B) components to - H (Hue), S (Saturation) and L (Luminance) components. -/\} - -Procedure RGBToHSL(RR,GG,BB : integer;var H,S,L : Extended); inline; -var - R, G, B, D, Cmax, Cmin: Extended; -begin - R := RR / 255; - G := GG / 255; - B := BB / 255; - CMin := R; - if G < Cmin then Cmin := G; - if B < Cmin then Cmin := B; - CMax := R; - if G > Cmax then Cmax := G; - if B > Cmax then Cmax := B; - L := 0.5 * (Cmax + Cmin); - if Cmax = Cmin then - begin - H := 0; - S := 0; - end else - begin; - D := Cmax - Cmin; - if L < 0.5 then - S := D / (Cmax + Cmin) - else - S := D / (2 - Cmax - Cmin); - if R = Cmax then - H := (G - B) / D - else - if G = Cmax then - H := 2 + (B - R) / D - else - H := 4 + (R - G) / D; - H := H / 6; - if H < 0 then - H := H + 1; - end; - H := H * 100; - S := S * 100; - L := L * 100; -end; - -{/\ - Translates the given H (Hue), S (Saturation) and L (Luminance) components to - Red (R), Green (G) and Blue (B) components. -/\} - -Procedure HSLtoRGB(H,S,L : extended;var R,G,B : Integer); inline; -var - Temp,Temp2 : Extended; -//begin - -Function Hue2RGB(TempHue : Extended) : integer; -begin; - if TempHue < 0 then - TempHue := TempHue + 1 - else if TempHue > 1 then - TempHue := TempHue - 1; - if ( ( 6 * TempHue ) < 1 ) then - Result :=Round(255 * (( Temp + ( Temp2 - Temp ) * 6 * TempHue ))) - else if ( ( 2 * TempHue ) < 1 ) then - Result :=Round(255 * Temp2) - else if ( ( 3 * TempHue ) < 2 ) then - Result :=Round(255 * (Temp + ( Temp2 - Temp ) * ( ( TwoDivThree ) - TempHue ) * 6)) - else - Result :=Round(255 * Temp); -end; - -begin; - H := H / 100; - S := S / 100; - L := L / 100; - if s = 0 then - begin; - R := Round(L * 255); - G := R; - B := R; - end else - begin; - if (L < 0.5) then - Temp2 := L * ( 1 + S ) - else - Temp2 := (L + S) - ( S * L); - Temp := 2 * L - Temp2; - R := Hue2RGB( H + ( OneDivThree ) ); - G := Hue2RGB( H ); - B := Hue2RGB( H - ( OneDivThree ) ); - end; -end; - -{/\ - Split the Given Color col in H, S, L components. -/\} - -Procedure ColorToHSL(Col: Integer; var h, s, l: Extended); inline; -Var - R, G, B: Integer; -Begin - ColorToRGB(Col, R, G, B); - RGBToHSL(R, G, B, H, S, L); -End; - -end. - +{ + This file is part of the Mufasa Macro Library (MML) + Copyright (c) 2009 by Raymond van Venetiƫ and Merlijn Wajer + + MML is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + MML is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with MML. If not, see . + + See the file COPYING, included in this distribution, + for details about the copyright. + + Colour Conversion Utilities for the Mufasa Macro Library +} + +unit colour_conv; + +{$mode objfpc}{$H+} + +interface + +uses + Classes, SysUtils, + Graphics, + Math; + + +Function RGBtoColor(r,g,b : byte) : TColor; overload; inline; +Function RGBtoColor(r,g,b : integer) : TColor; overload; inline; +Procedure ColorToRGB(Color : integer;var r,g,b : byte); overload; inline; +Procedure ColorToRGB(Color : integer;var r,g,b : integer); overload; inline; +Procedure RGBToXYZ(R,G,B : integer;var x,y,z : Extended); inline; +Procedure XYZToRGB(X,Y,Z : Extended;var R,G,B: integer); inline; +Procedure RGBToHSL(RR,GG,BB : integer;var H,S,L : Extended); inline; +Procedure HSLtoRGB(H,S,L : extended;var R,G,B : Byte); inline;overload; +Procedure HSLtoRGB(H,S,L : extended;var R,G,B : Integer); inline;overload; +Procedure ColorToHSL(Col: Integer; var h, s, l: Extended); inline; + +implementation + +Const + OneDivThree = 1/3.0; + TwoDivThree = 2 / 3.0; + OneDivTwoPointFour = 1 / 2.4; + +Function RGBtoColor(r,g,b : byte): TColor; overload; inline; +begin; + Result := R or g shl 8 or b shl 16; +end; + +{/\ + Translates the given Red (R), Green (G) and Blue (B) components to a TColor. + R, G and B are integers. +/\} + +Function RGBtoColor(r,g,b : integer): TColor; overload; inline; +begin; + Result := R or g shl 8 or b shl 16; +end; + +{/\ + Translates the given win-32 color in the Red (R), Green (G) and Blue (B) + components. R, G and B are bytes. +/\} + +Procedure ColorToRGB(Color : integer;var r,g,b : byte); overload; inline; +begin + R := Color and $ff; + G := Color shr 8 and $ff; + B := Color shr 16 and $ff; +end; + +{/\ + Translates the given win-32 color in the Red (R), Green (G) and Blue (B) + components. R, G and B are integers. +/\} + +Procedure ColorToRGB(Color : integer;var r,g,b : integer); overload; inline; +begin + R := Color and $ff; + G := Color shr 8 and $ff; + B := Color shr 16 and $ff; +end; + +{/\ + Translates the given Red (R), Green (G) and Blue (B) components to + X, Y and Z components. +/\} + +Procedure RGBToXYZ(R,G,B : integer;var x,y,z : Extended); inline; +var + Red,Green,Blue : Extended; +begin; + Red := R / 255; + Green := G / 255; + Blue := B / 255; + if Red > 0.04045 then + Red := Power( ( Red + 0.055 ) / 1.055 , 2.4) * 100 + else + Red := Red / 7.73994; + if Green > 0.04045 then + Green := Power( ( Green + 0.055 ) / 1.055 , 2.4) * 100 + else + Green := Green / 7.73994; + if Blue > 0.04045 then + Blue := Power( ( Blue + 0.055 ) / 1.055 , 2.4) * 100 + else + Blue := Blue / 7.73994; + X := Red * 0.4124 + Green * 0.3576 + Blue * 0.1805; + Y := Red * 0.2126 + Green * 0.7152 + Blue * 0.0722; + Z := Red * 0.0193 + Green * 0.1192 + Blue * 0.9505; +end; + +{/\ + Translates the given X, Y and Z components to + Red (R), Green (G) and Blue (B) components. +/\} + +Procedure XYZToRGB(X,Y,Z : Extended;var R,G,B: integer); inline; +var + TempR,TempG,TempB,Tempx,tempy,tempz : Extended; +begin; + Tempx := X / 100; + tempy := Y / 100; + tempz := Z / 100; + TempR := Tempx * 3.2406 + tempy * -1.5372 + tempz * -0.4986; + TempG := Tempx * -0.9689 + tempy * 1.8758 + tempz * 0.0415; + TempB := Tempx * 0.0557 + tempy * -0.2040 + tempz * 1.0570; + if TempR > 0.0031308 then + TempR := 1.055 * ( Power(TempR, (OneDivTwoPointFour)) ) - 0.055 + else + TempR := 12.92 * TempR; + if TempG > 0.0031308 then + TempG := 1.055 * ( Power(TempG, ( OneDivTwoPointFour)) ) - 0.055 + else + TempG := 12.92 * TempG; + if TempB > 0.0031308 then + TempB := 1.055 * ( Power(TempB , ( OneDivTwoPointFour )) ) - 0.055 + else + TempB := 12.92 * TempB; + R := Round(TempR * 255); + G := Round(TempG * 255); + B := Round(TempB * 255); +end; + +{/\ + Translates the given Red (R), Green (G) and Blue (B) components to + H (Hue), S (Saturation) and L (Luminance) components. +/\} + +Procedure RGBToHSL(RR,GG,BB : integer;var H,S,L : Extended); inline; +var + R, G, B, D, Cmax, Cmin: Extended; +begin + R := RR / 255; + G := GG / 255; + B := BB / 255; + CMin := R; + if G < Cmin then Cmin := G; + if B < Cmin then Cmin := B; + CMax := R; + if G > Cmax then Cmax := G; + if B > Cmax then Cmax := B; + L := 0.5 * (Cmax + Cmin); + if Cmax = Cmin then + begin + H := 0; + S := 0; + end else + begin; + D := Cmax - Cmin; + if L < 0.5 then + S := D / (Cmax + Cmin) + else + S := D / (2 - Cmax - Cmin); + if R = Cmax then + H := (G - B) / D + else + if G = Cmax then + H := 2 + (B - R) / D + else + H := 4 + (R - G) / D; + H := H / 6; + if H < 0 then + H := H + 1; + end; + H := H * 100; + S := S * 100; + L := L * 100; +end; + +{/\ + Translates the given H (Hue), S (Saturation) and L (Luminance) components to + Red (R), Green (G) and Blue (B) components. +/\} + +procedure HSLtoRGB(H, S, L: extended; var R, G, B: Byte); inline; overload; +var + Temp,Temp2 : Extended; +//begin + +Function Hue2RGB(TempHue : Extended) : integer; +begin; + if TempHue < 0 then + TempHue := TempHue + 1 + else if TempHue > 1 then + TempHue := TempHue - 1; + if ( ( 6 * TempHue ) < 1 ) then + Result :=Round(255 * (( Temp + ( Temp2 - Temp ) * 6 * TempHue ))) + else if ( ( 2 * TempHue ) < 1 ) then + Result :=Round(255 * Temp2) + else if ( ( 3 * TempHue ) < 2 ) then + Result :=Round(255 * (Temp + ( Temp2 - Temp ) * ( ( TwoDivThree ) - TempHue ) * 6)) + else + Result :=Round(255 * Temp); +end; + +begin; + H := H / 100; + S := S / 100; + L := L / 100; + if s = 0 then + begin; + R := Byte(Round(L * 255)); + G := R; + B := R; + end else + begin; + if (L < 0.5) then + Temp2 := L * ( 1 + S ) + else + Temp2 := (L + S) - ( S * L); + Temp := 2 * L - Temp2; + R := Hue2RGB( H + ( OneDivThree ) ); + G := Hue2RGB( H ); + B := Hue2RGB( H - ( OneDivThree ) ); + end; +end; + +Procedure HSLtoRGB(H,S,L : extended;var R,G,B : Integer); inline; +var + Temp,Temp2 : Extended; +//begin + +Function Hue2RGB(TempHue : Extended) : integer; +begin; + if TempHue < 0 then + TempHue := TempHue + 1 + else if TempHue > 1 then + TempHue := TempHue - 1; + if ( ( 6 * TempHue ) < 1 ) then + Result :=Round(255 * (( Temp + ( Temp2 - Temp ) * 6 * TempHue ))) + else if ( ( 2 * TempHue ) < 1 ) then + Result :=Round(255 * Temp2) + else if ( ( 3 * TempHue ) < 2 ) then + Result :=Round(255 * (Temp + ( Temp2 - Temp ) * ( ( TwoDivThree ) - TempHue ) * 6)) + else + Result :=Round(255 * Temp); +end; + +begin; + H := H / 100; + S := S / 100; + L := L / 100; + if s = 0 then + begin; + R := Round(L * 255); + G := R; + B := R; + end else + begin; + if (L < 0.5) then + Temp2 := L * ( 1 + S ) + else + Temp2 := (L + S) - ( S * L); + Temp := 2 * L - Temp2; + R := Hue2RGB( H + ( OneDivThree ) ); + G := Hue2RGB( H ); + B := Hue2RGB( H - ( OneDivThree ) ); + end; +end; + +{/\ + Split the Given Color col in H, S, L components. +/\} + +Procedure ColorToHSL(Col: Integer; var h, s, l: Extended); inline; +Var + R, G, B: Integer; +Begin + ColorToRGB(Col, R, G, B); + RGBToHSL(R, G, B, H, S, L); +End; + +end. +