Example #1
0
func (stash *Stash) AddFontFromMemory(buffer []byte) (int, error) {
	fnt := &Font{}

	// Init hash lookup.
	for i := 0; i < int(HASH_LUT_SIZE); i++ {
		fnt.lut[i] = -1
	}

	fnt.data = buffer

	// Init truetype
	var err error
	fnt.font, err = truetype.InitFont(fnt.data, 0)
	if err != nil {
		return 0, err
	}

	// Store normalized line height. The real line height is calculated
	// by multiplying the lineh by font size.
	ascent, descent, lineGap := fnt.font.GetFontVMetrics()
	fh := float64(ascent - descent)
	fnt.ascender = float64(ascent) / fh
	fnt.descender = float64(descent) / fh
	fnt.lineh = (fh + float64(lineGap)) / fh

	fnt.idx = idx
	fnt.fType = TTFONT_MEM
	stash.fonts = append([]*Font{fnt}, stash.fonts...)

	idx++
	return idx - 1, nil
}
func main() {
	data, err := ioutil.ReadFile(filepath.Join("..", "ClearSans-Regular.ttf"))
	if err != nil {
		panic(err)
	}

	font, err := truetype.InitFont(data, truetype.GetFontOffsetForIndex(data, 0))
	if err != nil {
		panic(err)
	}

	var c int
	if len(os.Args) > 1 {
		c = int(os.Args[1][0])
	} else {
		c = int('a')
	}

	bitmap, w, h := font.GetCodepointBitmap(0, font.ScaleForPixelHeight(20), c, 0, 0)

	for j := 0; j < h; j++ {
		for i := 0; i < w; i++ {
			fmt.Printf("%s", string(" .:ioVM@"[bitmap[j*w+i]>>5]))
		}
		fmt.Printf("\n")
	}
}
Example #3
0
func main() {
	data, err := ioutil.ReadFile(filepath.Join("..", "ClearSans-Regular.ttf"))
	if err != nil {
		panic(err)
	}

	font, err := truetype.InitFont(data, truetype.GetFontOffsetForIndex(data, 0))
	if err != nil {
		panic(err)
	}

	bW := 512 // bitmap width
	bH := 128 // bitmap height
	lH := 64  // line height

	scale := font.ScaleForPixelHeight(float64(lH))

	word := "how are you?"

	ascent, descent, _ := font.GetFontVMetrics()

	ascent = int(float64(ascent) * scale)
	descent = int(float64(descent) * scale)

	bitmap := make([]byte, bW*bH)

	x := 0
	for i, b := range word {
		cX1, cY1, cX2, cY2 := font.GetCodepointBitmapBox(int(b), scale, scale)

		y := ascent + cY1

		byteOffset := x + (y * bW)
		tmp := font.MakeCodepointBitmap(bitmap[byteOffset:], cX2-cX1, cY2-cY1, bW, scale, scale, int(b))
		copy(bitmap[byteOffset:], tmp)

		ax, _ := font.GetCodepointHMetrics(int(b))
		x += int(float64(ax) * scale)

		if len(word) > i+1 {
			kern := font.GetCodepointKernAdvance(int(b), int(word[i+1]))
			x += int(float64(kern) * scale)
		}
	}

	r := image.Rect(0, 0, bW, bH)
	g := image.NewGray(r)
	g.Pix = []uint8(bitmap)

	file, err := os.Create("test.png")
	if err != nil {
		panic(err)
	}
	png.Encode(file, g)
}
Example #4
0
func main() {
	data, err := ioutil.ReadFile(filepath.Join("..", "ClearSans-Regular.ttf"))
	if err != nil {
		panic(err)
	}

	font, err := truetype.InitFont(data, truetype.GetFontOffsetForIndex(data, 0))
	if err != nil {
		panic(err)
	}

	text := "Heljo World!"

	scale := font.ScaleForPixelHeight(15)
	ascent, _, _ := font.GetFontVMetrics()
	baseline := int(float64(ascent) * scale)

	var screen [1580]byte

	var xpos float64
	for ch, b := range text {
		xShift := xpos - math.Floor(xpos)
		advance, _ := font.GetCodepointHMetrics(int(b))
		x0, y0, x1, y1 := font.GetCodepointBitmapBoxSubpixel(int(b), scale, scale, xShift, 0)
		tmp := font.MakeCodepointBitmapSubpixel(screen[(baseline+y0)*79+int(xpos)+x0:], x1-x0, y1-y0, 79, scale, scale, xShift, 0, int(b))
		copy(screen[(baseline+y0)*79+int(xpos)+x0:], tmp)
		xpos += (float64(advance) * scale)
		if len(text) > ch+1 {
			xpos += scale * float64(font.GetCodepointKernAdvance(int(b), int(text[ch+1])))
		}
	}

	for j := 0; j < 20; j++ {
		for i := 0; i < 78; i++ {
			fmt.Printf("%s", string(" .:ioVM@"[screen[j*79+i]>>5]))
		}
		fmt.Printf("\n")
	}
}