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!