implement a simplist font management

This commit is contained in:
legoff.laurent 2010-12-06 16:34:51 +00:00
parent ab3e5a08bf
commit 6f328d3b76
21 changed files with 140 additions and 77421 deletions

24
draw2d/fonts/README Normal file
View 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

Binary file not shown.

BIN
draw2d/fonts/luximbi.ttf Normal file

Binary file not shown.

BIN
draw2d/fonts/luximri.ttf Normal file

Binary file not shown.

BIN
draw2d/fonts/luxirb.ttf Normal file

Binary file not shown.

BIN
draw2d/fonts/luxirbi.ttf Normal file

Binary file not shown.

BIN
draw2d/fonts/luxirri.ttf Normal file

Binary file not shown.

BIN
draw2d/fonts/luxisb.ttf Normal file

Binary file not shown.

BIN
draw2d/fonts/luxisbi.ttf Normal file

Binary file not shown.

BIN
draw2d/fonts/luxisri.ttf Normal file

Binary file not shown.

View file

@ -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

View file

@ -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)

View file

@ -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
} }

View 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
}