mirror of
https://github.com/moparisthebest/Simba
synced 2024-11-22 17:22:21 -05:00
Added FindColorsToleranceOptimised and FindColorToleranceOptimised, both optimised for CTS 2.. Test it outz!
git-svn-id: http://www.villavu.com/repositories/merlijn/mufasa@250 3f818213-9676-44b0-a9b4-5e4c4e03d09d
This commit is contained in:
parent
0a46930651
commit
432b9b5f1c
@ -31,6 +31,10 @@ begin
|
|||||||
Result := CurrThread.Client.MFinder.FindColor(x, y, color, x1, y1, x2, y2);
|
Result := CurrThread.Client.MFinder.FindColor(x, y, color, x1, y1, x2, y2);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function findcolortoleranceOptimised(out x, y: integer; color, x1, y1, x2, y2, tol: integer): boolean;
|
||||||
|
begin
|
||||||
|
Result := CurrThread.Client.MFinder.FindColorToleranceOptimised(x, y, color, x1, y1, x2, y2, tol);
|
||||||
|
end;
|
||||||
function findcolortolerance(out x, y: integer; color, x1, y1, x2, y2, tol: integer): boolean;
|
function findcolortolerance(out x, y: integer; color, x1, y1, x2, y2, tol: integer): boolean;
|
||||||
begin
|
begin
|
||||||
Result := CurrThread.Client.MFinder.FindColorTolerance(x, y, color, x1, y1, x2, y2, tol);
|
Result := CurrThread.Client.MFinder.FindColorTolerance(x, y, color, x1, y1, x2, y2, tol);
|
||||||
@ -56,6 +60,10 @@ begin;
|
|||||||
result := CurrThread.Client.MFinder.CountColorTolerance(color,xs,ys,xe,ye,tolerance);
|
result := CurrThread.Client.MFinder.CountColorTolerance(color,xs,ys,xe,ye,tolerance);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function FindColorsToleranceOptimised(out Points: TPointArray; Color, xs, ys, xe, ye, Tolerance: Integer): Boolean;
|
||||||
|
begin;
|
||||||
|
result := CurrThread.Client.MFinder.FindColorsToleranceOptimised(points,color,xs,ys,xe,ye,tolerance);
|
||||||
|
end;
|
||||||
function FindColorsTolerance(out Points: TPointArray; Color, xs, ys, xe, ye, Tolerance: Integer): Boolean;
|
function FindColorsTolerance(out Points: TPointArray; Color, xs, ys, xe, ye, Tolerance: Integer): Boolean;
|
||||||
begin;
|
begin;
|
||||||
result := CurrThread.Client.MFinder.FindColorsTolerance(points,color,xs,ys,xe,ye,tolerance);
|
result := CurrThread.Client.MFinder.FindColorsTolerance(points,color,xs,ys,xe,ye,tolerance);
|
||||||
|
@ -100,10 +100,12 @@ Sender.AddFunction(@OpenWebPage,'procedure OpenWebPage(url : string);');
|
|||||||
{Color + Color Finders}
|
{Color + Color Finders}
|
||||||
Sender.AddFunction(@GetColor,'function GetColor(x, y: Integer): Integer;');
|
Sender.AddFunction(@GetColor,'function GetColor(x, y: Integer): Integer;');
|
||||||
Sender.AddFunction(@FindColor, 'function findcolor(out x, y: integer; color, x1, y1, x2, y2: integer): boolean;');
|
Sender.AddFunction(@FindColor, 'function findcolor(out x, y: integer; color, x1, y1, x2, y2: integer): boolean;');
|
||||||
|
Sender.AddFunction(@findcolortoleranceOptimised, 'function findcolortoleranceOptimised(out x, y: integer; color, x1, y1, x2, y2, tol: integer): boolean;');
|
||||||
Sender.AddFunction(@FindColorTolerance, 'function findcolortolerance(out x, y: integer; color, x1, y1, x2, y2, tol: integer): boolean;');
|
Sender.AddFunction(@FindColorTolerance, 'function findcolortolerance(out x, y: integer; color, x1, y1, x2, y2, tol: integer): boolean;');
|
||||||
Sender.AddFunction(@FindColors, 'function findcolors(out TPA: TPointArray; color, x1, y1, x2, y2: integer): boolean;');
|
Sender.AddFunction(@FindColors, 'function findcolors(out TPA: TPointArray; color, x1, y1, x2, y2: integer): boolean;');
|
||||||
Sender.AddFunction(@SimilarColors,'function SimilarColors(Col1,Col2,Tolerance : integer) : boolean');
|
Sender.AddFunction(@SimilarColors,'function SimilarColors(Col1,Col2,Tolerance : integer) : boolean');
|
||||||
Sender.AddFunction(@CountColorTolerance,'function CountColorTolerance(Color, xs, ys, xe, ye, Tolerance: Integer): Integer;');
|
Sender.AddFunction(@CountColorTolerance,'function CountColorTolerance(Color, xs, ys, xe, ye, Tolerance: Integer): Integer;');
|
||||||
|
Sender.AddFunction(@FindColorsToleranceOptimised,'function FindColorsToleranceOptimised(out Points: TPointArray; Color, xs, ys, xe, ye, Tolerance: Integer): Boolean;');
|
||||||
Sender.AddFunction(@FindColorsTolerance,'function FindColorsTolerance(out Points: TPointArray; Color, xs, ys, xe, ye, Tolerance: Integer): Boolean;');
|
Sender.AddFunction(@FindColorsTolerance,'function FindColorsTolerance(out Points: TPointArray; Color, xs, ys, xe, ye, Tolerance: Integer): Boolean;');
|
||||||
Sender.AddFunction(@FindColorSpiral,'function FindColorSpiral(var x, y: Integer; color, xs, ys, xe, ye: Integer): Boolean;');
|
Sender.AddFunction(@FindColorSpiral,'function FindColorSpiral(var x, y: Integer; color, xs, ys, xe, ye: Integer): Boolean;');
|
||||||
Sender.AddFunction(@FindColorsSpiralTolerance,'function FindColorsSpiralTolerance(x, y: Integer; out Points: TPointArray; color, xs, ys, xe, ye: Integer; Tolerance: Integer) : boolean;');
|
Sender.AddFunction(@FindColorsSpiralTolerance,'function FindColorsSpiralTolerance(x, y: Integer; out Points: TPointArray; color, xs, ys, xe, ye: Integer; Tolerance: Integer) : boolean;');
|
||||||
|
@ -40,6 +40,7 @@ Procedure ColorToRGB(Color : integer;out r,g,b : integer); overload; inline;
|
|||||||
Procedure RGBToXYZ(R,G,B : integer;out x,y,z : Extended); inline;
|
Procedure RGBToXYZ(R,G,B : integer;out x,y,z : Extended); inline;
|
||||||
Procedure XYZToRGB(X,Y,Z : Extended;out R,G,B: integer); inline;
|
Procedure XYZToRGB(X,Y,Z : Extended;out R,G,B: integer); inline;
|
||||||
Procedure RGBToHSL(RR,GG,BB : integer;out H,S,L : Extended); inline;
|
Procedure RGBToHSL(RR,GG,BB : integer;out H,S,L : Extended); inline;
|
||||||
|
Procedure RGBToHSLNonFixed(RR,GG,BB : integer;out H,S,L : Extended); inline;
|
||||||
Procedure HSLtoRGB(H,S,L : extended;out R,G,B : Byte); inline;overload;
|
Procedure HSLtoRGB(H,S,L : extended;out R,G,B : Byte); inline;overload;
|
||||||
Procedure HSLtoRGB(H,S,L : extended;out R,G,B : Integer); inline;overload;
|
Procedure HSLtoRGB(H,S,L : extended;out R,G,B : Integer); inline;overload;
|
||||||
Procedure ColorToHSL(Col: Integer; out h, s, l: Extended); inline;
|
Procedure ColorToHSL(Col: Integer; out h, s, l: Extended); inline;
|
||||||
@ -197,6 +198,50 @@ begin
|
|||||||
L := L * 100;
|
L := L * 100;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{/\
|
||||||
|
Translates the given Red (R), Green (G) and Blue (B) components to
|
||||||
|
H (Hue), S (Saturation) and L (Luminance) components.
|
||||||
|
This function does not multiply it by 100.
|
||||||
|
/\}
|
||||||
|
|
||||||
|
Procedure RGBToHSLNonFixed(RR,GG,BB : integer;out 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;
|
||||||
|
end;
|
||||||
|
|
||||||
{/\
|
{/\
|
||||||
Translates the given H (Hue), S (Saturation) and L (Luminance) components to
|
Translates the given H (Hue), S (Saturation) and L (Luminance) components to
|
||||||
Red (R), Green (G) and Blue (B) components.
|
Red (R), Green (G) and Blue (B) components.
|
||||||
|
@ -45,11 +45,17 @@ type
|
|||||||
constructor Create(aClient: TObject);
|
constructor Create(aClient: TObject);
|
||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
private
|
private
|
||||||
|
|
||||||
|
|
||||||
Procedure UpdateCachedValues(NewWidth,NewHeight : integer);
|
Procedure UpdateCachedValues(NewWidth,NewHeight : integer);
|
||||||
procedure DefaultOperations(var xs,ys,xe,ye : integer);
|
procedure DefaultOperations(var xs,ys,xe,ye : integer);
|
||||||
//Loads the Spiral into ClientTPA (Will not cause problems)
|
//Loads the Spiral into ClientTPA (Will not cause problems)
|
||||||
procedure LoadSpiralPath(startX, startY, x1, y1, x2, y2: Integer);
|
procedure LoadSpiralPath(startX, startY, x1, y1, x2, y2: Integer);
|
||||||
public
|
public
|
||||||
|
function FindColorsToleranceOptimised(out Points: TPointArray; Color,
|
||||||
|
xs, ys, xe, ye, Tol: Integer): Boolean;
|
||||||
|
function FindColorToleranceOptimised(out x, y: Integer; Color, xs, ys,
|
||||||
|
xe, ye, tol: Integer): Boolean;
|
||||||
function CountColorTolerance(Color, xs, ys, xe, ye, Tolerance: Integer): Integer;
|
function CountColorTolerance(Color, xs, ys, xe, ye, Tolerance: Integer): Integer;
|
||||||
procedure SetToleranceSpeed(nCTS: Integer);
|
procedure SetToleranceSpeed(nCTS: Integer);
|
||||||
function SimilarColors(Color1,Color2,Tolerance : Integer) : boolean;
|
function SimilarColors(Color1,Color2,Tolerance : Integer) : boolean;
|
||||||
@ -73,6 +79,7 @@ type
|
|||||||
function FindDeformedBitmapToleranceIn(bitmap: TMufasaBitmap; out x, y: Integer; xs, ys, xe, ye: Integer; tolerance: Integer; Range: Integer; AllowPartialAccuracy: Boolean; var accuracy: Extended): Boolean;
|
function FindDeformedBitmapToleranceIn(bitmap: TMufasaBitmap; out x, y: Integer; xs, ys, xe, ye: Integer; tolerance: Integer; Range: Integer; AllowPartialAccuracy: Boolean; var accuracy: Extended): Boolean;
|
||||||
protected
|
protected
|
||||||
Client: TObject;
|
Client: TObject;
|
||||||
|
Percentage : array[0..255] of Extended; //We store all the possible RGB / 255 divisions.
|
||||||
CachedWidth, CachedHeight : integer;
|
CachedWidth, CachedHeight : integer;
|
||||||
ClientTPA : TPointArray;
|
ClientTPA : TPointArray;
|
||||||
hueMod, satMod: Extended;
|
hueMod, satMod: Extended;
|
||||||
@ -223,6 +230,8 @@ begin;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TMFinder.Create(aClient: TObject);
|
constructor TMFinder.Create(aClient: TObject);
|
||||||
|
var
|
||||||
|
I : integer;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
@ -231,6 +240,8 @@ begin
|
|||||||
Self.CTS := 1;
|
Self.CTS := 1;
|
||||||
Self.hueMod := 0.2;
|
Self.hueMod := 0.2;
|
||||||
Self.satMod := 0.2;
|
Self.satMod := 0.2;
|
||||||
|
for i := 0 to 255 do
|
||||||
|
Percentage[i] := i / 255;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -279,7 +290,6 @@ begin
|
|||||||
0: Result := ((Abs(R1-R2) <= Tolerance) and (Abs(G1-G2) <= Tolerance) and (Abs(B1-B2) <= Tolerance));
|
0: Result := ((Abs(R1-R2) <= Tolerance) and (Abs(G1-G2) <= Tolerance) and (Abs(B1-B2) <= Tolerance));
|
||||||
1: Result := (Sqrt(sqr(R1-R2) + sqr(G1-G2) + sqr(B1-B2)) <= Tolerance);
|
1: Result := (Sqrt(sqr(R1-R2) + sqr(G1-G2) + sqr(B1-B2)) <= Tolerance);
|
||||||
2: begin
|
2: begin
|
||||||
RGBToHSL(R1,g1,b1,H1,S1,L1);
|
|
||||||
RGBToHSL(R2,g2,b2,H2,S2,L2);
|
RGBToHSL(R2,g2,b2,H2,S2,L2);
|
||||||
Result := ((abs(H1 - H2) <= (hueMod * Tolerance)) and (abs(S2-S1) <= (satMod * Tolerance)) and (abs(L1-L2) <= Tolerance));
|
Result := ((abs(H1 - H2) <= (hueMod * Tolerance)) and (abs(S2-S1) <= (satMod * Tolerance)) and (abs(L1-L2) <= Tolerance));
|
||||||
end;
|
end;
|
||||||
@ -451,15 +461,17 @@ begin
|
|||||||
TClient(Client).MWindow.FreeReturnData;
|
TClient(Client).MWindow.FreeReturnData;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TMFinder.FindColorTolerance(out x, y: Integer; Color, xs, ys, xe, ye, tol: Integer): Boolean;
|
function TMFinder.FindColorToleranceOptimised(out x, y: Integer; Color, xs, ys, xe, ye, tol: Integer): Boolean;
|
||||||
var
|
var
|
||||||
PtrData: TRetData;
|
PtrData: TRetData;
|
||||||
Ptr: PRGB32;
|
Ptr: PRGB32;
|
||||||
PtrInc: Integer;
|
PtrInc: Integer;
|
||||||
dX, dY, clR, clG, clB, xx, yy: Integer;
|
dX, dY, clR, clG, clB, xx, yy: Integer;
|
||||||
H1, S1, L1, H2, S2, L2: Extended;
|
H1, S1, L1, H2, S2, L2: Extended;
|
||||||
HueXTol, SatXTol: Extended;
|
R,G,B : extended; //percentage R,G,B.. (Needed for HSL).
|
||||||
|
D : Extended; //CMax - Cmin
|
||||||
|
HueTol,SatTol, LumTol : extended;
|
||||||
|
CMax, CMin : extended;
|
||||||
label Hit;
|
label Hit;
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -472,7 +484,140 @@ begin
|
|||||||
dY := ye - ys;
|
dY := ye - ys;
|
||||||
//next, convert the color to r,g,b
|
//next, convert the color to r,g,b
|
||||||
ColorToRGB(Color, clR, clG, clB);
|
ColorToRGB(Color, clR, clG, clB);
|
||||||
ColorToHSL(Color, H1, S1, L1);
|
if Cts = 2 then
|
||||||
|
RGBToHSLNonFixed(clR,clG,clB,H1,S1,L1);
|
||||||
|
|
||||||
|
PtrData := TClient(Client).MWindow.ReturnData(xs, ys, dX + 1, dY + 1);
|
||||||
|
|
||||||
|
// Do we want to "cache" these vars?
|
||||||
|
// We will, for now. Easier to type.
|
||||||
|
Ptr := PtrData.Ptr;
|
||||||
|
PtrInc := PtrData.IncPtrWith;
|
||||||
|
|
||||||
|
case CTS of
|
||||||
|
0:
|
||||||
|
for yy := ys to ye do
|
||||||
|
begin
|
||||||
|
for xx := xs to xe do
|
||||||
|
begin
|
||||||
|
if ((abs(clB-Ptr^.B) <= Tol) and (abs(clG-Ptr^.G) <= Tol) and (Abs(clR-Ptr^.R) <= Tol)) then
|
||||||
|
goto Hit;
|
||||||
|
inc(Ptr);
|
||||||
|
end;
|
||||||
|
Inc(Ptr, PtrInc);
|
||||||
|
end;
|
||||||
|
|
||||||
|
1:
|
||||||
|
begin
|
||||||
|
Tol := Sqr(Tol);
|
||||||
|
|
||||||
|
for yy := ys to ye do
|
||||||
|
begin
|
||||||
|
for xx := xs to xe do
|
||||||
|
begin
|
||||||
|
if (sqr(clB - Ptr^.B) + sqr(clG - Ptr^.G) + sqr(clR-Ptr^.R)) <= Tol then
|
||||||
|
goto Hit;
|
||||||
|
inc(ptr);
|
||||||
|
end;
|
||||||
|
Inc(Ptr, PtrInc);
|
||||||
|
end;
|
||||||
|
|
||||||
|
end;
|
||||||
|
2:
|
||||||
|
begin
|
||||||
|
//Since we don't make (real) percentages of the HSL-values we need to change the tolerance..
|
||||||
|
HueTol := hueMod * Tol / 100;
|
||||||
|
SatTol := satMod * Tol / 100;
|
||||||
|
LumTol := Tol / 100;
|
||||||
|
for yy := ys to ye do
|
||||||
|
begin
|
||||||
|
for xx := xs to xe do
|
||||||
|
begin
|
||||||
|
R := Percentage[Ptr^.r];
|
||||||
|
G := Percentage[Ptr^.g];
|
||||||
|
B := Percentage[Ptr^.b];
|
||||||
|
//We increase the Ptr already, since we do Continue in loops..
|
||||||
|
inc(Ptr);
|
||||||
|
CMin := R;
|
||||||
|
CMax := R;
|
||||||
|
if G < Cmin then CMin := G;
|
||||||
|
if B < Cmin then CMin := B;
|
||||||
|
if G > Cmax then CMax := G;
|
||||||
|
if B > Cmax then CMax := B;
|
||||||
|
L2 := 0.5 * (Cmax + Cmin);
|
||||||
|
//The L-value is already calculated, lets see if the current point meats the requirements!
|
||||||
|
if Abs(L2-L1) > LumTol then //if not (Abs(L2 - L1) <= LumTol) then
|
||||||
|
Continue;
|
||||||
|
if Cmax = Cmin then
|
||||||
|
begin
|
||||||
|
//S and H are both zero, lets check if we need found a point!
|
||||||
|
if (H1 <= HueTol) and (S1 <= SatTol) then
|
||||||
|
goto Hit
|
||||||
|
else
|
||||||
|
Continue;
|
||||||
|
end;
|
||||||
|
D := Cmax - Cmin;
|
||||||
|
if L2 < 0.5 then
|
||||||
|
S2 := D / (Cmax + Cmin)
|
||||||
|
else
|
||||||
|
S2 := D / (2 - Cmax - Cmin);
|
||||||
|
//We've Calculated the S. Lets see if we need to continue.
|
||||||
|
if Abs(S2 - S1) > SatTol then //if not (abs(S1 - S2) <= SatXTol) then
|
||||||
|
Continue;
|
||||||
|
if R = Cmax then
|
||||||
|
H2 := (G - B) / D
|
||||||
|
else
|
||||||
|
if G = Cmax then
|
||||||
|
H2 := 2 + (B - R) / D
|
||||||
|
else
|
||||||
|
H2 := 4 + (R - G) / D;
|
||||||
|
H2 := H2 / 6;
|
||||||
|
if H2 < 0 then
|
||||||
|
H2 := H2 + 1;
|
||||||
|
//Finally lets test H2
|
||||||
|
if Abs(H2 - H1) <= HueTol then
|
||||||
|
goto hit;
|
||||||
|
end;
|
||||||
|
Inc(Ptr, PtrInc);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
Result := False;
|
||||||
|
TClient(Client).MWindow.FreeReturnData;
|
||||||
|
Exit;
|
||||||
|
|
||||||
|
Hit:
|
||||||
|
Result := True;
|
||||||
|
x := xx;
|
||||||
|
y := yy;
|
||||||
|
TClient(Client).MWindow.FreeReturnData;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TMFinder.FindColorTolerance(out x, y: Integer; Color, xs, ys, xe, ye, tol: Integer): Boolean;
|
||||||
|
var
|
||||||
|
PtrData: TRetData;
|
||||||
|
Ptr: PRGB32;
|
||||||
|
PtrInc: Integer;
|
||||||
|
dX, dY, clR, clG, clB, xx, yy: Integer;
|
||||||
|
H1, S1, L1, H2, S2, L2: Extended;
|
||||||
|
R,G,B : extended; //percentage R,G,B.. (Needed for HSL).
|
||||||
|
D : Extended; //CMax - Cmin
|
||||||
|
HueXTol, SatXTol: Extended;
|
||||||
|
CMax, CMin : extended;
|
||||||
|
label Hit;
|
||||||
|
|
||||||
|
begin
|
||||||
|
Result := false;
|
||||||
|
// checks for valid xs,ys,xe,ye? (may involve GetDimensions)
|
||||||
|
DefaultOperations(xs,ys,xe,ye);
|
||||||
|
|
||||||
|
// calculate delta x and y
|
||||||
|
dX := xe - xs;
|
||||||
|
dY := ye - ys;
|
||||||
|
//next, convert the color to r,g,b
|
||||||
|
ColorToRGB(Color, clR, clG, clB);
|
||||||
|
if Cts = 2 then
|
||||||
|
RGBToHSL(clR,clG,clB,H1,S1,L1);
|
||||||
|
|
||||||
PtrData := TClient(Client).MWindow.ReturnData(xs, ys, dX + 1, dY + 1);
|
PtrData := TClient(Client).MWindow.ReturnData(xs, ys, dX + 1, dY + 1);
|
||||||
|
|
||||||
@ -516,6 +661,7 @@ begin
|
|||||||
HueXTol := hueMod * Tol;
|
HueXTol := hueMod * Tol;
|
||||||
SatXTol := satMod * Tol;
|
SatXTol := satMod * Tol;
|
||||||
for yy := ys to ye do
|
for yy := ys to ye do
|
||||||
|
begin
|
||||||
for xx := xs to xe do
|
for xx := xs to xe do
|
||||||
begin
|
begin
|
||||||
RGBToHSL(Ptr^.R,Ptr^.G,Ptr^.B,H2,S2,L2);
|
RGBToHSL(Ptr^.R,Ptr^.G,Ptr^.B,H2,S2,L2);
|
||||||
@ -524,6 +670,7 @@ begin
|
|||||||
inc(Ptr);
|
inc(Ptr);
|
||||||
end;
|
end;
|
||||||
Inc(Ptr, PtrInc);
|
Inc(Ptr, PtrInc);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
Result := False;
|
Result := False;
|
||||||
@ -544,7 +691,9 @@ var
|
|||||||
Ptr: PRGB32;
|
Ptr: PRGB32;
|
||||||
PtrInc,C: Integer;
|
PtrInc,C: Integer;
|
||||||
dX, dY, clR, clG, clB, xx, yy: Integer;
|
dX, dY, clR, clG, clB, xx, yy: Integer;
|
||||||
H1, S1, L1, H2, S2, L2, hueXTol, satXTol: Extended;
|
H1, S1, L1, H2, S2, L2, hueXTol, satXTol,LumTol,R,G,B,D,Cmin,Cmax: Extended;
|
||||||
|
label
|
||||||
|
hit;
|
||||||
begin
|
begin
|
||||||
Result := false;
|
Result := false;
|
||||||
DefaultOperations(xs,ys,xe,ye);
|
DefaultOperations(xs,ys,xe,ye);
|
||||||
@ -553,7 +702,8 @@ begin
|
|||||||
dY := ye - ys;
|
dY := ye - ys;
|
||||||
//next, convert the color to r,g,b
|
//next, convert the color to r,g,b
|
||||||
ColorToRGB(Color, clR, clG, clB);
|
ColorToRGB(Color, clR, clG, clB);
|
||||||
ColorToHSL(Color, H1, S1, L1);
|
if CTS = 2 then
|
||||||
|
ColorToHSL(color,H1,S1,L1);
|
||||||
|
|
||||||
PtrData := TClient(Client).MWindow.ReturnData(xs, ys, dX + 1, dY + 1);
|
PtrData := TClient(Client).MWindow.ReturnData(xs, ys, dX + 1, dY + 1);
|
||||||
|
|
||||||
@ -600,6 +750,7 @@ begin
|
|||||||
HueXTol := hueMod * Tol;
|
HueXTol := hueMod * Tol;
|
||||||
SatXTol := satMod * Tol;
|
SatXTol := satMod * Tol;
|
||||||
for yy := ys to ye do
|
for yy := ys to ye do
|
||||||
|
begin
|
||||||
for xx := xs to xe do
|
for xx := xs to xe do
|
||||||
begin
|
begin
|
||||||
RGBToHSL(Ptr^.R,Ptr^.G,Ptr^.B,H2,S2,L2);
|
RGBToHSL(Ptr^.R,Ptr^.G,Ptr^.B,H2,S2,L2);
|
||||||
@ -609,10 +760,139 @@ begin
|
|||||||
ClientTPA[c].y := yy;
|
ClientTPA[c].y := yy;
|
||||||
Inc(c);
|
Inc(c);
|
||||||
end;
|
end;
|
||||||
Inc(Ptr);
|
Inc(Ptr)
|
||||||
end;
|
end;
|
||||||
|
Inc(Ptr, PtrInc);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
SetLength(Points, C);
|
||||||
|
Move(ClientTPA[0], Points[0], C * SizeOf(TPoint));
|
||||||
|
Result := C > 0;
|
||||||
|
TClient(Client).MWindow.FreeReturnData;
|
||||||
|
end;
|
||||||
|
function TMFinder.FindColorsToleranceOptimised(out Points: TPointArray; Color, xs, ys,
|
||||||
|
xe, ye, Tol: Integer): Boolean;
|
||||||
|
var
|
||||||
|
PtrData: TRetData;
|
||||||
|
Ptr: PRGB32;
|
||||||
|
PtrInc,C: Integer;
|
||||||
|
dX, dY, clR, clG, clB, xx, yy: Integer;
|
||||||
|
H1, S1, L1, H2, S2, L2, hueTol, satTol,LumTol,R,G,B,D,Cmin,Cmax: Extended;
|
||||||
|
label
|
||||||
|
hit;
|
||||||
|
begin
|
||||||
|
Result := false;
|
||||||
|
DefaultOperations(xs,ys,xe,ye);
|
||||||
|
|
||||||
|
dX := xe - xs;
|
||||||
|
dY := ye - ys;
|
||||||
|
//next, convert the color to r,g,b
|
||||||
|
ColorToRGB(Color, clR, clG, clB);
|
||||||
|
if CTS = 2 then
|
||||||
|
RGBToHSLNonFixed(clR,clG,clB,H1,S1,L1);
|
||||||
|
|
||||||
|
PtrData := TClient(Client).MWindow.ReturnData(xs, ys, dX + 1, dY + 1);
|
||||||
|
|
||||||
|
// Do we want to "cache" these vars?
|
||||||
|
// We will, for now. Easier to type.
|
||||||
|
Ptr := PtrData.Ptr;
|
||||||
|
PtrInc := PtrData.IncPtrWith;
|
||||||
|
c := 0;
|
||||||
|
case CTS of
|
||||||
|
0:
|
||||||
|
for yy := ys to ye do
|
||||||
|
begin
|
||||||
|
for xx := xs to xe do
|
||||||
|
begin
|
||||||
|
if ((abs(clB-Ptr^.B) <= Tol) and (abs(clG-Ptr^.G) <= Tol) and (Abs(clR-Ptr^.R) <= Tol)) then
|
||||||
|
begin;
|
||||||
|
ClientTPA[c].x := xx;
|
||||||
|
ClientTPA[c].y := yy;
|
||||||
|
inc(c);
|
||||||
|
end;
|
||||||
|
inc(Ptr);
|
||||||
|
end;
|
||||||
Inc(Ptr, PtrInc);
|
Inc(Ptr, PtrInc);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
1:
|
||||||
|
for yy := ys to ye do
|
||||||
|
begin
|
||||||
|
for xx := xs to xe do
|
||||||
|
begin
|
||||||
|
if (Sqrt(sqr(clR-Ptr^.R) + sqr(clG - Ptr^.G) + sqr(clB - Ptr^.B)) <= Tol) then
|
||||||
|
begin;
|
||||||
|
ClientTPA[c].x := xx;
|
||||||
|
ClientTPA[c].y := yy;
|
||||||
|
inc(c);
|
||||||
|
end;
|
||||||
|
inc(ptr);
|
||||||
|
end;
|
||||||
|
Inc(Ptr, PtrInc);
|
||||||
|
end;
|
||||||
|
|
||||||
|
2:
|
||||||
|
begin
|
||||||
|
HueTol := hueMod * Tol / 100;
|
||||||
|
SatTol := satMod * Tol / 100;
|
||||||
|
LumTol := Tol / 100;
|
||||||
|
for yy := ys to ye do
|
||||||
|
begin
|
||||||
|
for xx := xs to xe do
|
||||||
|
begin
|
||||||
|
R := Percentage[Ptr^.r];
|
||||||
|
G := Percentage[Ptr^.g];
|
||||||
|
B := Percentage[Ptr^.b];
|
||||||
|
//We increase the Ptr already, since we use Continue;
|
||||||
|
inc(Ptr);
|
||||||
|
CMin := R;
|
||||||
|
CMax := R;
|
||||||
|
if G < Cmin then CMin := G;
|
||||||
|
if B < Cmin then CMin := B;
|
||||||
|
if G > Cmax then CMax := G;
|
||||||
|
if B > Cmax then CMax := B;
|
||||||
|
L2 := 0.5 * (Cmax + Cmin);
|
||||||
|
//The L-value is already calculated, lets see if the current point meats the requirements!
|
||||||
|
if Abs(L2-L1) > LumTol then //if not (Abs(L2 - L1) <= LumTol) then
|
||||||
|
Continue;
|
||||||
|
if Cmax = Cmin then
|
||||||
|
begin
|
||||||
|
//S and H are both zero, lets check if we need found a point!
|
||||||
|
if (H1 <= HueTol) and (S1 <= SatTol) then
|
||||||
|
goto Hit
|
||||||
|
else
|
||||||
|
Continue;
|
||||||
|
end;
|
||||||
|
D := Cmax - Cmin;
|
||||||
|
if L2 < 0.5 then
|
||||||
|
S2 := D / (Cmax + Cmin)
|
||||||
|
else
|
||||||
|
S2 := D / (2 - Cmax - Cmin);
|
||||||
|
//We've Calculated the S. Lets see if we need to continue.
|
||||||
|
if Abs(S2 - S1) > SatTol then //if not (abs(S1 - S2) <= SatXTol) then
|
||||||
|
Continue;
|
||||||
|
if R = Cmax then
|
||||||
|
H2 := (G - B) / D
|
||||||
|
else
|
||||||
|
if G = Cmax then
|
||||||
|
H2 := 2 + (B - R) / D
|
||||||
|
else
|
||||||
|
H2 := 4 + (R - G) / D;
|
||||||
|
H2 := H2 / 6;
|
||||||
|
if H2 < 0 then
|
||||||
|
H2 := H2 + 1;
|
||||||
|
//Finally lets test H2
|
||||||
|
if Abs(H2 - H1) > HueTol then
|
||||||
|
continue;
|
||||||
|
hit:
|
||||||
|
ClientTPA[c].x := xx;
|
||||||
|
ClientTPA[c].y := yy;
|
||||||
|
Inc(c);
|
||||||
|
end;
|
||||||
|
Inc(Ptr, PtrInc);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
SetLength(Points, C);
|
SetLength(Points, C);
|
||||||
Move(ClientTPA[0], Points[0], C * SizeOf(TPoint));
|
Move(ClientTPA[0], Points[0], C * SizeOf(TPoint));
|
||||||
|
Loading…
Reference in New Issue
Block a user