// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

//go:build darwin && cgo

package mtldriver

import (
	"image"
	"image/color"

	"golang.org/x/exp/shiny/screen"
	"golang.org/x/image/draw"
)

// textureImpl implements screen.Texture.
type textureImpl struct {
	rgba *image.RGBA
}

func (*textureImpl) Release()                  {}
func (t *textureImpl) Size() image.Point       { return t.rgba.Rect.Max }
func (t *textureImpl) Bounds() image.Rectangle { return t.rgba.Rect }

func (t *textureImpl) Upload(dp image.Point, src screen.Buffer, sr image.Rectangle) {
	draw.Draw(t.rgba, sr.Sub(sr.Min).Add(dp), src.RGBA(), sr.Min, draw.Src)
}

func (t *textureImpl) Fill(dr image.Rectangle, src color.Color, op draw.Op) {
	draw.Draw(t.rgba, dr, &image.Uniform{src}, image.Point{}, op)
}
