具体实施方式
在本发明实施例进行多边形矢量图形填充的过程中,首先要解析所述矢量图形,得到一系列多边形,然后再利用变换参数以及变换矩阵将每个多边形映射到1/2n像素为单位的新绘图坐标系中,同时更新绘图窗口至新坐标系中;获取新坐标系中多边形在新绘图窗口内的部分;将所述新坐标系中多边形在新绘图窗口内的部分转换为一组扫描段;将所述扫描段坐标的原码右移n位,并对移位后的扫描段上的像素着色;其中,变换参数A=2n/20,n为移位参数,为自然数。
由于现有技术中在对扫描线覆盖的像素着色时,需要将扫描段的起止坐标及扫描线y坐标除以20,转换为以像素为单位的值,需要大量除法运算。在本发明实施例中,为了减少除法运算,采用移位的方法代替除法运算,将除以20运算采用除以一个与20相近似的2的整次幂的数代替,这样,就可以用简单的整数移位代替除法运算。与此同时,将产生的多边形裁减误差转移到着色以前的计算过程中,从而消除最终结果的误差。
与20相近似的2的整次幂的数有8、16、32、64等,当然也可以用其它数值,当用这些数代替20时,扫描线覆盖的像素着色以前相应的计算结果就要乘0.4、0.8、1.6、3.2等,以保证最终的计算结果是正确的。
为了节省成本,如精简指令及计算机(RISC)处理器一般都不具有浮点处理单元,在这样的处理器上做浮点运算,或者通过软件模拟方式,或者使用定点近似方式,在精度误差允许范围内,使用定点方式的运算速度要快于软件模拟方式。因此,为了加速处理器的处理速度,在本发明实施例中,处理过程中涉及到浮点运算的部分要用定点方式来完成,小数运算均用定点数来代替。
图2示出了本发明实施例提供的一种在便携式多媒体设备上实现矢量图像填充的方法的实现流程,该方法可以降低便携式多媒体设备中CPU资源的耗费,具体如下:
步骤201:解析矢量图形,得到一系列多边形。这里,由于矢量图形文件中多边形顶点坐标的单位为1/20像素,这里解析得到的多边形坐标为1/20像素。
步骤202:利用变换参数以及变换矩阵将每个多边形映射到1/2n像素为单位的新绘图坐标系中,同时更新绘图窗口至新坐标系中,其中,变换参数为A,A=2n/20,n为移位参数,n取值为自然数。
Flash矢量图形中,多边形顶点坐标是按32位整数形式定义的,变换矩阵的旋转因子和缩放因子是按16.16的定点数形式定义的,其平移因子是按32位整数形式定义的。
本发明实施例中将坐标变换矩阵定义为:
其中,S
x为x方向缩放因子,S
y为y方向缩放因子,R
x为x方向旋转因子,R
y为y方向旋转因子,T
x为x方向平移因子。变换过程为:
展开后:
x′=Sxx+Ryy+Tx,
y′=Rxx+Syy+Ty,
其中,(x,y)为原始坐标,(x′,y′)为变换后的坐标。
除以32和乘1.6的组合为例,具体来说,假设有一个坐标点(x0,y0),通过坐标变换
映射到绘图窗口中的坐标点(x1,y1),随后将(x1,y1)的x和y坐标除20得到像素单位坐标值,有:
上式表明,用1.6倍的变换坐标值除32,就能够无误差的得到像素单位坐标值。
1.6倍的变换坐标值可以通过如下变换得到:
上式表明,可以通过将变换矩阵的缩放因子、旋转因子、平移因子分别乘以1.6,然后用乘以1.6后的矩阵将原始坐标进行变换,得到所需要的1.6倍变换坐标值。上式还表明,不必将原始坐标值乘1.6,只需要将变换因子乘1.6,因此可以减少计算量。
从上述展开后的变换式可以看出,变换过程是一个连续的乘加过程,要执行2次乘法和3次加法。其中,乘法运算是32位整数与16.16格式的定点数乘法,结果为48.16格式的定点数,因为最终变换结果是32位整数坐标值,因此要对乘法结果进行移位处理。RISC处理器中,两个32位数乘法运算的结果为一个64位数,分别放在HI和LO寄存器中,HI存放高32位,LO存放低32位,为了得到32位整数值,需要通过对HI和LO寄存器中的值进行移位操作。一般情况下,HI中的高16位是可以舍去的无效位,LO中的低16位是要舍去的小数部分,HI的低16位是32位整数坐标值的高16位,LO的高16位是正数坐标的低16位。因此,通过对HI和LO的以下操作,可以得到32位整数坐标值:
HI<<16 HI逻辑左移16位
LO>>16 LO逻辑右移16位
R=HI|LO HI与LO进行位或操作,得到结果
可以看出,要通过3次位操作,才能得到32位整数坐标值。但在RISC处理器中,可以通过用户自定义,将某些复杂操作通过一条指令完成,以上的操作可以使用RISC处理器的UDI指令udi8 rs,rt,rd,(imm<<3)来实现。该UDI指令的操作过程如下所示:
rd={rs[(31-8*imm):0],rt[31:(31-8*imm+1)]
imm=00,01,10,11,100
图3中,ABCD表示寄存器rs的内容,其中:A=rs[31:24],B=rs[23:16],C=rs[15:8],D=rs[7:0]。EFGH表示寄存器rt的内容,其中:E=rt[31:24],F=rt[23:16],G=rt[15:8],H=rt[7:0]。Imm=00,表示从rs中取出ABCD,按ABCD顺序放入寄存器rd中;imm=01,表示从rs中取出BCD,从rt中取出E,按BCDE顺序放入寄存器rd中;imm=10,表示从rs中取出CD,从rt中取出EF,按CDEF顺序放入寄存器rd中;imm=11,表示从rs中取出D,从rt中取出EFG,按DEFG顺序放入寄存器rd中;imm=100,表示从rt中取出EFGH,按EFGH顺序放入寄存器rd中。通过该指令,将HI作为rs寄存器,LO作为rt寄存器,指定imm=10,可以获取HI寄存器的低16位与LO寄存器的高16位并组合成所需要的32位整数结果。上述计算,使用该指令的操作为:
udi8 HI,LO,R,(10)<<3
本发明实施利中通过使用UDI中的单周期指令udi8 rs,rt,rd,(imm<<3),使原来需要3条指令才能完成的操作,缩减为1条指令就可完成,节省了指令数,同时减少了指令执行的周期数,加快了变换处理过程。
上述计算过程中,HI寄存器的高16位有可能也是有效位。这表明,变换后的坐标值太大,已经超出了32位整数所能表示的范围,出现了溢出。这种情况下,需要对溢出进行处理,一般将出现溢出的变换结果赋值为0x7FFFFFFF(上溢出)或0x80000000(下溢出)。结果是否溢出,可以通过HI寄存器的高16位是否为有效位进行判断,具体方法为:当HI寄存器的最高位为0时,如果其高16位全为0,则没有溢出,否则出现溢出,将结果赋值为0x7FFFFFFF;当HI寄存器的最高位为1时,如果其高16位全为1,则没有溢出,否则出现溢出,将结果赋值为0x80000000。
在步骤202中,还需要将绘图窗口更新至新坐标系中。
图4a为平移因子没有乘变换参数之前的多边形与串口的相对位置,参见图4b所示,当变换矩阵的平移因子乘1.6后,多边形与绘图窗口的相对位置就会发生变化,将导致多边形的裁剪产生误差。为了消除裁剪误差,在本发明实施例中,将绘图窗口也作相应的更新,将绘图窗口的4个顶点坐标转换为1/20像素单位,同时对每个坐标用如下矩阵进行变换:
这样,用变化了的绘图窗口对多边形裁剪,消除了裁剪误差。
步骤203:获取新坐标系中多边形在新绘图窗口内的部分。
顶点坐标变换完成后,多边形就被映射到绘图坐标系下。多边形与绘图窗口的位置关系有三种:多边形在绘图窗口内、多边形与绘图窗口相交、多边形在绘图窗口外。对于在绘图窗口内的多边形,所有边都是有效的,都是要填充区域的有效边界,此时不需要裁剪处理;对于在绘图窗口外的多边形,所有的边都是无效的,所包围的区域不需要填充,此时多边形直接被抛弃,不必进行后续的处理过程;对于与绘图窗口相交的多边形,有部分在绘图窗口外面,这部分是不需要被绘制出的,因此需要针对绘图窗口进行裁剪,计算出位于窗口内的部分,以对窗口内的部分进行填充。
如图7所示,外包矩形是指包围多边形顶点的最小矩形。为了减少不必要的计算过程,本发明实施例通过获得的多边形的外包矩形判断多边形与绘图窗口的位置关系来决策是否需要进行裁剪处理,如果不需要裁剪,则直接获取所述多边形,否则,对所述多边形进行裁剪得到位于新绘图窗口内的多边形的部分。
利用所述外包矩形与新绘图窗口的位置关系,判断是否对所述多边形进行裁剪处理可以这样实现:当所述外包矩形在所述新绘图窗口内时,则确定不需要裁剪;当所述外包矩形与所述新绘图窗口部分相交时,确定需要对所述多边形进行裁剪。
获得多边形的外包矩形是一个在顶点的x、y坐标中求极值的过程。外包矩形可以通过如下方式获得:
(1)获得多边形顶点坐标的极值,即:顶点坐标中最大和最小横坐标和纵坐标;
xmin=MIN(xi)
ymin=MIN(yi)
xmax=MAX(xi)
ymax=MAX(yi),i=0,…,N
其中,xi、yi为多边形顶点坐标,N为多边形的顶点数量;
(2)由(xmin,ymin)、(xmax,ymax)界定外包矩形。
外包矩形确定后,通过该矩形与绘图窗口矩形的布尔运算,即可获得多边形与绘图窗口的位置关系。位置关系如图5所示,图5a中,外包矩形与绘图窗口不相交,图5b中外包矩形与绘图窗口相交,图5c中外包矩形在绘图窗口内。对于外包矩形与绘图窗口不相交的情况,退出处理过程;对于外包矩形与绘图窗口相交的情况,需要进行多边形裁剪;对于外包矩形在绘图窗口内的情况,此时可以跳过裁剪过程,直接进行扫描转换。
处理过程中,对多边形的裁剪和扫描转换过程都需要计算边的斜率,都需要除法运算。为了减少除法运算量,对多边形的边计算一次斜率,即可满足裁剪和扫描转换时的使用。因此,在进行裁剪和扫描转换之前,首先进行多边形边的斜率计算。为了满足应用要求,计算出的斜率处理成16.16格式的定点数。计算斜率时,填充如表1所示的数据结构:
表1
从变换后的坐标中,取一条边的两个顶点坐标(x1,y1)和(x2,y2),然后计算斜率Slopex,计算方法为:
同时将Slopex处理成16.16格式的定点数。当为水平边时,无法计算出Slopex,但由于水平边在扫描转换过程中对生成扫描段没有贡献,可以在扫描转换时剔除,因此将Slopex赋为某一固定值如0x7FFFFFFF,表明该Slopex无意义,计算时不会被使用到。最后,各个值写入数据结构中以便后面的处理过程使用。
多边形的裁剪过程可以按照顶点顺序,依次获取每条边的数据结构Edge,然后通过裁剪算法,依次对多边形的每条边与绘图窗口进行裁剪,裁剪后得到新的顶点坐标。如图6所示,当边完全在绘图窗口内时,裁剪后边的端点坐标保持不变,同时Slopex保持不变。当边与绘图窗口的边界有1个或2个交点时,裁剪后用计算出的交点对应更新(x1,y1)或(x2,y2),更新规则如图6所示,图6a中交点P1代替(x2,y2),图6b中交点P1代替(x1,y1),图6c中交点P1代替(x1,y1),交点P2代替(x2,y2)。同时Slopex保持不变。
裁剪算法中,需要使用边的斜率Slopex,当使用Slopex时,直接从数据结构中获取。裁剪过程执行完成后,每条边的Edge数据被更新,多边形的所有边都处在了绘图窗口内。
步骤204:将所述新坐标系中多边形在新绘图窗口内的部分转换为一组扫描段。
对已经完全处在新绘图窗口内的多边形,接下来要进行的是扫描转换过程,将多边形转换为一组扫描线上的扫描段。扫描线是绘图窗口内的一条贯穿窗口的水平线,一个绘图窗口共有H条扫描线,H是以像素为单位的绘图窗口高度。扫描段是指扫描线位于多边形内部的部分,H条扫描线上的扫描段完全覆盖了多边形,这样,通过对这些扫描段的着色,就完成了对多边形的着色。
扫描转换过程中,从Edge中获取边数据,依次求出与当前扫描线相交的边,并计算出这些边与扫描线的交点,计算交点的方法为:
ix=x1+Slopex(iy-y1)
其中,ix为扫描线与边的交点x坐标值,iy为扫描线的y坐标。由于水平边对生成扫描段没有贡献,因此,如果从Edge中获取的是水平边,那么跳过对该边执行的扫描转换过程。扫描转换的计算过程如图8所示。
计算完成后,对得到的2m+2个交点x坐标,其中m为非负整数,按照x大小顺序排序,并将数据写入如表2所示的数据结构中:
表2
这样,就能保证诸如
这样的由交点界定的扫描段覆盖多边形的内部,而象
这样的扫描段覆盖多边形的外部,即由偶-奇序号交点界定的扫描段覆盖多边形内部,奇-偶序号交点界定的扫描段覆盖多边形外部。同时,对偶-奇序号交点界定的扫描段进行着色,就能保证正确填充多边形内部区域。对所有的扫描线执行这个过程,完成多边形的扫描转换过程。
值得注意的是,目前所有的坐标数据都是以1/20像素为单位的,计算交点时,扫描线y坐标也要转换为1/20像素为单位,如果扫描线y坐标为y′,那么转换后的扫描线y坐标iy=20y′。为了加快新绘图窗口内进行扫描转换的过程,本发明的一个优选实施例是只对扫描线纵坐标是2n的整数倍的扫描线进行扫描。
该实施例按如下方式执行:
建立一个扫描段链表;
当新绘图窗口内的扫描线纵坐标为2n的整数倍时,求与该扫描线对应的扫描段,所述扫描段为扫描线与新坐标系中多边形在新绘图窗口内的部分的公共部分。
将所述扫描段的参数添加到所述扫描段链表中。
在本实施例中,需要将扫棉线与新坐标系中多边形区域在新绘图窗口内部的部分的公共线段的参数加入到所述扫描段链表中。所述参数可以包括下述组合中任何一个组合的参数,扫描线的纵坐标i
y,扫描段一个端点的横坐标
以及扫描段另一端点的横坐标
的组合;或者扫描线的纵坐标i
y,扫描段的两个端点中横坐标较小端点的横坐标
以及扫描段长度width的组合;或者扫描线的纵坐标i
y,扫描段的两个端点中横坐标较大端点的横坐标
以及扫描段的长度width的组合。本发明实施例使用的参数包括第一组参数,即扫描线的纵坐标i
y,扫描段一个端点的横坐标
以及扫描段一个端点的横坐标
步骤205:将所述扫描段坐标的原码右移n位,并对移位后的扫描段上的像素着色。
完成扫描转换过程后,从ScanLine数据结构中依次获取扫描段
其中m为不大于n的非负整数,将每一个扫描段覆盖的像素着色,就完成了对多边形的填充。
图9示意出了本发明实施例提供的一种实现矢量图形填充的装置结构示意图,为了便于说明,仅示意出了与本发明实施例相关的部分,本装置可以集成在多媒体播放终端内,例如移动电话,个人数字助理(PDA)、MP4、GPS导航器等,实现FLASH动画文件,GPS图像等以矢量构成的多媒体数据的播放。
参见图9所示,本发明实施例的一种降低在矢量图形填充过程中对CPU耗费的装置包括:解析单元91、映射单元92、多边形获取单元93、扫描转换单元94、移位单元95以及像素着色单元96。其中,
解析单元91,用于解析所述矢量图形,得到一系列多边形;
映射单元92,用于利用乘以变换参数的变换矩阵将多边形映射到以1/2n像素为单位的新绘图坐标系中,同时更新原绘图窗口至新坐标系中,其中,变换参数为A,A=2n/20,n为移位参数,n取值为自然数;
多边形获取单元93,用于获取新坐标系中多边形在新绘图窗口内的部分;
扫描转换单元94,用于将所述新坐标系中多边形在新绘图窗口内的部分转换为一组扫描段;
移位单元95,用于将所述扫描段坐标的原码右移n位;
像素着色单元96,用于对移位后的扫描段上的像素着色。
所述映射单元91可以通过如下公式利用变换参数以及变换矩阵将多边形映射到1/2n像素为单位的新绘图坐标系中,
其中,所述变换矩阵为
S
x为x方向缩放因子,S
y为y方向缩放因子,R
x为x方向旋转因子,R
y为y方向旋转因子,T
x为x方向平移因子,(x,y)为原始坐标,(x′,y′)为变换后的坐标。
所述映射单元还可以采用UDI中的单周期指令实现利用变换参数以及变换矩阵将多边形映射到1/2n为单位的新绘图坐标系。本发明实施利中通过使用UDI中的单周期指令udi8 rs,rt,rd,(imm<<3),使原来需要3条指令才能完成的操作,缩减为1条指令就可完成,节省了指令数,同时减少了指令执行的周期数,加快了变换处理过程。
该装置还可以进一步包括:
斜率计算单元,根据新坐标系中多边形的顶点坐标,计算多变形每条边的斜率;
存储单元,用于存储多边形每条边的斜率以提供裁剪和扫描转换过程所使用。
所述多边形获取单元93包括:
外包矩形获取单元,用于获取所述多边形的外包矩形;
第一获取单元,利用所述外包矩形与新绘图窗口的位置关系,判断是否对所述多边形进行裁剪处理,如果不需要裁剪,则直接获取所述多边形,否则,对所述多边形进行裁剪得到位于新绘图窗口内的多边形的部分。
所述第一获取单元,用于当所述外包矩形在所述新绘图窗口内时,则确定不需要裁剪;当所述外包矩形与所述新绘图窗口部分相交时,确定需要对所述多边形进行裁剪。
所述第一获取单元,用于依次获取每条边的数据结构,利用裁剪算法对相应多边形的边与绘图窗口进行裁剪,当多边形的边完全在新绘图窗口内时,裁剪后边的端点坐标保持不变,当多边形的边与新绘图窗口有交点时,裁剪后计算出交点坐标,更新所述数据结构中的坐标值。
所述外包矩形获取单元93用于获得多边形顶点坐标的极值,并由顶点坐标中最大和最小横坐标和纵坐标界定外包矩形。
所述扫描转换单元用于当新绘图窗口内的扫描线纵坐标为2n的整数倍时,获得与该扫描线对应的扫描段,所述扫描段为扫描线与新坐标系中多边形在新绘图窗口内的部分的公共部分。
所述扫描转换单元当新绘图窗口内的扫描线纵坐标为2n的整数倍时,获得与该扫描线对应的扫描段的具体过程可以这样实现:
建立一个扫描段链表;
当新绘图窗口内的扫描线纵坐标为2n的整数倍时,求与该扫描线对应的扫描段,所述扫描段为扫描线与新坐标系中多边形在新绘图窗口内的部分的公共部分。
将所述扫描段的参数添加到所述扫描段链表中。
在本实施例中,需要将扫棉线与新坐标系中多边形区域在新绘图窗口内部的部分的公共线段的参数加入到所述扫描段链表中。所述参数可以包括下述组合中任何一个组合的参数,扫描线的纵坐标i
y,扫描段一个端点的横坐标
以及扫描段另一端点的横坐标
的组合;或者扫描线的纵坐标i
y,扫描段的两个端点中横坐标较小端点的横坐标
以及扫描段长度width的组合;或者扫描线的纵坐标i
y,扫描段的两个端点中横坐标较大端点的横坐标
以及扫描段的长度width的组合。本发明实施例使用的参数包括第一组参数,即扫描线的纵坐标i
y,扫描段一个端点的横坐标
以及扫描段一个端点的横坐标
本发明实施例中,在将扫描线覆盖的像素着色时,采用将坐标值移位的方式代替除法运算,同时将产生的多边形裁减误差转移到着色以前的计算过程中,在保证结果正确的前提下,减少了除法运算。
本发明实施例充分考虑了RISC处理器的特点及flash多边形处理过程的特点和计算关联性,能较好的加速flash多边形处理过程。Flash中的多边形顶点坐标是以1/20像素单位定义的,在扫描转换完成后,将扫描段着色时,需要将坐标值除20,转换为以像素为单位。这里,将除20运算用右移n位代替,同时将误差乘到变换矩阵中,这样在保证结果正确的前提下,减少了除法运算。
本发明实施利中通过使用特定UDI指令,将变换中定点数乘法运算结果快速的转换为所需的整数结果,减少了变换所需指令数,加快了坐标变换处理过程。
本发明实施例中通过定义多边形的外包矩形,并计算多边形的外包矩形与绘图窗口的相对位置,以决策多边形是否需要裁剪,同时对需要裁剪的多边形才进行裁剪处理,减少了不必要的计算。由于多边形裁剪和扫描转换处理过程中,都需要计算边的斜率。在本发明实施例中,通过在裁剪和扫描转换处理之前,预先计算出边的斜率,在裁剪和扫描转换过程中重复使用,减少了斜率计算次数,同时减少了除法运算。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。