分析EMF檔案以及類比繪製已經有一段時間了,這裡做個總結。然後繼續重構雁哥代碼。(寫代碼不寫注釋會遭雷劈的!!)
MSDN的資料是寶,但只是對於看得懂的人來說。
http://msdn.microsoft.com/en-us/library/cc230565(PROT.13).aspx
第一部分:
EMF檔案對裝置描述表中的對象採用了object table機制。
http://msdn.microsoft.com/en-us/library/cc231165(PROT.10).aspx
即在操作了下列幾個圖元函數後在各自的ihpen,ihbrush,ihfont等(未列出color space, palette)進行編號
1,EMR_EXTCREATEPEN,EMR_CREATEPEN
2,EMR_CREATEBRUSHINDIRECT
3,EMR_EXTCREATEFONTINDIRECTW
其號碼順序按照出現前後次序進行編製。例如先建立畫筆,則畫筆的ihpen = 1.按序下來。
之後直到遇到EMR_DELETEOBJECT,則把object table中的相應號的object刪除,之後有新建立的object則填入空缺處。
對於這個過程的理解是寫分析代碼,從資料找出規律。
第二部分:
as類比GDI的裝置描述表
GDI的裝置描述表儲存了mapmode,page->device座標轉換,pen,brush,bmp,font,等資訊。
類比DC主要是EMF的records中有EMR_SAVEDC,EMR_RESTOREDC操作。
第三部分:
as類比路徑填充,畫圖填充
在重構這部分代碼中,覺得代碼架構的設計起到重要作用,涉及的邏輯是遍布整塊代碼。
第四部分:
as繪製位元影像像素
從位元影像的檔案結構可以知道只要擷取像素值,就可以直接繪製,但這樣考慮太過不成熟。
下面是要考慮的分析步驟:
1,位元影像分1,4,8,16,24,32位(以下步驟均要分別考慮這些位情況)
2,四個位元組對齊(沒有對齊會出現菱形切割成合并成正方形)
16位的對齊方程如下:
int pitch = width + width % 2;
int positionnow = beginbitsposition + (y * pitch + x) * 2;
3,分離RGB,再合成到32位元模式下,注意:AS中的RGB位元組排序從右至左是BGR
4,判斷圖片是否旋轉
如果位元影像資訊的height > 0 則為翻轉,否則為正常
第五部分:
as架構設計
相當於做EMF讀取繪製引擎,一來是想,能夠以後重用,二來,最重要的一點,保證效率.雖然用SVG可以很方便的類比出EMF。不過按濤哥的意思,還是做個自家產的東西更好。
不過在重構路上,代碼越寫越是覺得跑起來肯定不理想。跑上一萬次迴圈是到處可見的,一萬就耗時1秒了。另外as的記憶體管理實在讓人不太放心。從as的類庫上,整塊的處理是uicomponent->sprite(文字),shape(繪圖),bitmap(位元影像),把後面的容器裝填到前面的容器內,再顯示到舞台上。最後還是試試用swc來試試跑迴圈那邊的邏輯,看看效率如何再辦.
第六部分:
代碼重構不出來,心裡不踏實。