Graphics的Image destination字段指向当前Graphics对象的目标绘制区域。
当目标区域为屏幕时,该字段为空,否则指向一个Image的子类MutableImage类型的对象。
无论目标绘制区域是屏幕或者是缓冲区,都是用SCREEN_INFO保存其信息。不同的是wndID,屏幕时wndID指向的是一个窗体,否则是一个pixmap。
目前对于设置Graphics的setColor、setClip、setFont等接口只是将相关属性保存在Graphics对象当中,并没有对绘图目标区域SCREEN_INFO中对应的gc进行设定,而是当调用drawLine、drawChars等具体操作时,调用GRAPHICS_SETUP(FALSE)对gc的剪切区和线条等属性进行设置,有一些如颜色属性在调用LCDUIdrawLine等接口时设定,字体是在LCDUIdrawChars中进行设定的。
由于每个目标设备都有自己的gc,其实设定Graphics绘图属性时,可以直接设置相应CREEN_INFO中的gcID进行设置,从而避免每次绘图操作时,都需要设置gc。
根据上述方法优化后的sun的kvm虚拟机,jbeanchmark的测试成绩提升了200%以上。看来图形还是最消耗资源的。
Graphics.rgbColor
// 用来替代myBitmapStruct,表示屏幕信息或者一个缓冲区
typedef struct screen_info {
struct _gvt *vtable; // 对应的基本图形绘制函数表
int prop; // 表示是否有alpha混合,mask等信息
int width;
int aligned_width; // image的宽度数值是为偶数的,类似填充位
int height;
//int cl, ct, cr, cb;// 取消于20070628,使用底层microwindow剪切区
// 该绘图区域中的gc,其实只有屏幕和MutableImage对象时,gc才有效
GR_GC_ID gcID;
GR_WINDOW_ID wndID; // Image对象对应得pixmap的id或者屏幕窗体id
GR_REGION_ID regionID;// 用来设置对应的剪切区
// unsigned char *alpha; // alpha混合时所用的数据
int strokeStyle; // 所画线条的类型
int mutable; // 窗体id对应的区域是否是可变的。
// alpha 通道,当SCREEN_INFO表示屏幕或者没有alpha通道的图像时
// alphaChannel的值等于0
int alphaChannel ;
/* 原系统只使用一个全局变量,在多线程情况下可能会出现问题,
* 其实该font并没有什么用处,每次进行绘图操作时,
* 将获取Graphics对象当中font和
*/
LOG_FONT font;
} SCREEN_INFO; // screenInfo包含窗体id和大部分得gc信息。
当要载入一副图片时,先调用Image.createImage接口将其载入一个Image的子类ImmutableImage类型的对象当中。
然后再调用Graphics.drawImage方法将其绘制到屏幕或者另一个绘图缓冲区(MutableImage类型的对象)当中。