func (ir *interpreter) upload_image(name string, img image.Image) error { var buf bytes.Buffer err := sprintf(&buf, "image create photo %{}", name) if err != nil { return err } nrgba, ok := img.(*image.NRGBA) if !ok { // let's do it slowpoke bounds := img.Bounds() nrgba = image.NewNRGBA(bounds) for x := 0; x < bounds.Max.X; x++ { for y := 0; y < bounds.Max.Y; y++ { nrgba.Set(x, y, img.At(x, y)) } } } cname := C.CString(name) handle := C.Tk_FindPhoto(ir.C, cname) if handle == nil { err := ir.eval(buf.Bytes()) if err != nil { return err } handle = C.Tk_FindPhoto(ir.C, cname) if handle == nil { return errors.New("failed to create an image handle") } } C.free(unsafe.Pointer(cname)) block := C.Tk_PhotoImageBlock{ (*C.uchar)(unsafe.Pointer(&nrgba.Pix[0])), C.int(nrgba.Rect.Max.X), C.int(nrgba.Rect.Max.Y), C.int(nrgba.Stride), 4, [...]C.int{0, 1, 2, 3}, } status := C.Tk_PhotoPutBlock(ir.C, handle, &block, 0, 0, C.int(nrgba.Rect.Max.X), C.int(nrgba.Rect.Max.Y), C.TK_PHOTO_COMPOSITE_SET) // alpha should be non-zero or you may get peculiar slowdowns // Note: C.TK_PHOTO_COMPOSITE_OVERLAY would overlay an existing image if status != C.TCL_OK { return errors.New(C.GoString(C.Tcl_GetStringResult(ir.C))) } return nil }
func (ir *interpreter) upload_image(name string, img image.Image) error { nrgba, ok := img.(*image.NRGBA) if !ok { // let's do it slowpoke bounds := img.Bounds() nrgba = image.NewNRGBA(bounds) for x := 0; x < bounds.Max.X; x++ { for y := 0; y < bounds.Max.Y; y++ { nrgba.Set(x, y, img.At(x, y)) } } } cname := C.CString(name) handle := C.Tk_FindPhoto(ir.C, cname) if handle == nil { ir.eval("image create photo ", name) handle = C.Tk_FindPhoto(ir.C, cname) if handle == nil { return errors.New("failed to create an image handle") } } C.free(unsafe.Pointer(cname)) block := C.Tk_PhotoImageBlock{ (*C.uchar)(unsafe.Pointer(&nrgba.Pix[0])), C.int(nrgba.Rect.Max.X), C.int(nrgba.Rect.Max.Y), C.int(nrgba.Stride), 4, [...]C.int{0, 1, 2, 3}, } status := C.Tk_PhotoPutBlock(ir.C, handle, &block, 0, 0, C.int(nrgba.Rect.Max.X), C.int(nrgba.Rect.Max.Y), C.TK_PHOTO_COMPOSITE_SET) if status != C.TCL_OK { return errors.New(C.GoString(C.Tcl_GetStringResult(ir.C))) } return nil }