mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 11:18:54 +01:00
text/v2: replace Rune and IndexInBytes with Start/EndIndexInBytes in Glyph
The relationships between runes and glyphs are n:m in general, then Rune is not enough. Let Glyph have a range of a string. Updates #2454
This commit is contained in:
parent
ea1d9dde4e
commit
2b46a77e39
@ -204,6 +204,7 @@ func appendGlyphs(glyphs []Glyph, text string, face Face, x, y float64, options
|
||||
}
|
||||
}
|
||||
|
||||
var indexOffset int
|
||||
var originX, originY float64
|
||||
var i int
|
||||
for t := text; ; {
|
||||
@ -231,12 +232,13 @@ func appendGlyphs(glyphs []Glyph, text string, face Face, x, y float64, options
|
||||
}
|
||||
}
|
||||
|
||||
glyphs = face.appendGlyphs(glyphs, line, originX+offsetX+x, originY+offsetY+y)
|
||||
glyphs = face.appendGlyphs(glyphs, line, indexOffset, originX+offsetX+x, originY+offsetY+y)
|
||||
|
||||
if !found {
|
||||
break
|
||||
}
|
||||
t = rest
|
||||
indexOffset += len(line) + 1
|
||||
i++
|
||||
|
||||
// Advance the origin position in the secondary direction.
|
||||
|
@ -18,6 +18,7 @@ import (
|
||||
"image"
|
||||
"runtime"
|
||||
"sync/atomic"
|
||||
"unicode/utf8"
|
||||
|
||||
"golang.org/x/image/font"
|
||||
"golang.org/x/image/math/fixed"
|
||||
@ -92,7 +93,7 @@ func (s *StdFace) advance(text string) float64 {
|
||||
}
|
||||
|
||||
// appendGlyphs implements Face.
|
||||
func (s *StdFace) appendGlyphs(glyphs []Glyph, text string, originX, originY float64) []Glyph {
|
||||
func (s *StdFace) appendGlyphs(glyphs []Glyph, text string, indexOffset int, originX, originY float64) []Glyph {
|
||||
s.copyCheck()
|
||||
|
||||
origin := fixed.Point26_6{
|
||||
@ -109,12 +110,13 @@ func (s *StdFace) appendGlyphs(glyphs []Glyph, text string, originX, originY flo
|
||||
if img != nil {
|
||||
// Adjust the position to the integers.
|
||||
// The current glyph images assume that they are rendered on integer positions so far.
|
||||
_, size := utf8.DecodeRuneInString(text[i:])
|
||||
glyphs = append(glyphs, Glyph{
|
||||
Rune: r,
|
||||
IndexInBytes: i,
|
||||
Image: img,
|
||||
X: float64(imgX),
|
||||
Y: float64(imgY),
|
||||
StartIndexInBytes: indexOffset + i,
|
||||
EndIndexInBytes: indexOffset + i + size,
|
||||
Image: img,
|
||||
X: float64(imgX),
|
||||
Y: float64(imgY),
|
||||
})
|
||||
}
|
||||
origin.X += a
|
||||
|
@ -42,7 +42,7 @@ type Face interface {
|
||||
|
||||
advance(text string) float64
|
||||
|
||||
appendGlyphs(glyphs []Glyph, text string, originX, originY float64) []Glyph
|
||||
appendGlyphs(glyphs []Glyph, text string, indexOffset int, originX, originY float64) []Glyph
|
||||
|
||||
direction() Direction
|
||||
|
||||
@ -90,11 +90,14 @@ func adjustGranularity(x fixed.Int26_6) fixed.Int26_6 {
|
||||
|
||||
// Glyph represents one glyph to render.
|
||||
type Glyph struct {
|
||||
// Rune is a character for this glyph.
|
||||
Rune rune
|
||||
// StartIndexInBytes is the start index in bytes for the given string at AppendGlyphs.
|
||||
StartIndexInBytes int
|
||||
|
||||
// IndexInBytes is an index in bytes for the given string at AppendGlyphs.
|
||||
IndexInBytes int
|
||||
// EndIndexInBytes is the end index in bytes for the given string at AppendGlyphs.
|
||||
EndIndexInBytes int
|
||||
|
||||
// GID is an ID for a glyph of TrueType or OpenType font. GID is valid when the font is GoTextFont.
|
||||
GID uint32
|
||||
|
||||
// Image is a rasterized glyph image.
|
||||
// Image is a grayscale image i.e. RGBA values are the same.
|
||||
@ -110,9 +113,6 @@ type Glyph struct {
|
||||
// The position is determined in a sequence of characters given at AppendGlyphs.
|
||||
// The position's origin is the first character's origin position.
|
||||
Y float64
|
||||
|
||||
// GID is an ID for a glyph of TrueType or OpenType font. GID is valid when the font is GoTextFont.
|
||||
GID uint32
|
||||
}
|
||||
|
||||
// Advance returns the advanced distance from the origin position when rendering the given text with the given face.
|
||||
|
40
text/v2/text_test.go
Normal file
40
text/v2/text_test.go
Normal file
@ -0,0 +1,40 @@
|
||||
// Copyright 2023 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.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package text_test
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/hajimehoshi/bitmapfont/v3"
|
||||
|
||||
"github.com/hajimehoshi/ebiten/v2/text/v2"
|
||||
)
|
||||
|
||||
func TestGlyphIndex(t *testing.T) {
|
||||
const sampleText = `The quick brown fox jumps
|
||||
over the lazy dog.`
|
||||
|
||||
f := text.NewStdFace(bitmapfont.Face)
|
||||
got := sampleText
|
||||
for _, g := range text.AppendGlyphs(nil, sampleText, f, nil) {
|
||||
got = got[:g.StartIndexInBytes] + strings.Repeat(" ", g.EndIndexInBytes-g.StartIndexInBytes) + got[g.EndIndexInBytes:]
|
||||
}
|
||||
want := regexp.MustCompile(`\S`).ReplaceAllString(sampleText, " ")
|
||||
if got != want {
|
||||
t.Errorf("got: %q, want: %q", got, want)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user