From 64a66c57c0e350135655502f4212043bbc0f9279 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sun, 8 May 2016 16:30:48 +0900 Subject: [PATCH] examples/keyboard: Generate the image without Ebiten (#210) --- ebitenutil/internal/assets/bindata.go | 2 +- examples/common/font.go | 17 +++++++++++++-- examples/keyboard/keyboard/gen.go | 31 ++++++++------------------- 3 files changed, 25 insertions(+), 25 deletions(-) diff --git a/ebitenutil/internal/assets/bindata.go b/ebitenutil/internal/assets/bindata.go index f3d91d868..15192271a 100644 --- a/ebitenutil/internal/assets/bindata.go +++ b/ebitenutil/internal/assets/bindata.go @@ -53,7 +53,7 @@ func text_png() (*asset, error) { return nil, err } - info := bindata_file_info{name: "text.png", size: 2058, mode: os.FileMode(420), modTime: time.Unix(1455503506, 0)} + info := bindata_file_info{name: "text.png", size: 2058, mode: os.FileMode(420), modTime: time.Unix(1455644231, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/examples/common/font.go b/examples/common/font.go index d1e16bb9f..bd98d73c3 100644 --- a/examples/common/font.go +++ b/examples/common/font.go @@ -15,7 +15,9 @@ package common import ( + "image" "image/color" + "image/draw" "math" "path/filepath" "runtime" @@ -31,6 +33,7 @@ var ( type Font struct { image *ebiten.Image + origImage image.Image offset int charNumPerLine int charWidth int @@ -52,11 +55,11 @@ func init() { } arcadeFontPath := filepath.Join(dir, "_resources", "images", "arcadefont.png") - arcadeFontImage, _, err := ebitenutil.NewImageFromFile(arcadeFontPath, ebiten.FilterNearest) + arcadeFontImage, origImage, err := ebitenutil.NewImageFromFile(arcadeFontPath, ebiten.FilterNearest) if err != nil { panic(err) } - ArcadeFont = &Font{arcadeFontImage, 32, 16, 8, 8} + ArcadeFont = &Font{arcadeFontImage, origImage, 32, 16, 8, 8} } type fontImageParts struct { @@ -112,6 +115,16 @@ func (f *Font) DrawText(rt *ebiten.Image, str string, ox, oy, scale int, c color return rt.DrawImage(f.image, options) } +func (f *Font) DrawTextOnImage(rt draw.Image, str string, ox, oy int) error { + parts := &fontImageParts{str, f} + for i := 0; i < parts.Len(); i++ { + dx0, dy0, dx1, dy1 := parts.Dst(i) + sx0, sy0, _, _ := parts.Src(i) + draw.Draw(rt, image.Rect(dx0+ox, dy0+oy, dx1+ox, dy1+oy), f.origImage, image.Pt(sx0, sy0), draw.Over) + } + return nil +} + func (f *Font) DrawTextWithShadow(rt *ebiten.Image, str string, x, y, scale int, clr color.Color) error { if err := f.DrawText(rt, str, x+1, y+1, scale, color.NRGBA{0, 0, 0, 0x80}); err != nil { return err diff --git a/examples/keyboard/keyboard/gen.go b/examples/keyboard/keyboard/gen.go index c830c224b..402fa0544 100644 --- a/examples/keyboard/keyboard/gen.go +++ b/examples/keyboard/keyboard/gen.go @@ -17,8 +17,6 @@ package main import ( - "github.com/hajimehoshi/ebiten" - "github.com/hajimehoshi/ebiten/examples/common" "image" "image/color" "image/draw" @@ -30,6 +28,8 @@ import ( "runtime" "strings" "text/template" + + "github.com/hajimehoshi/ebiten/examples/common" ) func licenseComment() (string, error) { @@ -55,14 +55,11 @@ var keyboardKeys = [][]string{ {"Left", "Down", "Right"}, } -func drawKey(t *ebiten.Image, name string, x, y, width int) error { +func drawKey(t *image.NRGBA, name string, x, y, width int) error { const height = 16 width-- - shape, err := ebiten.NewImage(width, height, ebiten.FilterNearest) - if err != nil { - return err - } - p := make([]uint8, width*height*4) + shape := image.NewNRGBA(image.Rect(0, 0, width, height)) + p := shape.Pix for j := 0; j < height; j++ { for i := 0; i < width; i++ { x := (i + j*width) * 4 @@ -98,15 +95,8 @@ func drawKey(t *ebiten.Image, name string, x, y, width int) error { } } } - if err := shape.ReplacePixels(p); err != nil { - return err - } - op := &ebiten.DrawImageOptions{} - op.GeoM.Translate(float64(x), float64(y)) - if err := t.DrawImage(shape, op); err != nil { - return err - } - if err := common.ArcadeFont.DrawText(t, name, x+4, y+5, 1, color.White); err != nil { + draw.Draw(t, image.Rect(x, y, x+width, y+height), shape, image.ZP, draw.Over) + if err := common.ArcadeFont.DrawTextOnImage(t, name, x+4, y+5); err != nil { return err } return nil @@ -114,10 +104,7 @@ func drawKey(t *ebiten.Image, name string, x, y, width int) error { func outputKeyboardImage() (map[string]image.Rectangle, error) { keyMap := map[string]image.Rectangle{} - img, err := ebiten.NewImage(320, 240, ebiten.FilterNearest) - if err != nil { - return nil, err - } + img := image.NewNRGBA(image.Rect(0, 0, 320, 240)) x, y := 0, 0 for j, line := range keyboardKeys { x = 0 @@ -167,7 +154,7 @@ func outputKeyboardImage() (map[string]image.Rectangle, error) { palettedImg := image.NewPaletted(img.Bounds(), palette) draw.Draw(palettedImg, palettedImg.Bounds(), img, image.ZP, draw.Src) - f, err := os.Create("images/keyboard/keyboard.png") + f, err := os.Create("_resources/images/keyboard/keyboard.png") if err != nil { return nil, err }