How FreeType's rasterizer work
by David Turner
Revised 2007-Feb-01
This file is an attempt to explain the internals of the FreeType
rasterizer. The rasterizer is of quite general purpose and could
easily be integrated into other programs.
I. Introduction
II. Rendering Technology
1. Requirements
2. Profiles and Spans
a. Sweeping the Shape
b. Decomposing Outlines into Profiles
c. The Render Pool
d. Computing Profiles Extents
e. Computing Profiles Coordinates
f. Sweeping and Sorting the Spans
I. Introduction
===============
A rasterizer is a library in charge of converting a vectorial
representation of a shape into a bitmap. The FreeType rasterizer
has been originally developed to render the glyphs found in
TrueType files, made up of segments and second-order Béziers.
Meanwhile it has been extended to render third-order Bézier curves
also. This document is an explanation of its design and
implementation.
While these explanations start from the basics, a knowledge of
common rasterization techniques is assumed.
II. Rendering Technology
========================
1. Requirements
---------------
We assume that all scaling, rotating, hinting, etc., has been
already done. The glyph is thus described by a list of points in
the device space.
- All point coordinates are in the 26.6 fixed float format. The
used orientation is:
^ y
| reference orientation
|
*----> x
0
`26.6' means that 26 bits are used for the integer part of a
value and 6 bits are used for the fractional part.
Consequently, the `distance' between two neighbouring pixels is
64 `units' (1 unit = 1/64th of a pixel).
Note that, for the rasterizer, pixel centers are located at
integer coordinates. The TrueType bytecode interpreter,
however, assumes that the lower left edge of a pixel (which is
taken to be a square with a length of 1 unit) has integer
coordinates.
^ y ^ y
| |
| (1,1) | (0.5,0.5)
+-----------+ +-----+-----+
| | | | |
| | | | |
| | | o-----+-----> x
| | | (0,0) |
| | | |
o-----------+-----> x +-----------+
(0,0) (-0.5,-0.5)
TrueType bytecode interpreter FreeType rasterizer
A pixel line in the target bitmap is called a `scanline'.
- A glyph is usually made of several contours, also called
`outlines'. A contour is simply a closed curve that delimits an
outer or inner region of the glyph. It is described by a series
of successive points of the points table.
Each point of the glyph has an associated flag that indicates
whether it is `on' or `off' the curve. Two successive `on'
points indicate a line segment joining the two points.
One `off' point amidst two `on' points indicates a second-degree
(conic) Bézier parametric arc, defined by these three points
(the `off' point being the control point, and the `on' ones the
start and end points). Similarly, a third-degree (cubic) Bézier
curve is described by four points (two `off' control points
between two `on' points).
Finally, for second-order curves only, two successive `off'
points forces the rasterizer to create, during rendering, an
`on' point amidst them, at their exact middle. This greatly
facilitates the definition of successive Bézier arcs.
The parametric form of a second-order Bézier curve is:
P(t) = (1-t)^2*P1 + 2*t*(1-t)*P2 + t^2*P3
(P1 and P3 are the end points, P2 the control point.)
The parametric form of a third-order Bézier curve is:
P(t) = (1-t)^3*P1 + 3*t*(1-t)^2*P2 + 3*t^2*(1-t)*P3 + t^3*P4
(P1 and P4 are the end points, P2 and P3 the control points.)
For both formulae, t is a real number in the range [0..1].
Note that the rasterizer does not use these formulae directly.
They exhibit, however, one very useful property of Bézier arcs:
Each point of the curve is a weighted average of the control
points.
As all weights are positive and always sum up to 1, whatever the
value of t, each arc point lies within the triangle (polygon)
defined by the arc's three (four) control points.
In the following, only second-order curves are discussed since
rasterization of third-order curves is completely identical.
Here some samples for second-order curves.
* # on curve
* off curve
__---__
#-__ _-- -_
--__ _- -
--__ # \
--__ #
-#
Two `on' points
Two `on' points and one `off' point
between them
*
# __ Two `on' points with two `off'
\ - - points between them. The point
\ / \ marked `0' is the middle of the
- 0 \ `off' points, and is a `virtual
-_ _- # on' point where the curve passes.
-- It does not appear in the point
* list.
2. Profiles and Spans
---------------------
The following is a basic explanation of the _kind_ of computations
made by the rasterizer to build a bitmap from a vector
representation. Note that the actual implementation is slightly
different, due to performance tuning and other factors.
However, the following ideas remain in the same category, and are
more convenient to understand.
a. Sweeping the Shape
The best way to fill a shape is to decompose it into a number of
simple horizontal segments, then turn them on in the target
bitmap. These segments are called `spans'.
__---__
_-- -_
_- -
- \
/ \
/ \
| \
__---__ Example: filling a shape
_----------_ with spans.
_--------------
----------------\
/-----------------\ This is typically done from the top
/ \ to the bottom of the shape, in a
| | \ movement called a `sweep'.
V
__---__
_----------_
_--------------
----------------\
/-----------------\
/-------------------\
|---------------------\
In order to draw a span, the rasterizer must compute its
coordinates, which are simply the x coordinates of the shape's
contours, taken on the y scanlines.
/---/ |---| Note that there are usually
/---/ |---| several spans per scanline.
| /
没有合适的资源?快使用搜索试试~ 我知道了~
Visual C++ 2015 编译 FreeType 28
共770个文件
h:258个
c:214个
mk:92个
需积分: 3 0 下载量 171 浏览量
2024-12-19
09:11:41
上传
评论
收藏 2.88MB RAR 举报
温馨提示
在NX二次开发中,如果你做的是提取系统英文字体,这是一个不错的选择,我看到好多人用 FreeType,而且有博客,但都描述的不详细,因此我想写字篇全网最详细的,而且文章免费分享给大家,这利用到FreeType 28,这个是压缩包,欢迎大家下载。
资源推荐
资源详情
资源评论
收起资源包目录
Visual C++ 2015 编译 FreeType 28 (770个子文件)
freetype-config.1 3KB
ChangeLog.20 92KB
ChangeLog.21 331KB
ChangeLog.22 100KB
ChangeLog.23 274KB
ChangeLog.24 209KB
ChangeLog.25 164KB
ChangeLog.26 178KB
configure.ac 29KB
INSTALL.ANY 6KB
deflinejoiner.awk 4KB
ttinterp.c 289KB
ftobjs.c 147KB
ttgxvar.c 123KB
ttcmap.c 118KB
aflatin.c 114KB
ftraster.c 107KB
cffgload.c 100KB
ttgload.c 91KB
t1load.c 77KB
cffload.c 76KB
bdflib.c 74KB
aflatin2.c 74KB
afblue.c 72KB
afcjk.c 69KB
ftstroke.c 68KB
cf2hints.c 63KB
ftgrays.c 62KB
pshalgo.c 60KB
cf2intrp.c 60KB
sfobjs.c 58KB
gxvcommn.c 56KB
ttload.c 53KB
t1decode.c 52KB
psobjs.c 51KB
ttobjs.c 50KB
ttsbit.c 49KB
pcfread.c 46KB
cffparse.c 46KB
afhints.c 45KB
ftmac.c 44KB
cffdrivr.c 40KB
t42parse.c 40KB
cffobjs.c 38KB
winfnt.c 36KB
sfdriver.c 35KB
afranges.c 34KB
ftmac.c 34KB
ttsubpix.c 34KB
pshrec.c 32KB
ftrfork.c 31KB
otvgpos.c 30KB
pfrload.c 30KB
ftoutln.c 29KB
gxvkern.c 29KB
otvcommn.c 29KB
ftcalc.c 26KB
afloader.c 26KB
bdfdrivr.c 26KB
ftdbgmem.c 25KB
t1driver.c 24KB
ttdriver.c 24KB
cidload.c 24KB
afmparse.c 23KB
pshglob.c 23KB
pfrgload.c 23KB
cf2ft.c 23KB
pcfdrivr.c 22KB
pfrsbit.c 22KB
gxvjust.c 22KB
ttpload.c 22KB
ftbbox.c 22KB
ftgzip.c 22KB
t42objs.c 21KB
afshaper.c 21KB
t1objs.c 21KB
cf2blues.c 21KB
cf2font.c 21KB
ftstream.c 21KB
ftsystem.c 20KB
ftbitmap.c 20KB
t1gload.c 18KB
otvgsub.c 18KB
pfrobjs.c 18KB
ftglyph.c 18KB
ftcmanag.c 18KB
t1parse.c 18KB
ftcbasic.c 18KB
ftrandom.c 18KB
ttpost.c 17KB
cidobjs.c 17KB
afmodule.c 17KB
psmodule.c 16KB
cidgload.c 16KB
inftrees.c 16KB
ftsmooth.c 16KB
gxvfgen.c 16KB
ftccache.c 15KB
ftsystem.c 15KB
otvmath.c 15KB
共 770 条
- 1
- 2
- 3
- 4
- 5
- 6
- 8
资源评论
白雪公主的后妈
- 粉丝: 979
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功