android4.0.1 webkit 软件渲染过程可分为三部分。
一. webkit 将绘制网页的命令存储在SKPicture中
这个过程的详细顺序图如下:
webkit render 记录网页绘制命令顺序图
以下是这个过程的详细说明。
webviewcore.cpp的contentInvalidate()会调用webviewcore.cpp的contentDraw(),这个函数会回调webviewcore.java中的contentDraw().
webviewcore.java contentDraw() 会发送消息EventHub.WEBKIT_DRAW。这个消息在webViewCore.java的EventHub的transferMessage()中处理,
webkitDraw()中会先调用nativeRecordContent(),nativeRecordContent()会调用WebViewCore.cpp中recordContent().
recordContent()会调用recordPictureSet().
recordPictureSet()中会调用layoutIfNeededRecursive()以便得到最新的contentwidth和contentheight()
layoutIfNeededRecursive()会调用FrameView.cpp的Layout()从而触发整颗RenderTree的Layout.
recordPictureSet()在调用layoutIfNeededRecursive()后,会接着调用rebuildPicture()。
rebuildPicture()会创建一块新的SKPicture,
SkPicture 用来记录绘制命令,这些命令会在以后draw到一个指定的canvas上。
这个SKPicture将被保存在WebViewCore.cpp中的 m_content的WTF::Vector<Pictures> mPictures结构中。
SKPicture 的实例作为参数传给SkAutoPictureRecord的构造函数。
SKAutoPictureRecord的构造函数会调用SKPicture的beginRecording().
在SKPicture的beginRecording()函数中会创建一块SKBitmap,和一块SkPictureRecord。并将新创建的SKBitmap作为Device设置给SKPictureRecord.
SKPictureRecord继承自SKCanvas.
SKPictureRecord会作为参数传给PlatformGrap