static void initBadShiftTable(UTHashTable *jumpTable, MMBitmapRef needle) { const MMPoint lastPoint = MMPointMake(needle->width - 1, needle->height - 1); const size_t maxColors = needle->width * needle->height; MMPoint scan; printf("lastpoint=%d,%d, maxColors=%d\n", lastPoint.x, lastPoint.y, maxColors); /* Allocate max size initially to avoid a million calls to malloc(). */ initHashTable(jumpTable, maxColors, sizeof(struct shiftNode)); printf("init table finished!\n"); int i = 0; /* Populate jumpTable with analysis of |needle|. */ for (scan.y = lastPoint.y; ; --scan.y) { for (scan.x = lastPoint.x; ; --scan.x) { MMRGBHex color = MMRGBHexAtPoint(needle, scan.x, scan.y); if (!tableHasKey(jumpTable, color)) { i++; addNodeToTable(jumpTable, color, MMPointMake(needle->width - scan.x, needle->height - scan.y)); } if (scan.x == 0) break; /* Avoid infinite loop from unsigned type. */ } if (scan.y == 0) break; } printf("i = %d\n", i); //printf("init func finished!\n"); }
INLINE MMPoint getMousePos() { #if defined(IS_MACOSX) CGEventRef event = CGEventCreate(NULL); CGPoint point = CGEventGetLocation(event); CFRelease(event); return MMPointFromCGPoint(point); #elif defined(USE_X11) int x, y; /* This is all we care about. Seriously. */ Window garb1, garb2; /* Why you can't specify NULL as a parameter */ int garb_x, garb_y; /* is beyond me. */ unsigned int more_garbage; Display *display = XGetMainDisplay(); XQueryPointer(display, XDefaultRootWindow(display), &garb1, &garb2, &x, &y, &garb_x, &garb_y, &more_garbage); return MMPointMake(x, y); #elif defined(IS_WINDOWS) POINT point; GetCursorPos(&point); return MMPointFromPOINT(point); #endif }
MMRect MMRectMake(size_t x, size_t y, size_t width, size_t height) { MMRect rect; rect.origin = MMPointMake(x, y); rect.size = MMSizeMake(width, height); return rect; }
static int needleAtOffset(MMBitmapRef needle, MMBitmapRef haystack, MMPoint offset, float tolerance) { const MMPoint lastPoint = MMPointMake(needle->width - 1, needle->height - 1); MMPoint scan; /* Note that |needle| is searched backwards, in accordance with the * Boyer-Moore search algorithm. */ for (scan.y = lastPoint.y; ; --scan.y) { for (scan.x = lastPoint.x; ; --scan.x) { MMRGBHex ncolor = MMRGBHexAtPoint(needle, scan.x, scan.y); MMRGBHex hcolor = MMRGBHexAtPoint(haystack, offset.x + scan.x, offset.y + scan.y); if (!MMRGBHexSimilarToColor(ncolor, hcolor, tolerance)) return 0; if (scan.x == 0) break; /* Avoid infinite loop from unsigned type. */ } if (scan.y == 0) break; } return 1; }