diff --git a/bitmap/goBitmap.h b/bitmap/goBitmap.h index 2a17bbd..0ac6557 100644 --- a/bitmap/goBitmap.h +++ b/bitmap/goBitmap.h @@ -60,40 +60,32 @@ MMPoint find_bitmap(MMBitmapRef bitmap, MMBitmapRef sbit, float tolerance){ // printf("x=%d, y=%d, width=%d, height=%d\n", rect.origin.x, // rect.origin.y, rect.size.width, rect.size.height); - if (findBitmapInRect(bitmap, sbit, &point, - rect, tolerance) == 0) { + if (findBitmapInRect(bitmap, sbit, &point, rect, tolerance) == 0) { return point; } return point; } -MMPoint *find_every_bitmap(MMBitmapRef bitmap, MMBitmapRef sbit, float tolerance, MMPoint *list){ - if (!bitmap_ready(bitmap) || !bitmap_ready(sbit)) return NULL; +MMPointArrayRef find_every_bitmap(MMBitmapRef bitmap, MMBitmapRef sbit, float tolerance, MMPoint *list){ + if (!bitmap_ready(bitmap) || !bitmap_ready(sbit)) { return NULL; } MMPoint point; MMPointArrayRef pointArray; - MMRect rect = MMBitmapGetBounds(bitmap); + MMRect rect = MMBitmapGetBounds(sbit); - if (findBitmapInRect(bitmap, sbit, &point, - rect, tolerance) == 0) { - return NULL; + if (findBitmapInRect(bitmap, sbit, &point, rect, tolerance) == 0) { + // return NULL; } pointArray = findAllBitmapInRect(bitmap, sbit, rect, tolerance); - if (pointArray == NULL) return NULL; - - memcpy(list, pointArray->array, sizeof(MMPoint) * pointArray->count); - destroyMMPointArray(pointArray); - - return list; + return pointArray; } int count_of_bitmap(MMBitmapRef bitmap, MMBitmapRef sbit, float tolerance){ if (!bitmap_ready(bitmap) || !bitmap_ready(sbit)) return 0; MMRect rect = MMBitmapGetBounds(bitmap); - return countOfBitmapInRect(bitmap, sbit, rect, tolerance); } @@ -126,9 +118,8 @@ MMBitmapRef bitmap_from_string(const char *str){ MMBitmapRef bitmap; MMBMPStringError err; - if ((bitmap = createMMBitmapFromString( - (unsigned char*)str, len, &err ) - ) == NULL) { + if ((bitmap = createMMBitmapFromString((unsigned char*)str, len, &err )) + == NULL) { return NULL; } @@ -148,7 +139,6 @@ char *tostring_bitmap(MMBitmapRef bitmap){ MMBMPStringError err; buf = (char *)createStringFromMMBitmap(bitmap, &err); - return buf; } @@ -174,7 +164,7 @@ MMBitmapRef get_portion(MMBitmapRef bit_map, MMRect rect){ } MMRGBHex bitmap_get_color(MMBitmapRef bitmap, size_t x, size_t y){ - if (!bitmap_ready(bitmap)) return 0; + if (!bitmap_ready(bitmap)) { return 0; } MMPoint point; point = MMPointMake(x, y); @@ -197,6 +187,15 @@ MMPoint bitmap_find_color(MMBitmapRef bitmap, MMRGBHex color, float tolerance){ return point; } +MMPointArrayRef bitmap_find_every_color(MMBitmapRef bitmap, MMRGBHex color, float tolerance, MMPoint *list){ + if (!bitmap_ready(bitmap)) { return NULL; } + MMRect rect = MMBitmapGetBounds(bitmap); + MMPointArrayRef pointArray; + + pointArray = findAllColorInRect(bitmap, color, rect, tolerance); + return pointArray; +} + int bitmap_count_of_color(MMBitmapRef bitmap, MMRGBHex color, float tolerance){ if (!bitmap_ready(bitmap)) return 0; MMRect rect = MMBitmapGetBounds(bitmap); diff --git a/robotgo.go b/robotgo.go index 7adf936..3cdc1ff 100644 --- a/robotgo.go +++ b/robotgo.go @@ -1017,8 +1017,13 @@ func FindPic(path string, args ...interface{}) (int, int) { return fx, fy } +// FreeMMPointArr free MMPoint array +func FreeMMPointArr(pointArray C.MMPointArrayRef) { + C.destroyMMPointArray(pointArray) +} + // FindEveryBitmap find the every bitmap -func FindEveryBitmap(bit C.MMBitmapRef, args ...interface{}) (int, int) { +func FindEveryBitmap(bit C.MMBitmapRef, args ...interface{}) (posArr []MPoint) { var ( sbit C.MMBitmapRef tolerance C.float = 0.01 @@ -1053,9 +1058,23 @@ func FindEveryBitmap(bit C.MMBitmapRef, args ...interface{}) (int, int) { if len(args) <= 0 { FreeBitmap(sbit) } + if pos == nil { + return + } + defer FreeMMPointArr(pos) + + cSize := pos.count + cArray := pos.array + gSlice := (*[(1 << 28) - 1]C.MMPoint)(unsafe.Pointer(cArray))[:cSize:cSize] + for i := 0; i < len(gSlice); i++ { + posArr = append(posArr, MPoint{ + x: int(gSlice[i].x), + y: int(gSlice[i].y), + }) + } // fmt.Println("pos----", pos) - return int(pos.x), int(pos.y) + return } // CountBitmap count of the bitmap @@ -1298,6 +1317,60 @@ func FindColorCS(color CHex, x, y, w, h int, args ...float64) (int, int) { return rx, ry } +// FindEveryColor find every color +func FindEveryColor(color CHex, args ...interface{}) (posArr []MPoint) { + var ( + bitmap C.MMBitmapRef + tolerance C.float = 0.01 + lpos C.MMPoint + ) + + if len(args) > 0 && args[0] != nil { + bitmap = args[0].(C.MMBitmapRef) + } else { + bitmap = CaptureScreen() + } + + if len(args) > 1 { + tolerance = C.float(args[1].(float64)) + } + + if len(args) > 2 { + lpos.x = C.size_t(args[2].(int)) + lpos.y = 0 + } else { + lpos.x = 0 + lpos.y = 0 + } + + if len(args) > 3 { + lpos.x = C.size_t(args[2].(int)) + lpos.y = C.size_t(args[3].(int)) + } + + pos := C.bitmap_find_every_color(bitmap, C.MMRGBHex(color), tolerance, &lpos) + if len(args) <= 0 { + FreeBitmap(bitmap) + } + + if pos == nil { + return + } + defer FreeMMPointArr(pos) + + cSize := pos.count + cArray := pos.array + gSlice := (*[(1 << 28) - 1]C.MMPoint)(unsafe.Pointer(cArray))[:cSize:cSize] + for i := 0; i < len(gSlice); i++ { + posArr = append(posArr, MPoint{ + x: int(gSlice[i].x), + y: int(gSlice[i].y), + }) + } + + return +} + // CountColor count bitmap color func CountColor(color CHex, args ...interface{}) int { var (