Tiled Backing Store(三)

3.Qt WebKit之QGraphicsWebView

     本节叙述如何通过Qt的QGraphicsWebView实现 分片底衬仓库 tiled backing store)。
Tiled Backing Store(三)_第1张图片

如上静态类图所示,只有实现了分片底衬仓库客户端(TiledBackingStoreClient)的接口的WebCore::Frame才拥有分片底衬仓库实例。其他类只能通过WebCore::Frame发消息给分片底衬仓库。 

QGraphicsWebView是QGraphicsWidget的子类. 它被用于显示屏幕上的可见内容。

3.1 按照内容重置QGraphicsWebView的大小(Resize to Content)

      resizesToContents(布尔变量)是QGraphicsWebView的属性。 当使用分片策略时, QGraphicsWebView用来充当我们的内容,它应当按照main frame内容立即重置自己的大小
     如Qt4.7文档所说, 如果设置此属性, QGraphicsWebView将自动按照main frame的尺寸设置自己的大小。结果就是,顶层的frame绝不会有滚动条。这样就会使得CSS的定点定位(fixed positioning)看起来就像是绝对定位(absolute positioning)--元素相对文档而不是视图端口定位。
     如果resizesToContents设置为true, 一旦Frame的内容发生改变,WebCore::FrameView 就会通知QGraphicsWebView去更新自己的大小。

3.2 绘制过程

    以下是绘制QGraphicsWebView所需步骤:

  • 按照QGraphicsWebView坐标计算可见区矩形。因为QGraphicsWebView按照frame内容的大小重置自己的尺寸,当QGraphicsWebView滚动或者缩放时,可见区矩形随之改变分片底衬仓库创建瓦片需要这样的可见区域

  • 确保整个可见区域被瓦片覆盖。对于那些没有被瓦片覆盖的可见区域, 它将重复创建最靠经视图端口中心的瓦片,直到所有可见区域被覆盖。距离的计算方法是基于Manhattan距离算法(Manhattan distance)。
           为了尽可能不阻塞绘制操作,瓦片创建采用异步执行方式,在分片底衬仓库里,异步方式是通过定时器实现的startTileCreationTimer.

  • 把frame的内容绘制到每一个瓦片的后缓冲区,通过这样的方式来更新瓦片,当然因为同样原因更新也是异步方式。

  • 由Qt画笔的drawPixmap函数来绘制后缓冲区

原文:http://xbfp2b2n.blog.sohu.com/196617339.html

你可能感兴趣的:(Tiled Backing Store(三))