Skip to content

Commit

Permalink
refactor: remove cgo of buffer
Browse files Browse the repository at this point in the history
  • Loading branch information
dongwlin committed Nov 15, 2024
1 parent 20b7b5d commit b55aa0c
Show file tree
Hide file tree
Showing 10 changed files with 181 additions and 160 deletions.
2 changes: 1 addition & 1 deletion custom_action.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ func _MaaCustomActionCallbackAgent(
tasker := ctx.GetTasker()
taskDetail := tasker.getTaskDetail(taskId)
recognitionDetail := tasker.getRecognitionDetail(recoId)
curBoxRectBuffer := buffer.NewRectBufferByHandle(unsafe.Pointer(box))
curBoxRectBuffer := buffer.NewRectBufferByHandle(box)

ok := action.Run(
&Context{handle: context},
Expand Down
4 changes: 2 additions & 2 deletions custom_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ func _RequestUUIDAgent(handleArg unsafe.Pointer, uuidBuffer uintptr) bool {
ctrl := customControllerCallbacksAgents[id]
uuid, ok := ctrl.RequestUUID()
if ok {
uuidStrBuffer := buffer.NewStringBufferByHandle(unsafe.Pointer(uuidBuffer))
uuidStrBuffer := buffer.NewStringBufferByHandle(uuidBuffer)
uuidStrBuffer.Set(uuid)
return true
}
Expand Down Expand Up @@ -120,7 +120,7 @@ func _ScreencapAgent(handleArg unsafe.Pointer, imgBuffer uintptr) bool {
ctrl := customControllerCallbacksAgents[id]
img, captured := ctrl.Screencap()
if captured {
imgImgBuffer := buffer.NewImageBufferByHandle(unsafe.Pointer(imgBuffer))
imgImgBuffer := buffer.NewImageBufferByHandle(imgBuffer)
if ok := imgImgBuffer.Set(img); ok {
return true
}
Expand Down
8 changes: 4 additions & 4 deletions custom_recognition.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ func _MaaCustomRecognitionCallbackAgent(
ctx := Context{handle: context}
tasker := ctx.GetTasker()
taskDetail := tasker.getTaskDetail(int64(taskId))
imgBuffer := buffer.NewImageBufferByHandle(unsafe.Pointer(image))
imgBuffer := buffer.NewImageBufferByHandle(image)
imgImg := imgBuffer.Get()

ret, ok := recognizer.Run(
Expand All @@ -71,14 +71,14 @@ func _MaaCustomRecognitionCallbackAgent(
CustomRecognizerName: bytePtrToString(customRecognitionName),
CustomRecognitionParam: bytePtrToString(customRecognitionParam),
Img: imgImg,
Roi: buffer.NewRectBufferByHandle(unsafe.Pointer(roi)).Get(),
Roi: buffer.NewRectBufferByHandle(roi).Get(),
},
)
if ok {
box := ret.Box
outBoxRect := buffer.NewRectBufferByHandle(unsafe.Pointer(outBox))
outBoxRect := buffer.NewRectBufferByHandle(outBox)
outBoxRect.Set(box)
outDetailString := buffer.NewStringBufferByHandle(unsafe.Pointer(outDetail))
outDetailString := buffer.NewStringBufferByHandle(outDetail)
outDetailString.Set(ret.Detail)
return 1
}
Expand Down
10 changes: 0 additions & 10 deletions internal/buffer/cgo.go

This file was deleted.

50 changes: 19 additions & 31 deletions internal/buffer/image_buffer.go
Original file line number Diff line number Diff line change
@@ -1,51 +1,48 @@
package buffer

/*
#include <stdlib.h>
#include <MaaFramework/MaaAPI.h>
*/
import "C"
import (
"image"
"image/color"
"image/draw"
"unsafe"

"github.com/MaaXYZ/maa-framework-go/internal/maa"
)

type ImageBuffer struct {
handle *C.MaaImageBuffer
handle uintptr
}

func NewImageBuffer() *ImageBuffer {
handle := C.MaaImageBufferCreate()
if handle == nil {
handle := maa.MaaImageBufferCreate()
if handle == 0 {
return nil
}
return &ImageBuffer{
handle: handle,
}
}

func NewImageBufferByHandle(handle unsafe.Pointer) *ImageBuffer {
func NewImageBufferByHandle(handle uintptr) *ImageBuffer {
return &ImageBuffer{
handle: (*C.MaaImageBuffer)(handle),
handle: handle,
}
}

func (i *ImageBuffer) Destroy() {
C.MaaImageBufferDestroy(i.handle)
maa.MaaImageBufferDestroy(i.handle)
}

func (i *ImageBuffer) Handle() unsafe.Pointer {
return unsafe.Pointer(i.handle)
func (i *ImageBuffer) Handle() uintptr {
return i.handle
}

func (i *ImageBuffer) IsEmpty() bool {
return C.MaaImageBufferIsEmpty(i.handle) != 0
return maa.MaaImageBufferIsEmpty(i.handle)
}

func (i *ImageBuffer) Clear() bool {
return C.MaaImageBufferClear(i.handle) != 0
return maa.MaaImageBufferClear(i.handle)
}

// Get retrieves the image from raw data stored in the buffer.
Expand All @@ -58,7 +55,7 @@ func (i *ImageBuffer) Get() image.Image {
height := i.getHeight()

img := image.NewNRGBA(image.Rect(0, 0, int(width), int(height)))
raw := C.GoBytes(rawData, C.int(width*height*3))
raw := unsafe.Slice((*byte)(rawData), width*height*3)
for y := 0; y < int(height); y++ {
for x := 0; x < int(width); x++ {
offset := (y*int(width) + x) * 3
Expand Down Expand Up @@ -96,46 +93,37 @@ func (i *ImageBuffer) Set(img image.Image) bool {
}
}

cRawData := C.CBytes(rawData)
defer C.free(cRawData)

return i.setRawData(cRawData, int32(width), int32(height), imageType)
return i.setRawData(unsafe.Pointer(&rawData[0]), int32(width), int32(height), imageType)
}

// getRawData retrieves the raw image data from the buffer.
// It returns a pointer to the raw image data.
func (i *ImageBuffer) getRawData() unsafe.Pointer {
return unsafe.Pointer(C.MaaImageBufferGetRawData(i.handle))
return maa.MaaImageBufferGetRawData(i.handle)
}

// getWidth retrieves the width of the image stored in the buffer.
// It returns the width as an int32.
func (i *ImageBuffer) getWidth() int32 {
return int32(C.MaaImageBufferWidth(i.handle))
return maa.MaaImageBufferWidth(i.handle)
}

// getHeight retrieves the height of the image stored in the buffer.
// It returns the height as an int32.
func (i *ImageBuffer) getHeight() int32 {
return int32(C.MaaImageBufferHeight(i.handle))
return maa.MaaImageBufferHeight(i.handle)
}

// getType retrieves the type of the image stored in the buffer.
// This corresponds to the cv::Mat.type() in OpenCV.
// It returns the type as an int32.
func (i *ImageBuffer) getType() int32 {
return int32(C.MaaImageBufferType(i.handle))
return maa.MaaImageBufferType(i.handle)
}

// setRawData sets the raw image data in the buffer.
// It takes a pointer to the raw image data, the width, height, and type of the image.
// It returns true if the operation was successful, otherwise false.
func (i *ImageBuffer) setRawData(data unsafe.Pointer, width, height, imageType int32) bool {
return C.MaaImageBufferSetRawData(
i.handle,
C.MaaImageRawData(data),
C.int32_t(width),
C.int32_t(height),
C.int32_t(imageType),
) != 0
return maa.MaaImageBufferSetRawData(i.handle, data, width, height, imageType)
}
42 changes: 16 additions & 26 deletions internal/buffer/image_list_buffer.go
Original file line number Diff line number Diff line change
@@ -1,57 +1,53 @@
package buffer

/*
#include <stdlib.h>
#include <MaaFramework/MaaAPI.h>
*/
import "C"
import (
"image"
"unsafe"

"github.com/MaaXYZ/maa-framework-go/internal/maa"
)

type ImageListBuffer struct {
handle *C.MaaImageListBuffer
handle uintptr
}

func NewImageListBuffer() *ImageListBuffer {
handle := C.MaaImageListBufferCreate()
if handle == nil {
handle := maa.MaaImageListBufferCreate()
if handle == 0 {
return nil
}
return &ImageListBuffer{
handle: handle,
}
}

func NewImageListBufferByHandle(handle unsafe.Pointer) *ImageListBuffer {
func NewImageListBufferByHandle(handle uintptr) *ImageListBuffer {
return &ImageListBuffer{
handle: (*C.MaaImageListBuffer)(handle),
handle: handle,
}
}

func (il *ImageListBuffer) Destroy() {
C.MaaImageListBufferDestroy(il.handle)
maa.MaaImageListBufferDestroy(il.handle)
}

func (il *ImageListBuffer) Handle() unsafe.Pointer {
return unsafe.Pointer(il.handle)
func (il *ImageListBuffer) Handle() uintptr {
return il.handle
}

func (il *ImageListBuffer) IsEmpty() bool {
return C.MaaImageListBufferIsEmpty(il.handle) != 0
return maa.MaaImageListBufferIsEmpty(il.handle)
}

func (il *ImageListBuffer) Clear() bool {
return C.MaaImageListBufferClear(il.handle) != 0
return maa.MaaImageListBufferClear(il.handle)
}

func (il *ImageListBuffer) Size() uint64 {
return uint64(C.MaaImageListBufferSize(il.handle))
return maa.MaaImageListBufferSize(il.handle)
}

func (il *ImageListBuffer) Get(index uint64) image.Image {
handle := C.MaaImageListBufferAt(il.handle, C.uint64_t(index))
handle := maa.MaaImageListBufferAt(il.handle, index)
img := &ImageBuffer{
handle: handle,
}
Expand All @@ -69,15 +65,9 @@ func (il *ImageListBuffer) GetAll() []image.Image {
}

func (il *ImageListBuffer) Append(value *ImageBuffer) bool {
return C.MaaImageListBufferAppend(
il.handle,
(*C.MaaImageBuffer)(value.Handle()),
) != 0
return maa.MaaImageListBufferAppend(il.handle, value.handle)
}

func (il *ImageListBuffer) Remove(index uint64) bool {
return C.MaaImageListBufferRemove(
il.handle,
C.uint64_t(index),
) != 0
return maa.MaaImageListBufferRemove(il.handle, index)
}
39 changes: 14 additions & 25 deletions internal/buffer/rect_buffer.go
Original file line number Diff line number Diff line change
@@ -1,12 +1,7 @@
package buffer

/*
#include <stdlib.h>
#include <MaaFramework/MaaAPI.h>
*/
import "C"
import (
"unsafe"
"github.com/MaaXYZ/maa-framework-go/internal/maa"
)

type Rect struct {
Expand All @@ -18,59 +13,53 @@ func (r Rect) ToInts() [4]int32 {
}

type RectBuffer struct {
handle *C.MaaRect
handle uintptr
}

func NewRectBuffer() *RectBuffer {
handle := C.MaaRectCreate()
if handle == nil {
handle := maa.MaaRectCreate()
if handle == 0 {
return nil
}
return &RectBuffer{
handle: handle,
}
}

func NewRectBufferByHandle(handle unsafe.Pointer) *RectBuffer {
func NewRectBufferByHandle(handle uintptr) *RectBuffer {
return &RectBuffer{
handle: (*C.MaaRect)(handle),
handle: handle,
}
}

func (r *RectBuffer) Destroy() {
C.MaaRectDestroy(r.handle)
maa.MaaRectDestroy(r.handle)
}

func (r *RectBuffer) Handle() unsafe.Pointer {
return unsafe.Pointer(r.handle)
func (r *RectBuffer) Handle() uintptr {
return r.handle
}

func (r *RectBuffer) Get() Rect {
return Rect{r.GetX(), r.GetY(), r.GetW(), r.GetH()}
}

func (r *RectBuffer) GetX() int32 {
return int32(C.MaaRectGetX(r.handle))
return maa.MaaRectGetX(r.handle)
}

func (r *RectBuffer) GetY() int32 {
return int32(C.MaaRectGetY(r.handle))
return maa.MaaRectGetY(r.handle)
}

func (r *RectBuffer) GetW() int32 {
return int32(C.MaaRectGetW(r.handle))
return maa.MaaRectGetW(r.handle)
}

func (r *RectBuffer) GetH() int32 {
return int32(C.MaaRectGetH(r.handle))
return maa.MaaRectGetH(r.handle)
}

func (r *RectBuffer) Set(rect Rect) bool {
return C.MaaRectSet(
r.handle,
C.int32_t(rect.X),
C.int32_t(rect.Y),
C.int32_t(rect.W),
C.int32_t(rect.H),
) != 0
return maa.MaaRectSet(r.handle, rect.X, rect.Y, rect.W, rect.H)
}
Loading

0 comments on commit b55aa0c

Please sign in to comment.