Documentation ¶
Overview ¶
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 github.com/elwhite321/image/font.Face interface.
The sibling github.com/elwhite321/image/font/sfnt package provides a low-level API.
Index ¶
- func NewFace(f *Font, opts *FaceOptions) (font.Face, error)
- type Collection
- 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, ...)
- 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
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func NewFace ¶
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 ¶
package main import ( "fmt" "image" "image/color" "log" "os" "github.com/elwhite321/image/font" "github.com/elwhite321/image/font/gofont/goitalic" "github.com/elwhite321/image/font/opentype" "github.com/elwhite321/image/math/fixed" ) func main() { 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 != '.' { // No-op. } 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............................................++++............... ....+++................................................................. .....]..................................................................
Types ¶
type Collection ¶
type Collection = sfnt.Collection
Collection is a collection of one or more fonts.
All of the Collection methods are safe to call concurrently.
func ParseCollection ¶
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 ¶
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.
type Face ¶
type Face struct {
// contains filtered or unexported fields
}
Face implements the font.Face interface for Font values.
A Face is not safe to use concurrently.
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 (*Face) GlyphAdvance ¶
GlyphAdvance satisfies the font.Face interface.
func (*Face) GlyphBounds ¶
GlyphBounds satisfies the font.Face interface.
type FaceOptions ¶
type FaceOptions struct { Size float64 // Size is the font size in points DPI float64 // DPI is the dots per inch resolution Hinting font.Hinting // Hinting selects how to quantize a vector font's glyph nodes }
FaceOptions describes the possible options given to NewFace when creating a new font.Face from a Font.
type Font ¶
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.