| 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 |