diff options
author | hush@chromium.org <hush@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-24 14:21:12 +0000 |
---|---|---|
committer | hush@chromium.org <hush@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-07-24 14:21:12 +0000 |
commit | 7894de87addffe7c54f693696e3a1fcc46246f73 (patch) | |
tree | cbd07262781c8d482cfb109c0db3f7d5b89bdb6a | |
parent | e7a1b1c95b337b5926f853656bef665a57d2f65c (diff) | |
download | chromium_src-7894de87addffe7c54f693696e3a1fcc46246f73.zip chromium_src-7894de87addffe7c54f693696e3a1fcc46246f73.tar.gz chromium_src-7894de87addffe7c54f693696e3a1fcc46246f73.tar.bz2 |
Fix auxiliary bitmap software draws.
When the software canvas contains 3d transforms, or the clip region is not a rectangle, webview will draw via an auxiliary bitmap.
In this mode, WebView applies the scroll offsets incorrectly. As a result, only a portion of the webview will be shown when you scroll.
This fix works by not applying the scroll offset on canvas backed by the auxiliary bitmap. Instead, the scroll offset is applied on the original software canvas.
BUG=396515
Review URL: https://codereview.chromium.org/411133002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@285247 0039d316-1c4b-4281-b951-d872f2087c98
8 files changed, 37 insertions, 44 deletions
diff --git a/android_webview/browser/browser_view_renderer.cc b/android_webview/browser/browser_view_renderer.cc index ef039bf..b958dae 100644 --- a/android_webview/browser/browser_view_renderer.cc +++ b/android_webview/browser/browser_view_renderer.cc @@ -306,13 +306,19 @@ bool BrowserViewRenderer::OnDrawSoftware(jobject java_canvas) { return false; } + // TODO(hush): right now webview size is passed in as the auxiliary bitmap + // size, which might hurt performace (only for software draws with auxiliary + // bitmap). For better performance, get global visible rect, transform it + // from screen space to view space, then intersect with the webview in + // viewspace. Use the resulting rect as the auxiliary + // bitmap. return BrowserViewRendererJavaHelper::GetInstance() ->RenderViaAuxilaryBitmapIfNeeded( - java_canvas, - last_on_draw_scroll_offset_, - gfx::Rect(width_, height_), - base::Bind(&BrowserViewRenderer::CompositeSW, - base::Unretained(this))); + java_canvas, + last_on_draw_scroll_offset_, + gfx::Size(width_, height_), + base::Bind(&BrowserViewRenderer::CompositeSW, + base::Unretained(this))); } skia::RefPtr<SkPicture> BrowserViewRenderer::CapturePicture(int width, diff --git a/android_webview/browser/browser_view_renderer.h b/android_webview/browser/browser_view_renderer.h index e130334..338b31d 100644 --- a/android_webview/browser/browser_view_renderer.h +++ b/android_webview/browser/browser_view_renderer.h @@ -47,7 +47,7 @@ class BrowserViewRendererJavaHelper { virtual bool RenderViaAuxilaryBitmapIfNeeded( jobject java_canvas, const gfx::Vector2d& scroll_correction, - const gfx::Rect& auxiliary_bitmap_size, + const gfx::Size& auxiliary_bitmap_size, RenderMethod render_source) = 0; protected: diff --git a/android_webview/java/src/org/chromium/android_webview/AwPicture.java b/android_webview/java/src/org/chromium/android_webview/AwPicture.java index 6f245bc..17eaa07 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwPicture.java +++ b/android_webview/java/src/org/chromium/android_webview/AwPicture.java @@ -6,7 +6,6 @@ package org.chromium.android_webview; import android.graphics.Canvas; import android.graphics.Picture; -import android.graphics.Rect; import org.chromium.base.JNINamespace; import org.chromium.content.common.CleanupReference; @@ -65,15 +64,9 @@ class AwPicture extends Picture { return nativeGetHeight(mNativeAwPicture); } - // Effectively a local variable of draw(), but held as a member to avoid GC churn. - private Rect mClipBoundsTemporary = new Rect(); - @Override public void draw(Canvas canvas) { - canvas.getClipBounds(mClipBoundsTemporary); - nativeDraw(mNativeAwPicture, canvas, - mClipBoundsTemporary.left, mClipBoundsTemporary.top, - mClipBoundsTemporary.right, mClipBoundsTemporary.bottom); + nativeDraw(mNativeAwPicture, canvas); } @Override @@ -89,7 +82,6 @@ class AwPicture extends Picture { private static native void nativeDestroy(long nativeAwPicture); private native int nativeGetWidth(long nativeAwPicture); private native int nativeGetHeight(long nativeAwPicture); - private native void nativeDraw(long nativeAwPicture, Canvas canvas, - int left, int top, int right, int bottom); + private native void nativeDraw(long nativeAwPicture, Canvas canvas); } diff --git a/android_webview/java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java b/android_webview/java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java index 4df7b4a..f9eaa76 100644 --- a/android_webview/java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java +++ b/android_webview/java/src/org/chromium/android_webview/JavaBrowserViewRendererHelper.java @@ -44,8 +44,12 @@ public class JavaBrowserViewRendererHelper { * Used for convenience from the native side and other static helper methods. */ @CalledByNative - private static void drawBitmapIntoCanvas(Bitmap bitmap, Canvas canvas, int x, int y) { - canvas.drawBitmap(bitmap, x, y, null); + private static void drawBitmapIntoCanvas(Bitmap bitmap, + Canvas canvas, + int scroll_x, + int scroll_y) { + canvas.translate(scroll_x, scroll_y); + canvas.drawBitmap(bitmap, 0, 0, null); } // Should never be instantiated. diff --git a/android_webview/native/aw_picture.cc b/android_webview/native/aw_picture.cc index 535908d..3a319e6 100644 --- a/android_webview/native/aw_picture.cc +++ b/android_webview/native/aw_picture.cc @@ -37,15 +37,14 @@ bool RenderPictureToCanvas(SkPicture* picture, SkCanvas* canvas) { } } -void AwPicture::Draw(JNIEnv* env, jobject obj, jobject canvas, - jint left, jint top, jint right, jint bottom) { +void AwPicture::Draw(JNIEnv* env, jobject obj, jobject canvas) { bool ok = JavaBrowserViewRendererHelper::GetInstance() ->RenderViaAuxilaryBitmapIfNeeded( - canvas, - gfx::Vector2d(), - gfx::Rect(left, top, right - left, bottom - top), - base::Bind(&RenderPictureToCanvas, - base::Unretained(picture_.get()))); + canvas, + gfx::Vector2d(), + gfx::Size(picture_->width(), picture_->height()), + base::Bind(&RenderPictureToCanvas, + base::Unretained(picture_.get()))); LOG_IF(ERROR, !ok) << "Couldn't draw picture"; } diff --git a/android_webview/native/aw_picture.h b/android_webview/native/aw_picture.h index b1e31ee..fc4d1ec 100644 --- a/android_webview/native/aw_picture.h +++ b/android_webview/native/aw_picture.h @@ -26,8 +26,7 @@ class AwPicture { void Destroy(JNIEnv* env, jobject obj); jint GetWidth(JNIEnv* env, jobject obj); jint GetHeight(JNIEnv* env, jobject obj); - void Draw(JNIEnv* env, jobject obj, jobject canvas, - jint left, jint top, jint right, jint bottom); + void Draw(JNIEnv* env, jobject obj, jobject canvas); private: skia::RefPtr<SkPicture> picture_; diff --git a/android_webview/native/java_browser_view_renderer_helper.cc b/android_webview/native/java_browser_view_renderer_helper.cc index f874676..a1258be 100644 --- a/android_webview/native/java_browser_view_renderer_helper.cc +++ b/android_webview/native/java_browser_view_renderer_helper.cc @@ -71,7 +71,7 @@ JavaBrowserViewRendererHelper::~JavaBrowserViewRendererHelper() {} bool JavaBrowserViewRendererHelper::RenderViaAuxilaryBitmapIfNeeded( jobject java_canvas, const gfx::Vector2d& scroll_correction, - const gfx::Rect& auxiliary_bitmap_rect, + const gfx::Size& auxiliary_bitmap_size, RenderMethod render_source) { TRACE_EVENT0("android_webview", "RenderViaAuxilaryBitmapIfNeeded"); @@ -97,7 +97,7 @@ bool JavaBrowserViewRendererHelper::RenderViaAuxilaryBitmapIfNeeded( return RenderViaAuxilaryBitmap(env, java_canvas, scroll_correction, - auxiliary_bitmap_rect, + auxiliary_bitmap_size, render_source); } @@ -105,28 +105,26 @@ bool JavaBrowserViewRendererHelper::RenderViaAuxilaryBitmap( JNIEnv* env, jobject java_canvas, const gfx::Vector2d& scroll_correction, - const gfx::Rect& auxiliary_bitmap_rect, + const gfx::Size& auxiliary_bitmap_size, const RenderMethod& render_source) { // Render into an auxiliary bitmap if pixel info is not available. ScopedJavaLocalRef<jobject> jcanvas(env, java_canvas); TRACE_EVENT0("android_webview", "RenderToAuxBitmap"); - if (auxiliary_bitmap_rect.width() <= 0 || auxiliary_bitmap_rect.height() <= 0) + if (auxiliary_bitmap_size.width() <= 0 || auxiliary_bitmap_size.height() <= 0) return false; ScopedJavaLocalRef<jobject> jbitmap( Java_JavaBrowserViewRendererHelper_createBitmap( env, - auxiliary_bitmap_rect.width(), - auxiliary_bitmap_rect.height(), + auxiliary_bitmap_size.width(), + auxiliary_bitmap_size.height(), jcanvas.obj())); if (!jbitmap.obj()) return false; if (!RasterizeIntoBitmap(env, jbitmap, - auxiliary_bitmap_rect.x() - scroll_correction.x(), - auxiliary_bitmap_rect.y() - scroll_correction.y(), render_source)) { return false; } @@ -135,8 +133,8 @@ bool JavaBrowserViewRendererHelper::RenderViaAuxilaryBitmap( env, jbitmap.obj(), jcanvas.obj(), - auxiliary_bitmap_rect.x(), - auxiliary_bitmap_rect.y()); + scroll_correction.x(), + scroll_correction.y()); return true; } @@ -147,8 +145,6 @@ bool RegisterJavaBrowserViewRendererHelper(JNIEnv* env) { bool JavaBrowserViewRendererHelper::RasterizeIntoBitmap( JNIEnv* env, const JavaRef<jobject>& jbitmap, - int scroll_x, - int scroll_y, const JavaBrowserViewRendererHelper::RenderMethod& renderer) { DCHECK(jbitmap.obj()); @@ -172,7 +168,6 @@ bool JavaBrowserViewRendererHelper::RasterizeIntoBitmap( bitmap.installPixels(info, pixels, bitmap_info.stride); SkCanvas canvas(bitmap); - canvas.translate(-scroll_x, -scroll_y); succeeded = renderer.Run(&canvas); } diff --git a/android_webview/native/java_browser_view_renderer_helper.h b/android_webview/native/java_browser_view_renderer_helper.h index c945366..5ff938d 100644 --- a/android_webview/native/java_browser_view_renderer_helper.h +++ b/android_webview/native/java_browser_view_renderer_helper.h @@ -26,20 +26,18 @@ class JavaBrowserViewRendererHelper : public BrowserViewRendererJavaHelper { virtual bool RenderViaAuxilaryBitmapIfNeeded( jobject java_canvas, const gfx::Vector2d& scroll_correction, - const gfx::Rect& auxiliary_bitmap_rect, + const gfx::Size& auxiliary_bitmap_size, RenderMethod render_source) OVERRIDE; private: bool RenderViaAuxilaryBitmap(JNIEnv* env, jobject java_canvas, const gfx::Vector2d& scroll_correction, - const gfx::Rect& auxiliary_bitmap_rect, + const gfx::Size& auxiliary_bitmap_size, const RenderMethod& render_source); bool RasterizeIntoBitmap( JNIEnv* env, const base::android::JavaRef<jobject>& jbitmap, - int scroll_x, - int scroll_y, const JavaBrowserViewRendererHelper::RenderMethod& renderer); }; |