github.com/jmigpin/editor@v1.6.0/driver/xdriver/wimage/shmimgwrap.go (about)

     1  package wimage
     2  
     3  import (
     4  	"image"
     5  	"reflect"
     6  	"unsafe"
     7  
     8  	"github.com/jmigpin/editor/util/imageutil"
     9  )
    10  
    11  type ShmImgWrap struct {
    12  	Img   *imageutil.BGRA
    13  	shmId uintptr
    14  	addr  uintptr
    15  }
    16  
    17  func NewShmImgWrap(r image.Rectangle) (*ShmImgWrap, error) {
    18  	size := imageutil.BGRASize(&r)
    19  	shmId, addr, err := ShmOpen(size)
    20  	if err != nil {
    21  		return nil, err
    22  	}
    23  
    24  	// mask shared mem into a slice
    25  	h := reflect.SliceHeader{Data: addr, Len: size, Cap: size}
    26  	buf := *(*[]byte)(unsafe.Pointer(&h))
    27  
    28  	img := imageutil.NewBGRAFromBuffer(buf, &r)
    29  	imgWrap := &ShmImgWrap{Img: img, shmId: shmId, addr: addr}
    30  	return imgWrap, nil
    31  }
    32  
    33  func (imgWrap *ShmImgWrap) Close() error {
    34  	return ShmClose(imgWrap.shmId, imgWrap.addr)
    35  }