Text is not well positioned with some fonts
Opened this issue · 0 comments
I use Material icons as font for a project.
In the example below, the letters and icons are both drawn from the same origin, but the icons start with an unexpected offset:
Where:
- light red rectangles represents text bounds;
- light green rectangles represents icons bounds;
- blue dots represents text and icons origins;
- red dots represents text
.Dot
; - green dots represents icons
.Dot
;
See the source code for more details:
source code (click to expand)
package mainimport (
"fmt"
"github.com/faiface/pixel"
"github.com/faiface/pixel/imdraw"
"github.com/faiface/pixel/pixelgl"
"github.com/faiface/pixel/text"
"github.com/golang/freetype/truetype"
"golang.org/x/image/colornames"
"golang.org/x/image/font/gofont/goregular"
"image/color"
"io/ioutil"
"os"
"path"
)const fontSize float64 = 64
const distance float64 = 100var offset pixel.Vec = pixel.V(25, 25)
func main() {
pixelgl.Run(run)
}func run() {
cfg := pixelgl.WindowConfig{
Title: "Pixel Rocks!",
Bounds: pixel.R(0, 0, 300, 300),
}win, err := pixelgl.NewWindow(cfg) if err != nil { panic(err) } win.Clear(colornames.Lightgray) textFont, err := truetype.Parse(goregular.TTF) if err != nil { panic(err) } textFace := truetype.NewFace(textFont, &truetype.Options{Size: fontSize, GlyphCacheEntries: 1}) textAtlas := text.NewAtlas(textFace, text.ASCII) iconFont, err := getTTF("MaterialIcons-Regular.ttf") if err != nil { panic(err) } iconFace := truetype.NewFace(iconFont, &truetype.Options{Size: fontSize, GlyphCacheEntries: 1}) iconAtlas := text.NewAtlas(iconFace, []rune{'\ue313', '\ue314', '\ue315', '\ue316'}) north := pixel.V(1, 2).Scaled(distance).Add(offset) drawTxt(win, north, textAtlas, "n", colornames.Red, colornames.Pink) drawTxt(win, north, iconAtlas, string('\ue316'), colornames.Green, colornames.Lightgreen) drawDot(win, north, colornames.Blue) east := pixel.V(2, 1).Scaled(distance).Add(offset) drawTxt(win, east, textAtlas, "e", colornames.Red, colornames.Pink) drawTxt(win, east, iconAtlas, string('\ue315'), colornames.Green, colornames.Lightgreen) drawDot(win, east, colornames.Blue) south := pixel.V(1, 0).Scaled(distance).Add(offset) drawTxt(win, south, textAtlas, "s", colornames.Red, colornames.Pink) drawTxt(win, south, iconAtlas, string('\ue313'), colornames.Green, colornames.Lightgreen) drawDot(win, south, colornames.Blue) west := pixel.V(0, 1).Scaled(distance).Add(offset) drawTxt(win, west, textAtlas, "w", colornames.Red, colornames.Pink) drawTxt(win, west, iconAtlas, string('\ue314'), colornames.Green, colornames.Lightgreen) drawDot(win, west, colornames.Blue) for !win.Closed() { win.Update() }
}
func getTTF(fontName string) (*truetype.Font, error) {
file, err := os.Open(path.Join("assets", fontName))
if err != nil {
return nil, err
}
defer file.Close()bytes, err := ioutil.ReadAll(file) if err != nil { return nil, err } ttf, err := truetype.Parse(bytes) if err != nil { return nil, err } return ttf, nil
}
func drawTxt(win *pixelgl.Window, pos pixel.Vec, atlas *text.Atlas, txtContent string, color, bgColor color.Color) {
txt := text.New(pos, atlas)
txt.Color = color
fmt.Fprint(txt, txtContent)
drawDot(win, txt.Dot, color)
drawRect(win, txt.Bounds(), bgColor)
txt.Draw(win, pixel.IM)
}func drawDot(win *pixelgl.Window, pos pixel.Vec, color color.Color) {
drawRect(win, pixel.R(pos.X-3, pos.Y-3, pos.X+3, pos.Y+3), color)
}func drawRect(win *pixelgl.Window, rect pixel.Rect, color color.Color) {
imd := imdraw.New(nil)
imd.Color = color
imd.Push(rect.Min, rect.Max)
imd.Rectangle(0)
imd.Draw(win)
}
Original issue: faiface/pixel#255