1// Copyright 2010 The draw2d Authors. All rights reserved.
2// created: 13/12/2010 by Laurent Le Goff
3
4package draw2d
5
6import (
7	"io/ioutil"
8	"log"
9	"path"
10	"path/filepath"
11
12	"github.com/golang/freetype/truetype"
13)
14
15var (
16	fontFolder               = "../resource/font/"
17	fonts                    = make(map[string]*truetype.Font)
18	fontNamer  FontFileNamer = FontFileName
19)
20
21// FontStyle defines bold and italic styles for the font
22// It is possible to combine values for mixed styles, eg.
23//     FontData.Style = FontStyleBold | FontStyleItalic
24type FontStyle byte
25
26const (
27	FontStyleNormal FontStyle = iota
28	FontStyleBold
29	FontStyleItalic
30)
31
32type FontFamily byte
33
34const (
35	FontFamilySans FontFamily = iota
36	FontFamilySerif
37	FontFamilyMono
38)
39
40type FontData struct {
41	Name   string
42	Family FontFamily
43	Style  FontStyle
44}
45
46type FontFileNamer func(fontData FontData) string
47
48func FontFileName(fontData FontData) string {
49	fontFileName := fontData.Name
50	switch fontData.Family {
51	case FontFamilySans:
52		fontFileName += "s"
53	case FontFamilySerif:
54		fontFileName += "r"
55	case FontFamilyMono:
56		fontFileName += "m"
57	}
58	if fontData.Style&FontStyleBold != 0 {
59		fontFileName += "b"
60	} else {
61		fontFileName += "r"
62	}
63
64	if fontData.Style&FontStyleItalic != 0 {
65		fontFileName += "i"
66	}
67	fontFileName += ".ttf"
68	return fontFileName
69}
70
71func RegisterFont(fontData FontData, font *truetype.Font) {
72	fonts[fontNamer(fontData)] = font
73}
74
75func GetFont(fontData FontData) *truetype.Font {
76	fontFileName := fontNamer(fontData)
77	font := fonts[fontFileName]
78	if font != nil {
79		return font
80	}
81	fonts[fontFileName] = loadFont(fontFileName)
82	return fonts[fontFileName]
83}
84
85func GetFontFolder() string {
86	return fontFolder
87}
88
89func SetFontFolder(folder string) {
90	fontFolder = filepath.Clean(folder)
91}
92
93func SetFontNamer(fn FontFileNamer) {
94	fontNamer = fn
95}
96
97func loadFont(fontFileName string) *truetype.Font {
98	fontBytes, err := ioutil.ReadFile(path.Join(fontFolder, fontFileName))
99	if err != nil {
100		log.Println(err)
101		return nil
102	}
103	font, err := truetype.Parse(fontBytes)
104	if err != nil {
105		log.Println(err)
106		return nil
107	}
108	return font
109}
110