QtWebkit的畫圖

WebKit支持的圖形庫很多:

Cairo、GTK2、Qt、Wx、CG、Mac、Skia,

不同的圖形庫能支持不同的平臺,而在各平臺上的顯示效果會有所不同。

至於在一個指定的平臺上究竟使用哪種圖形庫,這個可以靈活選擇,比如在windows平臺上可選的圖形庫有Cairo、Qt、 Wx、Cg、Skia。

 

WebKit的WebCore提供了一個稱之爲圖形上下文GraphicsContext的公共圖形接口,各個圖形庫根據自己需要實現了這些公共圖形接口,以提供給WebCore的Element使用,這樣WebKit就可以支持不同的圖形庫了。

GraphicsContext類包括了所有的圖形接口,針對不同平臺的特性,其定義中包含一些不同平臺特有的宏及元素定義。
看過WebCore代碼的人都知道, Webcore目錄下有個platform目錄, 下面的子目錄就是平臺相關的實現, Qt的實現就放在Qt目錄下,

名字叫GraphicsContext, 注意, 只有實現, 接口統一用公共的GraphicsContext.h.

 

GraphicsContext 創建的時機一般發生在WebView獲得Paint消息事件時,接下來會將該GraphicsContext類實例傳遞給FrameView及其不同的RenderObject,

由不同的RenderObject來決定究竟如何來顯示自身的內容,而GraphicsContext則提供了各種的顯示文字、圖形、圖像的方法,供RenderObject調用。

 

QtWebkit是在QWebFrame的render接口中實現的,具體代碼如下:

void QWebFrame::render(QPainter *painter, const QRegion &clip)
{
if (!d->frame->view() || !d->frame->contentRenderer())
return;

d->frame->view()->layoutIfNeededRecursive();

GraphicsContext ctx(painter);
QVector vector = clip.rects();
WebCore::FrameView* view = d->frame->view();
for (int i = 0; i <>paint(&ctx, vector.at(i));
}


 上面的render函數會傳入一個Qt平臺特有的QPainter指針, 該指針作爲platform context傳給GraphicsContext類來創建GraphicsContext,

接下來就可以用來畫圖了.

 

enjoy it!

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