From 21455a146dc991f26ae5f157352c38ebf54755a0 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Mon, 12 Jan 2015 18:39:42 +0900 Subject: [PATCH] Refactoring: Add imageparts.go --- image.go | 77 +---------------------------------------- imageparts.go | 96 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 97 insertions(+), 76 deletions(-) create mode 100644 imageparts.go diff --git a/image.go b/image.go index 1e315c7dc..a0423f053 100644 --- a/image.go +++ b/image.go @@ -50,46 +50,13 @@ func (i *innerImage) Fill(c *opengl.Context, clr color.Color) error { return i.framebuffer.Fill(c, r, g, b, a) } -// TODO: Remove this in the future. -type imageParts []ImagePart - -func (p imageParts) Len() int { - return len(p) -} - -func (p imageParts) Dst(i int) (x0, y0, x1, y1 int) { - dst := &p[i].Dst - return dst.Min.X, dst.Min.Y, dst.Max.X, dst.Max.Y -} - -func (p imageParts) Src(i int) (x0, y0, x1, y1 int) { - src := &p[i].Src - return src.Min.X, src.Min.Y, src.Max.X, src.Max.Y -} - -type wholeImage struct { - width int - height int -} - -func (w *wholeImage) Len() int { - return 1 -} - -func (w *wholeImage) Dst(i int) (x0, y0, x1, y1 int) { - return 0, 0, w.width, w.height -} - -func (w *wholeImage) Src(i int) (x0, y0, x1, y1 int) { - return 0, 0, w.width, w.height -} - func (i *innerImage) drawImage(c *opengl.Context, img *innerImage, options *DrawImageOptions) error { if options == nil { options = &DrawImageOptions{} } parts := options.ImageParts if parts == nil { + // Check options.Parts for backward-compatibility. dparts := options.Parts if dparts != nil { parts = imageParts(dparts) @@ -103,35 +70,6 @@ func (i *innerImage) drawImage(c *opengl.Context, img *innerImage, options *Draw return i.framebuffer.DrawTexture(c, img.texture, quads, &options.GeoM, &options.ColorM) } -func u(x float32, width int) float32 { - return x / float32(internal.NextPowerOf2Int(width)) -} - -func v(y float32, height int) float32 { - return y / float32(internal.NextPowerOf2Int(height)) -} - -type textureQuads struct { - parts ImageParts - width int - height int -} - -func (t *textureQuads) Len() int { - return t.parts.Len() -} - -func (t *textureQuads) Vertex(i int) (x0, y0, x1, y1 float32) { - ix0, iy0, ix1, iy1 := t.parts.Dst(i) - return float32(ix0), float32(iy0), float32(ix1), float32(iy1) -} - -func (t *textureQuads) Texture(i int) (u0, v0, u1, v1 float32) { - x0, y0, x1, y1 := t.parts.Src(i) - w, h := t.width, t.height - return u(float32(x0), w), v(float32(y0), h), u(float32(x1), w), v(float32(y1), h) -} - // Image represents an image. // The pixel format is alpha-premultiplied. // Image implements image.Image. @@ -223,19 +161,6 @@ func (i *Image) At(x, y int) color.Color { return color.RGBA{r, g, b, a} } -// Deprecated (as of 1.1.0-alpha): Use ImageParts instead. -type ImagePart struct { - Dst image.Rectangle - Src image.Rectangle -} - -// An ImageParts represents the parts of the destination image and the parts of the source image. -type ImageParts interface { - Len() int - Dst(i int) (x0, y0, x1, y1 int) - Src(i int) (x0, y0, x1, y1 int) -} - // A DrawImageOptions represents options to render an image on an image. type DrawImageOptions struct { ImageParts ImageParts diff --git a/imageparts.go b/imageparts.go new file mode 100644 index 000000000..9a58e7c93 --- /dev/null +++ b/imageparts.go @@ -0,0 +1,96 @@ +// Copyright 2015 Hajime Hoshi +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package ebiten + +import ( + "github.com/hajimehoshi/ebiten/internal" + "image" +) + +// Deprecated (as of 1.1.0-alpha): Use ImageParts instead. +type ImagePart struct { + Dst image.Rectangle + Src image.Rectangle +} + +// An ImageParts represents the parts of the destination image and the parts of the source image. +type ImageParts interface { + Len() int + Dst(i int) (x0, y0, x1, y1 int) + Src(i int) (x0, y0, x1, y1 int) +} + +// TODO: Remove this in the future. +type imageParts []ImagePart + +func (p imageParts) Len() int { + return len(p) +} + +func (p imageParts) Dst(i int) (x0, y0, x1, y1 int) { + dst := &p[i].Dst + return dst.Min.X, dst.Min.Y, dst.Max.X, dst.Max.Y +} + +func (p imageParts) Src(i int) (x0, y0, x1, y1 int) { + src := &p[i].Src + return src.Min.X, src.Min.Y, src.Max.X, src.Max.Y +} + +type wholeImage struct { + width int + height int +} + +func (w *wholeImage) Len() int { + return 1 +} + +func (w *wholeImage) Dst(i int) (x0, y0, x1, y1 int) { + return 0, 0, w.width, w.height +} + +func (w *wholeImage) Src(i int) (x0, y0, x1, y1 int) { + return 0, 0, w.width, w.height +} + +func u(x float32, width int) float32 { + return x / float32(internal.NextPowerOf2Int(width)) +} + +func v(y float32, height int) float32 { + return y / float32(internal.NextPowerOf2Int(height)) +} + +type textureQuads struct { + parts ImageParts + width int + height int +} + +func (t *textureQuads) Len() int { + return t.parts.Len() +} + +func (t *textureQuads) Vertex(i int) (x0, y0, x1, y1 float32) { + ix0, iy0, ix1, iy1 := t.parts.Dst(i) + return float32(ix0), float32(iy0), float32(ix1), float32(iy1) +} + +func (t *textureQuads) Texture(i int) (u0, v0, u1, v1 float32) { + x0, y0, x1, y1 := t.parts.Src(i) + w, h := t.width, t.height + return u(float32(x0), w), v(float32(y0), h), u(float32(x1), w), v(float32(y1), h) +}