OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "android_webview/native/java_browser_view_renderer_helper.h" | 5 #include "android_webview/native/java_browser_view_renderer_helper.h" |
6 | 6 |
7 #include <android/bitmap.h> | 7 #include <android/bitmap.h> |
8 | 8 |
9 #include "android_webview/public/browser/draw_sw.h" | 9 #include "android_webview/public/browser/draw_sw.h" |
10 #include "base/android/scoped_java_ref.h" | 10 #include "base/android/scoped_java_ref.h" |
11 #include "base/trace_event/trace_event.h" | 11 #include "base/trace_event/trace_event.h" |
12 #include "jni/JavaBrowserViewRendererHelper_jni.h" | 12 #include "jni/JavaBrowserViewRendererHelper_jni.h" |
13 #include "third_party/skia/include/core/SkBitmap.h" | 13 #include "third_party/skia/include/core/SkBitmap.h" |
14 #include "third_party/skia/include/utils/SkCanvasStateUtils.h" | 14 #include "third_party/skia/include/utils/SkCanvasStateUtils.h" |
15 | 15 |
16 using base::android::ScopedJavaLocalRef; | 16 using base::android::ScopedJavaLocalRef; |
| 17 using base::android::JavaRef; |
17 | 18 |
18 namespace android_webview { | 19 namespace android_webview { |
19 | 20 |
20 namespace { | 21 namespace { |
21 | 22 |
22 // Provides software rendering functions from the Android glue layer. | 23 // Provides software rendering functions from the Android glue layer. |
23 // Allows preventing extra copies of data when rendering. | 24 // Allows preventing extra copies of data when rendering. |
24 AwDrawSWFunctionTable* g_sw_draw_functions = NULL; | 25 AwDrawSWFunctionTable* g_sw_draw_functions = NULL; |
25 | 26 |
26 class JavaCanvasHolder : public SoftwareCanvasHolder { | 27 class JavaCanvasHolder : public SoftwareCanvasHolder { |
27 public: | 28 public: |
28 JavaCanvasHolder(JNIEnv* env, | 29 JavaCanvasHolder(JNIEnv* env, |
29 jobject java_canvas, | 30 const JavaRef<jobject>& java_canvas, |
30 const gfx::Vector2d& scroll_correction); | 31 const gfx::Vector2d& scroll_correction); |
31 ~JavaCanvasHolder() override; | 32 ~JavaCanvasHolder() override; |
32 | 33 |
33 SkCanvas* GetCanvas() override; | 34 SkCanvas* GetCanvas() override; |
34 | 35 |
35 private: | 36 private: |
36 AwPixelInfo* pixels_; | 37 AwPixelInfo* pixels_; |
37 skia::RefPtr<SkCanvas> canvas_; | 38 skia::RefPtr<SkCanvas> canvas_; |
38 DISALLOW_COPY_AND_ASSIGN(JavaCanvasHolder); | 39 DISALLOW_COPY_AND_ASSIGN(JavaCanvasHolder); |
39 }; | 40 }; |
40 | 41 |
41 JavaCanvasHolder::JavaCanvasHolder(JNIEnv* env, | 42 JavaCanvasHolder::JavaCanvasHolder(JNIEnv* env, |
42 jobject java_canvas, | 43 const JavaRef<jobject>& java_canvas, |
43 const gfx::Vector2d& scroll) | 44 const gfx::Vector2d& scroll) |
44 : pixels_(nullptr) { | 45 : pixels_(nullptr) { |
45 if (!g_sw_draw_functions) | 46 if (!g_sw_draw_functions) |
46 return; | 47 return; |
47 pixels_ = g_sw_draw_functions->access_pixels(env, java_canvas); | 48 pixels_ = g_sw_draw_functions->access_pixels(env, java_canvas.obj()); |
48 if (!pixels_ || !pixels_->state) | 49 if (!pixels_ || !pixels_->state) |
49 return; | 50 return; |
50 | 51 |
51 canvas_ = | 52 canvas_ = |
52 skia::AdoptRef(SkCanvasStateUtils::CreateFromCanvasState(pixels_->state)); | 53 skia::AdoptRef(SkCanvasStateUtils::CreateFromCanvasState(pixels_->state)); |
53 // Workarounds for http://crbug.com/271096: SW draw only supports | 54 // Workarounds for http://crbug.com/271096: SW draw only supports |
54 // translate & scale transforms, and a simple rectangular clip. | 55 // translate & scale transforms, and a simple rectangular clip. |
55 if (canvas_ && (!canvas_->isClipRect() || | 56 if (canvas_ && (!canvas_->isClipRect() || |
56 (canvas_->getTotalMatrix().getType() & | 57 (canvas_->getTotalMatrix().getType() & |
57 ~(SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)))) { | 58 ~(SkMatrix::kTranslate_Mask | SkMatrix::kScale_Mask)))) { |
(...skipping 11 matching lines...) Expand all Loading... |
69 pixels_ = nullptr; | 70 pixels_ = nullptr; |
70 } | 71 } |
71 | 72 |
72 SkCanvas* JavaCanvasHolder::GetCanvas() { | 73 SkCanvas* JavaCanvasHolder::GetCanvas() { |
73 return canvas_.get(); | 74 return canvas_.get(); |
74 } | 75 } |
75 | 76 |
76 class AuxiliaryCanvasHolder : public SoftwareCanvasHolder { | 77 class AuxiliaryCanvasHolder : public SoftwareCanvasHolder { |
77 public: | 78 public: |
78 AuxiliaryCanvasHolder(JNIEnv* env, | 79 AuxiliaryCanvasHolder(JNIEnv* env, |
79 jobject java_canvas, | 80 const JavaRef<jobject>& java_canvas, |
80 const gfx::Vector2d& scroll_correction, | 81 const gfx::Vector2d& scroll_correction, |
81 const gfx::Size size); | 82 const gfx::Size size); |
82 ~AuxiliaryCanvasHolder() override; | 83 ~AuxiliaryCanvasHolder() override; |
83 | 84 |
84 SkCanvas* GetCanvas() override; | 85 SkCanvas* GetCanvas() override; |
85 | 86 |
86 private: | 87 private: |
87 ScopedJavaLocalRef<jobject> jcanvas_; | 88 ScopedJavaLocalRef<jobject> jcanvas_; |
88 ScopedJavaLocalRef<jobject> jbitmap_; | 89 ScopedJavaLocalRef<jobject> jbitmap_; |
89 gfx::Vector2d scroll_; | 90 gfx::Vector2d scroll_; |
90 scoped_ptr<SkBitmap> bitmap_; | 91 scoped_ptr<SkBitmap> bitmap_; |
91 skia::RefPtr<SkCanvas> canvas_; | 92 skia::RefPtr<SkCanvas> canvas_; |
92 DISALLOW_COPY_AND_ASSIGN(AuxiliaryCanvasHolder); | 93 DISALLOW_COPY_AND_ASSIGN(AuxiliaryCanvasHolder); |
93 }; | 94 }; |
94 | 95 |
95 AuxiliaryCanvasHolder::AuxiliaryCanvasHolder( | 96 AuxiliaryCanvasHolder::AuxiliaryCanvasHolder( |
96 JNIEnv* env, | 97 JNIEnv* env, |
97 jobject java_canvas, | 98 const JavaRef<jobject>& java_canvas, |
98 const gfx::Vector2d& scroll_correction, | 99 const gfx::Vector2d& scroll_correction, |
99 const gfx::Size size) | 100 const gfx::Size size) |
100 : jcanvas_(env, java_canvas), scroll_(scroll_correction) { | 101 : jcanvas_(java_canvas), scroll_(scroll_correction) { |
101 DCHECK(size.width() > 0); | 102 DCHECK(size.width() > 0); |
102 DCHECK(size.height() > 0); | 103 DCHECK(size.height() > 0); |
103 jbitmap_ = Java_JavaBrowserViewRendererHelper_createBitmap( | 104 jbitmap_ = Java_JavaBrowserViewRendererHelper_createBitmap( |
104 env, size.width(), size.height(), jcanvas_.obj()); | 105 env, size.width(), size.height(), jcanvas_.obj()); |
105 if (!jbitmap_.obj()) | 106 if (!jbitmap_.obj()) |
106 return; | 107 return; |
107 | 108 |
108 AndroidBitmapInfo bitmap_info; | 109 AndroidBitmapInfo bitmap_info; |
109 if (AndroidBitmap_getInfo(env, jbitmap_.obj(), &bitmap_info) < 0) { | 110 if (AndroidBitmap_getInfo(env, jbitmap_.obj(), &bitmap_info) < 0) { |
110 LOG(ERROR) << "Error getting java bitmap info."; | 111 LOG(ERROR) << "Error getting java bitmap info."; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 } | 144 } |
144 | 145 |
145 } // namespace | 146 } // namespace |
146 | 147 |
147 void RasterHelperSetAwDrawSWFunctionTable(AwDrawSWFunctionTable* table) { | 148 void RasterHelperSetAwDrawSWFunctionTable(AwDrawSWFunctionTable* table) { |
148 g_sw_draw_functions = table; | 149 g_sw_draw_functions = table; |
149 } | 150 } |
150 | 151 |
151 // static | 152 // static |
152 scoped_ptr<SoftwareCanvasHolder> SoftwareCanvasHolder::Create( | 153 scoped_ptr<SoftwareCanvasHolder> SoftwareCanvasHolder::Create( |
153 jobject java_canvas, | 154 const JavaRef<jobject>& java_canvas, |
154 const gfx::Vector2d& scroll_correction, | 155 const gfx::Vector2d& scroll_correction, |
155 const gfx::Size& auxiliary_bitmap_size, | 156 const gfx::Size& auxiliary_bitmap_size, |
156 bool force_auxiliary_bitmap) { | 157 bool force_auxiliary_bitmap) { |
157 JNIEnv* env = base::android::AttachCurrentThread(); | 158 JNIEnv* env = base::android::AttachCurrentThread(); |
158 scoped_ptr<SoftwareCanvasHolder> holder; | 159 scoped_ptr<SoftwareCanvasHolder> holder; |
159 if (!force_auxiliary_bitmap) { | 160 if (!force_auxiliary_bitmap) { |
160 holder.reset(new JavaCanvasHolder(env, java_canvas, scroll_correction)); | 161 holder.reset(new JavaCanvasHolder(env, java_canvas, scroll_correction)); |
161 } | 162 } |
162 if (!holder.get() || !holder->GetCanvas()) { | 163 if (!holder.get() || !holder->GetCanvas()) { |
163 holder.reset(); | 164 holder.reset(); |
164 holder.reset(new AuxiliaryCanvasHolder(env, java_canvas, scroll_correction, | 165 holder.reset(new AuxiliaryCanvasHolder(env, java_canvas, scroll_correction, |
165 auxiliary_bitmap_size)); | 166 auxiliary_bitmap_size)); |
166 } | 167 } |
167 if (!holder->GetCanvas()) { | 168 if (!holder->GetCanvas()) { |
168 holder.reset(); | 169 holder.reset(); |
169 } | 170 } |
170 return holder; | 171 return holder; |
171 } | 172 } |
172 | 173 |
173 bool RegisterJavaBrowserViewRendererHelper(JNIEnv* env) { | 174 bool RegisterJavaBrowserViewRendererHelper(JNIEnv* env) { |
174 return RegisterNativesImpl(env); | 175 return RegisterNativesImpl(env); |
175 } | 176 } |
176 | 177 |
177 } // namespace android_webview | 178 } // namespace android_webview |
OLD | NEW |