~eliasnaur/gio

454b2264048f39952fb7de8f853c8545f171ceeb — aarzilli 4 years ago 237a8da
op/paint: NewImageOp does not need to make copies of RGBA images

Signed-off-by: Elias Naur <mail@eliasnaur.com>
1 files changed, 19 insertions(+), 13 deletions(-)

M op/paint/paint.go
M op/paint/paint.go => op/paint/paint.go +19 -13
@@ 19,7 19,6 @@ type ImageOp struct {
	uniform bool
	color   color.RGBA
	src     *image.RGBA
	size    image.Point

	// handle is a key to uniquely identify this ImageOp
	// in a map of cached textures.


@@ 45,23 44,30 @@ func NewImageOp(src image.Image) ImageOp {
			uniform: true,
			color:   col,
		}
	default:
		sz := src.Bounds().Size()
		// Copy the image into a GPU friendly format.
		dst := image.NewRGBA(image.Rectangle{
			Max: sz,
		})
		draw.Draw(dst, src.Bounds(), src, image.Point{}, draw.Src)
		return ImageOp{
			src:    dst,
			size:   sz,
			handle: new(int),
	case *image.RGBA:
		bounds := src.Bounds()
		if bounds.Min == (image.Point{}) && src.Stride == bounds.Dx()*4 {
			return ImageOp{
				src:    src,
				handle: new(int),
			}
		}
	}

	sz := src.Bounds().Size()
	// Copy the image into a GPU friendly format.
	dst := image.NewRGBA(image.Rectangle{
		Max: sz,
	})
	draw.Draw(dst, src.Bounds(), src, image.Point{}, draw.Src)
	return ImageOp{
		src:    dst,
		handle: new(int),
	}
}

func (i ImageOp) Size() image.Point {
	return i.size
	return i.src.Bounds().Size()
}

func (i ImageOp) Add(o *op.Ops) {