This is in anticipation of caching glyph images. Quantization means that cache hits are more likely. Also make NewFace take an *Options instead of an Options.
158 lines
3.8 KiB
Go
158 lines
3.8 KiB
Go
// Copyright 2015 The Freetype-Go Authors. All rights reserved.
|
||
// Use of this source code is governed by your choice of either the
|
||
// FreeType License or the GNU General Public License version 2 (or
|
||
// any later version), both of which can be found in the LICENSE file.
|
||
|
||
// +build ignore
|
||
//
|
||
// This build tag means that "go install github.com/golang/freetype/..."
|
||
// doesn't install this example program. Use "go run main.go" to run it.
|
||
|
||
package main
|
||
|
||
import (
|
||
"bufio"
|
||
"flag"
|
||
"fmt"
|
||
"image"
|
||
"image/color"
|
||
"image/draw"
|
||
"image/png"
|
||
"io/ioutil"
|
||
"log"
|
||
"math"
|
||
"os"
|
||
|
||
"github.com/golang/freetype/truetype"
|
||
"golang.org/x/exp/shiny/font"
|
||
"golang.org/x/image/math/fixed"
|
||
)
|
||
|
||
var (
|
||
dpi = flag.Float64("dpi", 72, "screen resolution in Dots Per Inch")
|
||
fontfile = flag.String("fontfile", "../../testdata/luxisr.ttf", "filename of the ttf font")
|
||
hinting = flag.String("hinting", "none", "none | full")
|
||
size = flag.Float64("size", 12, "font size in points")
|
||
spacing = flag.Float64("spacing", 1.5, "line spacing (e.g. 2 means double spaced)")
|
||
wonb = flag.Bool("whiteonblack", false, "white text on a black background")
|
||
)
|
||
|
||
const title = "Jabberwocky"
|
||
|
||
var text = []string{
|
||
"’Twas brillig, and the slithy toves",
|
||
"Did gyre and gimble in the wabe;",
|
||
"All mimsy were the borogoves,",
|
||
"And the mome raths outgrabe.",
|
||
"",
|
||
"“Beware the Jabberwock, my son!",
|
||
"The jaws that bite, the claws that catch!",
|
||
"Beware the Jubjub bird, and shun",
|
||
"The frumious Bandersnatch!”",
|
||
"",
|
||
"He took his vorpal sword in hand:",
|
||
"Long time the manxome foe he sought—",
|
||
"So rested he by the Tumtum tree,",
|
||
"And stood awhile in thought.",
|
||
"",
|
||
"And as in uffish thought he stood,",
|
||
"The Jabberwock, with eyes of flame,",
|
||
"Came whiffling through the tulgey wood,",
|
||
"And burbled as it came!",
|
||
"",
|
||
"One, two! One, two! and through and through",
|
||
"The vorpal blade went snicker-snack!",
|
||
"He left it dead, and with its head",
|
||
"He went galumphing back.",
|
||
"",
|
||
"“And hast thou slain the Jabberwock?",
|
||
"Come to my arms, my beamish boy!",
|
||
"O frabjous day! Callooh! Callay!”",
|
||
"He chortled in his joy.",
|
||
"",
|
||
"’Twas brillig, and the slithy toves",
|
||
"Did gyre and gimble in the wabe;",
|
||
"All mimsy were the borogoves,",
|
||
"And the mome raths outgrabe.",
|
||
}
|
||
|
||
func main() {
|
||
flag.Parse()
|
||
|
||
// Read the font data.
|
||
fontBytes, err := ioutil.ReadFile(*fontfile)
|
||
if err != nil {
|
||
log.Println(err)
|
||
return
|
||
}
|
||
f, err := truetype.Parse(fontBytes)
|
||
if err != nil {
|
||
log.Println(err)
|
||
return
|
||
}
|
||
|
||
// Draw the background and the guidelines.
|
||
fg, bg := image.Black, image.White
|
||
ruler := color.RGBA{0xdd, 0xdd, 0xdd, 0xff}
|
||
if *wonb {
|
||
fg, bg = image.White, image.Black
|
||
ruler = color.RGBA{0x22, 0x22, 0x22, 0xff}
|
||
}
|
||
const imgW, imgH = 640, 480
|
||
rgba := image.NewRGBA(image.Rect(0, 0, imgW, imgH))
|
||
draw.Draw(rgba, rgba.Bounds(), bg, image.ZP, draw.Src)
|
||
for i := 0; i < 200; i++ {
|
||
rgba.Set(10, 10+i, ruler)
|
||
rgba.Set(10+i, 10, ruler)
|
||
}
|
||
|
||
// Draw the text.
|
||
h := font.HintingNone
|
||
switch *hinting {
|
||
case "full":
|
||
h = font.HintingFull
|
||
}
|
||
d := &font.Drawer{
|
||
Dst: rgba,
|
||
Src: fg,
|
||
Face: truetype.NewFace(f, &truetype.Options{
|
||
Size: *size,
|
||
DPI: *dpi,
|
||
Hinting: h,
|
||
}),
|
||
}
|
||
y := 10 + int(math.Ceil(*size**dpi/72))
|
||
dy := int(math.Ceil(*size * *spacing * *dpi / 72))
|
||
d.Dot = fixed.Point26_6{
|
||
X: (fixed.I(imgW) - d.MeasureString(title)) / 2,
|
||
Y: fixed.I(y),
|
||
}
|
||
d.DrawString(title)
|
||
y += dy
|
||
for _, s := range text {
|
||
d.Dot = fixed.P(10, y)
|
||
d.DrawString(s)
|
||
y += dy
|
||
}
|
||
|
||
// Save that RGBA image to disk.
|
||
outFile, err := os.Create("out.png")
|
||
if err != nil {
|
||
log.Println(err)
|
||
os.Exit(1)
|
||
}
|
||
defer outFile.Close()
|
||
b := bufio.NewWriter(outFile)
|
||
err = png.Encode(b, rgba)
|
||
if err != nil {
|
||
log.Println(err)
|
||
os.Exit(1)
|
||
}
|
||
err = b.Flush()
|
||
if err != nil {
|
||
log.Println(err)
|
||
os.Exit(1)
|
||
}
|
||
fmt.Println("Wrote out.png OK.")
|
||
}
|