Package opentype
Package opentype implements a glyph rasterizer for TTF (TrueType Fonts) and
OTF (OpenType Fonts).
This package provides a high-level API, centered on the NewFace function,
implementing the golang.org/x/image/font.Face interface.
The sibling golang.org/x/image/font/sfnt package provides a low-level API.
- func NewFace(f *Font, opts *FaceOptions) (font.Face, error)
- type Collection
- func ParseCollection(src []byte) (*Collection, error)
- func ParseCollectionReaderAt(src io.ReaderAt) (*Collection, error)
- type Face
- func (f *Face) Close() error
- func (f *Face) Glyph(dot fixed.Point26_6, r rune) (dr image.Rectangle, mask image.Image, maskp image.Point, advance fixed.Int26_6, ok bool)
- func (f *Face) GlyphAdvance(r rune) (advance fixed.Int26_6, ok bool)
- func (f *Face) GlyphBounds(r rune) (bounds fixed.Rectangle26_6, advance fixed.Int26_6, ok bool)
- func (f *Face) Kern(r0, r1 rune) fixed.Int26_6
- func (f *Face) Metrics() font.Metrics
- type FaceOptions
- type Font
- func Parse(src []byte) (*Font, error)
- func ParseReaderAt(src io.ReaderAt) (*Font, error)
Package files
opentype.go
func NewFace(f *Font, opts *FaceOptions) (font.Face, error)
NewFace returns a new font.Face for the given Font.
If opts is nil, sensible defaults will be used.
▾ Example
Code:
const (
width = 72
height = 36
startingDotX = 6
startingDotY = 28
)
f, err := opentype.Parse(goitalic.TTF)
if err != nil {
log.Fatalf("Parse: %v", err)
}
face, err := opentype.NewFace(f, &opentype.FaceOptions{
Size: 32,
DPI: 72,
Hinting: font.HintingNone,
})
if err != nil {
log.Fatalf("NewFace: %v", err)
}
dst := image.NewGray(image.Rect(0, 0, width, height))
d := font.Drawer{
Dst: dst,
Src: image.White,
Face: face,
Dot: fixed.P(startingDotX, startingDotY),
}
fmt.Printf("The dot is at %v\n", d.Dot)
d.DrawString("jel")
fmt.Printf("The dot is at %v\n", d.Dot)
d.Src = image.NewUniform(color.Gray{0x7F})
d.DrawString("ly")
fmt.Printf("The dot is at %v\n", d.Dot)
const asciiArt = ".++8"
buf := make([]byte, 0, height*(width+1))
for y := 0; y < height; y++ {
for x := 0; x < width; x++ {
c := asciiArt[dst.GrayAt(x, y).Y>>6]
if c != '.' {
} else if x == startingDotX-1 {
c = ']'
} else if y == startingDotY-1 {
c = '_'
}
buf = append(buf, c)
}
buf = append(buf, '\n')
}
os.Stdout.Write(buf)
Output:
The dot is at {6:00 28:00}
The dot is at {41:32 28:00}
The dot is at {66:48 28:00}
.....]..................................................................
.....]..................................................................
.....]..................................................................
.....]..................................+++......+++....................
.....]........+++.......................888......+++....................
.....].......+88+......................+88+......+++....................
.....].......888+......................+88+.....+++.....................
.....].......888+......................+88+.....+++.....................
.....].................................888......+++.....................
.....].................................888......+++.....................
.....]....................++..........+88+......+++.....................
.....]......+88+.......+888888+.......+88+.....+++....+++..........++...
.....]......888......+888888888+......+88+.....+++....++++........+++...
.....]......888.....+888+...+888......888......+++.....+++........++....
.....].....+888....+888......+88+.....888......+++.....+++.......+++....
.....].....+88+....888.......+88+....+88+......+++.....+++......+++.....
.....].....+88+...+888.......+88+....+88+.....+++......+++......+++.....
.....].....888....888+++++++++88+....+88+.....+++......+++.....+++......
.....].....888....88888888888888+....888......+++......++++....++.......
.....]....+888...+88888888888888.....888......+++.......+++...+++.......
.....]....+88+...+888...............+888......+++.......+++..+++........
.....]....+88+...+888...............+88+.....+++........+++..+++........
.....]....888....+888...............+88+.....+++........+++.+++.........
.....]....888....+888...............888......+++........++++++..........
.....]...+888.....888+..............888......+++........++++++..........
.....]...+88+.....+8888+....++8.....888+.....++++........++++...........
.....]...+88+......+8888888888+.....+8888....+++++.......++++...........
_____]___888________+88888888++______+888_____++++_______+++____________
.....]...888...........+++.............++................+++............
.....]..+88+............................................+++.............
.....]..+88+...........................................+++..............
.....].+888............................................+++..............
....888888............................................+++...............
....88888............................................++++...............
....+++.................................................................
.....]..................................................................
Collection is a collection of one or more fonts.
All of the Collection methods are safe to call concurrently.
type Collection = sfnt.Collection
func ParseCollection(src []byte) (*Collection, error)
ParseCollection parses an OpenType font collection, such as TTC or OTC data,
from a []byte data source.
If passed data for a single font, a TTF or OTF instead of a TTC or OTC, it
will return a collection containing 1 font.
func ParseCollectionReaderAt(src io.ReaderAt) (*Collection, error)
ParseCollectionReaderAt parses an OpenType collection, such as TTC or OTC
data, from an io.ReaderAt data source.
If passed data for a single font, a TTF or OTF instead of a TTC or OTC, it
will return a collection containing 1 font.
Face implements the font.Face interface for Font values.
A Face is not safe to use concurrently.
type Face struct {
}
func (*Face) Close
¶
func (f *Face) Close() error
Close satisfies the font.Face interface.
func (*Face) Glyph
¶
func (f *Face) Glyph(dot fixed.Point26_6, r rune) (dr image.Rectangle, mask image.Image, maskp image.Point, advance fixed.Int26_6, ok bool)
Glyph satisfies the font.Face interface.
func (f *Face) GlyphAdvance(r rune) (advance fixed.Int26_6, ok bool)
GlyphAdvance satisfies the font.Face interface.
func (f *Face) GlyphBounds(r rune) (bounds fixed.Rectangle26_6, advance fixed.Int26_6, ok bool)
GlyphBounds satisfies the font.Face interface.
func (*Face) Kern
¶
func (f *Face) Kern(r0, r1 rune) fixed.Int26_6
Kern satisfies the font.Face interface.
func (f *Face) Metrics() font.Metrics
Metrics satisfies the font.Face interface.
FaceOptions describes the possible options given to NewFace when
creating a new font.Face from a Font.
type FaceOptions struct {
Size float64
DPI float64
Hinting font.Hinting
}
Font is an OpenType font, also known as an SFNT font.
All of the Font methods are safe to call concurrently, as long as each call
has a different *sfnt.Buffer (or nil).
The Font methods that don't take a *sfnt.Buffer argument are always safe to
call concurrently.
type Font = sfnt.Font
func Parse(src []byte) (*Font, error)
Parse parses an OpenType font, such as TTF or OTF data, from a []byte data
source.
func ParseReaderAt(src io.ReaderAt) (*Font, error)
ParseReaderAt parses an OpenType font, such as TTF or OTF data, from an
io.ReaderAt data source.