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類型的對象)當中。