diff options
author | leandrogracia@chromium.org <leandrogracia@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-09 11:48:07 +0000 |
---|---|---|
committer | leandrogracia@chromium.org <leandrogracia@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-09 11:48:07 +0000 |
commit | f60335ce3aefc0eef1f20f39184d97b7e69411eb (patch) | |
tree | b67b9c55053e9204a4a5989560bd29a536c50638 | |
parent | 72bf5ac2f3b627e8d1f58b7ec78ccf61c7b9654d (diff) | |
download | chromium_src-f60335ce3aefc0eef1f20f39184d97b7e69411eb.zip chromium_src-f60335ce3aefc0eef1f20f39184d97b7e69411eb.tar.gz chromium_src-f60335ce3aefc0eef1f20f39184d97b7e69411eb.tar.bz2 |
[Android WebView] Update SW rendering to use SkPicture and fix scrolling cases.
The new capturePicture API will now provide SkPicture objects rather than cc::PicturePileImpl. Update the code to reflect that.
Also, when rendering into separate layers in HW mode we're applying a translation to undo the Android Framework scrolling and let Chrome's compositor take care of it. This is not applicable to the layer case, however, as we only render ourselves out of our provided sufrace.
SW rendering doesn't need scroll correction after using SkPicture directly. Before, cc::PicturePileImpl translated the canvas as part of the content rect rasterization.
BUG=161409
Review URL: https://chromiumcodereview.appspot.com/11732002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@175781 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | android_webview/DEPS | 2 | ||||
-rw-r--r-- | android_webview/common/renderer_picture_map.cc | 7 | ||||
-rw-r--r-- | android_webview/common/renderer_picture_map.h | 12 | ||||
-rw-r--r-- | android_webview/native/aw_contents.cc | 36 | ||||
-rw-r--r-- | android_webview/native/aw_contents.h | 2 | ||||
-rw-r--r-- | android_webview/renderer/aw_render_view_ext.cc | 3 | ||||
-rw-r--r-- | android_webview/renderer/aw_render_view_ext.h | 7 |
7 files changed, 34 insertions, 35 deletions
diff --git a/android_webview/DEPS b/android_webview/DEPS index 64297c3..740e94d 100644 --- a/android_webview/DEPS +++ b/android_webview/DEPS @@ -13,6 +13,8 @@ include_rules = [ "+content/public/common", "+jni", "+net", + "+skia", + "+third_party/skia/include", "+ui/android", "+ui/base", "+webkit", diff --git a/android_webview/common/renderer_picture_map.cc b/android_webview/common/renderer_picture_map.cc index f5e9e03..c27cc56 100644 --- a/android_webview/common/renderer_picture_map.cc +++ b/android_webview/common/renderer_picture_map.cc @@ -4,6 +4,8 @@ #include "android_webview/common/renderer_picture_map.h" +#include "base/logging.h" + using base::AutoLock; namespace android_webview { @@ -28,14 +30,13 @@ RendererPictureMap::RendererPictureMap() { RendererPictureMap::~RendererPictureMap() { } -scoped_refptr<cc::PicturePileImpl> RendererPictureMap::GetRendererPicture( - int id) { +skia::RefPtr<SkPicture> RendererPictureMap::GetRendererPicture(int id) { AutoLock lock(lock_); return picture_map_[id]; } void RendererPictureMap::SetRendererPicture(int id, - scoped_refptr<cc::PicturePileImpl> picture) { + skia::RefPtr<SkPicture> picture) { AutoLock lock(lock_); picture_map_[id] = picture; } diff --git a/android_webview/common/renderer_picture_map.h b/android_webview/common/renderer_picture_map.h index 5129129..5e0229d 100644 --- a/android_webview/common/renderer_picture_map.h +++ b/android_webview/common/renderer_picture_map.h @@ -7,28 +7,28 @@ #include <map> -#include "base/memory/ref_counted.h" #include "base/synchronization/lock.h" -#include "cc/picture_pile_impl.h" +#include "skia/ext/refptr.h" +#include "third_party/skia/include/core/SkPicture.h" namespace android_webview { -// Stores picture piles received from diferent renderers and associates them by +// Stores pictures received from diferent renderers and associates them by // renderer id. Will only work in single process mode. class RendererPictureMap { public: static void CreateInstance(); static RendererPictureMap* GetInstance(); - scoped_refptr<cc::PicturePileImpl> GetRendererPicture(int id); - void SetRendererPicture(int id, scoped_refptr<cc::PicturePileImpl> picture); + skia::RefPtr<SkPicture> GetRendererPicture(int id); + void SetRendererPicture(int id, skia::RefPtr<SkPicture> picture); void ClearRendererPicture(int id); private: RendererPictureMap(); ~RendererPictureMap(); - typedef std::map<int, scoped_refptr<cc::PicturePileImpl> > PictureMap; + typedef std::map<int, skia::RefPtr<SkPicture> > PictureMap; PictureMap picture_map_; base::Lock lock_; }; diff --git a/android_webview/native/aw_contents.cc b/android_webview/native/aw_contents.cc index 2343b6a..8d7e53c 100644 --- a/android_webview/native/aw_contents.cc +++ b/android_webview/native/aw_contents.cc @@ -27,8 +27,6 @@ #include "base/pickle.h" #include "base/supports_user_data.h" #include "cc/layer.h" -#include "cc/picture_pile_impl.h" -#include "cc/rendering_stats.h" #include "content/components/navigation_interception/intercept_navigation_delegate.h" #include "content/public/browser/android/content_view_core.h" #include "content/public/browser/browser_thread.h" @@ -39,9 +37,11 @@ #include "content/public/common/ssl_status.h" #include "jni/AwContents_jni.h" #include "net/base/x509_certificate.h" +#include "skia/ext/refptr.h" #include "third_party/skia/include/core/SkBitmap.h" #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkDevice.h" +#include "third_party/skia/include/core/SkPicture.h" #include "ui/gfx/transform.h" #include "ui/gl/gl_bindings.h" @@ -122,7 +122,6 @@ AwContents::AwContents(JNIEnv* env, view_visible_(false), compositor_visible_(false), is_composite_pending_(false), - last_scroll_x_(0), last_scroll_y_(0), last_frame_context_(NULL) { RendererPictureMap::CreateInstance(); android_webview::AwBrowserDependencyFactory* dependency_factory = @@ -270,7 +269,6 @@ void AwContents::DrawGL(AwDrawGLInfo* draw_info) { last_frame_context_ = current_context; } - gfx::Transform transform; compositor_->SetWindowBounds(gfx::Size(draw_info->width, draw_info->height)); if (draw_info->is_layer) { @@ -279,6 +277,7 @@ void AwContents::DrawGL(AwDrawGLInfo* draw_info) { // The Android framework will composite us afterwards. compositor_->SetHasTransparentBackground(false); view_clip_layer_->setMasksToBounds(false); + transform_layer_->setTransform(gfx::Transform()); scissor_clip_layer_->setMasksToBounds(false); scissor_clip_layer_->setPosition(gfx::PointF()); scissor_clip_layer_->setBounds(gfx::Size()); @@ -303,15 +302,17 @@ void AwContents::DrawGL(AwDrawGLInfo* draw_info) { undo_clip_position.Translate(-clip_rect.x(), -clip_rect.y()); scissor_clip_layer_->setSublayerTransform(undo_clip_position); + gfx::Transform transform; transform.matrix().setColMajorf(draw_info->transform); + + // The scrolling values of the Android Framework affect the transformation + // matrix. This needs to be undone to let the compositor handle scrolling. + transform.Translate(hw_rendering_scroll_.x(), hw_rendering_scroll_.y()); + transform_layer_->setTransform(transform); + view_clip_layer_->setMasksToBounds(true); } - // The scrolling values of the Android Framework affect the transformation - // matrix. This needs to be undone to let the compositor handle scrolling. - transform.Translate(last_scroll_x_, last_scroll_y_); - transform_layer_->setTransform(transform); - compositor_->Composite(); is_composite_pending_ = false; @@ -379,7 +380,7 @@ void AwContents::DrawGL(AwDrawGLInfo* draw_info) { } bool AwContents::DrawSW(JNIEnv* env, jobject obj, jobject java_canvas) { - scoped_refptr<cc::PicturePileImpl> picture = + skia::RefPtr<SkPicture> picture = RendererPictureMap::GetInstance()->GetRendererPicture( web_contents_->GetRoutingID()); if (!picture) @@ -402,9 +403,8 @@ bool AwContents::DrawSW(JNIEnv* env, jobject obj, jobject java_canvas) { SkDevice device(bitmap); SkCanvas canvas(&device); SkMatrix matrix; - for (int i = 0; i < 9; i++) { + for (int i = 0; i < 9; i++) matrix.set(i, pixels->matrix[i]); - } canvas.setMatrix(matrix); SkRegion clip; @@ -416,12 +416,7 @@ bool AwContents::DrawSW(JNIEnv* env, jobject obj, jobject java_canvas) { clip.setRect(SkIRect::MakeWH(pixels->width, pixels->height)); } - SkIRect sk_clip_rect = clip.getBounds(); - gfx::Rect clip_rect(sk_clip_rect.x(), sk_clip_rect.y(), - sk_clip_rect.width(), sk_clip_rect.height()); - - cc::RenderingStats stats; - picture->Raster(&canvas, clip_rect, 1.0, &stats); + picture->draw(&canvas); } g_draw_sw_functions->release_pixels(pixels); @@ -817,8 +812,7 @@ jboolean AwContents::RestoreFromOpaqueState( void AwContents::SetScrollForHWFrame(JNIEnv* env, jobject obj, int scroll_x, int scroll_y) { - last_scroll_x_ = scroll_x; - last_scroll_y_ = scroll_y; + hw_rendering_scroll_ = gfx::Point(scroll_x, scroll_y); } void AwContents::SetPendingWebContentsForPopup( @@ -846,6 +840,8 @@ void AwContents::OnPictureUpdated(int process_id, int render_view_id) { if (render_view_id != web_contents_->GetRoutingID()) return; + // TODO(leandrogracia): delete when sw rendering uses Ubercompositor. + // Invalidation should be provided by the compositor only. Invalidate(); } diff --git a/android_webview/native/aw_contents.h b/android_webview/native/aw_contents.h index 905240f..d482465 100644 --- a/android_webview/native/aw_contents.h +++ b/android_webview/native/aw_contents.h @@ -146,11 +146,11 @@ class AwContents : public FindHelper::Listener, scoped_refptr<cc::Layer> scissor_clip_layer_; scoped_refptr<cc::Layer> transform_layer_; scoped_refptr<cc::Layer> view_clip_layer_; + gfx::Point hw_rendering_scroll_; gfx::Size view_size_; bool view_visible_; bool compositor_visible_; bool is_composite_pending_; - int last_scroll_x_, last_scroll_y_; // Used only for detecting Android View System context changes. // Not to be used between draw calls. diff --git a/android_webview/renderer/aw_render_view_ext.cc b/android_webview/renderer/aw_render_view_ext.cc index 86f56ac..08475a8 100644 --- a/android_webview/renderer/aw_render_view_ext.cc +++ b/android_webview/renderer/aw_render_view_ext.cc @@ -200,8 +200,7 @@ void AwRenderViewExt::OnEnableCapturePictureCallback(bool enable) { // content::RenderView::CapturePictureCallback()); } -void AwRenderViewExt::OnPictureUpdate( - scoped_refptr<cc::PicturePileImpl> picture) { +void AwRenderViewExt::OnPictureUpdate(skia::RefPtr<SkPicture> picture) { RendererPictureMap::GetInstance()->SetRendererPicture(routing_id(), picture); Send(new AwViewHostMsg_PictureUpdated(routing_id())); } diff --git a/android_webview/renderer/aw_render_view_ext.h b/android_webview/renderer/aw_render_view_ext.h index 0959811..9fa91fd 100644 --- a/android_webview/renderer/aw_render_view_ext.h +++ b/android_webview/renderer/aw_render_view_ext.h @@ -7,10 +7,11 @@ #include "base/basictypes.h" #include "base/compiler_specific.h" -#include "base/memory/ref_counted.h" -#include "cc/picture_pile_impl.h" +#include "base/memory/weak_ptr.h" #include "content/public/renderer/render_view_observer.h" +#include "skia/ext/refptr.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebPermissionClient.h" +#include "third_party/skia/include/core/SkPicture.h" namespace WebKit { @@ -45,7 +46,7 @@ class AwRenderViewExt : public content::RenderViewObserver, void OnEnableCapturePictureCallback(bool enable); - void OnPictureUpdate(scoped_refptr<cc::PicturePileImpl> picture); + void OnPictureUpdate(skia::RefPtr<SkPicture> picture); // WebKit::WebPermissionClient implementation. virtual bool allowImage(WebKit::WebFrame* frame, |