本文介绍怎样实现任意角度的文字多色渐变填充。
因为文字填充区是由若干个不规则的图形组成的,因此渐变填充文字比渐变填充矩形(见《实现任意角度渐变填充(一) -- 双色渐变填充矩形》和《实现任意角度渐变填充(二) -- 多色渐变填充矩形》)要复杂一些。需要先建立一个临时位图,以黑底白字形式将文字画在临时位图上,然后以临时位图数据为掩码图,对文字填充区域进行填充,如果掩码图某坐标的象素值为白色,那么对文字填充区的相应坐标的象素进行填充,否则不填充,下面是多色渐变文字填充的实现代码:
上面的代码中,除了建立文字掩码图的过程和文字填充过程外,大部分过程和《实现任意角度渐变填充(二) -- 多色渐变填充矩形》是相同的,文字填充过程也是在矩形填充过程基础上修改的。
下面是个在窗口显示文字的例子:
例子中的LinearGradientFillRect见《实现任意角度渐变填充(一) -- 双色渐变填充矩形》或者《实现任意角度渐变填充(二) -- 多色渐变填充矩形》。
例子运行界面截图:
从界面截图看,多色文字填充过程是成功的。但是遗憾的是文字边缘有很多锯齿,为此,我对掩码图的制作过程作了改进,对文字掩码图进行了反走样处理,同时,文字填充过程也要做相应的改变,下面是改进后的过程代码:
为了加快反走样过程和填充过程速度,下面是用BASM代码优化后的AntiAliasMask和LinearMaskFill过程:
用改进后的多色填充文字过程再次运行上面的例子代码,其运行界面截图如下:
这个多色文字填充界面比前面的效果好多了。
指导和建议请来信:mao.maozefa@gmail.com,maozefa@hotmail.com
后记:本文的填充过程支持ARGB颜色填充,GetGradientColors过程就是采用常规ARGB合成方法计算的颜色缓冲区各元素的颜色值,后经CSDN网友winnuke指出:如果填充颜色的Alpha小于255时,按常规ARGB合成方法计算的颜色会导致人眼视觉偏差,必须先将颜色的RGB按Alpha进行预乘,即转换为PARGB格式后进行合成,合成完毕后再转换回ARGB格式(见《http://topic.csdn.net/u/20091118/20/4f96e8c5-dcea-41ae-ac07-492526462b9d.html?64533》)。为此,本文对GetGradientColors进行了修改,但《实现任意角度渐变填充(一) -- 双色渐变填充矩形》一文中的SetGradientColors没作修改,因为那篇文章的内容只是作为本文的导入篇,就让它保持原貌吧。在这里再次对网友winnuke表示感谢!