implement a simplist font management
This commit is contained in:
parent
ab3e5a08bf
commit
6f328d3b76
|
@ -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
|
||||
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
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"
|
||||
"image"
|
||||
"image/png"
|
||||
//"draw2d"
|
||||
"draw2d.googlecode.com/svn/trunk/draw2d/src/pkg/draw2d"
|
||||
"draw2d"
|
||||
//"draw2d.googlecode.com/svn/trunk/draw2d/src/pkg/draw2d"
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -495,11 +495,13 @@ func TestPathTransform() {
|
|||
}
|
||||
|
||||
func TestFillString() {
|
||||
draw2d.SetFontFolder("../../fonts/")
|
||||
i, gc := initGc(100, 100)
|
||||
draw2d.RoundRect(gc, 5, 5, 95, 95, 10, 10)
|
||||
gc.FillStroke()
|
||||
gc.SetFontSize(18)
|
||||
gc.MoveTo(10, 52)
|
||||
gc.SetFontData(draw2d.FontData{"luxi", draw2d.FontFamilyMono, draw2d.FontStyleBold|draw2d.FontStyleItalic})
|
||||
width := gc.FillString("cou")
|
||||
fmt.Printf("width: %f\n", width)
|
||||
gc.RMoveTo(width+1, 0)
|
||||
|
|
|
@ -7,32 +7,10 @@ import (
|
|||
"exp/draw"
|
||||
"image"
|
||||
"log"
|
||||
"io/ioutil"
|
||||
"freetype-go.googlecode.com/hg/freetype"
|
||||
"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
|
||||
|
||||
const (
|
||||
|
@ -45,6 +23,7 @@ type GraphicContext struct {
|
|||
fillRasterizer *raster.Rasterizer
|
||||
strokeRasterizer *raster.Rasterizer
|
||||
freetype *freetype.Context
|
||||
defaultFontData FontData
|
||||
DPI int
|
||||
current *contextStack
|
||||
}
|
||||
|
@ -62,6 +41,7 @@ type contextStack struct {
|
|||
join Join
|
||||
previous *contextStack
|
||||
fontSize float
|
||||
fontData FontData
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -75,9 +55,9 @@ func NewGraphicContext(pi *image.RGBA) *GraphicContext {
|
|||
gc.strokeRasterizer = raster.NewRasterizer(width, height)
|
||||
|
||||
gc.DPI = 92
|
||||
gc.defaultFontData = FontData{"luxi", FontFamilySans, FontStyleNormal}
|
||||
gc.freetype = freetype.NewContext()
|
||||
gc.freetype.SetDPI(gc.DPI)
|
||||
gc.freetype.SetFont(font)
|
||||
gc.freetype.SetClip(pi.Bounds())
|
||||
gc.freetype.SetDst(pi)
|
||||
|
||||
|
@ -92,6 +72,7 @@ func NewGraphicContext(pi *image.RGBA) *GraphicContext {
|
|||
gc.current.fillRule = FillRuleEvenOdd
|
||||
gc.current.join = RoundJoin
|
||||
gc.current.fontSize = 10
|
||||
gc.current.fontData = gc.defaultFontData
|
||||
|
||||
return gc
|
||||
}
|
||||
|
@ -163,6 +144,14 @@ func (gc *GraphicContext) GetFontSize() float {
|
|||
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) {
|
||||
gc.DPI = dpi
|
||||
gc.freetype.SetDPI(dpi)
|
||||
|
@ -176,6 +165,7 @@ func (gc *GraphicContext) GetDPI() int {
|
|||
func (gc *GraphicContext) Save() {
|
||||
context := new(contextStack)
|
||||
context.fontSize = gc.current.fontSize
|
||||
context.fontData = gc.current.fontData
|
||||
context.lineWidth = gc.current.lineWidth
|
||||
context.strokeColor = gc.current.strokeColor
|
||||
context.fillColor = gc.current.fillColor
|
||||
|
@ -253,6 +243,14 @@ func (gc *GraphicContext) FillString(text string) (cursor float){
|
|||
gc.current.tr.Transform(&x, &y)
|
||||
x0, fontSize := 0.0, gc.current.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)
|
||||
pt := freetype.Pt(int(x), int(y))
|
||||
p, err := gc.freetype.DrawString(text, pt)
|
||||
|
@ -261,9 +259,7 @@ func (gc *GraphicContext) FillString(text string) (cursor float){
|
|||
}
|
||||
x1, _ := gc.current.path.LastPoint()
|
||||
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)
|
||||
log.Printf("x2: %f, y2: %f\n", x2, y2)
|
||||
width := x2 - x1
|
||||
return width
|
||||
}
|
||||
|
|
|
@ -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 New Issue