QtWebkit裏RenderLayer樹的繪製詳細流程分析

       更新:RenderLayer樹的繪製對RenderObject的繪製,同時補足繪製階段的描述。

       QtWebkit裏,QWebView,QWebPage和QWebFrame的關係如下:


       QtWebKit從繪製事件(Qt的paint)發出,到WebCore裏面的RenderLayers樹的繪製詳細流程分析如下。

       首先是QWidget收到paintEvent,發送給Qt的QWebView,在QWebView裏,創建Qt的畫筆QPainter,並基於此畫筆創建繪圖上下文:GraphicContext,然後使用此畫筆再調用Qt的QWebFrame的渲染函數render把這個QWebFrame繪製到裁剪區裏。在QWebFrame的render函數裏,再調用QWebFramePrivate的繪製相對座標函數:renderRelativeCoords,後者就會計算每一個裁剪區和QWebView的交集、同時調用FrameView的繪製內容函數:paintContents。

         FrameView的paintContents函數內部就會開始繪製RenderLayer--通過paintLayer函數,此函數自己不幹活,實際調用的是RenderLayer自己的繪製函數:RenderLayer::paint,此RenderLayer的函數內部又會調用自己的paintLayer函數,這裏纔是重中之重。

         在paintLayer函數裏,主要分成三件事:1 做幾何表換:比如平移、翻轉、旋轉等等;2 繪製RenderLayer的內容;3 繪製RenderLayer的反射。後面兩件事情其實都是調用與本RenderLayer關聯的RenderObject來繪製,每一層的繪製都包括:繪製背景、繪製前景、繪製外邊框、繪製掩模、繪製z座標爲負數的RenderLayer、以及z座標爲正數的RenderLayer--即paintList,這paintLayer是遞歸調用的。具體序列圖如下:



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章