Added new DTM Finding. Not done yet, but getting there.

Needs a few obvious optimizations, and rotated isn't implemented yet.
Needs a stress-test script.

Added a script to test the difference between FindColorsTolerance and FindColorsToleranceOptimisation.



git-svn-id: http://www.villavu.com/repositories/merlijn/mufasa@260 3f818213-9676-44b0-a9b4-5e4c4e03d09d
This commit is contained in:
Wizzup? 2009-12-01 23:41:43 +00:00
parent 17cb6596cc
commit c0132294be
9 changed files with 832 additions and 800 deletions

View File

@ -11,7 +11,7 @@
<TargetFileExt Value=""/> <TargetFileExt Value=""/>
<Icon Value="0"/> <Icon Value="0"/>
<UseXPManifest Value="True"/> <UseXPManifest Value="True"/>
<ActiveEditorIndexAtStart Value="0"/> <ActiveEditorIndexAtStart Value="2"/>
</General> </General>
<VersionInfo> <VersionInfo>
<ProjectVersion Value=""/> <ProjectVersion Value=""/>
@ -30,15 +30,15 @@
<LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/> <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
</local> </local>
</RunParams> </RunParams>
<Units Count="19"> <Units Count="22">
<Unit0> <Unit0>
<Filename Value="project1.lpr"/> <Filename Value="project1.lpr"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="project1"/> <UnitName Value="project1"/>
<CursorPos X="23" Y="98"/> <CursorPos X="88" Y="89"/>
<TopLine Value="84"/> <TopLine Value="61"/>
<EditorIndex Value="0"/> <EditorIndex Value="0"/>
<UsageCount Value="38"/> <UsageCount Value="66"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit0> </Unit0>
<Unit1> <Unit1>
@ -46,15 +46,15 @@
<UnitName Value="CustApp"/> <UnitName Value="CustApp"/>
<CursorPos X="15" Y="51"/> <CursorPos X="15" Y="51"/>
<TopLine Value="32"/> <TopLine Value="32"/>
<UsageCount Value="9"/> <UsageCount Value="7"/>
</Unit1> </Unit1>
<Unit2> <Unit2>
<Filename Value="../../Units/MMLCore/client.pas"/> <Filename Value="../../Units/MMLCore/client.pas"/>
<UnitName Value="Client"/> <UnitName Value="Client"/>
<CursorPos X="40" Y="5"/> <CursorPos X="21" Y="51"/>
<TopLine Value="5"/> <TopLine Value="35"/>
<EditorIndex Value="2"/> <EditorIndex Value="6"/>
<UsageCount Value="14"/> <UsageCount Value="28"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit2> </Unit2>
<Unit3> <Unit3>
@ -62,15 +62,15 @@
<UnitName Value="windowutil"/> <UnitName Value="windowutil"/>
<CursorPos X="110" Y="30"/> <CursorPos X="110" Y="30"/>
<TopLine Value="3"/> <TopLine Value="3"/>
<UsageCount Value="9"/> <UsageCount Value="7"/>
</Unit3> </Unit3>
<Unit4> <Unit4>
<Filename Value="../../Units/MMLCore/window.pas"/> <Filename Value="../../Units/MMLCore/window.pas"/>
<UnitName Value="Window"/> <UnitName Value="Window"/>
<CursorPos X="1" Y="1"/> <CursorPos X="55" Y="251"/>
<TopLine Value="1"/> <TopLine Value="236"/>
<EditorIndex Value="6"/> <EditorIndex Value="9"/>
<UsageCount Value="13"/> <UsageCount Value="27"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit4> </Unit4>
<Unit5> <Unit5>
@ -78,31 +78,33 @@
<UnitName Value="colour_conv"/> <UnitName Value="colour_conv"/>
<CursorPos X="24" Y="7"/> <CursorPos X="24" Y="7"/>
<TopLine Value="37"/> <TopLine Value="37"/>
<UsageCount Value="9"/> <UsageCount Value="7"/>
</Unit5> </Unit5>
<Unit6> <Unit6>
<Filename Value="../../Units/MMLCore/finder.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<UnitName Value="finder"/> <UnitName Value="finder"/>
<CursorPos X="37" Y="11"/> <CursorPos X="52" Y="1654"/>
<TopLine Value="1"/> <TopLine Value="1645"/>
<UsageCount Value="17"/> <EditorIndex Value="2"/>
<UsageCount Value="31"/>
<Loaded Value="True"/>
</Unit6> </Unit6>
<Unit7> <Unit7>
<Filename Value="../../Units/MMLCore/input.pas"/> <Filename Value="../../Units/MMLCore/input.pas"/>
<UnitName Value="Input"/> <UnitName Value="Input"/>
<CursorPos X="56" Y="49"/> <CursorPos X="56" Y="49"/>
<TopLine Value="24"/> <TopLine Value="24"/>
<EditorIndex Value="1"/> <EditorIndex Value="5"/>
<UsageCount Value="13"/> <UsageCount Value="27"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit7> </Unit7>
<Unit8> <Unit8>
<Filename Value="../../Units/MMLCore/mufasatypes.pas"/> <Filename Value="../../Units/MMLCore/mufasatypes.pas"/>
<UnitName Value="MufasaTypes"/> <UnitName Value="MufasaTypes"/>
<CursorPos X="27" Y="50"/> <CursorPos X="1" Y="88"/>
<TopLine Value="36"/> <TopLine Value="76"/>
<EditorIndex Value="7"/> <EditorIndex Value="10"/>
<UsageCount Value="15"/> <UsageCount Value="29"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit8> </Unit8>
<Unit9> <Unit9>
@ -110,195 +112,220 @@
<UnitName Value="ocr"/> <UnitName Value="ocr"/>
<CursorPos X="11" Y="361"/> <CursorPos X="11" Y="361"/>
<TopLine Value="330"/> <TopLine Value="330"/>
<EditorIndex Value="3"/> <EditorIndex Value="7"/>
<UsageCount Value="14"/> <UsageCount Value="28"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit9> </Unit9>
<Unit10> <Unit10>
<Filename Value="../../../../Documents/fpc/rtl/objpas/sysutils/diskh.inc"/> <Filename Value="../../../../Documents/fpc/rtl/objpas/sysutils/diskh.inc"/>
<CursorPos X="10" Y="18"/> <CursorPos X="10" Y="18"/>
<TopLine Value="1"/> <TopLine Value="1"/>
<UsageCount Value="10"/> <UsageCount Value="8"/>
</Unit10> </Unit10>
<Unit11> <Unit11>
<Filename Value="../../Units/MMLCore/files.pas"/> <Filename Value="../../Units/MMLCore/files.pas"/>
<UnitName Value="files"/> <UnitName Value="files"/>
<CursorPos X="5" Y="42"/> <CursorPos X="5" Y="42"/>
<TopLine Value="27"/> <TopLine Value="27"/>
<UsageCount Value="10"/> <UsageCount Value="8"/>
</Unit11> </Unit11>
<Unit12> <Unit12>
<Filename Value="../../../../Documents/lazarus/lcl/graphics.pp"/> <Filename Value="../../../../Documents/lazarus/lcl/graphics.pp"/>
<UnitName Value="Graphics"/> <UnitName Value="Graphics"/>
<CursorPos X="3" Y="1426"/> <CursorPos X="3" Y="1426"/>
<TopLine Value="1411"/> <TopLine Value="1411"/>
<UsageCount Value="10"/> <UsageCount Value="8"/>
</Unit12> </Unit12>
<Unit13> <Unit13>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/> <Filename Value="../../Units/MMLCore/bitmaps.pas"/>
<UnitName Value="bitmaps"/> <UnitName Value="bitmaps"/>
<CursorPos X="11" Y="736"/> <CursorPos X="32" Y="835"/>
<TopLine Value="722"/> <TopLine Value="850"/>
<EditorIndex Value="5"/> <EditorIndex Value="1"/>
<UsageCount Value="12"/> <UsageCount Value="26"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit13> </Unit13>
<Unit14> <Unit14>
<Filename Value="../../../../Documents/fpc/rtl/inc/objpash.inc"/> <Filename Value="../../../../Documents/fpc/rtl/inc/objpash.inc"/>
<CursorPos X="22" Y="177"/> <CursorPos X="22" Y="177"/>
<TopLine Value="162"/> <TopLine Value="162"/>
<UsageCount Value="10"/> <UsageCount Value="8"/>
</Unit14> </Unit14>
<Unit15> <Unit15>
<Filename Value="../../../../Documents/lazarus/lcl/intfgraphics.pas"/> <Filename Value="../../../../Documents/lazarus/lcl/intfgraphics.pas"/>
<UnitName Value="IntfGraphics"/> <UnitName Value="IntfGraphics"/>
<CursorPos X="30" Y="2975"/> <CursorPos X="30" Y="2975"/>
<TopLine Value="2959"/> <TopLine Value="2959"/>
<UsageCount Value="10"/> <UsageCount Value="8"/>
</Unit15> </Unit15>
<Unit16> <Unit16>
<Filename Value="../../Units/MMLAddon/mmlpsthread.pas"/> <Filename Value="../../Units/MMLAddon/mmlpsthread.pas"/>
<UnitName Value="mmlpsthread"/> <UnitName Value="mmlpsthread"/>
<CursorPos X="3" Y="154"/> <CursorPos X="3" Y="154"/>
<TopLine Value="235"/> <TopLine Value="235"/>
<UsageCount Value="10"/> <UsageCount Value="8"/>
</Unit16> </Unit16>
<Unit17> <Unit17>
<Filename Value="../../../../Documents/fpc/rtl/i386/mmx.pp"/> <Filename Value="../../../../Documents/fpc/rtl/i386/mmx.pp"/>
<UnitName Value="mmx"/> <UnitName Value="mmx"/>
<CursorPos X="80" Y="15"/> <CursorPos X="80" Y="15"/>
<TopLine Value="71"/> <TopLine Value="71"/>
<UsageCount Value="10"/> <UsageCount Value="8"/>
</Unit17> </Unit17>
<Unit18> <Unit18>
<Filename Value="../../Units/MMLAddon/PSInc/Wrappers/ocr.inc"/> <Filename Value="../../Units/MMLAddon/PSInc/Wrappers/ocr.inc"/>
<CursorPos X="20" Y="5"/> <CursorPos X="20" Y="5"/>
<TopLine Value="1"/> <TopLine Value="1"/>
<EditorIndex Value="4"/> <EditorIndex Value="8"/>
<UsageCount Value="10"/> <UsageCount Value="24"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit18> </Unit18>
<Unit19>
<Filename Value="../../Units/MMLCore/dtm.pas"/>
<UnitName Value="dtm"/>
<CursorPos X="31" Y="74"/>
<TopLine Value="123"/>
<EditorIndex Value="4"/>
<UsageCount Value="24"/>
<Loaded Value="True"/>
</Unit19>
<Unit20>
<Filename Value="../../Units/MMLCore/dtmutil.pas"/>
<UnitName Value="dtmutil"/>
<CursorPos X="54" Y="196"/>
<TopLine Value="173"/>
<EditorIndex Value="3"/>
<UsageCount Value="20"/>
<Loaded Value="True"/>
</Unit20>
<Unit21>
<Filename Value="../../../../Documents/fpc/packages/fcl-base/src/custapp.pp"/>
<UnitName Value="CustApp"/>
<CursorPos X="59" Y="48"/>
<TopLine Value="18"/>
<UsageCount Value="9"/>
</Unit21>
</Units> </Units>
<JumpHistory Count="30" HistoryIndex="29"> <JumpHistory Count="30" HistoryIndex="29">
<Position1> <Position1>
<Filename Value="../../Units/MMLCore/ocr.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="656" Column="18" TopLine="636"/> <Caret Line="1738" Column="59" TopLine="1718"/>
</Position1> </Position1>
<Position2> <Position2>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="62" Column="33" TopLine="47"/> <Caret Line="1743" Column="53" TopLine="1718"/>
</Position2> </Position2>
<Position3> <Position3>
<Filename Value="../../Units/MMLCore/ocr.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="653" Column="39" TopLine="637"/> <Caret Line="1652" Column="33" TopLine="1643"/>
</Position3> </Position3>
<Position4> <Position4>
<Filename Value="../../Units/MMLCore/window.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="52" Column="40" TopLine="37"/> <Caret Line="1661" Column="1" TopLine="1643"/>
</Position4> </Position4>
<Position5> <Position5>
<Filename Value="../../Units/MMLCore/window.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="73" Column="33" TopLine="58"/> <Caret Line="1664" Column="17" TopLine="1637"/>
</Position5> </Position5>
<Position6> <Position6>
<Filename Value="../../Units/MMLCore/window.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="373" Column="39" TopLine="368"/> <Caret Line="1610" Column="19" TopLine="1594"/>
</Position6> </Position6>
<Position7> <Position7>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/> <Filename Value="../../Units/MMLCore/dtmutil.pas"/>
<Caret Line="98" Column="27" TopLine="91"/> <Caret Line="41" Column="23" TopLine="26"/>
</Position7> </Position7>
<Position8> <Position8>
<Filename Value="../../Units/MMLCore/ocr.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="656" Column="33" TopLine="637"/> <Caret Line="1607" Column="4" TopLine="1644"/>
</Position8> </Position8>
<Position9> <Position9>
<Filename Value="../../Units/MMLCore/window.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="63" Column="37" TopLine="47"/> <Caret Line="1420" Column="24" TopLine="1407"/>
</Position9> </Position9>
<Position10> <Position10>
<Filename Value="project1.lpr"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="68" Column="30" TopLine="63"/> <Caret Line="1603" Column="51" TopLine="1638"/>
</Position10> </Position10>
<Position11> <Position11>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="487" Column="3" TopLine="469"/> <Caret Line="1609" Column="1" TopLine="1600"/>
</Position11> </Position11>
<Position12> <Position12>
<Filename Value="project1.lpr"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="81" Column="4" TopLine="66"/> <Caret Line="1656" Column="123" TopLine="1644"/>
</Position12> </Position12>
<Position13> <Position13>
<Filename Value="project1.lpr"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="60" Column="4" TopLine="45"/> <Caret Line="1661" Column="42" TopLine="1651"/>
</Position13> </Position13>
<Position14> <Position14>
<Filename Value="project1.lpr"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="81" Column="4" TopLine="66"/> <Caret Line="1669" Column="49" TopLine="1654"/>
</Position14> </Position14>
<Position15> <Position15>
<Filename Value="project1.lpr"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="60" Column="4" TopLine="45"/> <Caret Line="1664" Column="1" TopLine="1644"/>
</Position15> </Position15>
<Position16> <Position16>
<Filename Value="../../Units/MMLCore/ocr.pas"/> <Filename Value="project1.lpr"/>
<Caret Line="11" Column="67" TopLine="1"/> <Caret Line="79" Column="40" TopLine="54"/>
</Position16> </Position16>
<Position17> <Position17>
<Filename Value="../../Units/MMLCore/ocr.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="466" Column="18" TopLine="451"/> <Caret Line="1620" Column="20" TopLine="1604"/>
</Position17> </Position17>
<Position18> <Position18>
<Filename Value="../../Units/MMLCore/ocr.pas"/> <Filename Value="../../Units/MMLCore/dtmutil.pas"/>
<Caret Line="477" Column="36" TopLine="45"/> <Caret Line="39" Column="27" TopLine="24"/>
</Position18> </Position18>
<Position19> <Position19>
<Filename Value="../../Units/MMLCore/ocr.pas"/> <Filename Value="../../Units/MMLCore/dtmutil.pas"/>
<Caret Line="493" Column="19" TopLine="478"/> <Caret Line="40" Column="27" TopLine="24"/>
</Position19> </Position19>
<Position20> <Position20>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/> <Filename Value="project1.lpr"/>
<Caret Line="98" Column="33" TopLine="91"/> <Caret Line="90" Column="11" TopLine="64"/>
</Position20> </Position20>
<Position21> <Position21>
<Filename Value="../../Units/MMLCore/client.pas"/> <Filename Value="project1.lpr"/>
<Caret Line="33" Column="53" TopLine="31"/> <Caret Line="78" Column="19" TopLine="61"/>
</Position21> </Position21>
<Position22> <Position22>
<Filename Value="project1.lpr"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="12" Column="6" TopLine="1"/> <Caret Line="1796" Column="59" TopLine="1771"/>
</Position22> </Position22>
<Position23> <Position23>
<Filename Value="project1.lpr"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="41" Column="17" TopLine="23"/> <Caret Line="1789" Column="43" TopLine="1774"/>
</Position23> </Position23>
<Position24> <Position24>
<Filename Value="project1.lpr"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="96" Column="16" TopLine="75"/> <Caret Line="707" Column="17" TopLine="697"/>
</Position24> </Position24>
<Position25> <Position25>
<Filename Value="../../Units/MMLCore/input.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="47" Column="65" TopLine="33"/> <Caret Line="51" Column="36" TopLine="36"/>
</Position25> </Position25>
<Position26> <Position26>
<Filename Value="project1.lpr"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="13" Column="25" TopLine="1"/> <Caret Line="1633" Column="15" TopLine="1619"/>
</Position26> </Position26>
<Position27> <Position27>
<Filename Value="project1.lpr"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="96" Column="39" TopLine="82"/> <Caret Line="51" Column="36" TopLine="36"/>
</Position27> </Position27>
<Position28> <Position28>
<Filename Value="../../Units/MMLCore/input.pas"/> <Filename Value="project1.lpr"/>
<Caret Line="47" Column="33" TopLine="33"/> <Caret Line="86" Column="19" TopLine="71"/>
</Position28> </Position28>
<Position29> <Position29>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="477" Column="35" TopLine="469"/> <Caret Line="82" Column="26" TopLine="63"/>
</Position29> </Position29>
<Position30> <Position30>
<Filename Value="project1.lpr"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="97" Column="12" TopLine="73"/> <Caret Line="84" Column="26" TopLine="63"/>
</Position30> </Position30>
</JumpHistory> </JumpHistory>
</ProjectOptions> </ProjectOptions>
@ -309,6 +336,13 @@
<OtherUnitFiles Value="$(ProjPath)/../../Units/MMLCore/;$(ProjPath)/../../Units/Misc/;$(ProjPath)/../../Units/MMLAddon/;$(LazarusDir)/lcl/units/$(TargetCPU)-$(TargetOS)/$(LCLWidgetType)/;$(LazarusDir)/lcl/units/$(TargetCPU)-$(TargetOS)/;$(ProjPath)/../../Units/Linux/;$(LazarusDir)/components/mouseandkeyinput/"/> <OtherUnitFiles Value="$(ProjPath)/../../Units/MMLCore/;$(ProjPath)/../../Units/Misc/;$(ProjPath)/../../Units/MMLAddon/;$(LazarusDir)/lcl/units/$(TargetCPU)-$(TargetOS)/$(LCLWidgetType)/;$(LazarusDir)/lcl/units/$(TargetCPU)-$(TargetOS)/;$(ProjPath)/../../Units/Linux/;$(LazarusDir)/components/mouseandkeyinput/"/>
</SearchPaths> </SearchPaths>
<CodeGeneration> <CodeGeneration>
<Checks>
<IOChecks Value="True"/>
<RangeChecks Value="True"/>
<OverflowChecks Value="True"/>
<StackChecks Value="True"/>
</Checks>
<VerifyObjMethodCallValidity Value="True"/>
<Optimizations> <Optimizations>
<OptimizationLevel Value="3"/> <OptimizationLevel Value="3"/>
</Optimizations> </Optimizations>

