!7 p { RGBImage a = null, b = rgbShootScreen(); repeat { sleep(500); time { a = b; b = rgbShootScreen(); print("*"); compare(a, b); } } } svoid compare(RGBImage a, RGBImage b) { //new HashSet deltas; for tries to 10: { Rect r = randomScreenRect(50, 50); RGBImage clip = a.clip(r); if (rgbInnerPrecision(clip) >= 0.5f) { Rect r2 = rgbSearchPrecise(b, clip); if (r2 != null && neq(r, r2)) { Pt delta = new Pt(r2.x-r.x, r2.y-r.y); print("Movement: " + delta + ". Match size: " + expandMatch(a, b, r, r2)); } } } //print("Deltas: " + deltas); } static Rect expandMatch(RGBImage a, RGBImage b, Rect r1, Rect r2) { assertEquals(r1.w, r2.w); assertEquals(r1.h, r2.h); //do { Rect r = r2; while (r2.x > 0 && r1.x > 0 && rgbImageSectionsIdentical(a, new Rect(r1.x-1, r1.y, 1, r1.h), b, new Rect(r2.x-1, r2.y, 1, r2.h))) r1 = growRectLeft(r1); r2 = growRectLeft(r2); ret r2; }