mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 19:28:57 +01:00
Optimize ColorM and GeoM
This commit is contained in:
parent
2f02a0a223
commit
2eea1afcd1
20
colorm.go
20
colorm.go
@ -79,6 +79,26 @@ func (c *ColorM) Add(other ColorM) {
|
|||||||
*c = result
|
*c = result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *ColorM) Scale(r, g, b, a float64) {
|
||||||
|
if !c.initialized {
|
||||||
|
*c = colorMI
|
||||||
|
}
|
||||||
|
c.es[0][0] *= r
|
||||||
|
c.es[1][1] *= g
|
||||||
|
c.es[2][2] *= b
|
||||||
|
c.es[3][3] *= a
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *ColorM) Translate(r, g, b, a float64) {
|
||||||
|
if !c.initialized {
|
||||||
|
*c = colorMI
|
||||||
|
}
|
||||||
|
c.es[0][4] += r
|
||||||
|
c.es[1][4] += g
|
||||||
|
c.es[2][4] += b
|
||||||
|
c.es[3][4] += a
|
||||||
|
}
|
||||||
|
|
||||||
// SetElement sets an element at (i, j).
|
// SetElement sets an element at (i, j).
|
||||||
func (c *ColorM) SetElement(i, j int, element float64) {
|
func (c *ColorM) SetElement(i, j int, element float64) {
|
||||||
if !c.initialized {
|
if !c.initialized {
|
||||||
|
@ -20,6 +20,7 @@ import (
|
|||||||
"image"
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
"math"
|
"math"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
var imageFont *ebiten.Image
|
var imageFont *ebiten.Image
|
||||||
@ -41,9 +42,10 @@ func textWidth(str string) int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func drawText(rt *ebiten.Image, str string, ox, oy, scale int, c color.Color) error {
|
func drawText(rt *ebiten.Image, str string, ox, oy, scale int, c color.Color) error {
|
||||||
parts := make([]ebiten.ImagePart, 0, len(str))
|
parts := make([]ebiten.ImagePart, len(strings.Replace(str, "\n", "", -1)))
|
||||||
|
|
||||||
locationX, locationY := 0, 0
|
locationX, locationY := 0, 0
|
||||||
|
i := 0
|
||||||
for _, c := range str {
|
for _, c := range str {
|
||||||
if c == '\n' {
|
if c == '\n' {
|
||||||
locationX = 0
|
locationX = 0
|
||||||
@ -53,27 +55,27 @@ func drawText(rt *ebiten.Image, str string, ox, oy, scale int, c color.Color) er
|
|||||||
code := int(c)
|
code := int(c)
|
||||||
x := (code % 16) * charWidth
|
x := (code % 16) * charWidth
|
||||||
y := ((code - 32) / 16) * charHeight
|
y := ((code - 32) / 16) * charHeight
|
||||||
parts = append(parts, ebiten.ImagePart{
|
parts[i].Dst = image.Rect(locationX, locationY, locationX+charWidth, locationY+charHeight)
|
||||||
Dst: image.Rect(locationX, locationY, locationX+charWidth, locationY+charHeight),
|
parts[i].Src = image.Rect(x, y, x+charWidth, y+charHeight)
|
||||||
Src: image.Rect(x, y, x+charWidth, y+charHeight),
|
i++
|
||||||
})
|
|
||||||
locationX += charWidth
|
locationX += charWidth
|
||||||
}
|
}
|
||||||
|
|
||||||
geo := ebiten.ScaleGeo(float64(scale), float64(scale))
|
options := &ebiten.DrawImageOptions{
|
||||||
geo.Concat(ebiten.TranslateGeo(float64(ox), float64(oy)))
|
Parts: parts,
|
||||||
|
}
|
||||||
|
options.GeoM.Scale(float64(scale), float64(scale))
|
||||||
|
options.GeoM.Translate(float64(ox), float64(oy))
|
||||||
|
|
||||||
c2 := color.NRGBA64Model.Convert(c).(color.NRGBA64)
|
c2 := color.NRGBA64Model.Convert(c).(color.NRGBA64)
|
||||||
const max = math.MaxUint16
|
const max = math.MaxUint16
|
||||||
r := float64(c2.R) / max
|
r := float64(c2.R) / max
|
||||||
g := float64(c2.G) / max
|
g := float64(c2.G) / max
|
||||||
b := float64(c2.B) / max
|
b := float64(c2.B) / max
|
||||||
a := float64(c2.A) / max
|
a := float64(c2.A) / max
|
||||||
clr := ebiten.ScaleColor(r, g, b, a)
|
options.ColorM.Scale(r, g, b, a)
|
||||||
return rt.DrawImage(imageFont, &ebiten.DrawImageOptions{
|
|
||||||
Parts: parts,
|
return rt.DrawImage(imageFont, options)
|
||||||
GeoM: geo,
|
|
||||||
ColorM: clr,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func drawTextWithShadow(rt *ebiten.Image, str string, x, y, scale int, clr color.Color) error {
|
func drawTextWithShadow(rt *ebiten.Image, str string, x, y, scale int, clr color.Color) error {
|
||||||
|
16
geom.go
16
geom.go
@ -72,6 +72,22 @@ func (g *GeoM) Add(other GeoM) {
|
|||||||
*g = result
|
*g = result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *GeoM) Scale(x, y float64) {
|
||||||
|
if !g.initialized {
|
||||||
|
*g = geoMI
|
||||||
|
}
|
||||||
|
g.es[0][0] *= x
|
||||||
|
g.es[1][1] *= y
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *GeoM) Translate(tx, ty float64) {
|
||||||
|
if !g.initialized {
|
||||||
|
*g = geoMI
|
||||||
|
}
|
||||||
|
g.es[0][2] += tx
|
||||||
|
g.es[1][2] += ty
|
||||||
|
}
|
||||||
|
|
||||||
// SetElement sets an element at (i, j).
|
// SetElement sets an element at (i, j).
|
||||||
func (g *GeoM) SetElement(i, j int, element float64) {
|
func (g *GeoM) SetElement(i, j int, element float64) {
|
||||||
if !g.initialized {
|
if !g.initialized {
|
||||||
|
Loading…
Reference in New Issue
Block a user