diff --git a/graphics/opengl/texture/texture.go b/graphics/opengl/texture/texture.go index cdce6cb64..2de71ab69 100644 --- a/graphics/opengl/texture/texture.go +++ b/graphics/opengl/texture/texture.go @@ -66,19 +66,22 @@ func createFromImage(img *image.NRGBA) (interface{}, error) { } func New(width, height int, filter Filter) (*gtexture.Texture, error) { - f := func(textureWidth, textureHeight int) (interface{}, error) { - return create(textureWidth, textureHeight, filter) + native, err := create(gtexture.AdjustSize(width), gtexture.AdjustSize(height), filter) + if err != nil { + return nil, err } - return gtexture.New(width, height, f) + return gtexture.New(native, width, height), nil } func NewEmpty(width, height int) (*gtexture.Texture, error) { - f := func(textureWidth, textureHeight int) (interface{}, error) { - return nil, nil - } - return gtexture.New(width, height, f) + return gtexture.New(nil, width, height), nil } func NewFromImage(img image.Image) (*gtexture.Texture, error) { - return gtexture.NewFromImage(img, createFromImage) + native, err := createFromImage(gtexture.AdjustImage(img)) + if err != nil { + return nil, err + } + size := img.Bounds().Size() + return gtexture.New(native, size.X, size.Y), nil } diff --git a/graphics/texture/texture.go b/graphics/texture/texture.go index 17079dc8b..baf3eb77c 100644 --- a/graphics/texture/texture.go +++ b/graphics/texture/texture.go @@ -23,10 +23,18 @@ type Texture struct { height int } -func AdjustImage(img image.Image, width, height int) *image.NRGBA { +func AdjustSize(size int) int { + return int(nextPowerOf2(uint64(size))) +} + +func AdjustImage(img image.Image) *image.NRGBA { + width, height := img.Bounds().Size().X, img.Bounds().Size().Y adjustedImageBounds := image.Rectangle{ image.ZP, - image.Point{width, height}, + image.Point{ + AdjustSize(width), + AdjustSize(height), + }, } if nrgba := img.(*image.NRGBA); nrgba != nil && img.Bounds() == adjustedImageBounds { @@ -42,56 +50,20 @@ func AdjustImage(img image.Image, width, height int) *image.NRGBA { return adjustedImage } -func New(width, height int, create func(textureWidth, textureHeight int) ( - interface{}, error)) (*Texture, error) { - texture := &Texture{ - width: width, - height: height, - } - var err error - texture.native, err = create(texture.textureWidth(), - texture.textureHeight()) - if err != nil { - return nil, err - } - return texture, nil -} - -func NewFromImage(img image.Image, create func(img *image.NRGBA) ( - interface{}, error)) (*Texture, error) { - size := img.Bounds().Size() - width, height := size.X, size.Y - texture := &Texture{ - width: width, - height: height, - } - adjustedImage := AdjustImage(img, texture.textureWidth(), texture.textureHeight()) - var err error - texture.native, err = create(adjustedImage) - if err != nil { - return nil, err - } - return texture, nil -} - -func (texture *Texture) textureWidth() int { - return int(nextPowerOf2(uint64(texture.width))) -} - -func (texture *Texture) textureHeight() int { - return int(nextPowerOf2(uint64(texture.height))) +func New(native interface{}, width, height int) *Texture { + return &Texture{native, width, height} } func (texture *Texture) u(x int) float32 { - return float32(x) / float32(texture.textureWidth()) + return float32(x) / float32(AdjustSize(texture.width)) } func (texture *Texture) v(y int) float32 { - return float32(y) / float32(texture.textureHeight()) + return float32(y) / float32(AdjustSize(texture.height)) } func (texture *Texture) SetAsViewport(setter func(x, y, width, height int)) { - setter(0, 0, texture.textureWidth(), texture.textureHeight()) + setter(0, 0, AdjustSize(texture.width), AdjustSize(texture.height)) } type Quad struct {