提交 bb775957 编写于 作者: N Nigel Tao

freetype/truetype: propagate the useMyMetrics flag to nested components.

Also increase the maximum recursion depth from 4 to 8, since some
x-deja-vu-sans-oblique glyphs are actually depth 4. It's an arbitrary
limit. The C Freetype code doesn't seem to limit recursion (below
whatever the font says it needs), but it seems safer to have a limit.

R=bsiegert
CC=golang-dev
https://codereview.appspot.com/14494062
上级 8373bbf0
...@@ -94,7 +94,8 @@ func (g *GlyphBuf) Load(f *Font, scale int32, i Index, h *Hinter) error { ...@@ -94,7 +94,8 @@ func (g *GlyphBuf) Load(f *Font, scale int32, i Index, h *Hinter) error {
} }
func (g *GlyphBuf) load(recursion int32, i Index, useMyMetrics bool) (err error) { func (g *GlyphBuf) load(recursion int32, i Index, useMyMetrics bool) (err error) {
if recursion >= 4 { // The recursion limit here is arbitrary, but defends against malformed glyphs.
if recursion >= 32 {
return UnsupportedError("excessive compound glyph recursion") return UnsupportedError("excessive compound glyph recursion")
} }
// Find the relevant slice of g.font.glyf. // Find the relevant slice of g.font.glyf.
...@@ -126,7 +127,7 @@ func (g *GlyphBuf) load(recursion int32, i Index, useMyMetrics bool) (err error) ...@@ -126,7 +127,7 @@ func (g *GlyphBuf) load(recursion int32, i Index, useMyMetrics bool) (err error)
return UnsupportedError("negative number of contours") return UnsupportedError("negative number of contours")
} }
pp1x = g.font.scale(g.scale * (b.XMin - uhm.LeftSideBearing)) pp1x = g.font.scale(g.scale * (b.XMin - uhm.LeftSideBearing))
if err := g.loadCompound(recursion, glyf); err != nil { if err := g.loadCompound(recursion, glyf, useMyMetrics); err != nil {
return err return err
} }
} else { } else {
...@@ -267,7 +268,7 @@ func (g *GlyphBuf) loadSimple(glyf []byte, ne int) (program []byte) { ...@@ -267,7 +268,7 @@ func (g *GlyphBuf) loadSimple(glyf []byte, ne int) (program []byte) {
return program return program
} }
func (g *GlyphBuf) loadCompound(recursion int32, glyf []byte) error { func (g *GlyphBuf) loadCompound(recursion int32, glyf []byte, useMyMetrics bool) error {
// Flags for decoding a compound glyph. These flags are documented at // Flags for decoding a compound glyph. These flags are documented at
// http://developer.apple.com/fonts/TTRefMan/RM06/Chap6glyf.html. // http://developer.apple.com/fonts/TTRefMan/RM06/Chap6glyf.html.
const ( const (
...@@ -319,7 +320,8 @@ func (g *GlyphBuf) loadCompound(recursion int32, glyf []byte) error { ...@@ -319,7 +320,8 @@ func (g *GlyphBuf) loadCompound(recursion int32, glyf []byte) error {
} }
} }
np0 := len(g.Point) np0 := len(g.Point)
if err := g.load(recursion+1, component, flags&flagUseMyMetrics != 0); err != nil { componentUMM := useMyMetrics && (flags&flagUseMyMetrics != 0)
if err := g.load(recursion+1, component, componentUMM); err != nil {
return err return err
} }
if hasTransform { if hasTransform {
......
...@@ -252,10 +252,8 @@ var scalingTestCases = []struct { ...@@ -252,10 +252,8 @@ var scalingTestCases = []struct {
hintingBrokenAt int hintingBrokenAt int
}{ }{
{"luxisr", 12, -1}, {"luxisr", 12, -1},
// TODO: uncomment the fonts below, once they get past Parse and
// GlyphBuf.Load, and the unhinted values match C Freetype.
{"x-arial-bold", 11, 0}, {"x-arial-bold", 11, 0},
//{"x-deja-vu-sans-oblique", 17, 0}, {"x-deja-vu-sans-oblique", 17, 0},
{"x-droid-sans-japanese", 9, 0}, {"x-droid-sans-japanese", 9, 0},
{"x-times-new-roman", 13, 0}, {"x-times-new-roman", 13, 0},
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册