1
0
mirror of https://github.com/moparisthebest/Simba synced 2024-11-21 16:55:01 -05:00
This commit is contained in:
Raymond 2011-02-06 14:33:16 +01:00
commit b6a9d32b82
2 changed files with 254 additions and 211 deletions

5
Projects/libmml/Makefile Normal file
View File

@ -0,0 +1,5 @@
.PHONY: default
default:
/home/merlijn/lazarus/lazbuild libmml.lpi

View File

@ -59,9 +59,11 @@ begin
C := TClient.Create(''); C := TClient.Create('');
Result := PtrUInt(C); Result := PtrUInt(C);
except on e : Exception do except on e : Exception do
begin
// FIXME UINT negative // FIXME UINT negative
result := PtrUInt(RESULT_ERROR); result := PtrUInt(RESULT_ERROR);
set_last_error(e.Message); set_last_error(e.message);
end;
end; end;
writeln(format('C: %d, IOManager: %d', [PtrUInt(C), PtrUInt(C.IOManager)])); writeln(format('C: %d, IOManager: %d', [PtrUInt(C), PtrUInt(C.IOManager)]));
end; end;
@ -72,8 +74,10 @@ begin
try try
C.Free; C.Free;
except on e : Exception do except on e : Exception do
begin
result := RESULT_ERROR; result := RESULT_ERROR;
set_last_error(e.message): set_last_error(e.message);
end;
end; end;
end; end;
@ -148,9 +152,11 @@ begin
C.IOManager.GetMousePos(t.x,t.y); C.IOManager.GetMousePos(t.x,t.y);
result := RESULT_OK; result := RESULT_OK;
except on e : Exception do except on e : Exception do
begin
result := RESULT_ERROR; result := RESULT_ERROR;
set_last_error(e.Message); set_last_error(e.Message);
end; end;
end;
end; end;
{ Set mouse position of client C to point t } { Set mouse position of client C to point t }
@ -160,9 +166,11 @@ begin
C.IOManager.MoveMouse(t.x,t.y); C.IOManager.MoveMouse(t.x,t.y);
result := RESULT_OK; result := RESULT_OK;
except on e : Exception do except on e : Exception do
begin
result := RESULT_ERROR; result := RESULT_ERROR;
set_last_error(e.Message); set_last_error(e.Message);
end; end;
end;
end; end;
@ -181,13 +189,15 @@ function get_mouse_button_state(C: TClient; But: Integer): Integer; cdecl;
begin begin
try try
if C.IOManager.IsMouseButtonDown(ConvIntClickType(But)) then if C.IOManager.IsMouseButtonDown(ConvIntClickType(But)) then
result := MOUSE_DOWN; result := MOUSE_DOWN
else else
result := MOUSE_UP; result := MOUSE_UP;
except on e : Exception do except on e : Exception do
begin
result := RESULT_ERROR; result := RESULT_ERROR;
set_last_error(e.Message); set_last_error(e.Message);
end; end;
end;
end; end;
{ Set the state of a mouse button given client C } { Set the state of a mouse button given client C }
@ -204,9 +214,11 @@ begin
result := RESULT_OK; result := RESULT_OK;
end; end;
except on e : Exception do except on e : Exception do
begin
result := RESULT_ERROR; result := RESULT_ERROR;
set_last_error(e.Message); set_last_error(e.Message);
end; end;
end;
end; end;
@ -222,9 +234,11 @@ begin
else else
result := RESULT_FALSE; result := RESULT_FALSE;
except on e : Exception do except on e : Exception do
begin
set_last_error(e.message); set_last_error(e.message);
result := RESULT_ERROR; result := RESULT_ERROR;
end; end;
end;
end; end;
{ Find color on client C in area (x1,y1,x2,y2) and return coordinate (if any) in x, y } { Find color on client C in area (x1,y1,x2,y2) and return coordinate (if any) in x, y }
@ -237,9 +251,11 @@ begin
else else
result := RESULT_FALSE; result := RESULT_FALSE;
except on e : Exception do except on e : Exception do
begin
set_last_error(e.Message); set_last_error(e.Message);
result := RESULT_ERROR; result := RESULT_ERROR;
end; end;
end;
end; end;
function find_color_tolerance(C: TClient; var x, y: Integer; color: Integer; function find_color_tolerance(C: TClient; var x, y: Integer; color: Integer;
@ -252,9 +268,11 @@ begin
else else
result := RESULT_FALSE; result := RESULT_FALSE;
except on e : Exception do except on e : Exception do
begin
set_last_error(e.Message); set_last_error(e.Message);
result := RESULT_ERROR; result := RESULT_ERROR;
end; end;
end;
end; end;
function find_color_tolerance_optimised(C: TClient; var x, y: Integer; function find_color_tolerance_optimised(C: TClient; var x, y: Integer;
@ -269,9 +287,11 @@ begin
else else
result := RESULT_FALSE; result := RESULT_FALSE;
except on e : Exception do except on e : Exception do
begin
set_last_error(e.message); set_last_error(e.message);
result := RESULT_ERROR; result := RESULT_ERROR;
end; end;
end;
end; end;
function find_colors(C: TClient; var ptr: PPoint; var len: Integer; function find_colors(C: TClient; var ptr: PPoint; var len: Integer;
@ -283,16 +303,20 @@ begin
try try
C.MFinder.FindColors(TPA, color, x1, y1, x2, y2); C.MFinder.FindColors(TPA, color, x1, y1, x2, y2);
except on e : Exception do except on e : Exception do
begin
set_last_error(e.Message); set_last_error(e.Message);
result := RESULT_ERROR; result := RESULT_ERROR;
end; end;
end;
len := Length(TPA); len := Length(TPA);
if len > 0 then if len > 0 then
result := RESULT_OK result := RESULT_OK
else else
setlength(tpa, 0); begin
exit(RESULT_FALSE); setlength(tpa, 0);
exit(RESULT_FALSE);
end;
ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint)); ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint));
setlength(tpa, 0); setlength(tpa, 0);
@ -303,24 +327,26 @@ function find_colors_tolerance(C: TClient; var ptr: PPoint; var len: Integer;
var var
TPA: TPointArray; TPA: TPointArray;
begin begin
try try
C.MFinder.FindColorsTolerance(TPA, color, x1, y1, x2, y2, tol); C.MFinder.FindColorsTolerance(TPA, color, x1, y1, x2, y2, tol);
except on e : Exception do except on e : Exception do
begin begin
set_last_error(e.Message); set_last_error(e.Message);
result := RESULT_ERROR; result := RESULT_ERROR;
end;
end; end;
end;
len := Length(TPA); len := Length(TPA);
if len > 0 then if len > 0 then
result := RESULT_OK result := RESULT_OK
else else
setlength(tpa, 0); begin
exit(RESULT_FALSE); setlength(tpa, 0);
exit(RESULT_FALSE);
end;
ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint)); ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint));
setlength(TPA, 0); setlength(TPA, 0);
end; end;
function find_colors_tolerance_optimised(C: TClient; var ptr: PPoint; function find_colors_tolerance_optimised(C: TClient; var ptr: PPoint;
@ -330,180 +356,184 @@ function find_colors_tolerance_optimised(C: TClient; var ptr: PPoint;
var var
TPA: TPointArray; TPA: TPointArray;
begin begin
try try
C.MFinder.FindColorsToleranceOptimised(TPA, col, x1, y1, x2, y2, tol); C.MFinder.FindColorsToleranceOptimised(TPA, col, x1, y1, x2, y2, tol);
except on e : Exception do except on e : Exception do
begin begin
set_last_error(e.message); set_last_error(e.message);
result := RESULT_ERROR; result := RESULT_ERROR;
end;
end; end;
end;
len := Length(TPA); len := Length(TPA);
if len > 0 then if len > 0 then
result := RESULT_OK result := RESULT_OK
else else
setlength(tpa, 0); begin
exit(RESULT_FALSE); setlength(tpa, 0);
exit(RESULT_FALSE);
end;
ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint)); ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint));
setlength(TPA, 0); setlength(TPA, 0);
end; end;
function similar_colors(C: TClient; col1, col2, tol: Integer): Integer; cdecl; function similar_colors(C: TClient; col1, col2, tol: Integer): Integer; cdecl;
begin begin
if C.MFinder.SimilarColors(col1, col2, tol) then try
result := RESULT_OK if C.MFinder.SimilarColors(col1, col2, tol) then
else result := RESULT_OK
result := RESULT_FALSE; else
result := RESULT_FALSE;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_FALSE;
end;
end;
end; end;
function count_color(C: TClient; out count: Integer; function count_color(C: TClient; out count: Integer;
Color, xs, ys, xe, ye: Integer): Integer; cdecl; Color, xs, ys, xe, ye: Integer): Integer; cdecl;
begin begin
try try
count := C.MFinder.CountColor(Color, xs, ys, xe, ye);
if count > 0 then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
begin begin
count := C.MFinder.CountColor(Color, xs, ys, xe, ye); set_last_error(e.message);
if count > 0 then result := RESULT_ERROR;
result := RESULT_OK
else
result := RESULT_FALSE;
end; end;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end; end;
end;
end; end;
function count_color_tolerance(C: TClient; out count: Integer; col: Integer; function count_color_tolerance(C: TClient; out count: Integer; col: Integer;
xs, ys, xe, ye, tol: Integer): Integer; cdecl; xs, ys, xe, ye, tol: Integer): Integer; cdecl;
begin begin
try try
count := C.MFinder.CountColorTolerance(col, xs, ys, xe, ye, tol); count := C.MFinder.CountColorTolerance(col, xs, ys, xe, ye, tol);
except on e : Exception do except on e : Exception do
begin begin
set_last_error(e.message); set_last_error(e.message);
result := RESULT_ERROR; result := RESULT_ERROR;
end; end;
end; end;
if count > 0 then
result := RESULT_OK if count > 0 then
else result := RESULT_OK
result := RESULT_FALSE; else
result := RESULT_FALSE;
end; end;
function find_color_spiral(C: TClient; var x, y: Integer; function find_color_spiral(C: TClient; var x, y: Integer;
col, xs, ys, xe, ye: Integer): Integer; cdecl; col, xs, ys, xe, ye: Integer): Integer; cdecl;
begin begin
try try
if C.MFinder.FindColorSpiral(x, y, col, xs, ys, xe, ye) then if C.MFinder.FindColorSpiral(x, y, col, xs, ys, xe, ye) then
result := RESULT_OK result := RESULT_OK
else else
result := RESULT_FALSE; result := RESULT_FALSE;
except on e : Exception do except on e : Exception do
begin begin
set_last_error(e.message); set_last_error(e.message);
result := RESULT_ERROR; result := RESULT_ERROR;
end;
end; end;
end;
end; end;
function find_color_spiral_tolerance(C: TClient; var x, y: Integer; function find_color_spiral_tolerance(C: TClient; var x, y: Integer;
col, xs, ys, xe, ye: Integer; col, xs, ys, xe, ye: Integer;
tol: Integer): Integer; cdecl; tol: Integer): Integer; cdecl;
begin begin
try try
if C.MFinder.FindColorSpiralTolerance(x, y, col, xs, ys, xe, ye, tol) then if C.MFinder.FindColorSpiralTolerance(x, y, col, xs, ys, xe, ye,
result := RESULT_OK tol) then
else result := RESULT_OK
result := RESULT_FALSE; else
except on e : Exception do result := RESULT_FALSE;
except on e : Exception do
begin begin
set_last_error(e.message); set_last_error(e.message);
result := RESULT_ERROR; result := RESULT_ERROR;
end;
end; end;
end;
end; end;
function find_colored_area(C: TClient; var x, y: Integer; function find_colored_area(C: TClient; var x, y: Integer;
col, xs, ys, xe, ye, minA: Integer): Integer; cdecl; col, xs, ys, xe, ye, minA: Integer): Integer; cdecl;
begin begin
try try
if C.MFinder.FindColoredArea(x, y, col, xs, ys, xe, ye, minA) then if C.MFinder.FindColoredArea(x, y, col, xs, ys, xe, ye, minA) then
result := RESULT_OK result := RESULT_OK
else else
result := RESULT_FALSE; result := RESULT_FALSE;
except on e : Exception do except on e : Exception do
begin begin
set_last_error(e.message); set_last_error(e.message);
result := RESULT_ERROR; result := RESULT_ERROR;
end;
end; end;
end;
end; end;
function find_colored_area_tolerance(C: TClient; var x, y: Integer; function find_colored_area_tolerance(C: TClient; var x, y: Integer;
col, xs, ys, xe, ye, minA: Integer; col, xs, ys, xe, ye, minA: Integer;
tol: Integer): Integer; cdecl; tol: Integer): Integer; cdecl;
begin begin
try try
if C.MFinder.FindColoredAreaTolerance(x, y, col, if C.MFinder.FindColoredAreaTolerance(x, y, col,
xs, ys, xe, ye, minA, tol) then xs, ys, xe, ye, minA, tol) then
result := RESULT_OK result := RESULT_OK
else else
result := RESULT_FALSE; result := RESULT_FALSE;
except on e : Exception do except on e : Exception do
begin begin
set_last_error(e.message); set_last_error(e.message);
result := RESULT_ERROR; result := RESULT_ERROR;
end;
end; end;
end;
end; end;
function set_tolerance_speed(C: TClient; nCTS: Integer): Integer; cdecl; function set_tolerance_speed(C: TClient; nCTS: Integer): Integer; cdecl;
begin begin
try try
C.MFinder.SetToleranceSpeed(nCTS);
result := RESULT_OK;
except on e : Exception do
begin begin
C.MFinder.SetToleranceSpeed(nCTS); set_last_error(e.message);
result := RESULT_OK; result := RESULT_ERROR;
end; end;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end; end;
end;
end; end;
function get_tolerance_speed(C: TClient; out cts: Integer): Integer; cdecl; function get_tolerance_speed(C: TClient; out cts: Integer): Integer; cdecl;
begin begin
try try
begin cts := C.MFinder.GetToleranceSpeed;
cts := C.MFinder.GetToleranceSpeed; result := RESULT_OK;
result := RESULT_OK; except on e: Exception do
begin;
set_last_error(e.message);
result := RESULT_ERROR;
end end
except on e: Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end; end;
end; end;
function set_tolerance_speed_2_modifiers(C: TClient; function set_tolerance_speed_2_modifiers(C: TClient;
nHue, nSat: Extended): Integer; cdecl; nHue, nSat: Extended): Integer; cdecl;
begin begin
try try
begin C.MFinder.SetToleranceSpeed2Modifiers(nHue, nSat);
C.MFinder.SetToleranceSpeed2Modifiers(nHue, nSat); result := RESULT_OK;
result := RESULT_OK; except on e : Exception do
begin;
set_last_error(e.message);
result := RESULT_ERROR;
end; end;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end; end;
end;
end; end;
function get_tolerance_speed_2_modifiers(C: TClient; out hueMod: Extended; function get_tolerance_speed_2_modifiers(C: TClient; out hueMod: Extended;
@ -511,17 +541,16 @@ function get_tolerance_speed_2_modifiers(C: TClient; out hueMod: Extended;
var var
h, s: Extended; h, s: Extended;
begin begin
try: try
begin C.MFinder.GetToleranceSpeed2Modifiers(h, s);
C.MFinder.GetToleranceSpeed2Modifiers(h, s); hueMod := h;
hueMod := h; satMod := s;
satMod := s; result := RESULT_OK;
result := RESULT_OK; except on e : Exception do
begin;
set_last_error(e.message);
result := RESULT_ERROR;
end; end;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end; end;
end; end;
@ -530,120 +559,129 @@ end;
{ FIXME: DTM has not been tested yet! } { FIXME: DTM has not been tested yet! }
{ Create a MDTM} { Create a MDTM}
function create_dtm(PointLen: integer; Points: PMDTMPoint; DTM: TMDTM): integer; cdecl; function create_dtm(PointLen: integer; Points: PMDTMPoint; DTM: TMDTM): integer;
cdecl;
var var
i: integer; i: integer;
begin begin
DTM := TMDTM.Create; DTM := TMDTM.Create;
for i := 0 to PointLen - 1 do for i := 0 to PointLen - 1 do
DTM.AddPoint(Points[i]); DTM.AddPoint(Points[i]);
if DTM.Valid then if DTM.Valid then
exit(RESULT_OK); exit(RESULT_OK);
DTM.Free; DTM.Free;
set_last_error('Invalid DTM'); set_last_error('Invalid DTM');
result := RESULT_ERROR; result := RESULT_ERROR;
end; end;
{ Delete a MDTM. Don't delete it if it is managed! use remove_dtm instead } { Delete a MDTM. Don't delete it if it is managed! use remove_dtm instead }
function delete_dtm(C: TClient; DTM: TMDTM): integer; cdecl; function delete_dtm(C: TClient; DTM: TMDTM): integer; cdecl;
begin begin
if not assigned(DTM) then if not assigned(DTM) then
begin begin
set_last_error('DTM is NULL'); set_last_error('DTM is NULL');
exit(RESULT_ERROR); exit(RESULT_ERROR);
end; end;
DTM.Free; DTM.Free;
result := RESULT_OK; result := RESULT_OK;
end; end;
{ Add a previously created DTM to the DTM Manager } { Add a previously created DTM to the DTM Manager }
function add_dtm(C: TClient; DTM: TMDTM; var index: integer): integer; cdecl; function add_dtm(C: TClient; DTM: TMDTM; var index: integer): integer; cdecl;
begin begin
if not assigned(DTM) then if not assigned(DTM) then
begin begin
set_last_error('DTM is NULL'); set_last_error('DTM is NULL');
exit(RESULT_ERROR); exit(RESULT_ERROR);
end; end;
try: try
begin index := C.MDTMs.AddDTM(DTM);
index := C.MDTMs.AddDTM(DTM); exit(RESULT_OK);
exit(RESULT_OK); except on e : Exception do
end; result := RESULT_ERROR;
except on e : Exception do end;
begin
exit(RESULT_ERROR);
end;
end; end;
{ Remove a previously added DTM from the DTM manager. This also frees the DTM } { Remove a previously added DTM from the DTM manager. This also frees the DTM }
function remove_dtm(C: TClient; DTMi: integer): integer; cdecl; function remove_dtm(C: TClient; DTMi: integer): integer; cdecl;
begin begin
C.MDTMs.FreeDTM(DTMi); C.MDTMs.FreeDTM(DTMi);
end; end;
{ Find a DTM given DTM index i, client C in area x1,y1,x2,y2. Return coord at x, y. } { Find a DTM given DTM index i, client C in area x1,y1,x2,y2. Return coord at x, y. }
function find_dtm(C: TClient; DTMi: integer; var x, y: integer; x1, y1, x2, y2: integer): integer; cdecl; function find_dtm(C: TClient; DTMi: integer; var x, y: integer; x1, y1, x2,
y2: integer): integer; cdecl;
var var
res: boolean; res: boolean;
begin begin
try try
res := C.MFinder.FindDTM(C.MDTMs.DTM[DTMi], x, y, x1, y1, x2, y2); res := C.MFinder.FindDTM(C.MDTMs.DTM[DTMi], x, y, x1, y1, x2, y2);
except on e : Exception do except on e : Exception do
begin begin;
result := RESULT_ERROR; result := RESULT_ERROR;
set_last_error(e.Message); set_last_error(e.Message);
end;
end; end;
end;
if res then if res then
result := RESULT_OK result := RESULT_OK
else else
result := RESULT_FALSE; result := RESULT_FALSE;
end; end;
{ Find a DTM given DTM index i, client C in area x1,y1,x2,y2. Return coord at x, y. } { Find a DTM given DTM index i, client C in area x1,y1,x2,y2. Return coord at x, y. }
function find_dtms(C: TClient; DTMi: integer; ptr: PPoint; x1, y1, x2, y2: integer): integer; cdecl; function find_dtms(C: TClient; DTMi: integer; ptr: PPoint; x1, y1, x2,
y2: integer): integer; cdecl;
var var
res: boolean; res: boolean;
len: integer;
TPA: TPointArray; TPA: TPointArray;
begin begin
try try
res := C.MFinder.FindDTMs(C.MDTMs.DTM[DTMi], TPA, x1, y1, x2, y2); res := C.MFinder.FindDTMs(C.MDTMs.DTM[DTMi], TPA, x1, y1, x2, y2);
except on e : Exception do except on e : Exception do
begin begin;
result := RESULT_ERROR; result := RESULT_ERROR;
set_last_error(e.Message); set_last_error(e.Message);
end;
end; end;
end;
len := Length(TPA); len := Length(TPA);
if len > 0 then if len > 0 then
result := RESULT_OK result := RESULT_OK
else else
setlength(tpa, 0); begin
exit(RESULT_FALSE); setlength(tpa, 0);
exit(RESULT_FALSE);
end;
ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint)); ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint));
setlength(TPA, 0); setlength(TPA, 0);
end; end;
function set_array_target(C: TClient; Arr: PRGB32; Size: TPoint): integer; cdecl; function set_array_target(C: TClient; Arr: PRGB32; Size: TPoint): integer;
cdecl;
begin begin
if not assigned(Arr) then if not assigned(Arr) then
begin begin
set_last_error('Arr is not assigned'); set_last_error('Arr is not assigned');
exit(RESULT_FALSE); exit(RESULT_FALSE);
end; end;
// FIXME: Catch exceptions. try
C.IOManager.SetTarget(Arr, Size); C.IOManager.SetTarget(Arr, Size);
result := RESULT_OK;
result := RESULT_OK; except on e : Exception do
begin;
set_last_error(e.message);
result := RESULT_FALSE;
end;
end;
end; end;
exports exports