
我的理解就是这样,我不知道你懂不懂一指察者个基本的知识,单片机是怎样在点阵屏上显示字的。如果你知道点阵LED屏显示在提的原理你就明白了。
没有接触过,纯支持而已。。。直线和曲线,我们提到了一段三阶Bezier曲线有四个控制点定义:位于曲线上(on-curve)的起始点、两个不在曲线上(off-curve)的控制点和一个曲线上的结束点。TureType字体中的图元轮廓是用二阶Bezier曲线定义的,有三个点:一个曲线袭颂上的点,一个曲线外的点和另一个曲线上的点。多个连续的不在曲线上的点是允许的,但不是用来定义三阶或更高阶的Bezier曲线,而是为了减少控制点的数目。比如,对于on-off-off-on模式的四个点,会加入一个隐含的点使之成为on-off-on-off-on,因此定义的是两段二阶Bezier曲线。
如果设置了G_ONCURVE位,那么控制点在曲线上,否则不在曲线上。如果设置了G_REPEAT,标志数组中的下一字节表示重复次数,当前标志应该重复指定的次数。因此,标志数组中实际使用了某种类型猜禅渣的行程编码穗悄。标志中的其他位用于描述相应 的x坐标和y坐标的编码方式,它们可以表示当前相寻坐标是否和上一个相同、正的单字节值、负的单字节值或有符号两字节值。
解码图元的描述是一个两次扫描的起始点。然后再遍历图元定义中的每一个点把它转换为更容易管理的格式。程序清单14-2列出了解码TrueType图元的函数,它是KTrueType类的一个方法。
int KTrueType::DecodeGlyph(int index, KCurve & curve, XFORM * xm) const
{
const GlyphHeader * pHeader = GetGlyph(index)
if ( pHeader==NULL )
{
// assert(false)
return 0
}
int nContour = (short) reverse(pHeader->numberOfContours)
if ( nContour<0 )
{
return DecodeCompositeGlyph(pHeader+1, curve) // after the header
}
if ( nContour==0 )
return 0
curve.SetBound(reverse((WORD)pHeader->xMin), reverse((WORD)pHeader->yMin),
reverse((WORD)pHeader->xMax), reverse((WORD)pHeader->yMax))
const USHORT * pEndPoint = (const USHORT *) (pHeader+1)
int nPoints = reverse(pEndPoint[nContour-1]) + 1// endpoint of last contour + 1
int nInst = reverse(pEndPoint[nContour]) // instructon length
curve.m_glyphindex = index
curve.m_glyphsize = (int) GetGlyph(index+1) - (int) GetGlyph(index)
curve.m_Ascender = m_Ascender
curve.m_Descender = m_Descender
curve.m_LineGap = m_LineGap
GetMetrics(index, curve.m_advancewidth, curve.m_lsb)
if ( curve.m_glyphsize==0 )
return 0
curve.m_instrsize = nInst
const BYTE * pFlag = (const BYTE *) & pEndPoint[nContour] + 2 + nInst// first byte in flag
const BYTE * pX = pFlag
int xlen = 0
for (int i=0 i<nPoints i++, pX++)
{
int unit = 0
switch ( pX[0] & G_XMASK )
{
case G_XADDBYTE:
case G_XSUBBYTE:
unit = 1
break
case G_XADDINT:
unit = 2
}
if ( pX[0] & G_REPEAT )
{
xlen += unit * (pX[1]+1)
i += pX[1]
pX ++
}
else
xlen += unit
}
const BYTE * pY = pX + xlen
int x = 0
KTrueType类处理TrueType字体的装入和解码,随书光盘中有它的完整源代码。DecodeGlyph给出图元索引和可选的变换矩阵,处理的是单个图元的解码。参数curve是KCurve类,用于把TrueType图元定义保存为32位的点的赎罪以及一个标志数组,以梗用GDI进行显示。这些代码可以作为简单TrueType字体编辑器的基础。
代码中调用了GetGlyph方法,该方法用位置表索引找到该图元的GlyphHeader结构。从中得到图元的轮廓线数目。注意必须反转该值的字节序,因为TrueType字体用的是Big-Endian字节序。如果该值为负值,说明这是一个合成图元,应该转而调用DecodeCompositeGlyph方法。接下支的代码定位了endPtsOfContours数组,找出点的总数,然后跳过指令找到标志数组的起始位置。
以下几种方法供你参闭肢基考:1、选择带汉字库的LCD模块,这样你就根本不用自己做字模了
2、建一个字模小库,按顺序填充字模,这样每个字模占用16个字节,按这个记录取就OK了,比如依次为:天、气、晴、阴。那么显示天从第0地址开始取饥族16个字节,轿谨显示阴则从48地址开始取。
3、建一个字模小字库,每个字占用18个字节,其中前两个为该字的区位码,呵呵,则样显示程序很好编了,直接查区位码再取字模就OK了。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)