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

Side by Side Diff: android_webview/native/java_browser_view_renderer_helper.cc

Issue 2863233002: [WebView] Move files from native to browser (Closed)
Patch Set: Created 3 years, 7 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "android_webview/native/java_browser_view_renderer_helper.h"
6
7 #include <android/bitmap.h>
8
9 #include "android_webview/public/browser/draw_sw.h"
10 #include "base/android/scoped_java_ref.h"
11 #include "base/memory/ptr_util.h"
12 #include "base/trace_event/trace_event.h"
13 #include "jni/JavaBrowserViewRendererHelper_jni.h"
14 #include "third_party/skia/include/core/SkBitmap.h"
15 #include "third_party/skia/include/core/SkRefCnt.h"
16 #include "third_party/skia/include/utils/SkCanvasStateUtils.h"
17
18 using base::android::ScopedJavaLocalRef;
19
20 namespace android_webview {
21
22 namespace {
23
24 // Provides software rendering functions from the Android glue layer.
25 // Allows preventing extra copies of data when rendering.
26 AwDrawSWFunctionTable* g_sw_draw_functions = NULL;
27
28 class JavaCanvasHolder : public SoftwareCanvasHolder {
29 public:
30 JavaCanvasHolder(JNIEnv* env,
31 jobject java_canvas,
32 const gfx::Vector2d& scroll_correction);
33 ~JavaCanvasHolder() override;
34
35 SkCanvas* GetCanvas() override;
36
37 private:
38 AwPixelInfo* pixels_;
39 std::unique_ptr<SkCanvas> canvas_;
40 DISALLOW_COPY_AND_ASSIGN(JavaCanvasHolder);
41 };
42
43 JavaCanvasHolder::JavaCanvasHolder(JNIEnv* env,
44 jobject java_canvas,
45 const gfx::Vector2d& scroll)
46 : pixels_(nullptr) {
47 if (!g_sw_draw_functions)
48 return;
49 pixels_ = g_sw_draw_functions->access_pixels(env, java_canvas);
50 if (!pixels_ || !pixels_->state)
51 return;
52
53 canvas_ = SkCanvasStateUtils::MakeFromCanvasState(pixels_->state);
54 // Workarounds for http://crbug.com/271096: SW draw only supports
55 // translate & scale transforms, and a simple rectangular clip.
56 if (canvas_ && (!canvas_->isClipRect() ||
57 (canvas_->getTotalMatrix().getType() &
58 ~(SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)))) {
59 canvas_.reset();
60 }
61 if (canvas_) {
62 canvas_->translate(scroll.x(), scroll.y());
63 }
64 }
65
66 JavaCanvasHolder::~JavaCanvasHolder() {
67 if (pixels_)
68 g_sw_draw_functions->release_pixels(pixels_);
69 pixels_ = nullptr;
70 }
71
72 SkCanvas* JavaCanvasHolder::GetCanvas() {
73 return canvas_.get();
74 }
75
76 class AuxiliaryCanvasHolder : public SoftwareCanvasHolder {
77 public:
78 AuxiliaryCanvasHolder(JNIEnv* env,
79 jobject java_canvas,
80 const gfx::Vector2d& scroll_correction,
81 const gfx::Size size);
82 ~AuxiliaryCanvasHolder() override;
83
84 SkCanvas* GetCanvas() override;
85
86 private:
87 ScopedJavaLocalRef<jobject> jcanvas_;
88 ScopedJavaLocalRef<jobject> jbitmap_;
89 gfx::Vector2d scroll_;
90 std::unique_ptr<SkBitmap> bitmap_;
91 std::unique_ptr<SkCanvas> canvas_;
92 DISALLOW_COPY_AND_ASSIGN(AuxiliaryCanvasHolder);
93 };
94
95 AuxiliaryCanvasHolder::AuxiliaryCanvasHolder(
96 JNIEnv* env,
97 jobject java_canvas,
98 const gfx::Vector2d& scroll_correction,
99 const gfx::Size size)
100 : jcanvas_(env, java_canvas), scroll_(scroll_correction) {
101 DCHECK(size.width() > 0);
102 DCHECK(size.height() > 0);
103 jbitmap_ = Java_JavaBrowserViewRendererHelper_createBitmap(
104 env, size.width(), size.height(), jcanvas_);
105 if (!jbitmap_.obj())
106 return;
107
108 AndroidBitmapInfo bitmap_info;
109 if (AndroidBitmap_getInfo(env, jbitmap_.obj(), &bitmap_info) < 0) {
110 LOG(ERROR) << "Error getting java bitmap info.";
111 return;
112 }
113
114 void* pixels = nullptr;
115 if (AndroidBitmap_lockPixels(env, jbitmap_.obj(), &pixels) < 0) {
116 LOG(ERROR) << "Error locking java bitmap pixels.";
117 return;
118 }
119
120 SkImageInfo info =
121 SkImageInfo::MakeN32Premul(bitmap_info.width, bitmap_info.height);
122 bitmap_.reset(new SkBitmap);
123 bitmap_->installPixels(info, pixels, bitmap_info.stride);
124 canvas_ = base::MakeUnique<SkCanvas>(*bitmap_);
125 }
126
127 AuxiliaryCanvasHolder::~AuxiliaryCanvasHolder() {
128 bitmap_.reset();
129
130 JNIEnv* env = base::android::AttachCurrentThread();
131 if (AndroidBitmap_unlockPixels(env, jbitmap_.obj()) < 0) {
132 LOG(ERROR) << "Error unlocking java bitmap pixels.";
133 return;
134 }
135
136 Java_JavaBrowserViewRendererHelper_drawBitmapIntoCanvas(
137 env, jbitmap_, jcanvas_, scroll_.x(), scroll_.y());
138 }
139
140 SkCanvas* AuxiliaryCanvasHolder::GetCanvas() {
141 return canvas_.get();
142 }
143
144 } // namespace
145
146 void RasterHelperSetAwDrawSWFunctionTable(AwDrawSWFunctionTable* table) {
147 g_sw_draw_functions = table;
148 }
149
150 // static
151 std::unique_ptr<SoftwareCanvasHolder> SoftwareCanvasHolder::Create(
152 jobject java_canvas,
153 const gfx::Vector2d& scroll_correction,
154 const gfx::Size& auxiliary_bitmap_size,
155 bool force_auxiliary_bitmap) {
156 JNIEnv* env = base::android::AttachCurrentThread();
157 std::unique_ptr<SoftwareCanvasHolder> holder;
158 if (!force_auxiliary_bitmap) {
159 holder.reset(new JavaCanvasHolder(env, java_canvas, scroll_correction));
160 }
161 if (!holder.get() || !holder->GetCanvas()) {
162 holder.reset();
163 holder.reset(new AuxiliaryCanvasHolder(env, java_canvas, scroll_correction,
164 auxiliary_bitmap_size));
165 }
166 if (!holder->GetCanvas()) {
167 holder.reset();
168 }
169 return holder;
170 }
171
172 } // namespace android_webview
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698