Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
小雨青年
freetype
提交
24265d1c
F
freetype
项目概览
小雨青年
/
freetype
通知
14
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
F
freetype
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
24265d1c
编写于
8月 24, 2015
作者:
N
Nigel Tao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Implement GlyphBounds and GlyphAdvance.
上级
9c46b875
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
51 addition
and
11 deletion
+51
-11
example/drawer/main.go
example/drawer/main.go
+14
-4
truetype/face.go
truetype/face.go
+37
-7
未找到文件。
example/drawer/main.go
浏览文件 @
24265d1c
...
...
@@ -37,6 +37,8 @@ var (
wonb
=
flag
.
Bool
(
"whiteonblack"
,
false
,
"white text on a black background"
)
)
const
title
=
"Jabberwocky"
var
text
=
[]
string
{
"’Twas brillig, and the slithy toves"
,
"Did gyre and gimble in the wabe;"
,
...
...
@@ -96,7 +98,8 @@ func main() {
fg
,
bg
=
image
.
White
,
image
.
Black
ruler
=
color
.
RGBA
{
0x22
,
0x22
,
0x22
,
0xff
}
}
rgba
:=
image
.
NewRGBA
(
image
.
Rect
(
0
,
0
,
640
,
480
))
const
imgW
,
imgH
=
640
,
480
rgba
:=
image
.
NewRGBA
(
image
.
Rect
(
0
,
0
,
imgW
,
imgH
))
draw
.
Draw
(
rgba
,
rgba
.
Bounds
(),
bg
,
image
.
ZP
,
draw
.
Src
)
for
i
:=
0
;
i
<
200
;
i
++
{
rgba
.
Set
(
10
,
10
+
i
,
ruler
)
...
...
@@ -118,11 +121,18 @@ func main() {
Hinting
:
h
,
}),
}
dy0
:=
int
(
math
.
Ceil
(
*
size
*
*
dpi
/
72
))
y
:=
10
+
int
(
math
.
Ceil
(
*
size
**
dpi
/
72
))
dy
:=
int
(
math
.
Ceil
(
*
size
*
*
spacing
*
*
dpi
/
72
))
for
i
,
s
:=
range
text
{
d
.
Dot
=
fixed
.
P
(
10
,
10
+
dy0
+
i
*
dy
)
d
.
Dot
=
fixed
.
Point26_6
{
X
:
(
fixed
.
I
(
imgW
)
-
d
.
MeasureString
(
title
))
/
2
,
Y
:
fixed
.
I
(
y
),
}
d
.
DrawString
(
title
)
y
+=
dy
for
_
,
s
:=
range
text
{
d
.
Dot
=
fixed
.
P
(
10
,
y
)
d
.
DrawString
(
s
)
y
+=
dy
}
// Save that RGBA image to disk.
...
...
truetype/face.go
浏览文件 @
24265d1c
...
...
@@ -132,6 +132,36 @@ func (a *face) Glyph(dot fixed.Point26_6, r rune) (
return
newDot
,
dr
,
a
.
mask
,
image
.
Point
{},
true
}
func
(
a
*
face
)
GlyphBounds
(
r
rune
)
(
bounds
fixed
.
Rectangle26_6
,
advance
fixed
.
Int26_6
,
ok
bool
)
{
if
err
:=
a
.
glyphBuf
.
Load
(
a
.
f
,
a
.
scale
,
a
.
f
.
Index
(
r
),
a
.
hinting
);
err
!=
nil
{
return
fixed
.
Rectangle26_6
{},
0
,
false
}
xmin
:=
+
a
.
glyphBuf
.
B
.
XMin
ymin
:=
-
a
.
glyphBuf
.
B
.
YMax
xmax
:=
+
a
.
glyphBuf
.
B
.
XMax
ymax
:=
-
a
.
glyphBuf
.
B
.
YMin
if
xmin
>
xmax
||
ymin
>
ymax
{
return
fixed
.
Rectangle26_6
{},
0
,
false
}
return
fixed
.
Rectangle26_6
{
Min
:
fixed
.
Point26_6
{
X
:
xmin
,
Y
:
ymin
,
},
Max
:
fixed
.
Point26_6
{
X
:
xmax
,
Y
:
ymax
,
},
},
a
.
glyphBuf
.
AdvanceWidth
,
true
}
func
(
a
*
face
)
GlyphAdvance
(
r
rune
)
(
advance
fixed
.
Int26_6
,
ok
bool
)
{
if
err
:=
a
.
glyphBuf
.
Load
(
a
.
f
,
a
.
scale
,
a
.
f
.
Index
(
r
),
a
.
hinting
);
err
!=
nil
{
return
0
,
false
}
return
a
.
glyphBuf
.
AdvanceWidth
,
true
}
// rasterize returns the advance width, integer-pixel offset to render at, and
// the width and height of the given glyph at the given sub-pixel offsets.
//
...
...
@@ -143,10 +173,10 @@ func (a *face) rasterize(index Index, fx, fy fixed.Int26_6) (
return
0
,
image
.
Point
{},
0
,
0
,
false
}
// Calculate the integer-pixel bounds for the glyph.
xmin
:=
int
(
fx
+
fixed
.
Int26_6
(
a
.
glyphBuf
.
B
.
XMin
)
)
>>
6
ymin
:=
int
(
fy
-
fixed
.
Int26_6
(
a
.
glyphBuf
.
B
.
YMax
)
)
>>
6
xmax
:=
int
(
fx
+
fixed
.
Int26_6
(
a
.
glyphBuf
.
B
.
XMax
)
+
0x3f
)
>>
6
ymax
:=
int
(
fy
-
fixed
.
Int26_6
(
a
.
glyphBuf
.
B
.
YMin
)
+
0x3f
)
>>
6
xmin
:=
int
(
fx
+
a
.
glyphBuf
.
B
.
XMin
)
>>
6
ymin
:=
int
(
fy
-
a
.
glyphBuf
.
B
.
YMax
)
>>
6
xmax
:=
int
(
fx
+
a
.
glyphBuf
.
B
.
XMax
+
0x3f
)
>>
6
ymax
:=
int
(
fy
-
a
.
glyphBuf
.
B
.
YMin
+
0x3f
)
>>
6
if
xmin
>
xmax
||
ymin
>
ymax
{
return
0
,
image
.
Point
{},
0
,
0
,
false
}
...
...
@@ -155,8 +185,8 @@ func (a *face) rasterize(index Index, fx, fy fixed.Int26_6) (
// the pixel offsets, based on the font's FUnit metrics, that let a
// negative co-ordinate in TrueType space be non-negative in rasterizer
// space. xmin and ymin are typically <= 0.
fx
+=
fixed
.
Int26_6
(
-
xmin
<<
6
)
fy
+=
fixed
.
Int26_6
(
-
ymin
<<
6
)
fx
-=
fixed
.
Int26_6
(
xmin
<<
6
)
fy
-=
fixed
.
Int26_6
(
ymin
<<
6
)
// Rasterize the glyph's vectors.
a
.
r
.
Clear
()
clear
(
a
.
mask
.
Pix
)
...
...
@@ -166,7 +196,7 @@ func (a *face) rasterize(index Index, fx, fy fixed.Int26_6) (
e0
=
e1
}
a
.
r
.
Rasterize
(
a
.
p
)
return
fixed
.
Int26_6
(
a
.
glyphBuf
.
AdvanceWidth
),
image
.
Point
{
xmin
,
ymin
},
xmax
-
xmin
,
ymax
-
ymin
,
true
return
a
.
glyphBuf
.
AdvanceWidth
,
image
.
Point
{
xmin
,
ymin
},
xmax
-
xmin
,
ymax
-
ymin
,
true
}
func
clear
(
pix
[]
byte
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录