mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-11-10 04:57:26 +01:00
text/v2: replace Metrics.Height/Width with HLineGap and VLineGap
Updates #2454
This commit is contained in:
parent
d91455c0a7
commit
a444f2dd40
@ -93,7 +93,7 @@ func (g *Game) Draw(screen *ebiten.Image) {
|
|||||||
|
|
||||||
// Use bitmapfont.Face instead of ebitenutil.DebugPrint, since some key names might not be printed with DebugPrint.
|
// Use bitmapfont.Face instead of ebitenutil.DebugPrint, since some key names might not be printed with DebugPrint.
|
||||||
textOp := &text.DrawOptions{}
|
textOp := &text.DrawOptions{}
|
||||||
textOp.LineSpacingInPixels = fontFace.Metrics().Height
|
textOp.LineSpacingInPixels = fontFace.Metrics().HLineGap + fontFace.Metrics().HAscent + fontFace.Metrics().HDescent
|
||||||
text.Draw(screen, strings.Join(keyStrs, ", ")+"\n"+strings.Join(keyNames, ", "), fontFace, textOp)
|
text.Draw(screen, strings.Join(keyStrs, ", ")+"\n"+strings.Join(keyNames, ", "), fontFace, textOp)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ func (g *Game) Update() error {
|
|||||||
// Initialize the glyphs for special (colorful) rendering.
|
// Initialize the glyphs for special (colorful) rendering.
|
||||||
if len(g.glyphs) == 0 {
|
if len(g.glyphs) == 0 {
|
||||||
op := &text.LayoutOptions{}
|
op := &text.LayoutOptions{}
|
||||||
op.LineSpacingInPixels = mplusNormalFace.Metrics().Height
|
op.LineSpacingInPixels = mplusNormalFace.Size * 1.5
|
||||||
g.glyphs = text.AppendGlyphs(g.glyphs, sampleText, mplusNormalFace, op)
|
g.glyphs = text.AppendGlyphs(g.glyphs, sampleText, mplusNormalFace, op)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -79,20 +79,20 @@ func (g *Game) Draw(screen *ebiten.Image) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
const x, y = 20, 20
|
const x, y = 20, 20
|
||||||
w, h := text.Measure(sampleText, mplusNormalFace, mplusNormalFace.Metrics().Height)
|
w, h := text.Measure(sampleText, mplusNormalFace, mplusNormalFace.Size*1.5)
|
||||||
vector.DrawFilledRect(screen, x, y, float32(w), float32(h), gray, false)
|
vector.DrawFilledRect(screen, x, y, float32(w), float32(h), gray, false)
|
||||||
op := &text.DrawOptions{}
|
op := &text.DrawOptions{}
|
||||||
op.GeoM.Translate(x, y)
|
op.GeoM.Translate(x, y)
|
||||||
op.LineSpacingInPixels = mplusNormalFace.Metrics().Height
|
op.LineSpacingInPixels = mplusNormalFace.Size * 1.5
|
||||||
text.Draw(screen, sampleText, mplusNormalFace, op)
|
text.Draw(screen, sampleText, mplusNormalFace, op)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
const x, y = 20, 120
|
const x, y = 20, 120
|
||||||
w, h := text.Measure(sampleText, mplusBigFace, mplusBigFace.Metrics().Height)
|
w, h := text.Measure(sampleText, mplusBigFace, mplusBigFace.Size*1.5)
|
||||||
vector.DrawFilledRect(screen, x, y, float32(w), float32(h), gray, false)
|
vector.DrawFilledRect(screen, x, y, float32(w), float32(h), gray, false)
|
||||||
op := &text.DrawOptions{}
|
op := &text.DrawOptions{}
|
||||||
op.GeoM.Translate(x, y)
|
op.GeoM.Translate(x, y)
|
||||||
op.LineSpacingInPixels = mplusBigFace.Metrics().Height
|
op.LineSpacingInPixels = mplusBigFace.Size * 1.5
|
||||||
text.Draw(screen, sampleText, mplusBigFace, op)
|
text.Draw(screen, sampleText, mplusBigFace, op)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
@ -101,7 +101,7 @@ func (g *Game) Draw(screen *ebiten.Image) {
|
|||||||
op.GeoM.Rotate(math.Pi / 4)
|
op.GeoM.Rotate(math.Pi / 4)
|
||||||
op.GeoM.Translate(x, y)
|
op.GeoM.Translate(x, y)
|
||||||
op.Filter = ebiten.FilterLinear
|
op.Filter = ebiten.FilterLinear
|
||||||
op.LineSpacingInPixels = mplusNormalFace.Metrics().Height
|
op.LineSpacingInPixels = mplusNormalFace.Size * 1.5
|
||||||
text.Draw(screen, sampleText, mplusNormalFace, op)
|
text.Draw(screen, sampleText, mplusNormalFace, op)
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
|
@ -91,7 +91,7 @@ func (t *TextField) textIndexByCursorPosition(x, y int) (int, bool) {
|
|||||||
y = 0
|
y = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
lineSpacingInPixels := int(fontFace.Metrics().Height)
|
lineSpacingInPixels := int(fontFace.Metrics().HLineGap + fontFace.Metrics().HAscent + fontFace.Metrics().HDescent)
|
||||||
var nlCount int
|
var nlCount int
|
||||||
var lineStart int
|
var lineStart int
|
||||||
var prevAdvance float64
|
var prevAdvance float64
|
||||||
@ -256,7 +256,7 @@ func (t *TextField) cursorPos() (int, int) {
|
|||||||
txt += t.state.Text[:t.state.CompositionSelectionStartInBytes]
|
txt += t.state.Text[:t.state.CompositionSelectionStartInBytes]
|
||||||
}
|
}
|
||||||
x := int(text.Advance(txt, fontFace))
|
x := int(text.Advance(txt, fontFace))
|
||||||
y := nlCount * int(fontFace.Metrics().Height)
|
y := nlCount * int(fontFace.Metrics().HLineGap+fontFace.Metrics().HAscent+fontFace.Metrics().HDescent)
|
||||||
return x, y
|
return x, y
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,7 +274,7 @@ func (t *TextField) Draw(screen *ebiten.Image) {
|
|||||||
cx, cy := t.cursorPos()
|
cx, cy := t.cursorPos()
|
||||||
x += px + cx
|
x += px + cx
|
||||||
y += py + cy
|
y += py + cy
|
||||||
h := int(fontFace.Metrics().Height)
|
h := int(fontFace.Metrics().HLineGap + fontFace.Metrics().HAscent + fontFace.Metrics().HDescent)
|
||||||
vector.StrokeLine(screen, float32(x), float32(y), float32(x), float32(y+h), 1, color.Black, false)
|
vector.StrokeLine(screen, float32(x), float32(y), float32(x), float32(y+h), 1, color.Black, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -288,7 +288,7 @@ func (t *TextField) Draw(screen *ebiten.Image) {
|
|||||||
op := &text.DrawOptions{}
|
op := &text.DrawOptions{}
|
||||||
op.GeoM.Translate(float64(tx), float64(ty))
|
op.GeoM.Translate(float64(tx), float64(ty))
|
||||||
op.ColorScale.ScaleWithColor(color.Black)
|
op.ColorScale.ScaleWithColor(color.Black)
|
||||||
op.LineSpacingInPixels = fontFace.Metrics().Height
|
op.LineSpacingInPixels = fontFace.Metrics().HLineGap + fontFace.Metrics().HAscent + fontFace.Metrics().HDescent
|
||||||
text.Draw(screen, shownText, fontFace, op)
|
text.Draw(screen, shownText, fontFace, op)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -296,7 +296,7 @@ const textFieldHeight = 24
|
|||||||
|
|
||||||
func textFieldPadding() (int, int) {
|
func textFieldPadding() (int, int) {
|
||||||
m := fontFace.Metrics()
|
m := fontFace.Metrics()
|
||||||
return 4, (textFieldHeight - int(m.Height)) / 2
|
return 4, (textFieldHeight - int(m.HLineGap+m.HAscent+m.HDescent)) / 2
|
||||||
}
|
}
|
||||||
|
|
||||||
type Game struct {
|
type Game struct {
|
||||||
|
@ -189,12 +189,12 @@ func (g *GoTextFace) Metrics() Metrics {
|
|||||||
|
|
||||||
var m Metrics
|
var m Metrics
|
||||||
if h, ok := g.Source.f.FontHExtents(); ok {
|
if h, ok := g.Source.f.FontHExtents(); ok {
|
||||||
m.Height = float64(h.Ascender-h.Descender+h.LineGap) * scale
|
m.HLineGap = float64(h.LineGap) * scale
|
||||||
m.HAscent = float64(h.Ascender) * scale
|
m.HAscent = float64(h.Ascender) * scale
|
||||||
m.HDescent = float64(-h.Descender) * scale
|
m.HDescent = float64(-h.Descender) * scale
|
||||||
}
|
}
|
||||||
if v, ok := g.Source.f.FontVExtents(); ok {
|
if v, ok := g.Source.f.FontVExtents(); ok {
|
||||||
m.Width = float64(v.Ascender-v.Descender+v.LineGap) * scale
|
m.VLineGap = float64(v.LineGap) * scale
|
||||||
m.VAscent = float64(v.Ascender) * scale
|
m.VAscent = float64(v.Ascender) * scale
|
||||||
m.VDescent = float64(-v.Descender) * scale
|
m.VDescent = float64(-v.Descender) * scale
|
||||||
}
|
}
|
||||||
|
@ -33,8 +33,8 @@ func (m MultiFace) Metrics() Metrics {
|
|||||||
var mt Metrics
|
var mt Metrics
|
||||||
for _, f := range m {
|
for _, f := range m {
|
||||||
mt1 := f.Metrics()
|
mt1 := f.Metrics()
|
||||||
if mt1.Height > mt.Height {
|
if mt1.HLineGap > mt.HLineGap {
|
||||||
mt.Height = mt1.Height
|
mt.HLineGap = mt1.HLineGap
|
||||||
}
|
}
|
||||||
if mt1.HAscent > mt.HAscent {
|
if mt1.HAscent > mt.HAscent {
|
||||||
mt.HAscent = mt1.HAscent
|
mt.HAscent = mt1.HAscent
|
||||||
@ -42,8 +42,8 @@ func (m MultiFace) Metrics() Metrics {
|
|||||||
if mt1.HDescent > mt.HDescent {
|
if mt1.HDescent > mt.HDescent {
|
||||||
mt.HDescent = mt1.HDescent
|
mt.HDescent = mt1.HDescent
|
||||||
}
|
}
|
||||||
if mt1.Width > mt.Width {
|
if mt1.VLineGap > mt.VLineGap {
|
||||||
mt.Width = mt1.Width
|
mt.VLineGap = mt1.VLineGap
|
||||||
}
|
}
|
||||||
if mt1.VAscent > mt.VAscent {
|
if mt1.VAscent > mt.VAscent {
|
||||||
mt.VAscent = mt1.VAscent
|
mt.VAscent = mt1.VAscent
|
||||||
|
@ -68,7 +68,7 @@ func (s *StdFace) Metrics() Metrics {
|
|||||||
|
|
||||||
m := s.f.Metrics()
|
m := s.f.Metrics()
|
||||||
return Metrics{
|
return Metrics{
|
||||||
Height: fixed26_6ToFloat64(m.Height),
|
HLineGap: fixed26_6ToFloat64(m.Height - m.Ascent - m.Descent),
|
||||||
HAscent: fixed26_6ToFloat64(m.Ascent),
|
HAscent: fixed26_6ToFloat64(m.Ascent),
|
||||||
HDescent: fixed26_6ToFloat64(m.Descent),
|
HDescent: fixed26_6ToFloat64(m.Descent),
|
||||||
}
|
}
|
||||||
|
@ -48,8 +48,8 @@ type Face interface {
|
|||||||
// Metrics holds the metrics for a Face.
|
// Metrics holds the metrics for a Face.
|
||||||
// A visual depiction is at https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/Art/glyph_metrics_2x.png
|
// A visual depiction is at https://developer.apple.com/library/mac/documentation/TextFonts/Conceptual/CocoaTextArchitecture/Art/glyph_metrics_2x.png
|
||||||
type Metrics struct {
|
type Metrics struct {
|
||||||
// Height is the recommended amount of vertical space between two lines of text in pixels.
|
// HLineGap is the recommended amount of vertical space between two lines of text in pixels.
|
||||||
Height float64
|
HLineGap float64
|
||||||
|
|
||||||
// HAscent is the distance in pixels from the top of a line to its baseline for horizontal lines.
|
// HAscent is the distance in pixels from the top of a line to its baseline for horizontal lines.
|
||||||
HAscent float64
|
HAscent float64
|
||||||
@ -58,9 +58,9 @@ type Metrics struct {
|
|||||||
// The value is typically positive, even though a descender goes below the baseline.
|
// The value is typically positive, even though a descender goes below the baseline.
|
||||||
HDescent float64
|
HDescent float64
|
||||||
|
|
||||||
// Width is the recommended amount of horizontal space between two lines of text in pixels.
|
// VLineGap is the recommended amount of horizontal space between two lines of text in pixels.
|
||||||
// If the face is StdFace or the font dosen't support a vertical direction, Width is 0.
|
// If the face is StdFace or the font dosen't support a vertical direction, VLineGap is 0.
|
||||||
Width float64
|
VLineGap float64
|
||||||
|
|
||||||
// VAscent is the distance in pixels from the top of a line to its baseline for vertical lines.
|
// VAscent is the distance in pixels from the top of a line to its baseline for vertical lines.
|
||||||
// If the face is StdFace or the font dosen't support a vertical direction, VAscent is 0.
|
// If the face is StdFace or the font dosen't support a vertical direction, VAscent is 0.
|
||||||
|
Loading…
Reference in New Issue
Block a user