Skip to content

Commit

Permalink
Prepare for CFF2 parsing
Browse files Browse the repository at this point in the history
  • Loading branch information
tdewolff committed Apr 20, 2021
1 parent b11e572 commit 5d126f1
Show file tree
Hide file tree
Showing 5 changed files with 367 additions and 167 deletions.
2 changes: 1 addition & 1 deletion eps/eps.go
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ func (r *EPS) RenderPath(path *canvas.Path, style canvas.Style, m canvas.Matrix)

func (r *EPS) RenderText(text *canvas.Text, m canvas.Matrix) {
// TODO: (EPS) write text natively
text.RenderAsPath(r, m)
text.RenderAsPath(r, m, canvas.DefaultResolution)
}

func (r *EPS) RenderImage(img image.Image, m canvas.Matrix) {
Expand Down
9 changes: 9 additions & 0 deletions font/font_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,15 @@ func TestParseOTF(t *testing.T) {
test.T(t, sfnt.Head.UnitsPerEm, uint16(1000))
}

//func TestParseOTF_CFF2(t *testing.T) {
// b, err := ioutil.ReadFile("../resources/AdobeVFPrototype.otf") // TODO: CFF2
// test.Error(t, err)
//
// sfnt, err := ParseFont(b, 0)
// test.Error(t, err)
// test.T(t, sfnt.Head.UnitsPerEm, uint16(1000))
//}

func TestParseWOFF(t *testing.T) {
b, err := ioutil.ReadFile("../resources/DejaVuSerif.woff")
test.Error(t, err)
Expand Down
21 changes: 13 additions & 8 deletions font/sfnt.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ type SFNT struct {

// CFF
CFF *cffTable
//CFF2 *cff2Table // TODO

// optional
Kern *kernTable
Expand All @@ -60,6 +59,7 @@ type SFNT struct {
//Gpos *gposTable // TODO
//Gsub *gsubTable // TODO
//Gasp *gaspTable // TODO
//Base *baseTable // TODO
}

func (sfnt *SFNT) NumGlyphs() uint16 {
Expand Down Expand Up @@ -234,6 +234,8 @@ func ParseSFNT(b []byte, index int) (*SFNT, error) {
switch tableName {
case "CFF ":
err = sfnt.parseCFF()
case "CFF2":
err = sfnt.parseCFF2()
case "cmap":
err = sfnt.parseCmap()
case "glyf":
Expand Down Expand Up @@ -1415,17 +1417,19 @@ func (post *postTable) Get(glyphID uint16) string {
}

func (sfnt *SFNT) parsePost() error {
// requires data from maxp
// requires data from maxp and CFF2
b, ok := sfnt.Tables["post"]
if !ok {
return fmt.Errorf("post: missing table")
} else if len(b) < 32 {
return fmt.Errorf("post: bad table")
}

_, isCFF2 := sfnt.Tables["CFF2"]

sfnt.Post = &postTable{}
r := newBinaryReader(b)
version := r.ReadBytes(4)
version := r.ReadUint32()
sfnt.Post.ItalicAngle = r.ReadUint32()
sfnt.Post.UnderlinePosition = r.ReadInt16()
sfnt.Post.UnderlineThickness = r.ReadInt16()
Expand All @@ -1434,9 +1438,10 @@ func (sfnt *SFNT) parsePost() error {
sfnt.Post.MaxMemType42 = r.ReadUint32()
sfnt.Post.MinMemType1 = r.ReadUint32()
sfnt.Post.MaxMemType1 = r.ReadUint32()
if binary.BigEndian.Uint32(version) == 0x00010000 && !sfnt.IsCFF && len(b) == 32 {
if version == 0x00010000 && sfnt.IsTrueType && len(b) == 32 {
return nil
} else if binary.BigEndian.Uint32(version) == 0x00020000 && !sfnt.IsCFF && 34 <= len(b) {
} else if version == 0x00020000 && (sfnt.IsTrueType || isCFF2) && 34 <= len(b) {
// can be used for TrueType and CFF2 fonts, we check for this in the CFF table
if r.ReadUint16() != sfnt.Maxp.NumGlyphs {
return fmt.Errorf("post: numGlyphs does not match maxp table numGlyphs")
}
Expand Down Expand Up @@ -1467,12 +1472,12 @@ func (sfnt *SFNT) parsePost() error {
sfnt.Post.GlyphNameIndex[i] = index
}
return nil
} else if binary.BigEndian.Uint32(version) == 0x00025000 && len(b) == 32 {
} else if version == 0x00025000 && sfnt.IsTrueType && len(b) == 32 {
return fmt.Errorf("post: version 2.5 not supported")
} else if binary.BigEndian.Uint32(version) == 0x00030000 && len(b) == 32 {
} else if version == 0x00030000 && len(b) == 32 {
return nil
}
return fmt.Errorf("post: bad table")
return fmt.Errorf("post: bad version")
}

////////////////////////////////////////////////////////////////
Expand Down

0 comments on commit 5d126f1

Please sign in to comment.