mirror of
https://github.com/go-vgo/robotgo.git
synced 2025-06-02 23:23:55 +00:00
Merge pull request #310 from go-vgo/bitmap-pr
optimize find every bitmap and color function
This commit is contained in:
commit
7b583478d4
@ -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,
|
// printf("x=%d, y=%d, width=%d, height=%d\n", rect.origin.x,
|
||||||
// rect.origin.y, rect.size.width, rect.size.height);
|
// rect.origin.y, rect.size.width, rect.size.height);
|
||||||
|
|
||||||
if (findBitmapInRect(bitmap, sbit, &point,
|
if (findBitmapInRect(bitmap, sbit, &point, rect, tolerance) == 0) {
|
||||||
rect, tolerance) == 0) {
|
|
||||||
return point;
|
return point;
|
||||||
}
|
}
|
||||||
|
|
||||||
return point;
|
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;
|
if (!bitmap_ready(bitmap) || !bitmap_ready(sbit)) { return NULL; }
|
||||||
|
|
||||||
MMPoint point;
|
MMPoint point;
|
||||||
MMPointArrayRef pointArray;
|
MMPointArrayRef pointArray;
|
||||||
MMRect rect = MMBitmapGetBounds(bitmap);
|
MMRect rect = MMBitmapGetBounds(sbit);
|
||||||
|
|
||||||
if (findBitmapInRect(bitmap, sbit, &point,
|
if (findBitmapInRect(bitmap, sbit, &point, rect, tolerance) == 0) {
|
||||||
rect, tolerance) == 0) {
|
// return NULL;
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pointArray = findAllBitmapInRect(bitmap, sbit, rect, tolerance);
|
pointArray = findAllBitmapInRect(bitmap, sbit, rect, tolerance);
|
||||||
if (pointArray == NULL) return NULL;
|
return pointArray;
|
||||||
|
|
||||||
memcpy(list, pointArray->array, sizeof(MMPoint) * pointArray->count);
|
|
||||||
destroyMMPointArray(pointArray);
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int count_of_bitmap(MMBitmapRef bitmap, MMBitmapRef sbit, float tolerance){
|
int count_of_bitmap(MMBitmapRef bitmap, MMBitmapRef sbit, float tolerance){
|
||||||
if (!bitmap_ready(bitmap) || !bitmap_ready(sbit)) return 0;
|
if (!bitmap_ready(bitmap) || !bitmap_ready(sbit)) return 0;
|
||||||
|
|
||||||
MMRect rect = MMBitmapGetBounds(bitmap);
|
MMRect rect = MMBitmapGetBounds(bitmap);
|
||||||
|
|
||||||
return countOfBitmapInRect(bitmap, sbit, rect, tolerance);
|
return countOfBitmapInRect(bitmap, sbit, rect, tolerance);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,9 +118,8 @@ MMBitmapRef bitmap_from_string(const char *str){
|
|||||||
MMBitmapRef bitmap;
|
MMBitmapRef bitmap;
|
||||||
MMBMPStringError err;
|
MMBMPStringError err;
|
||||||
|
|
||||||
if ((bitmap = createMMBitmapFromString(
|
if ((bitmap = createMMBitmapFromString((unsigned char*)str, len, &err ))
|
||||||
(unsigned char*)str, len, &err )
|
== NULL) {
|
||||||
) == NULL) {
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,7 +139,6 @@ char *tostring_bitmap(MMBitmapRef bitmap){
|
|||||||
MMBMPStringError err;
|
MMBMPStringError err;
|
||||||
|
|
||||||
buf = (char *)createStringFromMMBitmap(bitmap, &err);
|
buf = (char *)createStringFromMMBitmap(bitmap, &err);
|
||||||
|
|
||||||
return buf;
|
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){
|
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;
|
MMPoint point;
|
||||||
point = MMPointMake(x, y);
|
point = MMPointMake(x, y);
|
||||||
@ -197,6 +187,15 @@ MMPoint bitmap_find_color(MMBitmapRef bitmap, MMRGBHex color, float tolerance){
|
|||||||
return point;
|
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){
|
int bitmap_count_of_color(MMBitmapRef bitmap, MMRGBHex color, float tolerance){
|
||||||
if (!bitmap_ready(bitmap)) return 0;
|
if (!bitmap_ready(bitmap)) return 0;
|
||||||
MMRect rect = MMBitmapGetBounds(bitmap);
|
MMRect rect = MMBitmapGetBounds(bitmap);
|
||||||
|
77
robotgo.go
77
robotgo.go
@ -1017,8 +1017,13 @@ func FindPic(path string, args ...interface{}) (int, int) {
|
|||||||
return fx, fy
|
return fx, fy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FreeMMPointArr free MMPoint array
|
||||||
|
func FreeMMPointArr(pointArray C.MMPointArrayRef) {
|
||||||
|
C.destroyMMPointArray(pointArray)
|
||||||
|
}
|
||||||
|
|
||||||
// FindEveryBitmap find the every bitmap
|
// FindEveryBitmap find the every bitmap
|
||||||
func FindEveryBitmap(bit C.MMBitmapRef, args ...interface{}) (int, int) {
|
func FindEveryBitmap(bit C.MMBitmapRef, args ...interface{}) (posArr []MPoint) {
|
||||||
var (
|
var (
|
||||||
sbit C.MMBitmapRef
|
sbit C.MMBitmapRef
|
||||||
tolerance C.float = 0.01
|
tolerance C.float = 0.01
|
||||||
@ -1053,9 +1058,23 @@ func FindEveryBitmap(bit C.MMBitmapRef, args ...interface{}) (int, int) {
|
|||||||
if len(args) <= 0 {
|
if len(args) <= 0 {
|
||||||
FreeBitmap(sbit)
|
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)
|
// fmt.Println("pos----", pos)
|
||||||
return int(pos.x), int(pos.y)
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// CountBitmap count of the bitmap
|
// 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
|
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
|
// CountColor count bitmap color
|
||||||
func CountColor(color CHex, args ...interface{}) int {
|
func CountColor(color CHex, args ...interface{}) int {
|
||||||
var (
|
var (
|
||||||
|
Loading…
Reference in New Issue
Block a user