View File

@ -10,7 +10,7 @@ uses
Forms,Interfaces, Forms,Interfaces,
LCLIntf, LCLIntf,
Client, Client,
bitmaps,x ,mufasatypes bitmaps,x ,mufasatypes,dtm,dtmutil
{ you can add units after this }; { you can add units after this };
@ -36,7 +36,9 @@ var
ErrorMsg: String; ErrorMsg: String;
Time: DWord; Time: DWord;
C: TClient; C: TClient;
I{, W, H, X, Y}: Integer; I: Integer;
dtm: pdtm;
p:tpointarray;
bmp: TMufasaBitmap; bmp: TMufasaBitmap;
begin begin
@ -57,7 +59,74 @@ begin
{ add your program here } { add your program here }
C := TClient.Create; C := TClient.Create;
{$WARNING Change This Path!}
bmp := TMufasaBitmap.Create;
bmp.SetSize(10,10);
FillChar(bmp.FData[0],sizeof(trgb32)*100, 0);
bmp.FastSetPixel(8,8,255);
bmp.FastSetPixel(9,9,255);
bmp.FastSetPixel(7,7,255);
bmp.FastSetPixel(9,8,255);
bmp.FastSetPixel(8,9,255);
C.MWindow.SetTarget(bmp);
initdtm(dtm, 3);
dtm.p[0] := Point(2, 2);
dtm.p[1] := Point(-3, -3);
dtm.p[2] := Point(0, 0);
dtm.c[0] := 255;
dtm.asz[1] := 0;
dtm.ash[1] := dtm_Rectangle;
setlength(p, 0);
C.MFinder.FindDTMs(dtm, p, 0, 0, 9, 9);
for i := 0 to high(p) do
writeln(format('%d: (%d, %d)', [i, p[i].x, p[i].y]));
//bmp.OnDestroy:=nil;
bmp.Free;
C.Free;
// stop program loop
Terminate;
end;
constructor MufasaTests.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
StopOnException:=True;
end;
destructor MufasaTests.Destroy;
begin
inherited Destroy;
end;
procedure MufasaTests.WriteHelp;
begin
{ add your help code here }
writeln('Usage: ',ExeName,' -h');
end;
var
Application: MufasaTests;
{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
begin
Application:=MufasaTests.Create(nil);
Application.Title:='My Application';
Application.Run;
Application.Free;
end.
{ {$WARNING Change This Path!}
C.MOCR.InitTOCR('/home/merlijn/Programs/mufasa/Fonts/'); C.MOCR.InitTOCR('/home/merlijn/Programs/mufasa/Fonts/');
//C.MOCR.InitTOCR('/home/merlijn/Programs/mufasa/ben/'); //C.MOCR.InitTOCR('/home/merlijn/Programs/mufasa/ben/');
@ -95,43 +164,4 @@ begin
//C.MInput.ClickMouse(5,5, mouse_Left); //C.MInput.ClickMouse(5,5, mouse_Left);
sleep(2000); sleep(2000);
C.MInput.SendText('a'); C.MInput.SendText('a'); }
C.Free;
bmp.OnDestroy:=nil;
bmp.Free;
// stop program loop
Terminate;
end;
constructor MufasaTests.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
StopOnException:=True;
end;
destructor MufasaTests.Destroy;
begin
inherited Destroy;
end;
procedure MufasaTests.WriteHelp;
begin
{ add your help code here }
writeln('Usage: ',ExeName,' -h');
end;
var
Application: MufasaTests;
{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
begin
Application:=MufasaTests.Create(nil);
Application.Title:='My Application';
Application.Run;
Application.Free;
end.

View File

@ -33,16 +33,14 @@
<PackageName Value="LCL"/> <PackageName Value="LCL"/>
</Item2> </Item2>
</RequiredPackages> </RequiredPackages>
<Units Count="253"> <Units Count="255">
<Unit0> <Unit0>
<Filename Value="project1.lpr"/> <Filename Value="project1.lpr"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="project1"/> <UnitName Value="project1"/>
<CursorPos X="17" Y="41"/> <CursorPos X="17" Y="41"/>
<TopLine Value="26"/> <TopLine Value="16"/>
<EditorIndex Value="12"/>
<UsageCount Value="205"/> <UsageCount Value="205"/>
<Loaded Value="True"/>
</Unit0> </Unit0>
<Unit1> <Unit1>
<Filename Value="unit1.pas"/> <Filename Value="unit1.pas"/>
@ -65,7 +63,7 @@
<UnitName Value="CompTypes"/> <UnitName Value="CompTypes"/>
<CursorPos X="13" Y="531"/> <CursorPos X="13" Y="531"/>
<TopLine Value="523"/> <TopLine Value="523"/>
<UsageCount Value="0"/> <UsageCount Value="10"/>
</Unit3> </Unit3>
<Unit4> <Unit4>
<Filename Value="mufasatypes.pas"/> <Filename Value="mufasatypes.pas"/>
@ -155,7 +153,7 @@
<UnitName Value="xlib"/> <UnitName Value="xlib"/>
<CursorPos X="47" Y="1272"/> <CursorPos X="47" Y="1272"/>
<TopLine Value="1257"/> <TopLine Value="1257"/>
<UsageCount Value="0"/> <UsageCount Value="10"/>
</Unit16> </Unit16>
<Unit17> <Unit17>
<Filename Value="testunit.pas"/> <Filename Value="testunit.pas"/>
@ -164,9 +162,9 @@
<HasResources Value="True"/> <HasResources Value="True"/>
<ResourceBaseClass Value="Form"/> <ResourceBaseClass Value="Form"/>
<UnitName Value="TestUnit"/> <UnitName Value="TestUnit"/>
<CursorPos X="50" Y="950"/> <CursorPos X="79" Y="950"/>
<TopLine Value="944"/> <TopLine Value="874"/>
<EditorIndex Value="7"/> <EditorIndex Value="4"/>
<UsageCount Value="202"/> <UsageCount Value="202"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit17> </Unit17>
@ -182,7 +180,7 @@
<UnitName Value="CompInput"/> <UnitName Value="CompInput"/>
<CursorPos X="6" Y="462"/> <CursorPos X="6" Y="462"/>
<TopLine Value="449"/> <TopLine Value="449"/>
<UsageCount Value="0"/> <UsageCount Value="10"/>
</Unit19> </Unit19>
<Unit20> <Unit20>
<Filename Value="../FPC/FPCCheckout/rtl/win/wininc/func.inc"/> <Filename Value="../FPC/FPCCheckout/rtl/win/wininc/func.inc"/>
@ -221,9 +219,9 @@
<Filename Value="../../Units/MMLCore/client.pas"/> <Filename Value="../../Units/MMLCore/client.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="Client"/> <UnitName Value="Client"/>
<CursorPos X="25" Y="49"/> <CursorPos X="20" Y="66"/>
<TopLine Value="37"/> <TopLine Value="55"/>
<EditorIndex Value="2"/> <EditorIndex Value="1"/>
<UsageCount Value="201"/> <UsageCount Value="201"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit25> </Unit25>
@ -231,8 +229,8 @@
<Filename Value="../../Units/MMLCore/mufasatypes.pas"/> <Filename Value="../../Units/MMLCore/mufasatypes.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="MufasaTypes"/> <UnitName Value="MufasaTypes"/>
<CursorPos X="1" Y="1"/> <CursorPos X="11" Y="89"/>
<TopLine Value="1"/> <TopLine Value="81"/>
<EditorIndex Value="0"/> <EditorIndex Value="0"/>
<UsageCount Value="201"/> <UsageCount Value="201"/>
<Loaded Value="True"/> <Loaded Value="True"/>
@ -256,9 +254,9 @@
<Filename Value="../../Units/MMLCore/window.pas"/> <Filename Value="../../Units/MMLCore/window.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="Window"/> <UnitName Value="Window"/>
<CursorPos X="13" Y="462"/> <CursorPos X="31" Y="262"/>
<TopLine Value="452"/> <TopLine Value="247"/>
<EditorIndex Value="5"/> <EditorIndex Value="3"/>
<UsageCount Value="201"/> <UsageCount Value="201"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit29> </Unit29>
@ -272,9 +270,9 @@
<Unit31> <Unit31>
<Filename Value="../../Units/MMLCore/windowutil.pas"/> <Filename Value="../../Units/MMLCore/windowutil.pas"/>
<UnitName Value="windowutil"/> <UnitName Value="windowutil"/>
<CursorPos X="81" Y="21"/> <CursorPos X="23" Y="8"/>
<TopLine Value="14"/> <TopLine Value="1"/>
<EditorIndex Value="21"/> <EditorIndex Value="10"/>
<UsageCount Value="55"/> <UsageCount Value="55"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit31> </Unit31>
@ -283,26 +281,24 @@
<UnitName Value="Input"/> <UnitName Value="Input"/>
<CursorPos X="71" Y="274"/> <CursorPos X="71" Y="274"/>
<TopLine Value="242"/> <TopLine Value="242"/>
<EditorIndex Value="4"/>
<UsageCount Value="93"/> <UsageCount Value="93"/>
<Loaded Value="True"/>
</Unit32> </Unit32>
<Unit33> <Unit33>
<Filename Value="../../Units/MMLCore/finder.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="finder"/> <UnitName Value="finder"/>
<CursorPos X="57" Y="858"/> <CursorPos X="108" Y="76"/>
<TopLine Value="828"/> <TopLine Value="59"/>
<EditorIndex Value="5"/>
<UsageCount Value="201"/> <UsageCount Value="201"/>
<Loaded Value="True"/>
</Unit33> </Unit33>
<Unit34> <Unit34>
<Filename Value="../../../lazarus/lcl/graphics.pp"/> <Filename Value="../../../lazarus/lcl/graphics.pp"/>
<UnitName Value="Graphics"/> <UnitName Value="Graphics"/>
<CursorPos X="14" Y="1035"/> <CursorPos X="14" Y="1035"/>
<TopLine Value="1025"/> <TopLine Value="1025"/>
<EditorIndex Value="16"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit34> </Unit34>
<Unit35> <Unit35>
<Filename Value="../../Units/MMLAddon/mmlthread.pas"/> <Filename Value="../../Units/MMLAddon/mmlthread.pas"/>
@ -315,9 +311,9 @@
<Filename Value="../../Units/MMLAddon/mmlpsthread.pas"/> <Filename Value="../../Units/MMLAddon/mmlpsthread.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="mmlpsthread"/> <UnitName Value="mmlpsthread"/>
<CursorPos X="40" Y="49"/> <CursorPos X="19" Y="258"/>
<TopLine Value="51"/> <TopLine Value="245"/>
<EditorIndex Value="24"/> <EditorIndex Value="11"/>
<UsageCount Value="202"/> <UsageCount Value="202"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit36> </Unit36>
@ -339,14 +335,14 @@
<UnitName Value="types"/> <UnitName Value="types"/>
<CursorPos X="1" Y="1"/> <CursorPos X="1" Y="1"/>
<TopLine Value="1"/> <TopLine Value="1"/>
<UsageCount Value="0"/> <UsageCount Value="10"/>
</Unit39> </Unit39>
<Unit40> <Unit40>
<Filename Value="../../../FPC/FPCCheckout/rtl/objpas/typinfo.pp"/> <Filename Value="../../../FPC/FPCCheckout/rtl/objpas/typinfo.pp"/>
<UnitName Value="typinfo"/> <UnitName Value="typinfo"/>
<CursorPos X="1" Y="1"/> <CursorPos X="1" Y="1"/>
<TopLine Value="1"/> <TopLine Value="1"/>
<UsageCount Value="0"/> <UsageCount Value="10"/>
</Unit40> </Unit40>
<Unit41> <Unit41>
<Filename Value="../../Units/PascalScript/uPSC_forms.pas"/> <Filename Value="../../Units/PascalScript/uPSC_forms.pas"/>
@ -366,7 +362,7 @@
<UnitName Value="LResources"/> <UnitName Value="LResources"/>
<CursorPos X="3" Y="1396"/> <CursorPos X="3" Y="1396"/>
<TopLine Value="1396"/> <TopLine Value="1396"/>
<UsageCount Value="0"/> <UsageCount Value="10"/>
</Unit43> </Unit43>
<Unit44> <Unit44>
<Filename Value="../../../lazarus/components/synedit/synmemo.pas"/> <Filename Value="../../../lazarus/components/synedit/synmemo.pas"/>
@ -384,9 +380,9 @@
</Unit45> </Unit45>
<Unit46> <Unit46>
<Filename Value="../../Units/MMLAddon/PSInc/pscompile.inc"/> <Filename Value="../../Units/MMLAddon/PSInc/pscompile.inc"/>
<CursorPos X="56" Y="87"/> <CursorPos X="1" Y="55"/>
<TopLine Value="81"/> <TopLine Value="38"/>
<EditorIndex Value="25"/> <EditorIndex Value="7"/>
<UsageCount Value="100"/> <UsageCount Value="100"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit46> </Unit46>
@ -408,7 +404,7 @@
<UnitName Value="bitmaps"/> <UnitName Value="bitmaps"/>
<CursorPos X="1" Y="352"/> <CursorPos X="1" Y="352"/>
<TopLine Value="343"/> <TopLine Value="343"/>
<EditorIndex Value="3"/> <EditorIndex Value="2"/>
<UsageCount Value="200"/> <UsageCount Value="200"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit49> </Unit49>
@ -417,7 +413,7 @@
<UnitName Value="FPCanvas"/> <UnitName Value="FPCanvas"/>
<CursorPos X="96" Y="409"/> <CursorPos X="96" Y="409"/>
<TopLine Value="188"/> <TopLine Value="188"/>
<UsageCount Value="0"/> <UsageCount Value="10"/>
</Unit50> </Unit50>
<Unit51> <Unit51>
<Filename Value="../../Units/MMLAddon/PSInc/Wrappers/colour.inc"/> <Filename Value="../../Units/MMLAddon/PSInc/Wrappers/colour.inc"/>
@ -477,27 +473,21 @@
<UnitName Value="LCLIntf"/> <UnitName Value="LCLIntf"/>
<CursorPos X="10" Y="76"/> <CursorPos X="10" Y="76"/>
<TopLine Value="66"/> <TopLine Value="66"/>
<EditorIndex Value="18"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit59> </Unit59>
<Unit60> <Unit60>
<Filename Value="../../../lazarus/lcl/intfgraphics.pas"/> <Filename Value="../../../lazarus/lcl/intfgraphics.pas"/>
<UnitName Value="IntfGraphics"/> <UnitName Value="IntfGraphics"/>
<CursorPos X="3" Y="1336"/> <CursorPos X="3" Y="1336"/>
<TopLine Value="1334"/> <TopLine Value="1334"/>
<EditorIndex Value="19"/>
<UsageCount Value="11"/> <UsageCount Value="11"/>
<Loaded Value="True"/>
</Unit60> </Unit60>
<Unit61> <Unit61>
<Filename Value="../../../lazarus/lcl/graphtype.pp"/> <Filename Value="../../../lazarus/lcl/graphtype.pp"/>
<UnitName Value="GraphType"/> <UnitName Value="GraphType"/>
<CursorPos X="45" Y="1006"/> <CursorPos X="45" Y="1006"/>
<TopLine Value="994"/> <TopLine Value="994"/>
<EditorIndex Value="20"/>
<UsageCount Value="12"/> <UsageCount Value="12"/>
<Loaded Value="True"/>
</Unit61> </Unit61>
<Unit62> <Unit62>
<Filename Value="../../../FPC/FPCCheckout/packages/fcl-image/src/fpcolors.inc"/> <Filename Value="../../../FPC/FPCCheckout/packages/fcl-image/src/fpcolors.inc"/>
@ -541,16 +531,14 @@
<UnitName Value="CompMaths"/> <UnitName Value="CompMaths"/>
<CursorPos X="26" Y="43"/> <CursorPos X="26" Y="43"/>
<TopLine Value="14"/> <TopLine Value="14"/>
<UsageCount Value="0"/> <UsageCount Value="10"/>
</Unit68> </Unit68>
<Unit69> <Unit69>
<Filename Value="../../../FPC/FPCCheckout/rtl/objpas/math.pp"/> <Filename Value="../../../FPC/FPCCheckout/rtl/objpas/math.pp"/>
<UnitName Value="math"/> <UnitName Value="math"/>
<CursorPos X="10" Y="155"/> <CursorPos X="10" Y="155"/>
<TopLine Value="145"/> <TopLine Value="145"/>
<EditorIndex Value="10"/>
<UsageCount Value="12"/> <UsageCount Value="12"/>
<Loaded Value="True"/>
</Unit69> </Unit69>
<Unit70> <Unit70>
<Filename Value="../../../FPC/FPCCheckout/rtl/inc/systemh.inc"/> <Filename Value="../../../FPC/FPCCheckout/rtl/inc/systemh.inc"/>
@ -568,8 +556,8 @@
<Filename Value="../../Units/MMLCore/colour_conv.pas"/> <Filename Value="../../Units/MMLCore/colour_conv.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="colour_conv"/> <UnitName Value="colour_conv"/>
<CursorPos X="3" Y="164"/> <CursorPos X="27" Y="207"/>
<TopLine Value="187"/> <TopLine Value="152"/>
<UsageCount Value="201"/> <UsageCount Value="201"/>
</Unit72> </Unit72>
<Unit73> <Unit73>
@ -588,10 +576,8 @@
<Unit75> <Unit75>
<Filename Value="../../Units/MMLAddon/PSInc/Wrappers/other.inc"/> <Filename Value="../../Units/MMLAddon/PSInc/Wrappers/other.inc"/>
<CursorPos X="1" Y="78"/> <CursorPos X="1" Y="78"/>
<TopLine Value="62"/> <TopLine Value="1"/>
<EditorIndex Value="27"/>
<UsageCount Value="46"/> <UsageCount Value="46"/>
<Loaded Value="True"/>
</Unit75> </Unit75>
<Unit76> <Unit76>
<Filename Value="../../Units/PascalScript/uPSCompiler.pas"/> <Filename Value="../../Units/PascalScript/uPSCompiler.pas"/>
@ -631,9 +617,7 @@
<UnitName Value="plugins"/> <UnitName Value="plugins"/>
<CursorPos X="36" Y="32"/> <CursorPos X="36" Y="32"/>
<TopLine Value="32"/> <TopLine Value="32"/>
<EditorIndex Value="1"/>
<UsageCount Value="200"/> <UsageCount Value="200"/>
<Loaded Value="True"/>
</Unit81> </Unit81>
<Unit82> <Unit82>
<Filename Value="../../../Compilertje/Units/CogatUnits/compfiles.pas"/> <Filename Value="../../../Compilertje/Units/CogatUnits/compfiles.pas"/>
@ -690,9 +674,7 @@
<UnitName Value="Controls"/> <UnitName Value="Controls"/>
<CursorPos X="3" Y="1426"/> <CursorPos X="3" Y="1426"/>
<TopLine Value="1416"/> <TopLine Value="1416"/>
<EditorIndex Value="23"/>
<UsageCount Value="15"/> <UsageCount Value="15"/>
<Loaded Value="True"/>
</Unit90> </Unit90>
<Unit91> <Unit91>
<Filename Value="../../../lazarus/lcl/include/control.inc"/> <Filename Value="../../../lazarus/lcl/include/control.inc"/>
@ -725,9 +707,11 @@
<Filename Value="../../Units/MMLCore/dtm.pas"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="dtm"/> <UnitName Value="dtm"/>
<CursorPos X="52" Y="405"/> <CursorPos X="3" Y="74"/>
<TopLine Value="398"/> <TopLine Value="59"/>
<EditorIndex Value="6"/>
<UsageCount Value="200"/> <UsageCount Value="200"/>
<Loaded Value="True"/>
</Unit95> </Unit95>
<Unit96> <Unit96>
<Filename Value="../../../cogat/Units/CogatUnits/comppicker.pas"/> <Filename Value="../../../cogat/Units/CogatUnits/comppicker.pas"/>
@ -742,16 +726,14 @@
<UnitName Value="colourpicker"/> <UnitName Value="colourpicker"/>
<CursorPos X="7" Y="215"/> <CursorPos X="7" Y="215"/>
<TopLine Value="205"/> <TopLine Value="205"/>
<EditorIndex Value="8"/>
<UsageCount Value="201"/> <UsageCount Value="201"/>
<Loaded Value="True"/>
</Unit97> </Unit97>
<Unit98> <Unit98>
<Filename Value="../../../cogat/Units/CogatUnits/compdragger.pas"/> <Filename Value="../../../cogat/Units/CogatUnits/compdragger.pas"/>
<UnitName Value="CompDragger"/> <UnitName Value="CompDragger"/>
<CursorPos X="101" Y="26"/> <CursorPos X="101" Y="26"/>
<TopLine Value="26"/> <TopLine Value="26"/>
<UsageCount Value="0"/> <UsageCount Value="10"/>
</Unit98> </Unit98>
<Unit99> <Unit99>
<Filename Value="../../../cogat/mainform.pas"/> <Filename Value="../../../cogat/mainform.pas"/>
@ -782,9 +764,7 @@
<UnitName Value="Forms"/> <UnitName Value="Forms"/>
<CursorPos X="23" Y="660"/> <CursorPos X="23" Y="660"/>
<TopLine Value="650"/> <TopLine Value="650"/>
<EditorIndex Value="22"/>
<UsageCount Value="15"/> <UsageCount Value="15"/>
<Loaded Value="True"/>
</Unit102> </Unit102>
<Unit103> <Unit103>
<Filename Value="../../../usr/lib64/fpc/2.2.4/source/rtl/unix/cthreads.pp"/> <Filename Value="../../../usr/lib64/fpc/2.2.4/source/rtl/unix/cthreads.pp"/>
@ -816,9 +796,11 @@
</Unit106> </Unit106>
<Unit107> <Unit107>
<Filename Value="../../Units/MMLAddon/PSInc/Wrappers/dtm.inc"/> <Filename Value="../../Units/MMLAddon/PSInc/Wrappers/dtm.inc"/>
<CursorPos X="39" Y="26"/> <CursorPos X="21" Y="75"/>
<TopLine Value="14"/> <TopLine Value="50"/>
<EditorIndex Value="8"/>
<UsageCount Value="14"/> <UsageCount Value="14"/>
<Loaded Value="True"/>
</Unit107> </Unit107>
<Unit108> <Unit108>
<Filename Value="../../../Documents/lazarus/lcl/graphics.pp"/> <Filename Value="../../../Documents/lazarus/lcl/graphics.pp"/>
@ -921,15 +903,13 @@
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../../lazarus/lcl/include/winapih.inc"/>
<CursorPos X="87" Y="236"/> <CursorPos X="87" Y="236"/>
<TopLine Value="232"/> <TopLine Value="232"/>
<EditorIndex Value="9"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit122> </Unit122>
<Unit123> <Unit123>
<Filename Value="../../../lazarus/lcl/include/application.inc"/> <Filename Value="../../../lazarus/lcl/include/application.inc"/>
<CursorPos X="37" Y="945"/> <CursorPos X="37" Y="945"/>
<TopLine Value="925"/> <TopLine Value="925"/>
<UsageCount Value="0"/> <UsageCount Value="10"/>
</Unit123> </Unit123>
<Unit124> <Unit124>
<Filename Value="../../../lazarus/components/synedit/syneditkeycmds.pp"/> <Filename Value="../../../lazarus/components/synedit/syneditkeycmds.pp"/>
@ -1013,7 +993,7 @@
<UnitName Value="web"/> <UnitName Value="web"/>
<CursorPos X="1" Y="1"/> <CursorPos X="1" Y="1"/>
<TopLine Value="1"/> <TopLine Value="1"/>
<UsageCount Value="154"/> <UsageCount Value="155"/>
</Unit136> </Unit136>
<Unit137> <Unit137>
<Filename Value="../../../lazarus/lcl/lazhelphtml.pas"/> <Filename Value="../../../lazarus/lcl/lazhelphtml.pas"/>
@ -1212,9 +1192,7 @@
<UnitName Value="framescript"/> <UnitName Value="framescript"/>
<CursorPos X="106" Y="190"/> <CursorPos X="106" Y="190"/>
<TopLine Value="180"/> <TopLine Value="180"/>
<EditorIndex Value="6"/> <UsageCount Value="148"/>
<UsageCount Value="147"/>
<Loaded Value="True"/>
</Unit161> </Unit161>
<Unit162> <Unit162>
<Filename Value="framesynedit.lrs"/> <Filename Value="framesynedit.lrs"/>
@ -1528,8 +1506,8 @@
<UnitName Value="colourhistory"/> <UnitName Value="colourhistory"/>
<CursorPos X="3" Y="1"/> <CursorPos X="3" Y="1"/>
<TopLine Value="1"/> <TopLine Value="1"/>
<EditorIndex Value="11"/> <EditorIndex Value="9"/>
<UsageCount Value="84"/> <UsageCount Value="85"/>
<Loaded Value="True"/> <Loaded Value="True"/>
</Unit208> </Unit208>
<Unit209> <Unit209>
@ -1780,9 +1758,7 @@
<UnitName Value="about"/> <UnitName Value="about"/>
<CursorPos X="44" Y="21"/> <CursorPos X="44" Y="21"/>
<TopLine Value="4"/> <TopLine Value="4"/>
<EditorIndex Value="13"/> <UsageCount Value="48"/>
<UsageCount Value="47"/>
<Loaded Value="True"/>
</Unit245> </Unit245>
<Unit246> <Unit246>
<Filename Value="../../Units/MMLAddon/PSInc/Wrappers/file.inc"/> <Filename Value="../../Units/MMLAddon/PSInc/Wrappers/file.inc"/>
@ -1794,11 +1770,9 @@
<Filename Value="../../Units/MMLAddon/internets.pas"/> <Filename Value="../../Units/MMLAddon/internets.pas"/>
<IsPartOfProject Value="True"/> <IsPartOfProject Value="True"/>
<UnitName Value="internets"/> <UnitName Value="internets"/>
<CursorPos X="34" Y="7"/> <CursorPos X="87" Y="3"/>
<TopLine Value="1"/> <TopLine Value="1"/>
<EditorIndex Value="26"/> <UsageCount Value="42"/>
<UsageCount Value="41"/>
<Loaded Value="True"/>
</Unit247> </Unit247>
<Unit248> <Unit248>
<Filename Value="debugimageform.pas"/> <Filename Value="debugimageform.pas"/>
@ -1807,7 +1781,7 @@
<UnitName Value="debugimageform"/> <UnitName Value="debugimageform"/>
<CursorPos X="20" Y="1"/> <CursorPos X="20" Y="1"/>
<TopLine Value="1"/> <TopLine Value="1"/>
<UsageCount Value="28"/> <UsageCount Value="29"/>
</Unit248> </Unit248>
<Unit249> <Unit249>
<Filename Value="debugimage.pas"/> <Filename Value="debugimage.pas"/>
@ -1817,9 +1791,7 @@
<UnitName Value="debugimage"/> <UnitName Value="debugimage"/>
<CursorPos X="100" Y="103"/> <CursorPos X="100" Y="103"/>
<TopLine Value="82"/> <TopLine Value="82"/>
<EditorIndex Value="14"/> <UsageCount Value="28"/>
<UsageCount Value="27"/>
<Loaded Value="True"/>
</Unit249> </Unit249>
<Unit250> <Unit250>
<Filename Value="debugimage.lrs"/> <Filename Value="debugimage.lrs"/>
@ -1831,140 +1803,149 @@
<Filename Value="../../../lazarus/lcl/include/canvas.inc"/> <Filename Value="../../../lazarus/lcl/include/canvas.inc"/>
<CursorPos X="19" Y="141"/> <CursorPos X="19" Y="141"/>
<TopLine Value="135"/> <TopLine Value="135"/>
<EditorIndex Value="17"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit251> </Unit251>
<Unit252> <Unit252>
<Filename Value="../../../lazarus/lcl/interfacebase.pp"/> <Filename Value="../../../lazarus/lcl/interfacebase.pp"/>
<UnitName Value="InterfaceBase"/> <UnitName Value="InterfaceBase"/>
<CursorPos X="3" Y="172"/> <CursorPos X="3" Y="172"/>
<TopLine Value="162"/> <TopLine Value="162"/>
<EditorIndex Value="15"/>
<UsageCount Value="10"/> <UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit252> </Unit252>
<Unit253>
<Filename Value="../../../../Documents/lazarus/lcl/lclintf.pas"/>
<UnitName Value="LCLIntf"/>
<CursorPos X="77" Y="75"/>
<TopLine Value="67"/>
<UsageCount Value="10"/>
</Unit253>
<Unit254>
<Filename Value="../../../../Documents/fpc/rtl/inc/systemh.inc"/>
<CursorPos X="35" Y="574"/>
<TopLine Value="558"/>
<UsageCount Value="10"/>
</Unit254>
</Units> </Units>
<JumpHistory Count="30" HistoryIndex="29"> <JumpHistory Count="30" HistoryIndex="29">
<Position1> <Position1>
<Filename Value="testunit.pas"/> <Filename Value="../../Units/MMLCore/finder.pas"/>
<Caret Line="1082" Column="13" TopLine="1077"/> <Caret Line="793" Column="11" TopLine="789"/>
</Position1> </Position1>
<Position2> <Position2>
<Filename Value="../../Units/MMLAddon/colourpicker.pas"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="215" Column="7" TopLine="205"/> <Caret Line="312" Column="29" TopLine="299"/>
</Position2> </Position2>
<Position3> <Position3>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="196" Column="27" TopLine="186"/> <Caret Line="321" Column="17" TopLine="301"/>
</Position3> </Position3>
<Position4> <Position4>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="197" Column="29" TopLine="186"/> <Caret Line="312" Column="1" TopLine="297"/>
</Position4> </Position4>
<Position5> <Position5>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="199" Column="39" TopLine="186"/> <Caret Line="322" Column="54" TopLine="303"/>
</Position5> </Position5>
<Position6> <Position6>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="201" Column="36" TopLine="186"/> <Caret Line="319" Column="60" TopLine="304"/>
</Position6> </Position6>
<Position7> <Position7>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="202" Column="28" TopLine="186"/> <Caret Line="320" Column="23" TopLine="309"/>
</Position7> </Position7>
<Position8> <Position8>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/window.pas"/>
<Caret Line="204" Column="24" TopLine="186"/> <Caret Line="461" Column="36" TopLine="452"/>
</Position8> </Position8>
<Position9> <Position9>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/window.pas"/>
<Caret Line="208" Column="32" TopLine="198"/> <Caret Line="67" Column="43" TopLine="54"/>
</Position9> </Position9>
<Position10> <Position10>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/client.pas"/>
<Caret Line="209" Column="30" TopLine="198"/> <Caret Line="64" Column="40" TopLine="56"/>
</Position10> </Position10>
<Position11> <Position11>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/window.pas"/>
<Caret Line="210" Column="31" TopLine="198"/> <Caret Line="259" Column="57" TopLine="29"/>
</Position11> </Position11>
<Position12> <Position12>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/window.pas"/>
<Caret Line="213" Column="28" TopLine="198"/> <Caret Line="745" Column="34" TopLine="719"/>
</Position12> </Position12>
<Position13> <Position13>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/window.pas"/>
<Caret Line="214" Column="27" TopLine="198"/> <Caret Line="79" Column="44" TopLine="64"/>
</Position13> </Position13>
<Position14> <Position14>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="226" Column="25" TopLine="216"/> <Caret Line="329" Column="19" TopLine="309"/>
</Position14> </Position14>
<Position15> <Position15>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLAddon/mmlpsthread.pas"/>
<Caret Line="230" Column="35" TopLine="216"/> <Caret Line="177" Column="37" TopLine="159"/>
</Position15> </Position15>
<Position16> <Position16>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLAddon/mmlpsthread.pas"/>
<Caret Line="232" Column="42" TopLine="216"/> <Caret Line="210" Column="20" TopLine="195"/>
</Position16> </Position16>
<Position17> <Position17>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="233" Column="30" TopLine="216"/> <Caret Line="304" Column="1" TopLine="290"/>
</Position17> </Position17>
<Position18> <Position18>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="235" Column="33" TopLine="216"/> <Caret Line="28" Column="12" TopLine="13"/>
</Position18> </Position18>
<Position19> <Position19>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="242" Column="74" TopLine="232"/> <Caret Line="33" Column="46" TopLine="23"/>
</Position19> </Position19>
<Position20> <Position20>
<Filename Value="../../../lazarus/lcl/include/winapih.inc"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="243" Column="31" TopLine="232"/> <Caret Line="43" Column="60" TopLine="28"/>
</Position20> </Position20>
<Position21> <Position21>
<Filename Value="debugimage.pas"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="121" Column="45" TopLine="111"/> <Caret Line="46" Column="7" TopLine="31"/>
</Position21> </Position21>
<Position22> <Position22>
<Filename Value="debugimage.pas"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="97" Column="1" TopLine="94"/> <Caret Line="58" Column="41" TopLine="43"/>
</Position22> </Position22>
<Position23> <Position23>
<Filename Value="testunit.pas"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="1082" Column="13" TopLine="1077"/> <Caret Line="59" Column="3" TopLine="44"/>
</Position23> </Position23>
<Position24> <Position24>
<Filename Value="testunit.pas"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="1116" Column="82" TopLine="1111"/> <Caret Line="73" Column="65" TopLine="58"/>
</Position24> </Position24>
<Position25> <Position25>
<Filename Value="testunit.pas"/> <Filename Value="../../Units/MMLCore/client.pas"/>
<Caret Line="1114" Column="42" TopLine="1111"/> <Caret Line="66" Column="20" TopLine="55"/>
</Position25> </Position25>
<Position26> <Position26>
<Filename Value="testunit.pas"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="1120" Column="35" TopLine="1111"/> <Caret Line="75" Column="50" TopLine="60"/>
</Position26> </Position26>
<Position27> <Position27>
<Filename Value="../../Units/MMLAddon/mmlpsthread.pas"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="23" Column="27" TopLine="19"/> <Caret Line="71" Column="39" TopLine="56"/>
</Position27> </Position27>
<Position28> <Position28>
<Filename Value="testunit.pas"/> <Filename Value="../../Units/MMLCore/dtm.pas"/>
<Caret Line="1113" Column="1" TopLine="1111"/> <Caret Line="72" Column="64" TopLine="57"/>
</Position28> </Position28>
<Position29> <Position29>
<Filename Value="testunit.pas"/> <Filename Value="../../Units/MMLAddon/mmlpsthread.pas"/>
<Caret Line="789" Column="14" TopLine="787"/> <Caret Line="258" Column="19" TopLine="245"/>
</Position29> </Position29>
<Position30> <Position30>
<Filename Value="testunit.pas"/> <Filename Value="../../Units/MMLAddon/PSInc/pscompile.inc"/>
<Caret Line="387" Column="53" TopLine="375"/> <Caret Line="16" Column="25" TopLine="1"/>
</Position30> </Position30>
</JumpHistory> </JumpHistory>
</ProjectOptions> </ProjectOptions>

31
Tests/PS/ColourTest.mufa Normal file
View File

@ -0,0 +1,31 @@
program new;
var
p1, p2: TPointArray;
w, h: integer;
i, col: integer;
bmp: integer;
begin
SetColorToleranceSpeed(2);
bmp := LoadBitmap('/home/merlijn/Pictures/Mooi/Carina_1_by_Eeitam.png');
SetTargetBitmap(bmp);
GetClientDimensions(W, H);
writeln(inttostr(w) + ' : ' + inttostr(h));
for i := 0 to 100 do
begin
col := Random(clWhite);
writeln(inttostr(col));
FindColorsTolerance(p1, col, 0, 0, W - 1, H - 1, 40);
FindColorsToleranceOptimised(p2, col, 0, 0, W - 1, H - 1, 40);
writeln(inttostr(length(p1)) + ' : ' + inttostr(length(p2)));
if(length(p1) <> length(p2)) then
writeln('wat!');
setlength(p1,0);
setlength(p2,0);
end;
FreeBitmap(bmp);
end.

View File

@ -22,39 +22,67 @@
} }
function ps_FindDTM(DTM: Integer; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean; function ps_FindDTM(DTM: Integer; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean;
var
temp: pDTM;
begin begin
Result := CurrThread.Client.MDTM.FindDTM(DTM, x, y, x1, y1, x2, y2); if CurrThread.Client.MDTM.GetDTM(DTM, temp) then
Result := CurrThread.Client.MFinder.FindDTM(temp, x, y, x1, y1, x2, y2)
else
begin
x := 0;
y := 0;
Result := False;
end;
end; end;
function ps_FindDTMs(DTM: Integer; out p: TPointArray; x1, y1, x2, y2: Integer): Boolean; function ps_FindDTMs(DTM: Integer; out p: TPointArray; x1, y1, x2, y2: Integer): Boolean;
var
temp: pDTM;
begin begin
Result := CurrThread.Client.MDTM.FindDTMs(DTM, p, x1, y1, x2, y2); if CurrThread.Client.MDTM.GetDTM(DTM, temp) then
Result := CurrThread.Client.MFinder.FindDTMs(temp, p, x1, y1, x2, y2)
else
begin
setlength(p,0);
Result := False;
end;
end; end;
function ps_FindDTMRotated(DTM: Integer; out x, y: Integer; x1, y1, x2, y2: function ps_FindDTMRotated(DTM: Integer; out x, y: Integer; x1, y1, x2, y2:
Integer; sAngle, eAngle, aStep: Extended; Integer; sAngle, eAngle, aStep: Extended;
out aFound: Extended): Boolean; out aFound: Extended): Boolean;
var
temp: pDTM;
begin begin
Result := CurrThread.Client.MDTM.FindDTMRotated(DTM, x, y, x1, y1, x2, y2, if CurrThread.Client.MDTM.GetDTM(DTM, temp) then
sAngle, eAngle, aStep, aFound); Result := CurrThread.Client.MFinder.FindDTMRotated(temp, x, y, x1, y1, x2, y2, sAngle, eAngle, aStep, aFound)
else
begin
x := 0;
y := 0;
Result := False;
end;
end; end;
function ps_FindDTMsRotated(DTM: Integer; out x, y: Integer; x1, y1, x2, y2: function ps_FindDTMsRotated(DTM: Integer; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray): Boolean;
Integer; sAngle, eAngle, aStep: Extended; var
out aFound: Extended): Boolean; temp: pDTM;
begin begin
Result := CurrThread.Client.MDTM.FindDTMRotated(DTM, x, y, x1, y1, x2, y2, if CurrThread.Client.MDTM.GetDTM(DTM, temp) then
sAngle, eAngle, aStep, aFound); Result := CurrThread.Client.MFinder.FindDTMsRotated(temp, Points, x1, y1, x2, y2,
sAngle, eAngle, aStep, aFound)
else
Result := False;
end; end;
function ps_FindDTMsRotated(DTM: Integer; out Points: TPointArray; x1, {function ps_FindDTMsRotated(DTM: Integer; out Points: TPointArray; x1,
y1, x2, y2: Integer; sAngle, eAngle, y1, x2, y2: Integer; sAngle, eAngle,
aStep: Extended; out aFound: T2DExtendedArray) aStep: Extended; out aFound: T2DExtendedArray)
: Boolean; : Boolean;
begin begin
Result := CurrThread.Client.MDTM.FindDTMsRotated(DTM, Points, x1, y1, x2, y2, Result := CurrThread.Client.MDTM.FindDTMsRotated(DTM, Points, x1, y1, x2, y2,
sAngle, eAngle, aStep, aFound); sAngle, eAngle, aStep, aFound);
end; end; }
function ps_DTMFromString(DTMString: String): Integer; function ps_DTMFromString(DTMString: String): Integer;
var var

View File

@ -33,13 +33,17 @@ uses
type type
TMDTM = class(TObject) TMDTM = class(TObject)
private
public
function AddDTM(d: TDTM): Integer; function AddDTM(d: TDTM): Integer;
function AddpDTM(d: pDTM): Integer; function AddpDTM(d: pDTM): Integer;
function GetDTM(index: Integer; out dtm: pDTM): Boolean; function GetDTM(index: Integer; out dtm: pDTM): Boolean;
procedure FreeDTM(DTM: Integer); procedure FreeDTM(DTM: Integer);
Function StringToDTM(S: String): pDTM; Function StringToDTM(S: String): pDTM;
function FindDTM(DTM: Integer; out x, y: Integer; x1, y1, x2, { function FindDTM(DTM: Integer; out x, y: Integer; x1, y1, x2,
y2: Integer): Boolean; y2: Integer): Boolean;
function FindDTMs(DTM: Integer; out Points: TPointArray; x1, y1, x2, function FindDTMs(DTM: Integer; out Points: TPointArray; x1, y1, x2,
y2: Integer): Boolean; y2: Integer): Boolean;
@ -50,22 +54,18 @@ type
y1, x2, y2: Integer; sAngle, eAngle, y1, x2, y2: Integer; sAngle, eAngle,
aStep: Extended; out aFound: T2DExtendedArray) aStep: Extended; out aFound: T2DExtendedArray)
: Boolean; : Boolean;
function pFindDTM(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: function pFindDTM(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2:
Integer): Boolean; Integer): Boolean;
function pFindDTMs(DTM: pDTM; out Points: TPointArray; x1, y1, x2,
y2: Integer): Boolean;
function pFindDTMRotated(DTM: pDTM; out x, y: Integer; x1, y1, x2, function pFindDTMRotated(DTM: pDTM; out x, y: Integer; x1, y1, x2,
y2: Integer; sAngle, eAngle, aStep: Extended; y2: Integer; sAngle, eAngle, aStep: Extended;
out aFound: Extended): Boolean; out aFound: Extended): Boolean;
function pFindDTMsRotated(DTM: pDTM; out Points: TPointArray; x1, function pFindDTMsRotated(DTM: pDTM; out Points: TPointArray; x1,
y1, x2, y2: Integer; sAngle, eAngle, y1, x2, y2: Integer; sAngle, eAngle,
aStep: Extended; out aFound: T2DExtendedArray) aStep: Extended; out aFound: T2DExtendedArray)
: Boolean; : Boolean;
}
constructor Create(Owner: TObject); constructor Create(Owner: TObject);
destructor Destroy; override; destructor Destroy; override;
private
function AreaShape(Color, Tolerance, Size, Shape: Integer; P: TPoint) : Boolean; inline;
private private
Client: TObject; Client: TObject;
@ -76,13 +76,6 @@ type
FreeSpots: Array Of Integer; FreeSpots: Array Of Integer;
end; end;
const
dtm_Rectangle = 0;
dtm_Cross = 1;
dtm_DiagonalCross = 2;
dtm_Circle = 3;
dtm_Triangle = 4;
{ {
I am not sure wether I should simply copy and paste the old DTM implementation, I am not sure wether I should simply copy and paste the old DTM implementation,
or rewrite it from scratch. or rewrite it from scratch.
@ -112,6 +105,7 @@ type
TBufferByteArray = Array[0..524287] of Byte; TBufferByteArray = Array[0..524287] of Byte;
PBufferByteArray = ^TBufferByteArray; PBufferByteArray = ^TBufferByteArray;
constructor TMDTM.Create(Owner: TObject); constructor TMDTM.Create(Owner: TObject);
begin begin
inherited Create; inherited Create;
@ -152,102 +146,13 @@ begin
inherited Destroy; inherited Destroy;
end; end;
type Function AreaShape(Color, Tolerance, Size, Shape: Integer; P: TPoint) : Boolean; inline;
PMSimColor = function (Color1,Color2,Tolerance : Integer) : boolean of object;
PMGetCol = function (x, y: integer): TColor of object;
Function TMDTM.AreaShape(Color, Tolerance, Size, Shape: Integer; P: TPoint) : Boolean; inline;
Var
X, Y, S: Integer;
SimCol: PMSimColor;
GetCol: PMGetCol;
Begin Begin
SimCol := @TClient(Client).MFinder.SimilarColors;
GetCol := @TClient(Client).MWindow.GetColor;
Case Shape Of
dtm_Rectangle:
Begin
{
Example:
3x3
X X X
X X X
X X X
}
For X := P.X - Size To P.X + Size Do
For Y := P.Y - Size To P.Y + Size Do
If SimCol(GetCol(X, Y), Color, Tolerance) Then
Begin
Result := True;
Exit;
End;
End;
dtm_Cross:
{
Example:
3x3
X
X X X
X
}
Begin
For X := P.X - Size To P.X + Size Do
If SimCol(GetCol(X, P.Y), Color, Tolerance) Then
Begin
Result := True;
Exit;
End;
For Y := P.Y - Size To P.Y + Size Do
If SimCol(GetCol(P.X, Y), Color, Tolerance) Then
Begin
Result := True;
Exit;
End;
End;
dtm_DiagonalCross:
{
Example:
3x3
X X
X
X X
}
Begin
For S := -Size To Size Do
Begin
If SimCol(GetCol(P.X + S, P.Y + S), Color, Tolerance) Then
Begin
Result := True;
Exit;
End;
If SimCol(GetCol(P.X + S, P.Y - S), Color, Tolerance) Then
Begin
Result := True;
Exit;
End;
End;
End;
4:
Begin
raise Exception.CreateFmt('The given DTM Shape ([%d]) is not yet' +
' implemented.', [Shape]);
End;
Else
WriteLn('Incorrect Shape');
End;
Result := False;
End; End;
{/\ // Rotates the given point (p) by A (in radians) around the point defined by cx, cy.
Rotates the given point (p) by A (in radians) around the point defined by cx, cy.
/\}
function RotatePoint(p: TPoint; angle, mx, my: Extended): TPoint; inline; function RotatePoint(p: TPoint; angle, mx, my: Extended): TPoint; inline;
@ -306,6 +211,7 @@ begin
Result.t[i] := PInteger(@b^[c+24])^; Result.t[i] := PInteger(@b^[c+24])^;
end; end;
end; end;
result.l := length(result.p);
end; end;
function TMDTM.AddDTM(d: TDTM): Integer; function TMDTM.AddDTM(d: TDTM): Integer;
@ -380,61 +286,21 @@ begin
SetLength(DTMList[DTM].t, 0); SetLength(DTMList[DTM].t, 0);
SetLength(DTMList[DTM].asz, 0); SetLength(DTMList[DTM].asz, 0);
SetLength(DTMList[DTM].ash, 0); SetLength(DTMList[DTM].ash, 0);
DTMList[DTM].l := 0;
except except
raise Exception.CreateFmt('Invalid DTM passed to FreeDTM', []);
//WriteLn('Invalid DTM'); //WriteLn('Invalid DTM');
end; end;
SetLength(FreeSpots, Length(FreeSpots) + 1); SetLength(FreeSpots, Length(FreeSpots) + 1);
FreeSpots[High(FreeSpots)] := DTM; FreeSpots[High(FreeSpots)] := DTM;
end; end;
procedure DTMBounds(dtm: pDTM; var x1, y1, x2, y2: Integer);
var
i: Integer;
B: TBox;
begin
FillChar(b,sizeOf(TBox),0);
for i := 0 to high(dtm.p) do
begin
B.X1 := Min(B.X1, dtm.p[i].X - dtm.asz[i]);
B.Y1 := Min(B.Y1, dtm.p[i].Y - dtm.asz[i]);
B.X2 := Max(B.X2, dtm.p[i].X + dtm.asz[i]);
B.Y2 := Max(B.Y2, dtm.p[i].Y + dtm.asz[i]);
end;
{writeln(inttostr(B.x1) + ', ' + inttostr(b.y1) + ', ' + inttostr(b.x2) +
', ' + inttostr(b.y2)); }
x1 += -B.X1;
y1 += -B.Y1;
X2 -= B.X2;
Y2 -= B.Y2;
end;
// TODO
procedure DTMRotatedBounds(dtm: pDTM; var x1, y1, x2, y2: Integer);
var
i: Integer;
B: TBox;
begin
FillChar(b,sizeOf(TBox),0);
for i := 0 to high(dtm.p) do
begin
B.X1 := Min(B.X1, dtm.p[i].X - dtm.asz[i]);
B.Y1 := Min(B.Y1, dtm.p[i].Y - dtm.asz[i]);
B.X2 := Max(B.X2, dtm.p[i].X + dtm.asz[i]);
B.Y2 := Max(B.Y2, dtm.p[i].Y + dtm.asz[i]);
end;
x1 += -Sqr(B.X1);
y1 += -Sqr(B.Y1);
X2 -= Sqr(B.X2);
Y2 -= Sqr(B.Y2);
end;
{ {
Tries to find the given DTM (index). If found will put the point the dtm has Tries to find the given DTM (index). If found will put the point the dtm has
been found at in x, y and result to true. been found at in x, y and result to true.
} }
function TMDTM.FindDTM(DTM: Integer; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean; {function TMDTM.FindDTM(DTM: Integer; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean;
var var
temp: pDTM; temp: pDTM;
begin begin
@ -446,90 +312,26 @@ begin
y := 0; y := 0;
Result := False; Result := False;
end; end;
end; end; }
{ {
Tries to find the given pDTM. If found will put the point the dtm has Tries to find the given pDTM. If found will put the point the dtm has
been found at in x, y and result to true. been found at in x, y and result to true.
} }
function TMDTM.pFindDTM(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean; {function TMDTM.pFindDTM(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean;
var
mP: TPointArray;
I, J, H, dH: Integer;
Found: Boolean;
TempTP: TPoint;
begin begin
for I := 1 to High(DTM.p) do end; }
begin
DTM.p[I].x := DTM.p[I].x - DTM.p[0].x;
DTM.p[I].y := DTM.p[I].y - DTM.p[0].y;
end;
{writeln(inttostr(x1) + ', ' + inttostr(y1) + ', ' + inttostr(x2) +
', ' + inttostr(y2)); }
DTMBounds(DTM, x1, y1, x2, y2);
{writeln(inttostr(x1) + ', ' + inttostr(y1) + ', ' + inttostr(x2) +
', ' + inttostr(y2)); }
{If X2 > X1 then
//Exit;
If Y2 > Y1 then }
//Exit;
// Will make sure there are no out of bounds exceptions, and will make it faster
with TClient(Client) do
begin
MWindow.Freeze();
MFinder.FindColorsTolerance(mP, DTM.c[Low(DTM.c)], x1, y1, x2, y2,
DTM.t[Low(DTM.t)]);
MWindow.GetDimensions(H, dH);
end;
H := High(mP);
dH := High(DTM.p);
for I := 0 to H do
begin
// Use MainPoint's AreaSize and Shape.
// for Loop on mP, depending on the AreaShape. then on all the code beneath
// this point, use the var that is retrieved from the for loop.
Found := True;
for J := 1 to dH do
begin
TempTP.X := DTM.p[J].X + mP[I].X;
TempTP.Y := DTM.p[J].Y + mP[I].Y;
//Now would be the time to Rotate TempTP
if not AreaShape(DTM.c[J], DTM.t[J], DTM.asz[J], DTM.ash[J], TempTP) then
begin
Found := False;
Break;
end;
end;
if Found then
begin
Result := True;
x := mP[I].X;
y := mP[I].Y;
TClient(Client).MWindow.UnFreeze();
Exit;
end;
end;
TClient(Client).MWindow.UnFreeze();
Result := False;
end;
{/\ {/\
Tries to find the given DTM (index). Will return true if it has found one or more Tries to find the given DTM (index). Will return true if it has found one or more
DTM's. All the occurances are stored in the Points (TPointArray) DTM's. All the occurances are stored in the Points (TPointArray)
/\} /\}
function TMDTM.FindDTMs(DTM: Integer; out Points: TPointArray; x1, y1, x2, y2: Integer): Boolean; {function TMDTM.FindDTMs(DTM: Integer; out Points: TPointArray; x1, y1, x2, y2: Integer): Boolean;
Var Var
temp: pDTM; temp: pDTM;
Begin Begin
@ -540,78 +342,36 @@ Begin
SetLength(Points, 0); SetLength(Points, 0);
Result := False; Result := False;
End; End;
End; End; }
{/\ {/\
Tries to find the given pDTM. Will return true if it has found one or more Tries to find the given pDTM. Will return true if it has found one or more
DTM's. All the occurances are stored in the Points (TPointArray) DTM's. All the occurances are stored in the Points (TPointArray)
/\} /\}
Function TMDTM.pFindDTMs(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer): Boolean;
Var
mP: TPointArray;
I, J, H, dH: Integer;
Found: Boolean;
TempTP: TPoint;
Begin {wat}
Result := False; // Then, first find all occurances of all colours on the given client.
SetLength(Points, 0); // Each point has a colour, and we call them C_0...C_n.
For I := 1 To High(DTM.p) Do // MP denotes the points of the main point colour on the client.
Begin // P_i denotes the points on the client for C_i
DTM.p[I].x := DTM.p[I].x - DTM.p[0].x; // O_i denotes the point offset, and possible area shape and size.
DTM.p[I].y := DTM.p[I].y - DTM.p[0].y; // B_i denotes a boolean representation of P_i for C_i, for C_1...C_n.
End; // B_0 and O_0 are the merry exception here, as we don't need them for C_0,
// which we will show later.
{writeln(inttostr(x1) + ', ' + inttostr(y1) + ', ' + inttostr(x2) + // I hope it is clear how this will be respresented in computer data
', ' + inttostr(y2)); } // structures.
DTMBounds(DTM, x1, y1, x2, y2);
{ writeln(inttostr(x1) + ', ' + inttostr(y1) + ', ' + inttostr(x2) +
', ' + inttostr(y2)); }
{If X2 > X1 then
//Exit;
If Y2 > Y1 then }
//Exit;
// Will make sure there are no out of bounds exceptions, and will make it faster
with TClient(Client) do // Now, we iterate for i in range(1, n),
begin // We use MP_i, and iterate for j in range(0, dtm_points),
MWindow.Freeze(); // Calculate the B_j indices (with MP_i and O_j) for each j, and
// see if B_j is not true, go on with MP_i + 1.
// Possible using areasize/shape.
MFinder.FindColorsTolerance(mP, DTM.c[Low(DTM.c)], x1, y1, x2, y2, // else, if B_j is true, continue with this inner loop.
DTM.t[Low(DTM.t)]); // If B_{0...dtm_points} were all true, the point is valid.
MWindow.GetDimensions(H, dH);
end;
H := High(mP);
dH := High(DTM.p);
For I := 0 To H Do
Begin
Found := True;
For J := 1 To dH Do
Begin
TempTP.X := DTM.p[J].X + mP[I].X;
TempTP.Y := DTM.p[J].Y + mP[I].Y;
If Not AreaShape(DTM.c[J], DTM.t[J], DTM.asz[J], DTM.ash[J], TempTP) Then
Begin
Found := False;
Break;
End;
End;
If Found Then
Begin
Result := True;
SetLength(Points, Length(Points) + 1);
Points[High(Points)] := mP[I];
End;
End;
TClient(Client).MWindow.UnFreeze();
Result := Length(Points) > 0;
End;
{/\ {/\
Tries to find the given DTM (index). If found will put the point the dtm has Tries to find the given DTM (index). If found will put the point the dtm has
@ -620,7 +380,7 @@ End;
Returns all Angles in an Extended array. Returns all Angles in an Extended array.
/\} /\}
Function TMDTM.FindDTMRotated(DTM: Integer; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean; {Function TMDTM.FindDTMRotated(DTM: Integer; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean;
Var Var
temp: pDTM; temp: pDTM;
Begin Begin
@ -633,7 +393,7 @@ Begin
aFound := 0.0; aFound := 0.0;
Result := False; Result := False;
End; End;
End; End; }
{/\ {/\
Tries to find the given pDTM. If found will put the point the dtm has Tries to find the given pDTM. If found will put the point the dtm has
@ -642,115 +402,11 @@ End;
Returns all Angles in an Extended array. Returns all Angles in an Extended array.
/\} /\}
Function TMDTM.pFindDTMRotated(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean; {Function TMDTM.pFindDTMRotated(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean;
Var
mP: TPointArray;
I, J, H, dH, R, W: Integer;
Angle: Array Of Extended;
tAngle: Extended;
Found: Boolean;
TempTP: TPoint;
// MaxSubPointDist: TPoint;
Begin Begin
For I := 1 To High(DTM.p) Do
Begin
DTM.p[I].x := DTM.p[I].x - DTM.p[0].x;
DTM.p[I].y := DTM.p[I].y - DTM.p[0].y;
End;
writeln(inttostr(x1) + ', ' + inttostr(y1) + ', ' + inttostr(x2) + End; }
', ' + inttostr(y2));
DTMRotatedBounds(DTM, x1, y1, x2, y2);
writeln(inttostr(x1) + ', ' + inttostr(y1) + ', ' + inttostr(x2) +
', ' + inttostr(y2));
{If X2 > X1 then
//Exit;
If Y2 > Y1 then }
//Exit;
// Will make sure there are no out of bounds exceptions, and will make it faster
with TClient(Client) do
begin
MWindow.Freeze();
MFinder.FindColorsTolerance(mP, DTM.c[Low(DTM.c)], x1, y1, x2, y2,
DTM.t[Low(DTM.t)]);
MWindow.GetDimensions(H, dH);
end;
H := High(mP);
dH := High(DTM.p);
For I := 0 To H Do
Begin
// Use MainPoint's AreaSize and Shape.
// For Loop on mP, depending on the AreaShape. Then on all the code beneath
// this point, use the var that is retrieved from the for loop.
Found := True;
SetLength(Angle, 0);
Found := True;
For J := 1 To dH Do
Begin
If Length(Angle) = 0 Then
Begin
tAngle := sAngle;
While tAngle <= eAngle Do
Begin
TempTP.X := DTM.p[J].X + mP[I].X;
TempTP.Y := DTM.p[J].Y + mP[I].Y;
TempTP := RotatePoint(TempTP, tAngle, mP[I].X, mP[I].Y);
If AreaShape(DTM.c[J], DTM.t[J], DTM.asz[J], DTM.ash[J], TempTP) Then
Begin
SetLength(Angle, Length(Angle) + 1);
Angle[High(Angle)] := tAngle;
Found := True;
End;
tAngle := tAngle + aStep;
End;
End;
Found := Length(Angle) > 0;
For R := 0 To High(Angle) Do
Begin
writeln('dtm: ' + inttostr(dtm.p[j].x) + ', ' + inttostr(dtm.p[j].y));
writeln('mP: ' + inttostr(mP[i].x) + ', ' + inttostr(mP[i].y));
TempTP.X := DTM.p[J].X + mP[I].X;
TempTP.Y := DTM.p[J].Y + mP[I].Y;
writeln('TempTP: ' + inttostr(TempTP.x) + ', ' + inttostr(TempTP.y));
TempTP := RotatePoint(TempTP, Angle[R], mP[I].X, mP[I].Y);
writeln('TempTP: ' + inttostr(TempTP.x) + ', ' + inttostr(TempTP.y));
If Not AreaShape(DTM.c[J], DTM.t[J], DTM.asz[J], DTM.ash[J], TempTP) Then
Begin
For W := R To High(Angle) - 1 Do
Angle[W] := Angle[W + 1];
SetLength(Angle, Length(Angle) - 1);
If Length(Angle) = 0 Then
Begin
Found := False;
Break;
End;
End;
End;
If Not Found Then
Break;
End;
If Found Then
Begin
Result := True;
x := mP[I].X;
y := mP[I].Y;
aFound := Angle[0];
TClient(Client).MWindow.UnFreeze();
Exit;
End;
End;
TClient(Client).MWindow.UnFreeze();
Result := False;
End;
{/\ {/\
Tries to find the given DTM (index). Will return true if it has found one or more Tries to find the given DTM (index). Will return true if it has found one or more
@ -760,7 +416,7 @@ End;
Returns all Angles in a Two Dimensional Extended array. Returns all Angles in a Two Dimensional Extended array.
/\} /\}
Function TMDTM.FindDTMsRotated(DTM: Integer; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray): Boolean; {Function TMDTM.FindDTMsRotated(DTM: Integer; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray): Boolean;
Var Var
temp: pDTM; temp: pDTM;
Begin Begin
@ -772,7 +428,7 @@ Begin
SetLength(aFound, 0); SetLength(aFound, 0);
Result := False; Result := False;
End; End;
End; End; }
{/\ {/\
Tries to find the given pDTM. Will return true if it has found one or more Tries to find the given pDTM. Will return true if it has found one or more
@ -782,109 +438,12 @@ End;
Returns all Angles in a Two Dimensional Extended array. Returns all Angles in a Two Dimensional Extended array.
/\} /\}
Function TMDTM.pFindDTMsRotated(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray): Boolean; {Function TMDTM.pFindDTMsRotated(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray): Boolean;
Var
mP: TPointArray;
I, J, H, dH, R, W, PCount: Integer;
Angle: TExtendedArray;
tAngle: Extended;
Found: Boolean;
TempTP: TPoint;
Begin Begin
For I := 1 To High(DTM.p) Do // Don't forget to pre calculate the rotated points at the start.
Begin // Saves a lot of rotatepoint() calls.
DTM.p[I].x := DTM.p[I].x - DTM.p[0].x; End; }
DTM.p[I].y := DTM.p[I].y - DTM.p[0].y;
End;
DTMBounds(DTM, x1, y1, x2, y2);
{If X2 > X1 then
//Exit;
If Y2 > Y1 then }
//Exit;
// Will make sure there are no out of bounds exceptions, and will make it faster
with TClient(Client) do
begin
MWindow.Freeze();
MFinder.FindColorsTolerance(mP, DTM.c[Low(DTM.c)], x1, y1, x2, y2,
DTM.t[Low(DTM.t)]);
MWindow.GetDimensions(H, dH);
end;
H := High(mP);
dH := High(DTM.p);
PCount := 0;
For I := 0 To H Do
Begin
//WriteLn('I: ' + IntToStr(I));
// Use MainPoint's AreaSize and Shape.
// For Loop on mP, depending on the AreaShape. Then on all the code beneath
// this point, use the var that is retrieved from the for loop.
//Found := True;
SetLength(Angle, 0);
Found := True;
For J := 1 To dH Do
Begin
If Length(Angle) = 0 Then
Begin
tAngle := sAngle;
While tAngle <= eAngle Do
Begin
TempTP.X := DTM.p[J].X + mP[I].X;
TempTP.Y := DTM.p[J].Y + mP[I].Y;
TempTP := RotatePoint(TempTP, tAngle, mP[I].X, mP[I].Y);
If AreaShape(DTM.c[J], DTM.t[J], DTM.asz[J], DTM.ash[J], TempTP) Then
Begin
SetLength(Angle, Length(Angle) + 1);
Angle[High(Angle)] := tAngle;
Found := True;
End;
tAngle := tAngle + aStep;
End;
End;
Found := Length(Angle) > 0;
{If Found Then
WriteLn('Angle length after first search: ' + IntToStr(Length(Angle))); }
For R := 0 To High(Angle) Do
Begin
TempTP.X := DTM.p[J].X + mP[I].X;
TempTP.Y := DTM.p[J].Y + mP[I].Y;
TempTP := RotatePoint(TempTP, Angle[R], mP[I].X, mP[I].Y);
If Not AreaShape(DTM.c[J], DTM.t[J], DTM.asz[J], DTM.ash[J], TempTP) Then
Begin
For W := R To High(Angle) - 1 Do
Angle[W] := Angle[W + 1];
SetLength(Angle, Length(Angle) - 1);
If Length(Angle) = 0 Then
Begin
Found := False;
Break;
End;
End;
End;
If Not Found Then
Break;
End;
If Found Then
Begin
SetLength(Points, PCount + 1);
Points[PCount] := mP[I];
PCount := PCount + 1;
SetLength(aFound, Length(aFound) + 1);
aFound[High(aFound)] := Angle;
Continue;
End;
End;
TClient(Client).MWindow.UnFreeze();
Result := Length(Points) > 0;
End;
end. end.

View File

@ -35,7 +35,43 @@ Function pDTMToTDTM(Const DTM: pDTM): TDTM;
Function tDTMTopDTM(Const DTM: TDTM): pDTM; Function tDTMTopDTM(Const DTM: TDTM): pDTM;
Procedure PrintpDTM(tDTM : pDTM); Procedure PrintpDTM(tDTM : pDTM);
procedure initdtm(var d: pdtm; len: integer);
function ValidMainPointBox(var dtm: pDTM; const x1, y1, x2, y2: Integer): TBox;
function ValidMainPointBoxRotated(var dtm: pDTM; const x1, y1, x2, y2: Integer): TBox;
function DTMConsistent(var dtm: pdtm): boolean;
procedure NormalizeDTM(var dtm: pdtm);
const
dtm_Rectangle = 0;
dtm_Cross = 1;
dtm_DiagonalCross = 2;
dtm_Circle = 3;
dtm_Triangle = 4;
implementation implementation
uses math;
// macro
procedure initdtm(var d: pdtm; len: integer);
var
i: integer;
begin
d.l := len;
setlength(d.p, len);
setlength(d.c, len);
setlength(d.t, len);
setlength(d.ash, len);
setlength(d.asz, len);
FillChar(d.p[0], SizeOf(TPoint) * len, 0);
FillChar(d.c[0], SizeOf(Integer) * len, 0);
FillChar(d.t[0], SizeOf(Integer) * len, 0);
FillChar(d.ash[0], SizeOf(Integer) * len, 0);
// Better set it to 1, than fill with 0.
FillChar(d.asz[0], SizeOf(Integer) * len, 0);
{for i := 0 to len - 1 do
d.asz[i] := 1; }
end;
Procedure PrintpDTM(tDTM : pDTM); Procedure PrintpDTM(tDTM : pDTM);
var var
@ -65,7 +101,7 @@ Begin
Result.MainPoint := Temp; Result.MainPoint := Temp;
SetLength(Result.SubPoints, Length(DTM.p) - 1); SetLength(Result.SubPoints, Length(DTM.p) - 1);
For I := 1 To High(DTM.p) Do For I := 1 To DTM.l-1 Do
Begin Begin
Temp.X := 0; Temp.Y := 0; Temp.AreaSize := 0; Temp.AreaShape := 0; Temp.Color := 0; Temp.Tolerance := 0; Temp.X := 0; Temp.Y := 0; Temp.AreaSize := 0; Temp.AreaShape := 0; Temp.Color := 0; Temp.Tolerance := 0;
Temp.X := DTM.p[i].x; Temp.X := DTM.p[i].x;
@ -111,7 +147,87 @@ Begin
Result.asz[I] := DTM.SubPoints[I - 1].AreaSize; Result.asz[I] := DTM.SubPoints[I - 1].AreaSize;
Result.ash[I] := DTM.SubPoints[I - 1].AreaShape; Result.ash[I] := DTM.SubPoints[I - 1].AreaShape;
End; End;
Result.l := length(Result.p);
End; End;
{ TODO: Check if bounds are correct? }
function DTMConsistent(var dtm: pdtm): boolean;
var
i: integer;
begin
if dtm.l = 0 then
Exit(False);
if dtm.l <> length(dtm.p) then
Exit(False);
if dtm.l <> length(dtm.c) then
Exit(False);
if dtm.l <> length(dtm.t) then
Exit(False);
if dtm.l <> length(dtm.asz) then
Exit(False);
if dtm.l <> length(dtm.ash) then
Exit(False);
for i := 0 to dtm.l-1 do
if dtm.asz[i] < 0 then
Exit(False);
for i := 0 to dtm.l-1 do
if dtm.c[i] < 0 then
Exit(False);
for i := 0 to dtm.l-1 do
if dtm.t[i] < 0 then
Exit(False);
for i := 0 to dtm.l-1 do
if dtm.ash[i] < 0 then
Exit(False);
end;
procedure NormalizeDTM(var dtm: pdtm);
var
i:integer;
begin
for i := 0 to dtm.l do
dtm.p[i] := dtm.p[i] - dtm.p[0];
end;
Function ValidMainPointBox(var dtm: pDTM; const x1, y1, x2, y2: Integer): TBox;
var
i: Integer;
b: TBox;
begin
// writeln(format('%d, %d', [0,0]));
for i := 1 to high(dtm.c) do
begin
dtm.p[i] := dtm.p[i] - dtm.p[0];
// writeln(format('%d, %d', [dtm.p[i].x, dtm.p[i].y]));
end;
dtm.p[0] := dtm.p[0] - dtm.p[0];
FillChar(b, SizeOf(TBox), 0);
for i := 0 to high(dtm.c) do
begin
b.x1 := min(b.x1, dtm.p[i].x - dtm.asz[i]);
b.y1 := min(b.y1, dtm.p[i].y - dtm.asz[i]);
b.x2 := max(b.x2, dtm.p[i].x + dtm.asz[i]);
b.y2 := max(b.y2, dtm.p[i].y + dtm.asz[i]);
end;
//FillChar(Result, SizeOf(TBox), 0);
writeln(Format('DTM Bounding Box: %d, %d : %d, %d', [b.x1, b.y1,b.x2,b.y2]));
Result.x1 := x1 - b.x1;
Result.y1 := y1 - b.y1;
Result.x2 := x2 - b.x2;
Result.y2 := y2 - b.y2;
end;
Function ValidMainPointBoxRotated(var dtm: pDTM; const x1, y1, x2, y2: Integer): TBox;
begin
end;
end. end.

View File

@ -77,7 +77,14 @@ type
function FindBitmapSpiralTolerance(bitmap: TMufasaBitmap; var x, y: Integer; xs, ys, xe, ye,tolerance : integer): Boolean; function FindBitmapSpiralTolerance(bitmap: TMufasaBitmap; var x, y: Integer; xs, ys, xe, ye,tolerance : integer): Boolean;
function FindBitmapsSpiralTolerance(bitmap: TMufasaBitmap; x, y: Integer; out Points : TPointArray; xs, ys, xe, ye,tolerance: Integer): Boolean; function FindBitmapsSpiralTolerance(bitmap: TMufasaBitmap; x, y: Integer; out Points : TPointArray; xs, ys, xe, ye,tolerance: Integer): Boolean;
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
function FindDTM(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean;
function FindDTMs(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer): Boolean;
function FindDTMRotated(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean;
function FindDTMsRotated(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray): Boolean;
protected
Client: TObject; Client: TObject;
Percentage : array[0..255] of Extended; //We store all the possible RGB / 255 divisions. Percentage : array[0..255] of Extended; //We store all the possible RGB / 255 divisions.
CachedWidth, CachedHeight : integer; CachedWidth, CachedHeight : integer;
@ -90,7 +97,8 @@ implementation
uses uses
Client, // For the Client Casts. Client, // For the Client Casts.
colour_conv, // For RGBToColor, etc. colour_conv, // For RGBToColor, etc.
math //min/max math, //min/max
dtmutil
; ;
type type
TPRGB32Array = array of PRGB32; TPRGB32Array = array of PRGB32;
@ -1570,5 +1578,248 @@ begin
end; end;
end; end;
function TMFinder.FindDTM(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer): Boolean;
var
P: TPointArray;
begin
Self.FindDTMs(DTM, P, x1, y1, x2, y2);
if(Length(p) > 0) then
begin
x := p[0].x;
y := p[0].y;
Exit(True);
end;
Exit(False);
end;
// TODO: Add a max count, so we can use it more efficiently for FindDTM?
function TMFinder.FindDTMs(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer): Boolean;
var
// Colours of DTMs
C: Array of Integer;
// Bitwise
b: Array of Array of Integer;
// bounds
W, H: integer;
MA: TBox;
// for loops, etc
xx, yy: integer;
i, xxx,yyy: Integer;
// for comparions.
clR, clG, clB: Integer;
//clientdata
cd: TPRGB32Array;
PtrData: TRetData;
Ptr: PRGB32;
PtrInc: Integer;
// point count
pc: Integer = 0;
label EndOfLoop;
label AnotherLoopEnd;
begin
if not DTMConsistent(dtm) then
begin
raise Exception.CreateFmt('FindDTMs: DTM is not consistent.', []);
Exit;
end;
// Get the area we should search in for the Main Point.
writeln(Format('%d, %d, %d, %d', [x1,y1,x2,y2]));
MA := ValidMainPointBox(DTM, x1, y1, x2, y2);
writeln(Format('%d, %d, %d, %d', [MA.x1,MA.y1,MA.x2,MA.y2]));
DefaultOperations(MA.x1, MA.y1, MA.x2, MA.y2);
// Init data structure B.
W := x2 - x1;
H := y2 - y1;
setlength(b, W + 1);
for i := 0 to W do
begin
setlength(b[i], H + 1);
// does setlength init already? if it doesn't, do we want to init here?
// or do we want to init in the loop, as we loop over every b anyway?
//FillChar(b[i][0], SizeOf(Integer) * H, 0);
end;
// C = DTM.C
C := DTM.c;
// Now, we must find the occurances of all colours.
// This part should be turned into a more general function (for DTM Finding).
// Something like FindColorsMultiBooleanArray (?)
// Retreive Client Data.
PtrData := TClient(Client).MWindow.ReturnData(x1, y1, W + 1, H + 1);
// Do we want to "cache" these vars?
// We will, for now. Easier to type.
Ptr := PtrData.Ptr;
PtrInc := PtrData.IncPtrWith;
cd := CalculateRowPtrs(PtrData, h + 1);
writeln(format('w,h: %d, %d', [w,h]));
for yy := 0 to h do
for xx := 0 to w do
begin
//writeln(format('x,y: %d, %d', [xx,yy]));
// main point
if not TClient(Client).MFinder.SimilarColors(dtm.c[0], RGBToColor(cd[yy][xx].R, cd[yy][xx].G, cd[yy][xx].B), dtm.t[0]) then
goto AnotherLoopEnd;
b[xx][yy] := B[xx][yy] or 1;
for i := 1 to dtm.l - 1 do
begin // use square areashape - it covers all.
for xxx := xx - dtm.asz[i] + dtm.p[i].x to xx + dtm.asz[i] + dtm.p[i].x do
for yyy := yy - dtm.asz[i] + dtm.p[i].y to yy + dtm.asz[i]+ dtm.p[i].y do
// may want to remove this line, but I think it is a good optimisation.
if B[xxx][yyy] and (1 shl i) = 0 then
if TClient(Client).MFinder.SimilarColors(dtm.c[i], RGBToColor(cd[yyy][xxx].R, cd[yyy][xxx].G, cd[yyy][xxx].B), dtm.t[i]) then
b[xxx][yyy] := B[xxx][yyy] or (1 shl i)
else
goto AnotherLoopEnd;
end;
AnotherLoopEnd:
//writeln(format('b[%d][%d]: %d' ,[xx,yy,b[xx][yy]]));
end;
{for yy := 0 to h do
for xx := 0 to w do
writeln(format('b[%d][%d]: %d' ,[xx,yy,b[xx][yy]])); }
// Now iterate over the data. (Main Point Bounds)
for yy := MA.y1-y1 to MA.y2-y1 do
for xx := MA.x1-x1 to MA.x2-x1 do
begin
//writeln(format('Testing for MP at %d, %d', [xx,yy]));
//writeln(format('Testing for MP RealPoints at %d, %d', [xx+x1,yy+y1]));
if (b[xx][yy] and 1) = 0 then
continue;
//writeln(format('Got a MP at %d, %d', [xx,yy]));
//writeln(format('Got a MP Real Points at %d, %d', [xx+x1,yy+y1]));
for i := 1 to dtm.l - 1 do
begin
//writeln(format('i: %d',[i]));
case dtm.ash[i] of
{ Example:
3x3 (AreaSize = 1)
X X X
X X X
X X X }
//areasize and areashape. areasize = 0 is completly valid
dtm_Rectangle:
begin
//writeln(Format('X - From, To: %d, %d', [xx - dtm.asz[i]+ dtm.p[i].x, xx + dtm.asz[i]+ dtm.p[i].x]));
for xxx := xx - dtm.asz[i] + dtm.p[i].x to xx + dtm.asz[i] + dtm.p[i].x do
for yyy := yy - dtm.asz[i] + dtm.p[i].y to yy + dtm.asz[i]+ dtm.p[i].y do
if b[xxx][yyy] and (1 shl i) = 0 then
goto EndOfLoop;
end;
{ Example:
3x3 (AreaSize = 1)
X
X X X
X }
dtm_Cross:
begin
for xxx := xx - dtm.asz[i] + dtm.p[i].x to xx + dtm.asz[i] + dtm.p[i].x do
begin
//writeln(format('Cross - One. %d, %d', [xxx,dtm.p[i].y + yy]));
if b[xxx][dtm.p[i].y + yy] and (1 shl i) = 0 then
goto EndOfLoop;
end;
for yyy := yy - dtm.asz[i] + dtm.p[i].y to yy + dtm.asz[i]+ dtm.p[i].y do
begin
//writeln(format('Cross - One. %d, %d', [dtm.p[i].x + xx,yyy]));
if b[dtm.p[i].x + xx][yyy] and (1 shl i) = 0 then
goto EndOfLoop;
end;
end;
{ Example:
3x3 (AreaSize = 1)
X X
X
X X }
dtm_DiagonalCross:
begin
for xxx := -dtm.asz[i] to dtm.asz[i] do
begin
if b[xx + dtm.p[i].x + xxx][yy + dtm.p[i].y + xxx] and (1 shl i) = 0 then
goto EndOfLoop;
if b[xx + dtm.p[i].x + xxx][yy + dtm.p[i].y + xxx] and (1 shl i) = 0 then
goto EndOfLoop;
end;
end
else
begin
raise exception.createFMT('FindDTMs: Invalid Areashape!', []);
Exit;
end;
end;
// point [xx,yy] found if we make it to here
//writeln(Format('Wat (Real Points): %d, %d', [xx+x1, yy+y1])); //Good old wat!
end;
ClientTPA[pc] := Point(xx+x1, yy+y1);
Inc(pc);
//writeln(Format('Found a Point: %d, %d', [xx+x1, yy+y1]));
EndOfLoop:
end;
TClient(Client).MWindow.FreeReturnData;
SetLength(Points, pc);
Move(ClientTPA[0], Points[0], pc * SizeOf(TPoint));
end;
function TMFinder.FindDTMRotated(DTM: pDTM; out x, y: Integer; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: Extended): Boolean;
begin
raise Exception.CreateFmt('Not done yet!', []);
end;
function TMFinder.FindDTMsRotated(DTM: pDTM; out Points: TPointArray; x1, y1, x2, y2: Integer; sAngle, eAngle, aStep: Extended; out aFound: T2DExtendedArray): Boolean;
begin
// Don't forget to pre calculate the rotated points at the start.
// Saves a lot of rotatepoint() calls.
raise Exception.CreateFmt('Not done yet!', []);
end;
end. end.
{ crap code }
// this is the probably the slowest part of the algorithm.
{ for yy := y1 to y2 do
begin
for xx := x1 to x2 do
begin
{for i := 0 to dtm.l - 1 do
begin
// optimise this later...
if TClient(Client).MFinder.SimilarColors(dtm.c[i], RGBToColor(Ptr^.R,Ptr^.G,Ptr^.B) , dtm.t[i]) then
B[xx][yy] := B[xx][yy] or (1 shl i);
end; }
inc(Ptr);
end;
inc(Ptr, PtrInc);
end;
}

View File

@ -86,7 +86,9 @@ type
x1, y1, x2, y2: Integer; x1, y1, x2, y2: Integer;
end; end;
{ TODO: add cts per colour/tolerance? }
pDTM = record pDTM = record
l: Integer;
p: TPointArray; p: TPointArray;
c, t, asz, ash: TIntegerArray; c, t, asz, ash: TIntegerArray;
end; end;