Advertisement
Guest User

FindText.ahk

a guest
Dec 2nd, 2018
670
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 37.33 KB | None | 0 0
  1. FindText(x, y, w, h, err1, err0, text, ScreenShot=1)
  2. {
  3. xywh2xywh(x,y,w,h,x,y,w,h)
  4. if (w<1 or h<1)
  5. return, 0
  6. bch:=A_BatchLines
  7. SetBatchLines, -1
  8. ;--------------------------------------
  9. GetBitsFromScreen(x,y,w,h,Scan0,Stride,ScreenShot,zx,zy)
  10. ;--------------------------------------
  11. sx:=x-zx, sy:=y-zy, sw:=w, sh:=h, arr:=[]
  12. Loop, 2 {
  13. Loop, Parse, text, |
  14. {
  15. v:=A_LoopField
  16. IfNotInString, v, $, Continue
  17. comment:="", e1:=err1, e0:=err0
  18. ; You Can Add Comment Text within The <>
  19. if RegExMatch(v,"<([^>]*)>",r)
  20. v:=StrReplace(v,r), comment:=Trim(r1)
  21. ; You can Add two fault-tolerant in the [], separated by commas
  22. if RegExMatch(v,"\[([^\]]*)]",r)
  23. {
  24. v:=StrReplace(v,r), r1.=","
  25. StringSplit, r, r1, `,
  26. e1:=r1, e0:=r2
  27. }
  28. StringSplit, r, v, $
  29. color:=r1, v:=r2
  30. StringSplit, r, v, .
  31. w1:=r1, v:=base64tobit(r2), h1:=StrLen(v)//w1
  32. if (r0<2 or h1<1 or w1>sw or h1>sh or StrLen(v)!=w1*h1)
  33. Continue
  34. ;--------------------------------------
  35. mode:=InStr(color,"*") ? 2 : !InStr(color,"#") ? 1 : 0
  36. color:=RegExReplace(color,"[*#]") . "@"
  37. StringSplit, r, color, @
  38. color:=mode=0 ? ((r1-1)//w1)*Stride+Mod(r1-1,w1)*4 : r1
  39. n:=Round(r2,2)+(!r2), n:=Floor(255*3*(1-n))
  40. StrReplace(v,"1","",len1), len0:=StrLen(v)-len1
  41. e1:=Round(len1*e1), e0:=Round(len0*e0)
  42. VarSetCapacity(ss, sw*sh, 0), k:=StrLen(v)*4
  43. VarSetCapacity(s1, k, 0), VarSetCapacity(s0, k, 0)
  44. VarSetCapacity(allpos, 1024*4, 0)
  45. ;--------------------------------------
  46. if (ok:=PicFind(mode,color,n,Scan0,Stride
  47. ,sx,sy,sw,sh,ss,v,s1,s0,e1,e0,w1,h1,allpos))
  48. {
  49. Loop, % ok
  50. pos:=NumGet(allpos, 4*(A_Index-1), "uint")
  51. , rx:=(pos&0xFFFF)+zx, ry:=(pos>>16)+zy
  52. , arr.Push( [rx,ry,w1,h1,comment] )
  53. }
  54. }
  55. if (err1=0 and err0=0 and !arr.MaxIndex())
  56. err1:=err0:=0.1
  57. else Break
  58. }
  59. SetBatchLines, %bch%
  60. return, arr.MaxIndex() ? arr:0
  61. }
  62.  
  63. PicFind(mode, color, n, Scan0, Stride, sx, sy, sw, sh
  64. , ByRef ss, ByRef text, ByRef s1, ByRef s0
  65. , err1, err0, w1, h1, ByRef allpos)
  66. {
  67. static MyFunc, Ptr:=A_PtrSize ? "UPtr" : "UInt"
  68. if !MyFunc
  69. {
  70. x32:="5557565383EC3C8B9C24900000008B7C245085DB0F8EF20"
  71. . "60000C744241400000000C74424100000000031F6C744240C0"
  72. . "0000000C744240800000000C7442418000000008B4C24108BA"
  73. . "C248C0000008B5C24188B54241401CD89C829CB8B8C248C000"
  74. . "000035C247885C97E67892C2489F989D5895C2404EB1F8DB42"
  75. . "6000000008B9C248000000083C50483C0018914B383C601390"
  76. . "424742E8B7C240485C989EA0F45D0803C073175D78B5C24088"
  77. . "B7C247C83C50483C00139042489149F8D7B01897C240875D28"
  78. . "B9C248C000000015C241889CF8344240C018B4C246C8B44240"
  79. . "C014C24108B4C2460014C2414398424900000000F854BFFFFF"
  80. . "F8B44240839F00F4CC689042485FF0F85D80100008B44246C0"
  81. . "34424642B84248C000000894424288B442468034424702B842"
  82. . "49000000039442468894424380F8F960500008B4424608B7C2"
  83. . "4640FAF442468897424148B74245CC744242C000000008D04B"
  84. . "803442454894424348B442428394424640F8F4E0100008B442"
  85. . "468C1E010894424308B442434894424248B442464894424186"
  86. . "6908B4424248B2C240FB65C060289C72B7C245485ED895C240"
  87. . "40FB65C06010FB60406895C240C894424100F84B60300008B8"
  88. . "4248800000031DB894424208B8424840000008944241CEB738"
  89. . "DB426000000003B5C24147D5A8B8424800000008B149801FA0"
  90. . "FB64C16020FB64416012B4C24042B44240C0FB614162B54241"
  91. . "089CDC1FD1F31E929E989C5C1FD1F31E829E889D5C1FD1F01C"
  92. . "131EA29EA01CA395424587C0F836C2420017871908DB426000"
  93. . "0000083C3013B1C240F84290300003B5C24087D8E8B4C247C8"
  94. . "B049901F80FB64C06020FB65406012B4C24042B54240C0FB60"
  95. . "4062B44241089CDC1FD1F31E929E989D5C1FD1F31EA29EA89C"
  96. . "5C1FD1F01D131E829E801C83B4424580F8E42FFFFFF836C241"
  97. . "C010F8937FFFFFF834424180183442424048B4424183944242"
  98. . "80F8DCFFEFFFF83442468018B7C24608B442438017C24343B4"
  99. . "424680F8D89FEFFFF8B54242CE90A0200008B4424608B5C246"
  100. . "40FAF4424688B54246CF7DA83FF018D04988B5C24608D1C938"
  101. . "95C24140F84D90200008B7C2454C744240400000000C744240"
  102. . "C000000008D570169FAE80300008B54247089FB8B7C246CC1E"
  103. . "70285D2897C24107E7B8974241889DF89C58DB426000000008"
  104. . "B44246C85C07E4D8B4C245C8B5C240C8B74245C035C247401E"
  105. . "9036C241001EE0FB651020FB6410169D22B01000069C04B020"
  106. . "00001C20FB6016BC07201D039C70F970383C10483C30139F17"
  107. . "5D38B74246C0174240C8344240401036C24148B44240439442"
  108. . "47075988B7424188B44246C2B84248C000000894424188B442"
  109. . "4702B842490000000894424300F88F30200008B4424688B542"
  110. . "40889F78B6C247CC744241C00000000C744242C00000000C74"
  111. . "4242000000000894424288B44241885C00F88B50000008B442"
  112. . "428C744240400000000C1E010894424248B442464894424148"
  113. . "B4424040344241C39BC248800000089C3894424100F84B4000"
  114. . "0008B8424880000008B3424035C24748B8C248400000089442"
  115. . "40C31C085F60F8434010000894C2408EB2839F87D188B8C248"
  116. . "00000008B348101DE803E007407836C240C01782283C0013B0"
  117. . "4240F840601000039D07DD48B74850001DE803E0174C9836C2"
  118. . "4080179C2834424040183442414018B442404394424180F8D6"
  119. . "6FFFFFF8344242C018B5C246C8B44242C015C241C834424280"
  120. . "1394424300F8D1FFFFFFF8B54242083C43C89D05B5E5F5DC24"
  121. . "800908D74260085D20F84D20100008B7424748B5C241031C08"
  122. . "B8C248400000001F38B74850001DE803E01740583E90178888"
  123. . "3C00139D075E98B7424208B8C249400000089F083C00189442"
  124. . "4208B4424140B442424817C2420FF0300008904B17F9031C08"
  125. . "D76008B4C850083C00101D939D0C601007CF0E93EFFFFFF8B7"
  126. . "C242C8B4424300B4424188B9C24940000008D570181FAFF030"
  127. . "0008904BB0F8F55FFFFFF8954242CE906FDFFFF8B7424208B9"
  128. . "C249400000089F083C00189C1894424208B4424140B4424248"
  129. . "1F9FF0300008904B30F8F1BFFFFFF85D20F84DBFEFFFF8B442"
  130. . "4748B7424108D1C30E973FFFFFF8B5424548B5C2454C744241"
  131. . "800000000C744241C00000000C1EA100FB6FA897C24040FB6F"
  132. . "F8B5C2470897C240C0FB67C2454897C24108B7C246CC1E7028"
  133. . "5DB897C24240F8E8BFDFFFF897424288B4C246C85C97E768B5"
  134. . "C245C8B74241C8B6C245C0374247401C303442424894424200"
  135. . "1C58DB426000000000FB64B020FB653012B4C24042B54240C0"
  136. . "FB6032B44241089CFC1FF1F31F929F989D7C1FF1F31FA29FA8"
  137. . "9C7C1FF1F01D131F829F801C8394424580F9D0683C30483C60"
  138. . "139DD75B98B74246C0174241C8B44242083442418010344241"
  139. . "48B7C2418397C24700F856BFFFFFF8B742428E9E9FCFFFF31D"
  140. . "2E915FEFFFF8B7424208B9C249400000089F083C00189C1894"
  141. . "424208B4424140B44242481F9FF0300008904B30F8EACFDFFF"
  142. . "FE9DFFDFFFFC704240000000031F6C744240800000000E9E3F"
  143. . "9FFFF9090909090909090909090909090"
  144. x64:="4157415641554154555756534883EC38448BA424B800000"
  145. . "04C8BBC24E00000004C89CD448B8C240001000089542410448"
  146. . "98424900000004585C90F8ED10700004889AC2498000000448"
  147. . "9A424B800000031FF488BAC24D8000000448BA424F80000003"
  148. . "1DB31F64531F64531EDC7442408000000004585E47E6248635"
  149. . "42408458D1C1C89D848039424D00000004189F8EB1B83C0014"
  150. . "D63D64183C0044183C6014883C2014139C347890C97742A85C"
  151. . "94589C1440F45C8803A3175D783C0014D63D54183C0044183C"
  152. . "5014883C2014139C346894C950075D6440164240883C601039"
  153. . "C24B800000003BC24A000000039B424000100000F857BFFFFF"
  154. . "F4539F54489F0488BAC2498000000448BA424B8000000410F4"
  155. . "DC58944242485C90F854F0200008B8424B0000000038424C00"
  156. . "000004403A424A80000002B842400010000442BA424F800000"
  157. . "0398424B00000008944242C448964241C0F8F800600008B842"
  158. . "4A00000008BB424A80000000FAF8424B0000000448B6424244"
  159. . "C89BC24E00000004589EFC7442420000000008D04B00344241"
  160. . "0894424288B44241C398424A80000000F8F910100008B8424B"
  161. . "0000000448B6C2428C1E010894424248B8424A800000089442"
  162. . "408418D45024489EF2B7C24104585E44898440FB65C0500418"
  163. . "D450148980FB65C05004963C50FB67405000F846F0400008B8"
  164. . "424F00000004531C0894424188B8424E80000008944240CE98"
  165. . "E000000904539CE7E7B488B8C24E0000000428B048101F88D5"
  166. . "0024863D20FB64C15008D500148980FB64405004863D20FB65"
  167. . "415004429D94189C929F041C1F91F29DA4431C94429C94189D"
  168. . "141C1F91F4431CA4429CA4189C141C1F91F01D14431C84429C"
  169. . "801C8398424900000007C15836C2418010F8898000000662E0"
  170. . "F1F8400000000004983C0014539C40F8EC30300004539C7458"
  171. . "9C10F8E67FFFFFF488B8C24D8000000428B048101F88D50024"
  172. . "863D20FB64C15008D500148980FB64405004863D20FB654150"
  173. . "04429D94189CA29F041C1FA1F29DA4431D14429D14189D241C"
  174. . "1FA1F4431D24429D24189C241C1FA1F01D14431D04429D001C"
  175. . "83B8424900000000F8EFDFEFFFF836C240C010F89F2FEFFFF8"
  176. . "3442408014183C5048B4424083944241C0F8D8DFEFFFF83842"
  177. . "4B0000000018BB424A00000008B44242C017424283B8424B00"
  178. . "000000F8D3AFEFFFF8B4424204883C4385B5E5F5D415C415D4"
  179. . "15E415FC38B8424A00000008BB424A80000000FAF8424B0000"
  180. . "0008D04B08BB424A000000089C24489E0F7D883F9018D04868"
  181. . "94424080F842B030000448B5424108B8C24C00000004531DB3"
  182. . "1F6428D3CA5000000004183C2014569D2E803000085C90F8EA"
  183. . "500000044896C240C448974241889D34C89BC24E0000000448"
  184. . "B6C2408448BB424C00000004C8BBC24C8000000660F1F44000"
  185. . "04585E47E534863C34C63CE4531C0488D4C05024D01F9662E0"
  186. . "F1F8400000000000FB6110FB641FF69D22B01000069C04B020"
  187. . "00001C20FB641FE6BC07201D04139C2430F9704014983C0014"
  188. . "883C1044539C47FCD01FB4401E64183C3014401EB4539DE759"
  189. . "C448B6C240C448B7424184C8BBC24E00000004489E58B8424C"
  190. . "00000002BAC24F80000002B8424000100008944242C0F88420"
  191. . "300008B8424B0000000488BB424D800000031FF897C240C448"
  192. . "B5C24244C8B8C24C80000008BBC24F000000089442420418D4"
  193. . "5FF896C2408C744242800000000C7442418000000004889F54"
  194. . "88D4486044489A424B800000048894424108B44240885C00F8"
  195. . "89E0000008B442420448BA424A800000031DBC1E0108944241"
  196. . "C8B44240C4439F7448D04030F84AC00000031C04585DB89FE4"
  197. . "48B9424E80000007538E957010000660F1F4400004439F17D1"
  198. . "B418B14874401C24863D241803C1100740A83EE0178300F1F4"
  199. . "400004883C0014139C30F8E240100004439E889C17DCC8B548"
  200. . "5004401C24863D241803C110174BB4183EA0179B583C301418"
  201. . "3C401395C24080F8D77FFFFFF83442428018B9C24B80000008"
  202. . "B442428015C240C83442420013944242C0F8D33FFFFFF8B442"
  203. . "418E995FDFFFF0F1F8400000000004585ED0F84080200008B8"
  204. . "C24E80000004C8B5424104889EA8B024401C0489841803C010"
  205. . "1740583E90178904883C2044C39D275E448635424188B4C241"
  206. . "C488BB424080100004409E189D0890C9683C0013DFF0300000"
  207. . "F8F32FDFFFF8944241831C08B5485004883C0014401C24139C"
  208. . "54863D241C60411007FE883C3014183C401395C24080F8DB9F"
  209. . "EFFFFE93DFFFFFF9048635424208B4C24240B4C2408488BB42"
  210. . "40801000089D083C001890C963DFF0300000F8FD5FCFFFF894"
  211. . "42420E98DFCFFFF48635424188B4C241C488BB424080100004"
  212. . "409E189D0890C9683C0013DFF0300000F8FA5FCFFFF4585ED8"
  213. . "94424180F856AFFFFFFE9C1FEFFFF660F1F4400008B7424104"
  214. . "48B8424C000000031C94531DB4889F089F3400FB6F60FB6FC4"
  215. . "28D04A500000000C1EB104585C00FB6DB8944240C0F8E6EFDF"
  216. . "FFF4889AC24980000008BAC249000000044896C24184489742"
  217. . "4104189D54C89BC24E00000004189CE4589DF4585E47E75488"
  218. . "B8C24980000004D63DF4C039C24C80000004963C54531C94C8"
  219. . "D440102410FB608410FB650FF410FB640FE29D929FA4189CA2"
  220. . "9F041C1FA1F4431D14429D14189D241C1FA1F4431D24429D20"
  221. . "1CA89C1C1F91F31C829C801D039C5430F9D040B4983C101498"
  222. . "3C0044539CC7FB144036C240C4501E74183C60144036C24084"
  223. . "439B424C00000000F856FFFFFFF448B6C2418448B7424104C8"
  224. . "BBC24E0000000E99CFCFFFF31C0E97CFBFFFF48635424188B4"
  225. . "C241C488BB424080100004409E189D0890C9683C0013DFF030"
  226. . "0000F8F55FBFFFF89442418E97AFDFFFFC7442424000000004"
  227. . "531F64531EDE9F3F8FFFF909090909090909090909090"
  228. MCode(MyFunc, A_PtrSize=8 ? x64:x32)
  229. }
  230. return, DllCall(&MyFunc
  231. , "int",mode, "uint",color, "int",n, Ptr,Scan0
  232. , "int",Stride, "int",sx, "int",sy, "int",sw, "int",sh
  233. , Ptr,&ss, "AStr",text, Ptr,&s1, Ptr,&s0
  234. , "int",err1, "int",err0, "int",w1, "int",h1, Ptr,&allpos)
  235. }
  236.  
  237. xywh2xywh(x1,y1,w1,h1,ByRef x,ByRef y,ByRef w,ByRef h)
  238. {
  239. SysGet, zx, 76
  240. SysGet, zy, 77
  241. SysGet, zw, 78
  242. SysGet, zh, 79
  243. left:=x1, right:=x1+w1-1, up:=y1, down:=y1+h1-1
  244. left:=left<zx ? zx:left, right:=right>zx+zw-1 ? zx+zw-1:right
  245. up:=up<zy ? zy:up, down:=down>zy+zh-1 ? zy+zh-1:down
  246. x:=left, y:=up, w:=right-left+1, h:=down-up+1
  247. }
  248.  
  249. GetBitsFromScreen(x, y, w, h, ByRef Scan0, ByRef Stride
  250. , ScreenShot=1, ByRef zx="", ByRef zy="")
  251. {
  252. static bits, bpp, oldx, oldy, oldw, oldh
  253. if (ScreenShot or x<oldx or y<oldy
  254. or x+w>oldx+oldw or y+h>oldy+oldh)
  255. {
  256. oldx:=x, oldy:=y, oldw:=w, oldh:=h, ScreenShot:=1
  257. VarSetCapacity(bits, w*h*4), bpp:=32
  258. }
  259. Scan0:=&bits, Stride:=((oldw*bpp+31)//32)*4
  260. zx:=oldx, zy:=oldy
  261. if (!ScreenShot or w*h<1)
  262. return
  263. Ptr:=A_PtrSize ? "UPtr" : "UInt", PtrP:=Ptr . "*"
  264. win:=DllCall("GetDesktopWindow", Ptr)
  265. hDC:=DllCall("GetWindowDC", Ptr,win, Ptr)
  266. mDC:=DllCall("CreateCompatibleDC", Ptr,hDC, Ptr)
  267. ;-------------------------
  268. VarSetCapacity(bi, 40, 0), NumPut(40, bi, 0, "int")
  269. NumPut(w, bi, 4, "int"), NumPut(-h, bi, 8, "int")
  270. NumPut(1, bi, 12, "short"), NumPut(bpp, bi, 14, "short")
  271. ;-------------------------
  272. if hBM:=DllCall("CreateDIBSection", Ptr,mDC, Ptr,&bi
  273. , "int",0, PtrP,ppvBits, Ptr,0, "int",0, Ptr)
  274. {
  275. oBM:=DllCall("SelectObject", Ptr,mDC, Ptr,hBM, Ptr)
  276. DllCall("BitBlt", Ptr,mDC, "int",0, "int",0, "int",w, "int",h
  277. , Ptr,hDC, "int",x, "int",y, "uint",0x00CC0020|0x40000000)
  278. DllCall("RtlMoveMemory", Ptr,Scan0, Ptr,ppvBits, Ptr,Stride*h)
  279. DllCall("SelectObject", Ptr,mDC, Ptr,oBM)
  280. DllCall("DeleteObject", Ptr,hBM)
  281. }
  282. DllCall("DeleteDC", Ptr,mDC)
  283. DllCall("ReleaseDC", Ptr,win, Ptr,hDC)
  284. }
  285.  
  286. MCode(ByRef code, hex)
  287. {
  288. bch:=A_BatchLines
  289. SetBatchLines, -1
  290. VarSetCapacity(code, len:=StrLen(hex)//2)
  291. Loop, % len
  292. NumPut("0x" SubStr(hex,2*A_Index-1,2),code,A_Index-1,"uchar")
  293. Ptr:=A_PtrSize ? "UPtr" : "UInt", PtrP:=Ptr . "*"
  294. DllCall("VirtualProtect",Ptr,&code, Ptr,len,"uint",0x40,PtrP,0)
  295. SetBatchLines, %bch%
  296. }
  297.  
  298. base64tobit(s)
  299. {
  300. Chars:="0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  301. . "abcdefghijklmnopqrstuvwxyz"
  302. SetFormat, IntegerFast, d
  303. StringCaseSense, On
  304. Loop, Parse, Chars
  305. {
  306. i:=A_Index-1, v:=(i>>5&1) . (i>>4&1)
  307. . (i>>3&1) . (i>>2&1) . (i>>1&1) . (i&1)
  308. s:=StrReplace(s,A_LoopField,v)
  309. }
  310. StringCaseSense, Off
  311. s:=SubStr(s,1,InStr(s,"1",0,0)-1)
  312. s:=RegExReplace(s,"[^01]+")
  313. return, s
  314. }
  315.  
  316. bit2base64(s)
  317. {
  318. s:=RegExReplace(s,"[^01]+")
  319. s.=SubStr("100000",1,6-Mod(StrLen(s),6))
  320. s:=RegExReplace(s,".{6}","|$0")
  321. Chars:="0123456789+/ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  322. . "abcdefghijklmnopqrstuvwxyz"
  323. SetFormat, IntegerFast, d
  324. Loop, Parse, Chars
  325. {
  326. i:=A_Index-1, v:="|" . (i>>5&1) . (i>>4&1)
  327. . (i>>3&1) . (i>>2&1) . (i>>1&1) . (i&1)
  328. s:=StrReplace(s,v,A_LoopField)
  329. }
  330. return, s
  331. }
  332.  
  333. ASCII(s)
  334. {
  335. if RegExMatch(s,"\$(\d+)\.([\w+/]+)",r)
  336. {
  337. s:=RegExReplace(base64tobit(r2),".{" r1 "}","$0`n")
  338. s:=StrReplace(StrReplace(s,"0","_"),"1","0")
  339. }
  340. else s=
  341. return, s
  342. }
  343.  
  344. ; You can put the text library at the beginning of the script,
  345. ; and Use Pic(Text,1) to add the text library to Pic()'s Lib,
  346. ; Use Pic("comment1|comment2|...") to get text images from Lib
  347.  
  348. Pic(comments, add_to_Lib=0)
  349. {
  350. static Lib:=[]
  351. if (add_to_Lib)
  352. {
  353. re:="<([^>]*)>[^$]+\$\d+\.[\w+/]+"
  354. Loop, Parse, comments, |
  355. if RegExMatch(A_LoopField,re,r)
  356. Lib[Trim(r1)]:=r
  357. Lib[""]:=""
  358. }
  359. else
  360. {
  361. Text:=""
  362. Loop, Parse, comments, |
  363. Text.="|" . Lib[Trim(A_LoopField)]
  364. return, Text
  365. }
  366. }
  367.  
  368. PicN(number)
  369. {
  370. return, Pic(Trim(RegExReplace(number,".","$0|"),"|"))
  371. }
  372.  
  373. ; Use PicX(Text) to automatically cut into multiple characters
  374.  
  375. PicX(Text)
  376. {
  377. if !RegExMatch(Text,"\|([^$]+)\$(\d+)\.([\w+/]+)",r)
  378. return, Text
  379. w:=r2, v:=base64tobit(r3), Text:=""
  380. c:=StrLen(StrReplace(v,"0"))<=StrLen(v)//2 ? "1":"0"
  381. wz:=RegExReplace(v,".{" w "}","$0`n")
  382. SetFormat, IntegerFast, d
  383. While InStr(wz,c) {
  384. While !(wz~="m`n)^" c)
  385. wz:=RegExReplace(wz,"m`n)^.")
  386. i:=0
  387. While (wz~="m`n)^.{" i "}" c)
  388. i++
  389. v:=RegExReplace(wz,"m`n)^(.{" i "}).*","$1")
  390. wz:=RegExReplace(wz,"m`n)^.{" i "}")
  391. if v!=
  392. Text.="|" r1 "$" i "." bit2base64(v)
  393. }
  394. return, Text
  395. }
  396.  
  397. ; Screenshot and retained as the last screenshot.
  398.  
  399. ScreenShot()
  400. {
  401. n:=150000
  402. xywh2xywh(-n,-n,2*n+1,2*n+1,x,y,w,h)
  403. GetBitsFromScreen(x,y,w,h,Scan0,Stride,1)
  404. }
  405.  
  406. FindTextOCR(nX, nY, nW, nH, err1, err0, Text, Interval=20)
  407. {
  408. OCR:="", RightX:=nX+nW-1, ScreenShot()
  409. While (ok:=FindText(nX, nY, nW, nH, err1, err0, Text, 0))
  410. {
  411. For k,v in ok
  412. {
  413. ; X is the X coordinates of the upper left corner
  414. ; and W is the width of the image have been found
  415. x:=v.1, y:=v.2, w:=v.3, h:=v.4, comment:=v.5
  416. ; We need the leftmost X coordinates
  417. if (A_Index=1 or x<LeftX)
  418. LeftX:=x, LeftY:=y, LeftW:=w, LeftH:=h, LeftOCR:=comment
  419. else if (x=LeftX)
  420. {
  421. Loop, 100
  422. {
  423. err:=A_Index/100
  424. if FindText(x, y, w, h, err, err, Text, 0)
  425. {
  426. LeftX:=x, LeftY:=y, LeftW:=w, LeftH:=h, LeftOCR:=comment
  427. Break
  428. }
  429. if FindText(LeftX, LeftY, LeftW, LeftH, err, err, Text, 0)
  430. Break
  431. }
  432. }
  433. }
  434. ; If the interval exceeds the set value, add "*" to the result
  435. OCR.=(A_Index>1 and LeftX-nX-1>Interval ? "*":"") . LeftOCR
  436. ; Update nX and nW for next search
  437. nX:=LeftX+LeftW-1, nW:=RightX-nX+1
  438. }
  439. return, OCR
  440. }
  441.  
  442. ; Reordering the objects returned from left to right,
  443. ; from top to bottom, ignore slight height difference
  444.  
  445. SortOK(ok, dy=10) {
  446. if !IsObject(ok)
  447. return, ok
  448. SetFormat, IntegerFast, d
  449. For k,v in ok
  450. {
  451. x:=v.1+v.3//2, y:=v.2+v.4//2
  452. y:=A_Index>1 and Abs(y-lasty)<dy ? lasty : y, lasty:=y
  453. n:=(y*150000+x) "." k, s:=A_Index=1 ? n : s "-" n
  454. }
  455. Sort, s, N D-
  456. ok2:=[]
  457. Loop, Parse, s, -
  458. ok2.Push( ok[(StrSplit(A_LoopField,".")[2])] )
  459. return, ok2
  460. }
  461.  
  462. NearestOK(ok, px, py) {
  463. if !IsObject(ok)
  464. return, ok
  465. SetFormat, IntegerFast, d
  466. For k,v in ok
  467. {
  468. x:=v.1+v.3//2, y:=v.2+v.4//2
  469. n:=((x-px)**2+(y-py)**2) "." k
  470. s:=A_Index=1 ? n : s "-" n
  471. }
  472. Sort, s, N D-
  473. ok2:=[]
  474. Loop, Parse, s, -
  475. ok2.Push( ok[(StrSplit(A_LoopField,".")[2])] )
  476. return, ok2
  477. }
  478.  
  479. ; Note: This function is used for combination lookup,
  480. ; for example, a 0-9 text library has been set up,
  481. ; then any ID number can be found.
  482. ; Use Pic(Text,1) and PicN(number) when using.
  483. ; Use PicX(Text) to automatically cut into multiple characters.
  484. ; Color position mode is not supported.
  485.  
  486. FindText2(x, y, w, h, err1, err0, text, ScreenShot=1, Interval=20)
  487. {
  488. xywh2xywh(x,y,w,h,x,y,w,h)
  489. if (w<1 or h<1)
  490. return, 0
  491. bch:=A_BatchLines
  492. SetBatchLines, -1
  493. ;--------------------------------------
  494. GetBitsFromScreen(x,y,w,h,Scan0,Stride,ScreenShot,zx,zy)
  495. ;--------------------------------------
  496. sx:=x-zx, sy:=y-zy, sw:=w, sh:=h, arr:=[]
  497. info:=[], allw:=-1, allv:=allcolor:=allcomment:=""
  498. if (err1=0 and err0=0)
  499. err1:=err0:=0.1
  500. Loop, Parse, text, |
  501. {
  502. v:=A_LoopField
  503. IfNotInString, v, $, Continue
  504. comment:="", e1:=err1, e0:=err0
  505. ; You Can Add Comment Text within The <>
  506. if RegExMatch(v,"<([^>]*)>",r)
  507. v:=StrReplace(v,r), comment:=Trim(r1)
  508. ; You can Add two fault-tolerant in the [], separated by commas
  509. if RegExMatch(v,"\[([^\]]*)]",r)
  510. {
  511. v:=StrReplace(v,r), r1.=","
  512. StringSplit, r, r1, `,
  513. e1:=r1, e0:=r2
  514. }
  515. StringSplit, r, v, $
  516. color:=r1, v:=r2
  517. IfInString, color, #, Continue
  518. StringSplit, r, v, .
  519. w1:=r1, v:=base64tobit(r2), h1:=StrLen(v)//w1
  520. if (r0<2 or h1<1 or w1>sw or h1>sh or StrLen(v)!=w1*h1)
  521. Continue
  522. if (allcolor="")
  523. {
  524. mode:=InStr(color,"*") ? 1 : 0
  525. color:=StrReplace(color,"*") . "@"
  526. StringSplit, r, color, @
  527. allcolor:=r1, n:=Round(r2,2)+(!r2), n:=Floor(255*3*(1-n))
  528. }
  529. StrReplace(v,"1","",len1), len0:=StrLen(v)-len1
  530. e1:=Round(len1*e1), e0:=Round(len0*e0)
  531. info.Push(StrLen(allv),w1,h1,len1,len0,e1,e0)
  532. allv.=v, allw+=w1+1, allcomment.=comment
  533. }
  534. if (allv="")
  535. {
  536. SetBatchLines, %bch%
  537. return, 0
  538. }
  539. num:=info.MaxIndex(), VarSetCapacity(in,num*4,0)
  540. Loop, % num
  541. NumPut(info[A_Index], in, 4*(A_Index-1), "int")
  542. VarSetCapacity(ss, sw*sh, 0), k:=StrLen(allv)*4
  543. VarSetCapacity(s1, k, 0), VarSetCapacity(s0, k, 0)
  544. VarSetCapacity(allpos, 1024*4, 0)
  545. offsetX:=Interval, offsetY:=5
  546. ;--------------------------------------
  547. if (ok:=PicFind2(mode,allcolor,n,Scan0,Stride,sx,sy,sw,sh
  548. ,ss,allv,s1,s0,in,num,offsetX,offsetY,allpos))
  549. {
  550. Loop, % ok
  551. pos:=NumGet(allpos, 4*(A_Index-1), "uint")
  552. , rx:=(pos&0xFFFF)+zx, ry:=(pos>>16)+zy
  553. , arr.Push( [rx,ry,allw,h1,allcomment] )
  554. }
  555. SetBatchLines, %bch%
  556. return, arr.MaxIndex() ? arr:0
  557. }
  558.  
  559. PicFind2(mode, color, n, Scan0, Stride, sx, sy, sw, sh
  560. , ByRef ss, ByRef text, ByRef s1, ByRef s0
  561. , ByRef in, num, offsetX, offsetY, ByRef allpos)
  562. {
  563. static MyFunc, Ptr:=A_PtrSize ? "UPtr" : "UInt"
  564. if !MyFunc
  565. {
  566. x32:="5557565383EC7C8B8424C8000000C7442414000000008BB"
  567. . "C24C000000085C00F8EBA0000008B4424148BB424C40000008"
  568. . "B3486897424088BB424C40000008B5486048B44860885C0895"
  569. . "42404894424107E778B74240831EDC704240000000089F28B4"
  570. . "4240485C07E4C8B4C24088D1C28896C240C89E829E9038C24B"
  571. . "8000000EB0D89049783C00183C20139C3741B803C013175ED8"
  572. . "BAC24BC0000008944B50083C00183C60139C375E58B5C24040"
  573. . "15C24088B6C240C8304240103AC24AC0000008B04243944241"
  574. . "0759883442414078B442414398424C80000000F8F46FFFFFF8"
  575. . "B8424A80000008BB424A40000000FAF8424A00000008B9424A"
  576. . "00000008D3CB08B8424AC000000F7D88D0482894424108B842"
  577. . "49000000085C00F85440500008B842494000000C744240C000"
  578. . "00000C744241400000000C1E8100FB6C08904248B842494000"
  579. . "0000FB6C4894424040FB6842494000000894424088B8424AC0"
  580. . "00000C1E0028944241C8B8424B000000085C00F8E9E0000008"
  581. . "B8424AC00000085C07E798B9C249C0000008B7424148BAC249"
  582. . "C00000003B424B400000001FB037C241C897C241801FD0FB64"
  583. . "B020FB653012B0C242B5424040FB6032B44240889CFC1FF1F3"
  584. . "1F929F989D7C1FF1F31FA29FA01D19931D029D001C83B84249"
  585. . "80000000F9E0683C30483C60139DD75BB8B9424AC000000015"
  586. . "424148B7C24188344240C01037C24108B44240C398424B0000"
  587. . "0000F8562FFFFFF8B9C24C40000008B8424C40000008BB424C"
  588. . "40000008B9424C40000008B5B148B40048B760C8B5210895C2"
  589. . "42C8B9C24C400000089742428895424108B5B18895C24248B9"
  590. . "C24AC00000029C339D60F4DD68BB424C4000000895C2420895"
  591. . "424088B9424B00000002B56088954246C0F889B0400008B942"
  592. . "4BC0000008B74242883E801C744241C00000000C7442460000"
  593. . "00000C744247400000000894424648D14B2895424788B44242"
  594. . "085C00F88E70000008B5424608B8424A8000000C7442404000"
  595. . "0000001D0C1E0108944247089D02B9424D000000089D6BA000"
  596. . "000000F49D6895424580FAF9424AC0000008954245C8B9424D"
  597. . "000000001C289542468908B4424040344241C89C1894424188"
  598. . "B442424394424100F84B40000008B5C240889C6038C24B4000"
  599. . "00031C08B54242C85DB0F8ED10000008934248B5C24288B6C2"
  600. . "410EB2939C57E188BB424C00000008B3C8601CF803F0074078"
  601. . "32C240178289083C001394424080F849B00000039C37ED38BB"
  602. . "424BC0000008B3C8601CF803F0174C283EA0179BD834424040"
  603. . "18B442404394424200F8D66FFFFFF83442460018B9424AC000"
  604. . "0008B4424600154241C3944246C0F8DEFFEFFFF8B4C247483C"
  605. . "47C89C85B5E5F5DC24800908DB426000000008B7C242885FF7"
  606. . "E308BB424B40000008B5C241831C08B54242C01F38BB424BC0"
  607. . "000008B0C8601D9803901740583EA01788683C00139C775EA8"
  608. . "B4424640344240483BC24C800000007894424300F8EB901000"
  609. . "08B8424C4000000C744244C0700000083C020894424348B442"
  610. . "4348B9424AC0000008B7424308B0029C2894424508B8424CC0"
  611. . "0000001F039C20F4EC289C28944245439F20F8C1CFFFFFF8B4"
  612. . "424348B5424688B700C8B6808897424408B70108974241489C"
  613. . "68B4014894424448B8424B00000002B460439C20F4EC289442"
  614. . "40C8B46FC8BB424BC000000890424C1E00201C6038424C0000"
  615. . "000894424488B4424588B7C2430037C245C3B44240C8904240"
  616. . "F8FA50000008D76008DBC270000000085ED7E258B9C24B4000"
  617. . "0008B54241431C001FB8B0C8601D9803901740583EA0178618"
  618. . "3C00139C575EA8B4C244085C90F8E9B0000008B54244439D10"
  619. . "F848F0000008B9C24B4000000896C243831C0897C243C8B6C2"
  620. . "44801FB89CFEB0F8D74260083C00139FA746939C77E658B4C8"
  621. . "50001D980390074EA83EA0179E58B6C24388B7C243C8304240"
  622. . "103BC24AC0000008B04243944240C0F8D65FFFFFF834424300"
  623. . "18B442430394424540F8D2FFFFFFF83442404018B442404394"
  624. . "424200F8D5FFDFFFFE9F4FDFFFF8D76008DBC27000000008B4"
  625. . "424308B7424508344244C07834424341C8D4430FF894424308"
  626. . "B44244C398424C80000000F8F5DFEFFFF8B5C24748B4424040"
  627. . "38424A40000008BB424D40000000B4424708D4B0181F9FF030"
  628. . "00089049E0F8FB5FDFFFF8B54242885D27E278B7424188B942"
  629. . "4B40000008B8424BC0000008D1C328B7424788B1083C00401D"
  630. . "A39F0C6020075F28344240401894C24748B442404394424200"
  631. . "F8DB3FCFFFFE948FDFFFF8B8424940000008BAC24B0000000C"
  632. . "7042400000000C74424040000000083C00169C0E803000089C"
  633. . "38B8424AC000000C1E00285ED894424080F8E73FBFFFF89DD8"
  634. . "BB424AC00000085F67E5B8B8C249C0000008B5C24048BB4249"
  635. . "C000000039C24B400000001F9037C240801FE66900FB651020"
  636. . "FB6410169D22B01000069C04B02000001C20FB6016BC07201D"
  637. . "039C50F970383C10483C30139F175D38B9424AC00000001542"
  638. . "40483042401037C24108B0424398424B00000007586E9F2FAF"
  639. . "FFF83C47C31C95B89C85E5F5DC2480090"
  640. x64:="4157415641554154555756534881EC88000000488B84243"
  641. . "80100004C8BB424180100004C898C24E8000000448B8C24400"
  642. . "10000898C24D00000008954241444898424E00000004C8BAC2"
  643. . "4200100004585C94C8BBC24280100004C8BA42430010000488"
  644. . "9442408C7442410000000000F8EA10000004C89B4241801000"
  645. . "0448BB42408010000488B4424088B68088B308B780485ED7E5"
  646. . "C89F14189F24531DB31DB9085FF7E434863D6468D0C1F4489D"
  647. . "84C01EAEB164C63C14883C20183C1014389048483C0014139C"
  648. . "1741C803A3175E54D63C24883C2014183C2014389048783C00"
  649. . "14139C175E401FE83C3014501F339DD75AF834424100748834"
  650. . "424081C8B442410398424400100000F8F77FFFFFF4C8BB4241"
  651. . "80100008B8424000100008B9C24F80000000FAF8424F000000"
  652. . "0448B8424D00000008D2C988B8424080100008B9C24F000000"
  653. . "0F7D84585C08D0483894424100F855A0500008B7424148B8C2"
  654. . "41001000031D24531ED4889F089F3400FB6F60FB6FC8B84240"
  655. . "8010000C1EB100FB6DBC1E00285C9894424080F8ED70000004"
  656. . "C89BC24280100004C89A42430010000448BBC24E0000000448"
  657. . "BA424080100004C89B424180100004189D64585E47E79488B9"
  658. . "424E80000004D63DD4C039C24180100004863C54531C94C8D4"
  659. . "402020F1F4000410FB608410FB650FF410FB640FE29D929FA4"
  660. . "189CA29F041C1FA1F4431D14429D14189D241C1FA1F4431D24"
  661. . "429D201CA89C1C1F91F31C829C801D04439F8430F9E040B498"
  662. . "3C1014983C0044539CC7FB0036C24084501E54183C601036C2"
  663. . "4104439B424100100000F856CFFFFFF4C8BB424180100004C8"
  664. . "BBC24280100004C8BA42430010000488B9C2438010000488B8"
  665. . "42438010000448B6B108B5B148B50048B400C895C241C488B9"
  666. . "C243801000089C68B5B18895C24188B9C240801000029D3443"
  667. . "9E8895C2414488B9C2438010000410F4CC589C78B842410010"
  668. . "0002B4308894424740F889404000089F04C89BC24280100004"
  669. . "C89A4243001000083E8014D89F4C744240800000000498D448"
  670. . "7044589EE48C744245800000000C744247C000000004189F74"
  671. . "189FD48894424488D42FF894424688B44241485C00F88EB000"
  672. . "000488B5C24588B84240001000001D8C1E0108944247889D82"
  673. . "B84245001000089C6B8000000000F49C631ED894424500FAF8"
  674. . "42408010000894424548B84245001000001D88944246C4889E"
  675. . "84489ED4989C58B44240844896C2410428D3C288B442418413"
  676. . "9C60F84BB0000004189C131C085ED448B44241C0F8EDA00000"
  677. . "04C8B9424280100004C8B9C2430010000EB2E66904139CE7E1"
  678. . "B418B148301FA4863D241803C1400740B4183E901782E0F1F4"
  679. . "400004883C00139C50F8E9A0000004139C789C17ECD418B148"
  680. . "201FA4863D241803C140174BD4183E80179B74983C50144396"
  681. . "C24140F8D68FFFFFF4189ED4883442458018BB424080100004"
  682. . "88B44245801742408394424740F8DE9FEFFFF8B4C247C89C84"
  683. . "881C4880000005B5E5F5D415C415D415E415FC34585FF7E2C4"
  684. . "88B9424280100008B4C241C4C8B4424488B0201F8489841803"
  685. . "C0401740583E901788C4883C2044939D075E58B44246803442"
  686. . "41083BC2440010000070F8EB4010000488B9C2438010000896"
  687. . "C24408BAC240801000044897C24304C896C2438C7442428070"
  688. . "000004189C54883C3204489742434897C24704989DF418B078"
  689. . "9EA29C28944242C8B8424480100004401E839C20F4EC24439E"
  690. . "8894424440F8CEF000000418B47148BBC2410010000412B7F0"
  691. . "4418B5708418B770C458B771089C38B44246C4C897C246039C"
  692. . "70F4FF8496347FC4189DF48C1E0024989C0480384243001000"
  693. . "04C0384242801000048894424208B5C24508B4424544401E83"
  694. . "9FB4189DA0F8F7C0000009085D27E254589F34531C9438B0C8"
  695. . "801C14863C941803C0C0174064183EB0178504983C1014439C"
  696. . "A7FE185F60F8E800000004439FE747B4C8B4C24204489FB453"
  697. . "1DBEB114183C3014983C10439F374624439DE7E5D418B0901C"
  698. . "14863C941803C0C0074E083EB0179DB0F1F840000000000418"
  699. . "3C20101E84439D77D854183C50144396C24440F8D5FFFFFFF4"
  700. . "C8B6C2438448B7C2430448B7424348B6C24404983C50144396"
  701. . "C24140F8D74FDFFFFE907FEFFFF8B44242C4C8B7C246083442"
  702. . "42807458D6C05FF4983C71C8B442428398424400100000F8F9"
  703. . "BFEFFFF448B7C2430448B7424348B6C24404C8B6C24388B7C2"
  704. . "470486344247C8B542410039424F8000000488B9C245801000"
  705. . "00B5424788D480181F9FF0300008914830F8FC1FDFFFF4585F"
  706. . "F7E22488B8424280100004C8B4424488B104883C00401FA493"
  707. . "9C04863D241C604140075EB4983C50144396C2414894C247C0"
  708. . "F8DC8FCFFFFE95BFDFFFF0F1F00448B5424148B94241001000"
  709. . "031DB8B84240801000031F64183C2014569D2E803000085D28"
  710. . "D3C85000000000F8E84FBFFFF4C8BAC24E8000000448B9C240"
  711. . "80100004585DB7E524863C54C63CE4531C0498D4C05024D01F"
  712. . "1660F1F8400000000000FB6110FB641FF69D22B01000069C04"
  713. . "B02000001C20FB641FE6BC07201D04139C2430F9704014983C"
  714. . "0014883C1044539C37FCD01FD4401DE83C301036C2410399C2"
  715. . "4100100007599E908FBFFFF31C9E9CBFCFFFF9090"
  716. MCode(MyFunc, A_PtrSize=8 ? x64:x32)
  717. }
  718. return, DllCall(&MyFunc
  719. , "int",mode, "uint",color, "int",n, Ptr,Scan0
  720. , "int",Stride, "int",sx, "int",sy, "int",sw, "int",sh
  721. , Ptr,&ss, "AStr",text, Ptr,&s1, Ptr,&s0
  722. , Ptr,&in, "int",num, "int",offsetX, "int",offsetY, Ptr,&allpos)
  723. }
  724.  
  725.  
  726. /***** C source code of machine code *****
  727.  
  728. int __attribute__((__stdcall__)) PicFind(
  729. int mode, unsigned int c, int n, unsigned char * Bmp
  730. , int Stride, int sx, int sy, int sw, int sh
  731. , char * ss, char * text, int * s1, int * s0
  732. , int err1, int err0, int w1, int h1, int * allpos)
  733. {
  734. int o, i, j, x, y, sx1, sy1, ok=0;
  735. int r, g, b, rr, gg, bb, e1, e0, len1, len0, max;
  736. // Generate Lookup Table
  737. o=len1=len0=0;
  738. for (y=0; y<h1; y++)
  739. {
  740. for (x=0; x<w1; x++)
  741. {
  742. i=mode==0 ? y*Stride+x*4 : y*sw+x;
  743. if (text[o++]=='1')
  744. s1[len1++]=i;
  745. else
  746. s0[len0++]=i;
  747. }
  748. }
  749. // Color Position Mode
  750. // This mode will not clear the image that has been found
  751. if (mode==0)
  752. {
  753. sx1=sx+sw-w1; sy1=sy+sh-h1; max=len1>len0 ? len1 : len0;
  754. for (y=sy; y<=sy1; y++)
  755. {
  756. for (x=sx; x<=sx1; x++)
  757. {
  758. o=y*Stride+x*4; e1=err1; e0=err0;
  759. j=o+c; rr=Bmp[2+j]; gg=Bmp[1+j]; bb=Bmp[j];
  760. for (i=0; i<max; i++)
  761. {
  762. if (i<len1)
  763. {
  764. j=o+s1[i]; r=Bmp[2+j]-rr; g=Bmp[1+j]-gg; b=Bmp[j]-bb;
  765. if (r<0) r=-r; if (g<0) g=-g; if (b<0) b=-b;
  766. if (r+g+b>n && (--e1)<0) goto NoMatch2;
  767. }
  768. if (i<len0)
  769. {
  770. j=o+s0[i]; r=Bmp[2+j]-rr; g=Bmp[1+j]-gg; b=Bmp[j]-bb;
  771. if (r<0) r=-r; if (g<0) g=-g; if (b<0) b=-b;
  772. if (r+g+b<=n && (--e0)<0) goto NoMatch2;
  773. }
  774. }
  775. allpos[ok++]=y<<16|x;
  776. if (ok>=1024) goto Return1;
  777. NoMatch2:
  778. continue;
  779. }
  780. }
  781. goto Return1;
  782. }
  783. // Generate Two Value Image
  784. o=sy*Stride+sx*4; j=Stride-4*sw; i=0;
  785. if (mode==1) // Color Mode
  786. {
  787. rr=(c>>16)&0xFF; gg=(c>>8)&0xFF; bb=c&0xFF;
  788. for (y=0; y<sh; y++, o+=j)
  789. for (x=0; x<sw; x++, o+=4, i++)
  790. {
  791. r=Bmp[2+o]-rr; g=Bmp[1+o]-gg; b=Bmp[o]-bb;
  792. if (r<0) r=-r; if (g<0) g=-g; if (b<0) b=-b;
  793. ss[i]=r+g+b<=n ? 1:0;
  794. }
  795. }
  796. else // Gray Threshold Mode
  797. {
  798. c=(c+1)*1000;
  799. for (y=0; y<sh; y++, o+=j)
  800. for (x=0; x<sw; x++, o+=4, i++)
  801. ss[i]=Bmp[2+o]*299+Bmp[1+o]*587+Bmp[o]*114<c ? 1:0;
  802. }
  803. // Start Lookup
  804. sx1=sw-w1; sy1=sh-h1; max=len1>len0 ? len1 : len0;
  805. for (y=0; y<=sy1; y++)
  806. {
  807. for (x=0; x<=sx1; x++)
  808. {
  809. o=y*sw+x; e1=err1; e0=err0;
  810. if (e0==len0)
  811. {
  812. for (i=0; i<len1; i++)
  813. if (ss[o+s1[i]]!=1 && (--e1)<0) goto NoMatch1;
  814. }
  815. else
  816. {
  817. for (i=0; i<max; i++)
  818. {
  819. if (i<len1 && ss[o+s1[i]]!=1 && (--e1)<0) goto NoMatch1;
  820. if (i<len0 && ss[o+s0[i]]!=0 && (--e0)<0) goto NoMatch1;
  821. }
  822. }
  823. allpos[ok++]=(sy+y)<<16|(sx+x);
  824. if (ok>=1024) goto Return1;
  825. // Clear the image that has been found
  826. for (i=0; i<len1; i++) ss[o+s1[i]]=0;
  827. NoMatch1:
  828. continue;
  829. }
  830. }
  831. Return1:
  832. return ok;
  833. }
  834.  
  835.  
  836. int __attribute__((__stdcall__)) PicFind2(
  837. int mode, unsigned int c, int n, unsigned char * Bmp
  838. , int Stride, int sx, int sy, int sw, int sh
  839. , char * ss, char * text, int * s1, int * s0
  840. , int * in, int num, int offsetX, int offsetY, int * allpos )
  841. {
  842. int o, i, j, x, y, r, g, b, rr, gg, bb, max, e1, e0, ok=0;
  843. int o1, x1, y1, w1, h1, sx1, sy1, len1, len0, err1, err0;
  844. int o2, x2, y2, w2, h2, sx2, sy2, len21, len20, err21, err20;
  845. // Generate Lookup Table
  846. for (j=0; j<num; j+=7)
  847. {
  848. o=o1=o2=in[j]; w1=in[j+1]; h1=in[j+2];
  849. for (y=0; y<h1; y++)
  850. {
  851. for (x=0; x<w1; x++)
  852. {
  853. i=y*sw+x;
  854. if (text[o++]=='1')
  855. s1[o1++]=i;
  856. else
  857. s0[o2++]=i;
  858. }
  859. }
  860. }
  861. // Generate Two Value Image
  862. o=sy*Stride+sx*4; j=Stride-4*sw; i=0;
  863. if (mode==0) // Color Mode
  864. {
  865. rr=(c>>16)&0xFF; gg=(c>>8)&0xFF; bb=c&0xFF;
  866. for (y=0; y<sh; y++, o+=j)
  867. for (x=0; x<sw; x++, o+=4, i++)
  868. {
  869. r=Bmp[2+o]-rr; g=Bmp[1+o]-gg; b=Bmp[o]-bb;
  870. if (r<0) r=-r; if (g<0) g=-g; if (b<0) b=-b;
  871. ss[i]=r+g+b<=n ? 1:0;
  872. }
  873. }
  874. else // Gray Threshold Mode
  875. {
  876. c=(c+1)*1000;
  877. for (y=0; y<sh; y++, o+=j)
  878. for (x=0; x<sw; x++, o+=4, i++)
  879. ss[i]=Bmp[2+o]*299+Bmp[1+o]*587+Bmp[o]*114<c ? 1:0;
  880. }
  881. // Start Lookup
  882. w1=in[1]; h1=in[2]; len1=in[3]; len0=in[4]; err1=in[5]; err0=in[6];
  883. sx1=sw-w1; sy1=sh-h1; max=len1>len0 ? len1 : len0;
  884. for (y=0; y<=sy1; y++)
  885. {
  886. for (x=0; x<=sx1; x++)
  887. {
  888. o=y*sw+x; e1=err1; e0=err0;
  889. if (e0==len0)
  890. {
  891. for (i=0; i<len1; i++)
  892. if (ss[o+s1[i]]!=1 && (--e1)<0) goto NoMatch1;
  893. }
  894. else
  895. {
  896. for (i=0; i<max; i++)
  897. {
  898. if (i<len1 && ss[o+s1[i]]!=1 && (--e1)<0) goto NoMatch1;
  899. if (i<len0 && ss[o+s0[i]]!=0 && (--e0)<0) goto NoMatch1;
  900. }
  901. }
  902. x1=x+w1-1; y1=y-offsetY; if (y1<0) y1=0;
  903. for (j=7; j<num; j+=7)
  904. {
  905. o2=in[j]; w2=in[j+1]; h2=in[j+2];
  906. len21=in[j+3]; len20=in[j+4]; err21=in[j+5]; err20=in[j+6];
  907. sx2=sw-w2; i=x1+offsetX; if (i<sx2) sx2=i;
  908. sy2=sh-h2; i=y+offsetY; if (i<sy2) sy2=i;
  909. for (x2=x1; x2<=sx2; x2++)
  910. {
  911. for (y2=y1; y2<=sy2; y2++)
  912. {
  913. o1=y2*sw+x2; e1=err21; e0=err20;
  914. for (i=0; i<len21; i++)
  915. if (ss[o1+s1[o2+i]]!=1 && (--e1)<0) goto NoMatch2;
  916. for (i=0; e0!=len20 && i<len20; i++)
  917. if (ss[o1+s0[o2+i]]!=0 && (--e0)<0) goto NoMatch2;
  918. goto MatchOK;
  919. NoMatch2:
  920. continue;
  921. }
  922. }
  923. goto NoMatch1;
  924. MatchOK:
  925. x1=x2+w2-1;
  926. }
  927. allpos[ok++]=(sy+y)<<16|(sx+x);
  928. if (ok>=1024) goto Return1;
  929. // Clear the image that has been found
  930. for (i=0; i<len1; i++) ss[o+s1[i]]=0;
  931. NoMatch1:
  932. continue;
  933. }
  934. }
  935. Return1:
  936. return ok;
  937. }
  938.  
  939. */
  940.  
  941.  
  942. ;================= The End =================
  943.  
  944. ;***********Left click*******************
  945. FindText_Left_Click(Obj,X_Adj=0,Y_Adj=0,Move_Back=0){
  946. CoordMode, Mouse
  947. MouseGetPos,Orig_X,Orig_Y
  948. x:=(obj.1+obj.3//2)+X_Adj
  949. y:=(obj.2+obj.4//2)+Y_Adj
  950. Click, %X%,%Y%
  951. if (Move_Back){
  952. Sleep, 30
  953. MouseMove, %Orig_X%,%Orig_Y%
  954. }
  955. Return
  956. }
  957.  
  958. ;***********Right click*******************
  959. FindText_Right_Click(Obj,X_Adj=0,Y_Adj=0,Move_Back=0){
  960. CoordMode, Mouse
  961. MouseGetPos,Orig_X,Orig_Y
  962. x:=(obj.1+obj.3//2)+X_Adj
  963. y:=(obj.2+obj.4//2)+Y_Adj
  964. Click Right, %X%,%Y%
  965. if (Move_Back){
  966. Sleep, 30
  967. MouseMove, %Orig_X%,%Orig_Y%
  968. }
  969. Return
  970. }
  971.  
  972. ;***********Double click*******************
  973. FindText_Double_Click(Obj,X_Adj=0,Y_Adj=0,Move_Back=0){
  974. CoordMode, Mouse
  975. MouseGetPos,Orig_X,Orig_Y
  976. x:=(obj.1+obj.3//2)+X_Adj
  977. y:=(obj.2+obj.4//2)+Y_Adj
  978. MouseMove, %X%,%Y%
  979. Click 2
  980. if (Move_Back){
  981. Sleep, 30
  982. MouseMove, %Orig_X%,%Orig_Y%
  983. }
  984. }
  985.  
  986. ;***********Move mouse to location*******************
  987. FindText_Move_Mouse(Obj,X_Adj=0,Y_Adj=0){
  988. CoordMode, Mouse
  989. x:=(obj.1+obj.3//2)+X_Adj
  990. y:=(obj.2+obj.4//2)+Y_Adj
  991. MouseMove, %X%,%Y%
  992. }
  993.  
  994. ;***********Send text to location*******************
  995. FindText_Send_Text(Obj,Text,Enter=0,X_Adj=0,Y_Adj=0,Move_Back=0){
  996. CoordMode, Mouse
  997. MouseGetPos,Orig_X,Orig_Y
  998. x:=(obj.1+obj.3//2)+X_Adj
  999. y:=(obj.2+obj.4//2)+Y_Adj
  1000. MouseMove, %X%,%Y%
  1001. Sleep 30
  1002. Click, %X%,%Y%
  1003. Sleep 30
  1004. SendInput , %Text%
  1005. if (Enter=1)
  1006. SendInput , {Enter}
  1007. if (Move_Back){
  1008. Sleep, 30
  1009. MouseMove, %Orig_X%,%Orig_Y%
  1010. }
  1011. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement