Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1762)

Unified Diff: android_webview/browser/in_process_view_renderer.cc

Issue 23789003: Switch AwPixelInfo to wrap SkCanvasLayerState (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: clang Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | android_webview/public/browser/draw_sw.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: android_webview/browser/in_process_view_renderer.cc
diff --git a/android_webview/browser/in_process_view_renderer.cc b/android_webview/browser/in_process_view_renderer.cc
index bcf2ca4666e5eb25e65a9907139231f859372c39..eaaa51fb952c017a3538262a8691d08a31ca0854 100644
--- a/android_webview/browser/in_process_view_renderer.cc
+++ b/android_webview/browser/in_process_view_renderer.cc
@@ -27,6 +27,7 @@
#include "third_party/skia/include/core/SkCanvas.h"
#include "third_party/skia/include/core/SkGraphics.h"
#include "third_party/skia/include/core/SkPicture.h"
+#include "third_party/skia/include/utils/SkCanvasStateUtils.h"
#include "ui/gfx/skia_util.h"
#include "ui/gfx/transform.h"
#include "ui/gfx/vector2d_conversions.h"
@@ -449,82 +450,48 @@ bool InProcessViewRenderer::RenderViaAuxilaryBitmapIfNeeded(
JNIEnv* env = AttachCurrentThread();
ScopedPixelAccess auto_release_pixels(env, java_canvas);
AwPixelInfo* pixels = auto_release_pixels.pixels();
- SkMatrix matrix;
- SkBitmap::Config config(SkBitmap::kNo_Config);
- if (pixels) {
- switch (pixels->config) {
- case AwConfig_ARGB_8888:
- config = SkBitmap::kARGB_8888_Config;
- break;
- case AwConfig_RGB_565:
- config = SkBitmap::kRGB_565_Config;
- break;
+ if (pixels && pixels->state) {
+ skia::RefPtr<SkCanvas> canvas = skia::AdoptRef(
+ SkCanvasStateUtils::CreateFromCanvasState(pixels->state));
+
+ // Workarounds for http://crbug.com/271096: SW draw only supports
+ // translate & scale transforms, and a simple rectangular clip.
+ if (canvas && (!canvas->getTotalClip().isRect() ||
+ (canvas->getTotalMatrix().getType() &
+ ~(SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)))) {
+ canvas.clear();
}
-
- for (int i = 0; i < 9; i++) {
- matrix.set(i, pixels->matrix[i]);
- }
- // Workaround for http://crbug.com/271096: SW draw only supports
- // translate & scale transforms.
- if (matrix.getType() & ~(SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask))
- config = SkBitmap::kNo_Config;
- }
-
- if (config == SkBitmap::kNo_Config) {
- // Render into an auxiliary bitmap if pixel info is not available.
- ScopedJavaLocalRef<jobject> jcanvas(env, java_canvas);
- TRACE_EVENT0("android_webview", "RenderToAuxBitmap");
- ScopedJavaLocalRef<jobject> jbitmap(java_helper->CreateBitmap(
- env, clip.width(), clip.height(), jcanvas, owner_key));
- if (!jbitmap.obj()) {
- TRACE_EVENT_INSTANT0("android_webview",
- "EarlyOut_BitmapAllocFail",
- TRACE_EVENT_SCOPE_THREAD);
- return false;
- }
-
- if (!RasterizeIntoBitmap(env, jbitmap,
- clip.x() - scroll_correction.x(),
- clip.y() - scroll_correction.y(),
- render_source)) {
- TRACE_EVENT_INSTANT0("android_webview",
- "EarlyOut_RasterizeFail",
- TRACE_EVENT_SCOPE_THREAD);
- return false;
+ if (canvas) {
+ canvas->translate(scroll_correction.x(), scroll_correction.y());
+ return render_source.Run(canvas.get());
}
-
- java_helper->DrawBitmapIntoCanvas(env, jbitmap, jcanvas,
- clip.x(), clip.y());
- return true;
}
- // Draw in a SkCanvas built over the pixel information.
- SkBitmap bitmap;
- bitmap.setConfig(config,
- pixels->width,
- pixels->height,
- pixels->row_bytes);
- bitmap.setPixels(pixels->pixels);
- SkBitmapDevice device(bitmap);
- SkCanvas canvas(&device);
- canvas.setMatrix(matrix);
-
- if (pixels->clip_rect_count) {
- SkRegion clip;
- for (int i = 0; i < pixels->clip_rect_count; ++i) {
- clip.op(SkIRect::MakeXYWH(pixels->clip_rects[i + 0],
- pixels->clip_rects[i + 1],
- pixels->clip_rects[i + 2],
- pixels->clip_rects[i + 3]),
- SkRegion::kUnion_Op);
- }
- canvas.setClipRegion(clip);
+ // Render into an auxiliary bitmap if pixel info is not available.
+ ScopedJavaLocalRef<jobject> jcanvas(env, java_canvas);
+ TRACE_EVENT0("android_webview", "RenderToAuxBitmap");
+ ScopedJavaLocalRef<jobject> jbitmap(java_helper->CreateBitmap(
+ env, clip.width(), clip.height(), jcanvas, owner_key));
+ if (!jbitmap.obj()) {
+ TRACE_EVENT_INSTANT0("android_webview",
+ "EarlyOut_BitmapAllocFail",
+ TRACE_EVENT_SCOPE_THREAD);
+ return false;
}
- canvas.translate(scroll_correction.x(),
- scroll_correction.y());
+ if (!RasterizeIntoBitmap(env, jbitmap,
+ clip.x() - scroll_correction.x(),
+ clip.y() - scroll_correction.y(),
+ render_source)) {
+ TRACE_EVENT_INSTANT0("android_webview",
+ "EarlyOut_RasterizeFail",
+ TRACE_EVENT_SCOPE_THREAD);
+ return false;
+ }
- return render_source.Run(&canvas);
+ java_helper->DrawBitmapIntoCanvas(env, jbitmap, jcanvas,
+ clip.x(), clip.y());
+ return true;
}
skia::RefPtr<SkPicture> InProcessViewRenderer::CapturePicture(int width,
« no previous file with comments | « no previous file | android_webview/public/browser/draw_sw.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698