From 488a81253f5c4aa5fe037fd7c9f5f3da43f6cbff Mon Sep 17 00:00:00 2001 From: vcaesar Date: Fri, 29 Jan 2021 13:56:58 -0400 Subject: [PATCH] add free and find all point function --- bitmap/goBitmap.h | 21 +++++---------------- robotgo.go | 35 +++++++++++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/bitmap/goBitmap.h b/bitmap/goBitmap.h index 424ad09..359d9f2 100644 --- a/bitmap/goBitmap.h +++ b/bitmap/goBitmap.h @@ -67,24 +67,19 @@ MMPoint find_bitmap(MMBitmapRef bitmap, MMBitmapRef sbit, float tolerance){ return point; } -MMPoint *find_every_bitmap(MMBitmapRef bitmap, MMBitmapRef sbit, float tolerance, MMPoint *list){ +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; } 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){ @@ -192,19 +187,13 @@ MMPoint bitmap_find_color(MMBitmapRef bitmap, MMRGBHex color, float tolerance){ return point; } -MMPoint *bitmap_find_every_color(MMBitmapRef bitmap, MMRGBHex color, float tolerance, MMPoint *list){ +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); - if (pointArray == NULL) { return NULL; } - - memcpy(list, pointArray->array, sizeof(MMPoint) * pointArray->count); - destroyMMPointArray(pointArray); - if (list == NULL) { return NULL; } - - return list; + return pointArray; } int bitmap_count_of_color(MMBitmapRef bitmap, MMRGBHex color, float tolerance){ diff --git a/robotgo.go b/robotgo.go index 8034eb0..655e599 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 @@ -1050,12 +1055,23 @@ func FindEveryBitmap(bit C.MMBitmapRef, args ...interface{}) (int, int) { pos := C.find_every_bitmap(bit, sbit, tolerance, &lpos) // FreeBitmap(bit) + defer FreeMMPointArr(pos) if len(args) <= 0 { FreeBitmap(sbit) } + cSize := pos.count + cArray := pos.array + gSlice := (*[1 << 30]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 @@ -1299,7 +1315,7 @@ func FindColorCS(color CHex, x, y, w, h int, args ...float64) (int, int) { } // FindEveryColor find every color -func FindEveryColor(color CHex, args ...interface{}) (int, int) { +func FindEveryColor(color CHex, args ...interface{}) (posArr []MPoint) { var ( bitmap C.MMBitmapRef tolerance C.float = 0.01 @@ -1330,11 +1346,22 @@ func FindEveryColor(color CHex, args ...interface{}) (int, int) { } pos := C.bitmap_find_every_color(bitmap, C.MMRGBHex(color), tolerance, &lpos) + defer FreeMMPointArr(pos) if len(args) <= 0 { FreeBitmap(bitmap) } - return int(pos.x), int(pos.y) + cSize := pos.count + cArray := pos.array + gSlice := (*[1 << 30]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