From ba19f06ede4a90728416b3dabbcb4dfa861074ef Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sat, 3 Sep 2022 20:27:29 +0900 Subject: [PATCH] ebitenutil: bug fix: NewImageFromReader was not available on mobiles Closes #2301 --- ebitenutil/loadimage.go | 44 +++++++++---------- ebitenutil/{url.go => loadimage_notmobile.go} | 34 +++++++------- 2 files changed, 39 insertions(+), 39 deletions(-) rename ebitenutil/{url.go => loadimage_notmobile.go} (51%) diff --git a/ebitenutil/loadimage.go b/ebitenutil/loadimage.go index 9602d4f7c..744392923 100644 --- a/ebitenutil/loadimage.go +++ b/ebitenutil/loadimage.go @@ -12,38 +12,16 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !android && !ios -// +build !android,!ios - package ebitenutil import ( "image" "io" + "net/http" "github.com/hajimehoshi/ebiten/v2" ) -// NewImageFromFile loads the file with path and returns ebiten.Image and image.Image. -// -// Image decoders must be imported when using NewImageFromFile. For example, -// if you want to load a PNG image, you'd need to add `_ "image/png"` to the import section. -// -// How to solve path depends on your environment. This varies on your desktop or web browser. -// Note that this doesn't work on mobiles. -// -// For productions, instead of using NewImageFromFile, it is safer to embed your resources with go:embed. -func NewImageFromFile(path string) (*ebiten.Image, image.Image, error) { - file, err := OpenFile(path) - if err != nil { - return nil, nil, err - } - defer func() { - _ = file.Close() - }() - return NewImageFromReader(file) -} - // NewImageFromReader loads from the io.Reader and returns ebiten.Image and image.Image. // // Image decoders must be imported when using NewImageFromReader. For example, @@ -56,3 +34,23 @@ func NewImageFromReader(reader io.Reader) (*ebiten.Image, image.Image, error) { img2 := ebiten.NewImageFromImage(img) return img2, img, err } + +// NewImageFromURL creates a new ebiten.Image from the given URL. +// +// Image decoders must be imported when using NewImageFromURL. For example, +// if you want to load a PNG image, you'd need to add `_ "image/png"` to the import section. +func NewImageFromURL(url string) (*ebiten.Image, error) { + res, err := http.Get(url) + if err != nil { + return nil, err + } + defer res.Body.Close() + + img, _, err := image.Decode(res.Body) + if err != nil { + return nil, err + } + + eimg := ebiten.NewImageFromImage(img) + return eimg, nil +} diff --git a/ebitenutil/url.go b/ebitenutil/loadimage_notmobile.go similarity index 51% rename from ebitenutil/url.go rename to ebitenutil/loadimage_notmobile.go index 97980ed54..34dcc4369 100644 --- a/ebitenutil/url.go +++ b/ebitenutil/loadimage_notmobile.go @@ -1,4 +1,4 @@ -// Copyright 2018 The Ebiten Authors +// Copyright 2022 The Ebitengine Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -12,31 +12,33 @@ // See the License for the specific language governing permissions and // limitations under the License. +//go:build !android && !ios +// +build !android,!ios + package ebitenutil import ( "image" - "net/http" "github.com/hajimehoshi/ebiten/v2" ) -// NewImageFromURL creates a new ebiten.Image from the given URL. +// NewImageFromFile loads the file with path and returns ebiten.Image and image.Image. // -// Image decoders must be imported when using NewImageFromURL. For example, +// Image decoders must be imported when using NewImageFromFile. For example, // if you want to load a PNG image, you'd need to add `_ "image/png"` to the import section. -func NewImageFromURL(url string) (*ebiten.Image, error) { - res, err := http.Get(url) +// +// How to solve path depends on your environment. This varies on your desktop or web browser. +// Note that this doesn't work on mobiles. +// +// For productions, instead of using NewImageFromFile, it is safer to embed your resources with go:embed. +func NewImageFromFile(path string) (*ebiten.Image, image.Image, error) { + file, err := OpenFile(path) if err != nil { - return nil, err + return nil, nil, err } - defer res.Body.Close() - - img, _, err := image.Decode(res.Body) - if err != nil { - return nil, err - } - - eimg := ebiten.NewImageFromImage(img) - return eimg, nil + defer func() { + _ = file.Close() + }() + return NewImageFromReader(file) }