| // Copyright 2016 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package sfnt |
| |
| import ( |
| "bytes" |
| "io/ioutil" |
| "path/filepath" |
| "testing" |
| |
| "golang.org/x/image/font/gofont/goregular" |
| ) |
| |
| func TestTrueTypeParse(t *testing.T) { |
| f, err := Parse(goregular.TTF) |
| if err != nil { |
| t.Fatalf("Parse: %v", err) |
| } |
| testTrueType(t, f) |
| } |
| |
| func TestTrueTypeParseReaderAt(t *testing.T) { |
| f, err := ParseReaderAt(bytes.NewReader(goregular.TTF)) |
| if err != nil { |
| t.Fatalf("ParseReaderAt: %v", err) |
| } |
| testTrueType(t, f) |
| } |
| |
| func testTrueType(t *testing.T, f *Font) { |
| if got, want := f.UnitsPerEm(), Units(2048); got != want { |
| t.Errorf("UnitsPerEm: got %d, want %d", got, want) |
| } |
| // The exact number of glyphs in goregular.TTF can vary, and future |
| // versions may add more glyphs, but https://blog.golang.org/go-fonts says |
| // that "The WGL4 character set... [has] more than 650 characters in all. |
| if got, want := f.NumGlyphs(), 650; got <= want { |
| t.Errorf("NumGlyphs: got %d, want > %d", got, want) |
| } |
| } |
| |
| func TestPostScript(t *testing.T) { |
| data, err := ioutil.ReadFile(filepath.Join("..", "testdata", "CFFTest.otf")) |
| if err != nil { |
| t.Fatal(err) |
| } |
| f, err := Parse(data) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| // TODO: replace this by a higher level test, once we parse Type 2 |
| // Charstrings. |
| // |
| // As a sanity check for now, note that each string ends in '\x0e', which |
| // 5177.Type2.pdf Appendix A defines as "endchar". |
| wants := [...]string{ |
| "\xf7\x63\x8b\xbd\xf8\x45\xbd\x01\xbd\xbd\xf7\xc0\xbd\x03\xbd\x16\xf8\x24\xf8\xa9\xfc\x24\x06\xbd\xfc\x77\x15\xf8\x45\xf7\xc0\xfc\x45\x07\x0e", |
| "\x8b\xef\xf8\xec\xef\x01\xef\xdb\xf7\x84\xdb\x03\xf7\xc0\xf9\x50\x15\xdb\xb3\xfb\x0c\x3b\xfb\x2a\x6d\xfb\x8e\x31\x3b\x63\xf7\x0c\xdb\xf7\x2a\xa9\xf7\x8e\xe5\x1f\xef\x04\x27\x27\xfb\x70\xfb\x48\xfb\x48\xef\xfb\x70\xef\xef\xef\xf7\x70\xf7\x48\xf7\x48\x27\xf7\x70\x27\x1f\x0e", |
| "\xf6\xa0\x76\x01\xef\xf7\x5c\x03\xef\x16\xf7\x5c\xf9\xb4\xfb\x5c\x06\x0e", |
| "\xf7\x89\xe1\x03\xf7\x21\xf8\x9c\x15\x87\xfb\x38\xf7\x00\xb7\xe1\xfc\x0a\xa3\xf8\x18\xf7\x00\x9f\x81\xf7\x4e\xfb\x04\x6f\x81\xf7\x3a\x33\x85\x83\xfb\x52\x05\x0e", |
| } |
| if ng := f.NumGlyphs(); ng != len(wants) { |
| t.Fatalf("NumGlyphs: got %d, want %d", ng, len(wants)) |
| } |
| for i, want := range wants { |
| gd, err := f.viewGlyphData(nil, i) |
| if err != nil { |
| t.Errorf("i=%d: %v", i, err) |
| continue |
| } |
| if got := string(gd); got != want { |
| t.Errorf("i=%d:\ngot % x\nwant % x", i, got, want) |
| } |
| } |
| } |