Icon 描畫問題
在Outlook中添加附件,附件的圖標變成了黑色的方塊
實驗與現象:
- 當選中一個Attachment的時候,Icon可以正確描畫了。究其原因是因為,此時的描畫并不是由Orders來負責的,而是由另外一個PDU(Bitmap Update)來進行更新的
- 進行了一個測試,就是把一些Orders的描畫動作去掉,看看在Bitmap Update后,再通過窗口的遮擋與顯示來看看是否仍有問題。 測試后發現,黑色的色塊應該是 MEMBLT_ORDER 畫上去的。
原因:
進行了各種測試來排除到底是什么原因導致的,測試過:Bitmap Decompress(移植了FreeRDP的代碼),Color Depth Translate 16to32, 24to32。但是還是一直有這個問題。
最后定位到了癥結所在,MEMBLT_ORDER的XOR Operation導致了這個問題。為什么呢?因為在做XOR操作時,以前的代碼把Alpha通道也一并做了操作。因為是亦或操作,一般情況下Alpha的值都是255,在做亦或操作之后都變成0了。也就導致這個區域變成了透明,而我們的Canvas的默認顏色就是黑色。所以看起來就是一個黑色的色塊。
細節:
- 這個問題說起來簡單,但是找起來十分麻煩。那是怎么機緣巧合找到的呢?說起來也要歸功于我們Canvas的背景有公司的Logo也就是說并不是一味的都是黑色的。在調試的時候發現那個黑色的色塊竟然有一部分其它顏色出現了不是純黑色塊了。這就改變了我原來的查找方向,我原來一直認為是解壓縮或者轉換出了問題導致整塊的Bitmap Cache都解析錯誤了,從而展現出來的就是一個黑色的色塊。但是從這個細節包括之前的測試來看,問題最終還是定位到了MEMBLT_ORDER
- 說起來還有一個細節,就是在JS單步調試的時候,我看到了一個黑色的圖形出現在了圖標的位置,然后才是被一個黑色色塊覆蓋住。那么Icon的描畫方式也揭示出來了
- 先畫一個純色(Mask Color)的Icon的標志
- 再用另一個Bitmap蓋在上面來畫,因為有了Mask,所以Icon就可以正確描畫出來并且把Icon的背景色顯示出來
- 好了,根據以上的細節,這個問題最終被定位并解決掉了
IE 卡頓
在Windows Server 2008 上(10.103.220.113),發現如果打開IE瀏覽器之后,整個畫面的更新就會變的異常的卡頓。
猜測
- 有可能是,IE瀏覽器上的某些部分在快速的刷新與描畫導致前端無法相應如此之多的刷新