implement a simplist font management
This commit is contained in:
parent
ab3e5a08bf
commit
6f328d3b76
21 changed files with 140 additions and 77421 deletions
24
draw2d/fonts/README
Normal file
24
draw2d/fonts/README
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
|
||||||
|
All questions regarding this software should be directed at the
|
||||||
|
Xorg mailing list:
|
||||||
|
|
||||||
|
http://lists.freedesktop.org/mailman/listinfo/xorg
|
||||||
|
|
||||||
|
Please submit bug reports to the Xorg bugzilla:
|
||||||
|
|
||||||
|
https://bugs.freedesktop.org/enter_bug.cgi?product=xorg
|
||||||
|
|
||||||
|
The master development code repository can be found at:
|
||||||
|
|
||||||
|
git://anongit.freedesktop.org/git/xorg/font/bh-ttf
|
||||||
|
|
||||||
|
http://cgit.freedesktop.org/xorg/font/bh-ttf
|
||||||
|
|
||||||
|
For patch submission instructions, see:
|
||||||
|
|
||||||
|
http://www.x.org/wiki/Development/Documentation/SubmittingPatches
|
||||||
|
|
||||||
|
For more information on the git code manager, see:
|
||||||
|
|
||||||
|
http://wiki.x.org/wiki/GitPage
|
||||||
|
|
BIN
draw2d/fonts/luximb.ttf
Normal file
BIN
draw2d/fonts/luximb.ttf
Normal file
Binary file not shown.
BIN
draw2d/fonts/luximbi.ttf
Normal file
BIN
draw2d/fonts/luximbi.ttf
Normal file
Binary file not shown.
BIN
draw2d/fonts/luximri.ttf
Normal file
BIN
draw2d/fonts/luximri.ttf
Normal file
Binary file not shown.
BIN
draw2d/fonts/luxirb.ttf
Normal file
BIN
draw2d/fonts/luxirb.ttf
Normal file
Binary file not shown.
BIN
draw2d/fonts/luxirbi.ttf
Normal file
BIN
draw2d/fonts/luxirbi.ttf
Normal file
Binary file not shown.
BIN
draw2d/fonts/luxirri.ttf
Normal file
BIN
draw2d/fonts/luxirri.ttf
Normal file
Binary file not shown.
BIN
draw2d/fonts/luxisb.ttf
Normal file
BIN
draw2d/fonts/luxisb.ttf
Normal file
Binary file not shown.
BIN
draw2d/fonts/luxisbi.ttf
Normal file
BIN
draw2d/fonts/luxisbi.ttf
Normal file
Binary file not shown.
BIN
draw2d/fonts/luxisri.ttf
Normal file
BIN
draw2d/fonts/luxisri.ttf
Normal file
Binary file not shown.
|
@ -1,11 +0,0 @@
|
||||||
The *.ttf and COPYING files in this directory were copied from the X.org
|
|
||||||
project, specifically
|
|
||||||
http://xorg.freedesktop.org/releases/individual/font/font-bh-ttf-1.0.0.tar.bz2
|
|
||||||
|
|
||||||
There are three fonts: sans (s), serif (r) and monospaced (m). For example,
|
|
||||||
luxisr.ttf is Luxi Sans. The 'r' here means regular, as opposed to bold.
|
|
||||||
|
|
||||||
The *.ttx files in this directory were generated from the *.ttf files
|
|
||||||
by the ttx command-line tool.
|
|
||||||
http://www.letterror.com/code/ttx/index.html
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -13,8 +13,8 @@ import (
|
||||||
"math"
|
"math"
|
||||||
"image"
|
"image"
|
||||||
"image/png"
|
"image/png"
|
||||||
//"draw2d"
|
"draw2d"
|
||||||
"draw2d.googlecode.com/svn/trunk/draw2d/src/pkg/draw2d"
|
//"draw2d.googlecode.com/svn/trunk/draw2d/src/pkg/draw2d"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -495,11 +495,13 @@ func TestPathTransform() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestFillString() {
|
func TestFillString() {
|
||||||
|
draw2d.SetFontFolder("../../fonts/")
|
||||||
i, gc := initGc(100, 100)
|
i, gc := initGc(100, 100)
|
||||||
draw2d.RoundRect(gc, 5, 5, 95, 95, 10, 10)
|
draw2d.RoundRect(gc, 5, 5, 95, 95, 10, 10)
|
||||||
gc.FillStroke()
|
gc.FillStroke()
|
||||||
gc.SetFontSize(18)
|
gc.SetFontSize(18)
|
||||||
gc.MoveTo(10, 52)
|
gc.MoveTo(10, 52)
|
||||||
|
gc.SetFontData(draw2d.FontData{"luxi", draw2d.FontFamilyMono, draw2d.FontStyleBold|draw2d.FontStyleItalic})
|
||||||
width := gc.FillString("cou")
|
width := gc.FillString("cou")
|
||||||
fmt.Printf("width: %f\n", width)
|
fmt.Printf("width: %f\n", width)
|
||||||
gc.RMoveTo(width+1, 0)
|
gc.RMoveTo(width+1, 0)
|
||||||
|
|
|
@ -7,32 +7,10 @@ import (
|
||||||
"exp/draw"
|
"exp/draw"
|
||||||
"image"
|
"image"
|
||||||
"log"
|
"log"
|
||||||
"io/ioutil"
|
|
||||||
"freetype-go.googlecode.com/hg/freetype"
|
"freetype-go.googlecode.com/hg/freetype"
|
||||||
"freetype-go.googlecode.com/hg/freetype/raster"
|
"freetype-go.googlecode.com/hg/freetype/raster"
|
||||||
"freetype-go.googlecode.com/hg/freetype/truetype"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
font *truetype.Font
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
// Read the font data.
|
|
||||||
|
|
||||||
fontBytes, err := ioutil.ReadFile("../../luxi-fonts/luxisr.ttf")
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
font, err = freetype.ParseFont(fontBytes)
|
|
||||||
if err != nil {
|
|
||||||
log.Println(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
type FillRule int
|
type FillRule int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
@ -45,6 +23,7 @@ type GraphicContext struct {
|
||||||
fillRasterizer *raster.Rasterizer
|
fillRasterizer *raster.Rasterizer
|
||||||
strokeRasterizer *raster.Rasterizer
|
strokeRasterizer *raster.Rasterizer
|
||||||
freetype *freetype.Context
|
freetype *freetype.Context
|
||||||
|
defaultFontData FontData
|
||||||
DPI int
|
DPI int
|
||||||
current *contextStack
|
current *contextStack
|
||||||
}
|
}
|
||||||
|
@ -62,6 +41,7 @@ type contextStack struct {
|
||||||
join Join
|
join Join
|
||||||
previous *contextStack
|
previous *contextStack
|
||||||
fontSize float
|
fontSize float
|
||||||
|
fontData FontData
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -75,9 +55,9 @@ func NewGraphicContext(pi *image.RGBA) *GraphicContext {
|
||||||
gc.strokeRasterizer = raster.NewRasterizer(width, height)
|
gc.strokeRasterizer = raster.NewRasterizer(width, height)
|
||||||
|
|
||||||
gc.DPI = 92
|
gc.DPI = 92
|
||||||
|
gc.defaultFontData = FontData{"luxi", FontFamilySans, FontStyleNormal}
|
||||||
gc.freetype = freetype.NewContext()
|
gc.freetype = freetype.NewContext()
|
||||||
gc.freetype.SetDPI(gc.DPI)
|
gc.freetype.SetDPI(gc.DPI)
|
||||||
gc.freetype.SetFont(font)
|
|
||||||
gc.freetype.SetClip(pi.Bounds())
|
gc.freetype.SetClip(pi.Bounds())
|
||||||
gc.freetype.SetDst(pi)
|
gc.freetype.SetDst(pi)
|
||||||
|
|
||||||
|
@ -92,6 +72,7 @@ func NewGraphicContext(pi *image.RGBA) *GraphicContext {
|
||||||
gc.current.fillRule = FillRuleEvenOdd
|
gc.current.fillRule = FillRuleEvenOdd
|
||||||
gc.current.join = RoundJoin
|
gc.current.join = RoundJoin
|
||||||
gc.current.fontSize = 10
|
gc.current.fontSize = 10
|
||||||
|
gc.current.fontData = gc.defaultFontData
|
||||||
|
|
||||||
return gc
|
return gc
|
||||||
}
|
}
|
||||||
|
@ -163,6 +144,14 @@ func (gc *GraphicContext) GetFontSize() float {
|
||||||
return gc.current.fontSize
|
return gc.current.fontSize
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (gc *GraphicContext) SetFontData(fontData FontData) {
|
||||||
|
gc.current.fontData = fontData
|
||||||
|
}
|
||||||
|
|
||||||
|
func (gc *GraphicContext) GetFontData() FontData {
|
||||||
|
return gc.current.fontData
|
||||||
|
}
|
||||||
|
|
||||||
func (gc *GraphicContext) SetDPI(dpi int) {
|
func (gc *GraphicContext) SetDPI(dpi int) {
|
||||||
gc.DPI = dpi
|
gc.DPI = dpi
|
||||||
gc.freetype.SetDPI(dpi)
|
gc.freetype.SetDPI(dpi)
|
||||||
|
@ -176,6 +165,7 @@ func (gc *GraphicContext) GetDPI() int {
|
||||||
func (gc *GraphicContext) Save() {
|
func (gc *GraphicContext) Save() {
|
||||||
context := new(contextStack)
|
context := new(contextStack)
|
||||||
context.fontSize = gc.current.fontSize
|
context.fontSize = gc.current.fontSize
|
||||||
|
context.fontData = gc.current.fontData
|
||||||
context.lineWidth = gc.current.lineWidth
|
context.lineWidth = gc.current.lineWidth
|
||||||
context.strokeColor = gc.current.strokeColor
|
context.strokeColor = gc.current.strokeColor
|
||||||
context.fillColor = gc.current.fillColor
|
context.fillColor = gc.current.fillColor
|
||||||
|
@ -253,6 +243,14 @@ func (gc *GraphicContext) FillString(text string) (cursor float){
|
||||||
gc.current.tr.Transform(&x, &y)
|
gc.current.tr.Transform(&x, &y)
|
||||||
x0, fontSize := 0.0, gc.current.fontSize
|
x0, fontSize := 0.0, gc.current.fontSize
|
||||||
gc.current.tr.VectorTransform(&x0, &fontSize)
|
gc.current.tr.VectorTransform(&x0, &fontSize)
|
||||||
|
font := GetFont(gc.current.fontData)
|
||||||
|
if(font == nil) {
|
||||||
|
font = GetFont(gc.defaultFontData)
|
||||||
|
}
|
||||||
|
if(font == nil) {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
gc.freetype.SetFont(font)
|
||||||
gc.freetype.SetFontSize(fontSize)
|
gc.freetype.SetFontSize(fontSize)
|
||||||
pt := freetype.Pt(int(x), int(y))
|
pt := freetype.Pt(int(x), int(y))
|
||||||
p, err := gc.freetype.DrawString(text, pt)
|
p, err := gc.freetype.DrawString(text, pt)
|
||||||
|
@ -261,9 +259,7 @@ func (gc *GraphicContext) FillString(text string) (cursor float){
|
||||||
}
|
}
|
||||||
x1, _ := gc.current.path.LastPoint()
|
x1, _ := gc.current.path.LastPoint()
|
||||||
x2, y2 := float(p.X) / 256, float(p.Y) / 256
|
x2, y2 := float(p.X) / 256, float(p.Y) / 256
|
||||||
log.Printf("x2: %f, y2: %f\n", x2, y2)
|
|
||||||
gc.current.tr.InverseTransform(&x2, &y2)
|
gc.current.tr.InverseTransform(&x2, &y2)
|
||||||
log.Printf("x2: %f, y2: %f\n", x2, y2)
|
|
||||||
width := x2 - x1
|
width := x2 - x1
|
||||||
return width
|
return width
|
||||||
}
|
}
|
||||||
|
|
91
draw2d/src/pkg/draw2d/font.go
Normal file
91
draw2d/src/pkg/draw2d/font.go
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
package draw2d
|
||||||
|
|
||||||
|
|
||||||
|
import (
|
||||||
|
"freetype-go.googlecode.com/hg/freetype"
|
||||||
|
"freetype-go.googlecode.com/hg/freetype/truetype"
|
||||||
|
"path"
|
||||||
|
"log"
|
||||||
|
"io/ioutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
var (
|
||||||
|
fontFolder = "../../fonts/"
|
||||||
|
fonts = make(map[string] *truetype.Font)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
type FontStyle byte
|
||||||
|
|
||||||
|
const (
|
||||||
|
FontStyleNormal FontStyle = iota
|
||||||
|
FontStyleBold
|
||||||
|
FontStyleItalic
|
||||||
|
)
|
||||||
|
|
||||||
|
type FontFamily byte
|
||||||
|
|
||||||
|
const (
|
||||||
|
FontFamilySans FontFamily = iota
|
||||||
|
FontFamilySerif
|
||||||
|
FontFamilyMono
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
type FontData struct {
|
||||||
|
Name string
|
||||||
|
Family FontFamily
|
||||||
|
Style FontStyle
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
func GetFont(fontData FontData) (*truetype.Font) {
|
||||||
|
fontFileName := fontData.Name
|
||||||
|
switch fontData.Family {
|
||||||
|
case FontFamilySans: fontFileName += "s"
|
||||||
|
case FontFamilySerif: fontFileName += "r"
|
||||||
|
case FontFamilyMono: fontFileName += "m"
|
||||||
|
}
|
||||||
|
if(fontData.Style & FontStyleBold != 0) {
|
||||||
|
fontFileName += "b"
|
||||||
|
} else {
|
||||||
|
fontFileName += "r"
|
||||||
|
}
|
||||||
|
|
||||||
|
if(fontData.Style & FontStyleItalic != 0) {
|
||||||
|
fontFileName += "i"
|
||||||
|
}
|
||||||
|
fontFileName += ".ttf"
|
||||||
|
font := fonts[fontFileName]
|
||||||
|
if(font != nil) {
|
||||||
|
return font
|
||||||
|
}
|
||||||
|
fonts[fontFileName] = loadFont(fontFileName)
|
||||||
|
return fonts[fontFileName]
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetFontFolder() string {
|
||||||
|
return fontFolder
|
||||||
|
}
|
||||||
|
|
||||||
|
func SetFontFolder(folder string) {
|
||||||
|
fontFolder = folder
|
||||||
|
}
|
||||||
|
|
||||||
|
func loadFont(fontFileName string) (*truetype.Font) {
|
||||||
|
fontBytes, err := ioutil.ReadFile(path.Join(fontFolder, fontFileName))
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
font, err := freetype.ParseFont(fontBytes)
|
||||||
|
if err != nil {
|
||||||
|
log.Println(err)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return font
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue