ITRANSFORM_TransformBltSimple(...)与IBitmap_BltIn(.....)很相似。
参数上,两者都需要一个源位图指针;一个目标位图指针(ITransform*就是由IBitmap*转换而来的);在原图上的位置、大小、在目标图上的位置六个整型参数;一个光栅操作(对于IBitmap就是透明画、异或画这些色彩操作,对于ITransform就是旋转画,放大画这些形状操作)。
两者的画图过程都可以等效为以下几个步骤。取目标图位置,把源图放在这个位置上,进行光栅操作,得到最后的目标图。
要注意的地方:
1.源图与目标图一般不是同一幅图。对于IBitmap,这个很明显;对于ITransform,目标图是由IBitmap_QueryInterface得到的,可能会误将源图转换为目标图。
2.“在目标图上的位置”这个参数的含义。对于IBitmap,没有形状类的光栅操作。光栅操作前后,图像在目标图上的坐标是没有变化的。对于ITransform,在目标图上的位置,含义应该理解为源图左上角放在目标图的这个位置,中心固定,然后进行形状光栅操作,就可以得到最后想要的目标图。
3.ITransform接口支持的图像类型有限。测试发现,对于用IBITMAP_CreateCompatibleBitmap()创建的与屏幕兼容的位图,可以用IBtimap_QueryInterface取得ITransform指针;直接用IShell_LoadBitmap读入的windows位图,有些色深可能会转换失败。
4.BREW 2.0 模拟器对ITransform接口的实现可能有问题。同样的程序,用3.1.5的模拟器总能得到想要的结果;用2.0模拟器有些操作(例如ITransform_TransformBltSimple接口参数给旋转90度),会得到奇怪的结果。
测试代码如下: