From 5bf71e637e6fc943fdc5ddde1eb3431f40e4bc8e Mon Sep 17 00:00:00 2001 From: vcaesar Date: Tue, 26 Jan 2021 12:59:47 -0400 Subject: [PATCH 1/5] add find every color code --- bitmap/goBitmap.h | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/bitmap/goBitmap.h b/bitmap/goBitmap.h index 2a17bbd..424ad09 100644 --- a/bitmap/goBitmap.h +++ b/bitmap/goBitmap.h @@ -60,8 +60,7 @@ 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; } @@ -69,19 +68,18 @@ MMPoint find_bitmap(MMBitmapRef bitmap, MMBitmapRef sbit, float tolerance){ } MMPoint *find_every_bitmap(MMBitmapRef bitmap, MMBitmapRef sbit, float tolerance, MMPoint *list){ - if (!bitmap_ready(bitmap) || !bitmap_ready(sbit)) return NULL; + if (!bitmap_ready(bitmap) || !bitmap_ready(sbit)) { return NULL; } MMPoint point; MMPointArrayRef pointArray; MMRect rect = MMBitmapGetBounds(bitmap); - if (findBitmapInRect(bitmap, sbit, &point, - rect, tolerance) == 0) { + if (findBitmapInRect(bitmap, sbit, &point, rect, tolerance) == 0) { return NULL; } pointArray = findAllBitmapInRect(bitmap, sbit, rect, tolerance); - if (pointArray == NULL) return NULL; + if (pointArray == NULL) { return NULL; } memcpy(list, pointArray->array, sizeof(MMPoint) * pointArray->count); destroyMMPointArray(pointArray); @@ -93,7 +91,6 @@ 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 +123,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 +144,6 @@ char *tostring_bitmap(MMBitmapRef bitmap){ MMBMPStringError err; buf = (char *)createStringFromMMBitmap(bitmap, &err); - return buf; } @@ -174,7 +169,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 +192,21 @@ 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){ + 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; +} + int bitmap_count_of_color(MMBitmapRef bitmap, MMRGBHex color, float tolerance){ if (!bitmap_ready(bitmap)) return 0; MMRect rect = MMBitmapGetBounds(bitmap); From 5c45871af70efe3a26fa474b7189e2fa56f4afc2 Mon Sep 17 00:00:00 2001 From: vcaesar Date: Thu, 28 Jan 2021 13:46:08 -0400 Subject: [PATCH 2/5] add find every color function --- robotgo.go | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/robotgo.go b/robotgo.go index 7adf936..8034eb0 100644 --- a/robotgo.go +++ b/robotgo.go @@ -1298,6 +1298,45 @@ 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{}) (int, int) { + 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) + } + + return int(pos.x), int(pos.y) +} + // CountColor count bitmap color func CountColor(color CHex, args ...interface{}) int { var ( From 488a81253f5c4aa5fe037fd7c9f5f3da43f6cbff Mon Sep 17 00:00:00 2001 From: vcaesar Date: Fri, 29 Jan 2021 13:56:58 -0400 Subject: [PATCH 3/5] 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 From 25a40029243664e424f11015c3df78a1637d39f8 Mon Sep 17 00:00:00 2001 From: vcaesar Date: Sun, 31 Jan 2021 12:44:15 -0400 Subject: [PATCH 4/5] update find bitmap and color --- bitmap/goBitmap.h | 2 +- robotgo.go | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/bitmap/goBitmap.h b/bitmap/goBitmap.h index 359d9f2..0ac6557 100644 --- a/bitmap/goBitmap.h +++ b/bitmap/goBitmap.h @@ -75,7 +75,7 @@ MMPointArrayRef find_every_bitmap(MMBitmapRef bitmap, MMBitmapRef sbit, float to MMRect rect = MMBitmapGetBounds(sbit); if (findBitmapInRect(bitmap, sbit, &point, rect, tolerance) == 0) { - return NULL; + // return NULL; } pointArray = findAllBitmapInRect(bitmap, sbit, rect, tolerance); diff --git a/robotgo.go b/robotgo.go index 655e599..5eaa344 100644 --- a/robotgo.go +++ b/robotgo.go @@ -1055,10 +1055,13 @@ func FindEveryBitmap(bit C.MMBitmapRef, args ...interface{}) (posArr []MPoint) { pos := C.find_every_bitmap(bit, sbit, tolerance, &lpos) // FreeBitmap(bit) - defer FreeMMPointArr(pos) if len(args) <= 0 { FreeBitmap(sbit) } + if pos == nil { + return + } + defer FreeMMPointArr(pos) cSize := pos.count cArray := pos.array @@ -1346,11 +1349,15 @@ func FindEveryColor(color CHex, args ...interface{}) (posArr []MPoint) { } pos := C.bitmap_find_every_color(bitmap, C.MMRGBHex(color), tolerance, &lpos) - defer FreeMMPointArr(pos) if len(args) <= 0 { FreeBitmap(bitmap) } + if pos == nil { + return + } + defer FreeMMPointArr(pos) + cSize := pos.count cArray := pos.array gSlice := (*[1 << 30]C.MMPoint)(unsafe.Pointer(cArray))[:cSize:cSize] From bfaba0b1d2bb8760d071e6556c2822fd7349eefc Mon Sep 17 00:00:00 2001 From: vcaesar Date: Sun, 31 Jan 2021 13:29:42 -0400 Subject: [PATCH 5/5] compatible with 32-bit platforms --- robotgo.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/robotgo.go b/robotgo.go index 5eaa344..3cdc1ff 100644 --- a/robotgo.go +++ b/robotgo.go @@ -1065,7 +1065,7 @@ func FindEveryBitmap(bit C.MMBitmapRef, args ...interface{}) (posArr []MPoint) { cSize := pos.count cArray := pos.array - gSlice := (*[1 << 30]C.MMPoint)(unsafe.Pointer(cArray))[:cSize:cSize] + 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), @@ -1360,7 +1360,7 @@ func FindEveryColor(color CHex, args ...interface{}) (posArr []MPoint) { cSize := pos.count cArray := pos.array - gSlice := (*[1 << 30]C.MMPoint)(unsafe.Pointer(cArray))[:cSize:cSize] + 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),