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