diff --git a/image.go b/image.go index 6a4790de2..faffe5d9e 100644 --- a/image.go +++ b/image.go @@ -269,7 +269,7 @@ func NewImageFromImage(source image.Image, filter Filter) (*Image, error) { size := source.Bounds().Size() w, h := size.X, size.Y checkSize(w, h) - rgbaImg := graphics.CopyImage(source) + rgbaImg := restorable.CopyImage(source) r := restorable.NewImageFromImage(rgbaImg, w, h, glFilter(filter)) i := &Image{r} runtime.SetFinalizer(i, (*Image).Dispose) diff --git a/internal/graphics/image.go b/internal/graphics/image.go index 16d8bbcfe..e2b8caeb6 100644 --- a/internal/graphics/image.go +++ b/internal/graphics/image.go @@ -16,60 +16,12 @@ package graphics import ( "image" - "image/color" - "image/draw" - "runtime" "github.com/hajimehoshi/ebiten/internal/affine" "github.com/hajimehoshi/ebiten/internal/math" "github.com/hajimehoshi/ebiten/internal/opengl" ) -func CopyImage(origImg image.Image) *image.RGBA { - size := origImg.Bounds().Size() - w, h := size.X, size.Y - newImg := image.NewRGBA(image.Rect(0, 0, math.NextPowerOf2Int(w), math.NextPowerOf2Int(h))) - switch origImg := origImg.(type) { - case *image.Paletted: - b := origImg.Bounds() - x0 := b.Min.X - y0 := b.Min.Y - x1 := b.Max.X - y1 := b.Max.Y - palette := make([]uint8, len(origImg.Palette)*4) - for i, c := range origImg.Palette { - rgba := color.RGBAModel.Convert(c).(color.RGBA) - palette[4*i] = rgba.R - palette[4*i+1] = rgba.G - palette[4*i+2] = rgba.B - palette[4*i+3] = rgba.A - } - index0 := 0 - index1 := 0 - d0 := origImg.Stride - (x1 - x0) - d1 := newImg.Stride - (x1-x0)*4 - pix0 := origImg.Pix - pix1 := newImg.Pix - for j := 0; j < y1-y0; j++ { - for i := 0; i < x1-x0; i++ { - p := int(pix0[index0]) - pix1[index1] = palette[4*p] - pix1[index1+1] = palette[4*p+1] - pix1[index1+2] = palette[4*p+2] - pix1[index1+3] = palette[4*p+3] - index0++ - index1 += 4 - } - index0 += d0 - index1 += d1 - } - default: - draw.Draw(newImg, image.Rect(0, 0, w, h), origImg, origImg.Bounds().Min, draw.Src) - } - runtime.Gosched() - return newImg -} - type Image struct { texture *texture framebuffer *framebuffer diff --git a/internal/restorable/copy.go b/internal/restorable/copy.go new file mode 100644 index 000000000..2d6271be6 --- /dev/null +++ b/internal/restorable/copy.go @@ -0,0 +1,69 @@ +// Copyright 2017 The Ebiten Authors +// +// 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 restorable + +import ( + "image" + "image/color" + "image/draw" + "runtime" + + "github.com/hajimehoshi/ebiten/internal/math" +) + +func CopyImage(origImg image.Image) *image.RGBA { + size := origImg.Bounds().Size() + w, h := size.X, size.Y + newImg := image.NewRGBA(image.Rect(0, 0, math.NextPowerOf2Int(w), math.NextPowerOf2Int(h))) + switch origImg := origImg.(type) { + case *image.Paletted: + b := origImg.Bounds() + x0 := b.Min.X + y0 := b.Min.Y + x1 := b.Max.X + y1 := b.Max.Y + palette := make([]uint8, len(origImg.Palette)*4) + for i, c := range origImg.Palette { + rgba := color.RGBAModel.Convert(c).(color.RGBA) + palette[4*i] = rgba.R + palette[4*i+1] = rgba.G + palette[4*i+2] = rgba.B + palette[4*i+3] = rgba.A + } + index0 := 0 + index1 := 0 + d0 := origImg.Stride - (x1 - x0) + d1 := newImg.Stride - (x1-x0)*4 + pix0 := origImg.Pix + pix1 := newImg.Pix + for j := 0; j < y1-y0; j++ { + for i := 0; i < x1-x0; i++ { + p := int(pix0[index0]) + pix1[index1] = palette[4*p] + pix1[index1+1] = palette[4*p+1] + pix1[index1+2] = palette[4*p+2] + pix1[index1+3] = palette[4*p+3] + index0++ + index1 += 4 + } + index0 += d0 + index1 += d1 + } + default: + draw.Draw(newImg, image.Rect(0, 0, w, h), origImg, origImg.Bounds().Min, draw.Src) + } + runtime.Gosched() + return newImg +} diff --git a/internal/graphics/image_test.go b/internal/restorable/copy_test.go similarity index 97% rename from internal/graphics/image_test.go rename to internal/restorable/copy_test.go index c48f5c1f8..d011e22aa 100644 --- a/internal/graphics/image_test.go +++ b/internal/restorable/copy_test.go @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package graphics_test +package restorable_test import ( "image" @@ -20,7 +20,7 @@ import ( "image/color/palette" "testing" - . "github.com/hajimehoshi/ebiten/internal/graphics" + . "github.com/hajimehoshi/ebiten/internal/restorable" ) func TestCopyImage(t *testing.T) {