diff options
author | leandrogracia@chromium.org <leandrogracia@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-06 23:15:21 +0000 |
---|---|---|
committer | leandrogracia@chromium.org <leandrogracia@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-06 23:15:21 +0000 |
commit | 5a18337b03c700f0a7c3b1efb92d0616b66e6c78 (patch) | |
tree | 43689158fb8501d26bf80ce39191f5faa6b20b34 /android_webview/browser | |
parent | fde91bd820596f19b5fac0b453c735988dd678e3 (diff) | |
download | chromium_src-5a18337b03c700f0a7c3b1efb92d0616b66e6c78.zip chromium_src-5a18337b03c700f0a7c3b1efb92d0616b66e6c78.tar.gz chromium_src-5a18337b03c700f0a7c3b1efb92d0616b66e6c78.tar.bz2 |
Fix page scaling in Android Webview SW rendering.
BUG=
Review URL: https://chromiumcodereview.appspot.com/12310136
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@186532 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'android_webview/browser')
-rw-r--r-- | android_webview/browser/browser_view_renderer_impl.cc | 64 | ||||
-rw-r--r-- | android_webview/browser/browser_view_renderer_impl.h | 16 |
2 files changed, 65 insertions, 15 deletions
diff --git a/android_webview/browser/browser_view_renderer_impl.cc b/android_webview/browser/browser_view_renderer_impl.cc index cc3cd8f..ef1f9d1 100644 --- a/android_webview/browser/browser_view_renderer_impl.cc +++ b/android_webview/browser/browser_view_renderer_impl.cc @@ -21,8 +21,9 @@ #include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkDevice.h" #include "third_party/skia/include/core/SkGraphics.h" -#include "ui/gfx/size.h" +#include "ui/gfx/size_conversions.h" #include "ui/gfx/transform.h" +#include "ui/gfx/vector2d_f.h" #include "ui/gl/gl_bindings.h" // TODO(leandrogracia): remove when crbug.com/164140 is closed. @@ -115,6 +116,7 @@ BrowserViewRendererImpl::BrowserViewRendererImpl( JavaHelper* java_helper) : client_(client), java_helper_(java_helper), + view_renderer_host_(new ViewRendererHost(NULL, this)), ALLOW_THIS_IN_INITIALIZER_LIST(compositor_(Compositor::Create(this))), view_clip_layer_(cc::Layer::create()), transform_layer_(cc::Layer::create()), @@ -123,9 +125,14 @@ BrowserViewRendererImpl::BrowserViewRendererImpl( compositor_visible_(false), is_composite_pending_(false), dpi_scale_(1.0f), + page_scale_(1.0f), on_new_picture_mode_(kOnNewPictureDisabled), last_frame_context_(NULL), - web_contents_(NULL) { + web_contents_(NULL), + update_frame_info_callback_( + base::Bind(&BrowserViewRendererImpl::OnFrameInfoUpdated, + base::Unretained(ALLOW_THIS_IN_INITIALIZER_LIST(this)))) { + DCHECK(java_helper); // Define the view hierarchy. @@ -137,6 +144,7 @@ BrowserViewRendererImpl::BrowserViewRendererImpl( } BrowserViewRendererImpl::~BrowserViewRendererImpl() { + SetContents(NULL); } // static @@ -150,12 +158,24 @@ void BrowserViewRendererImpl::SetAwDrawSWFunctionTable( } void BrowserViewRendererImpl::SetContents(ContentViewCore* content_view_core) { + if (web_contents_) { + ContentViewCore* previous_content_view_core = + ContentViewCore::FromWebContents(web_contents_); + if (previous_content_view_core) { + previous_content_view_core->RemoveFrameInfoCallback( + update_frame_info_callback_); + } + } + + web_contents_ = content_view_core ? + content_view_core->GetWebContents() : NULL; + view_renderer_host_->Observe(web_contents_); + + if (!content_view_core) + return; + + content_view_core->AddFrameInfoCallback(update_frame_info_callback_); dpi_scale_ = content_view_core->GetDpiScale(); - web_contents_ = content_view_core->GetWebContents(); - if (!view_renderer_host_) - view_renderer_host_.reset(new ViewRendererHost(web_contents_, this)); - else - view_renderer_host_->Observe(web_contents_); view_clip_layer_->removeAllChildren(); view_clip_layer_->addChild(content_view_core->GetLayer()); @@ -532,7 +552,6 @@ skia::RefPtr<SkPicture> BrowserViewRendererImpl::GetLastCapturedPicture() { // If not available or not in listener mode get it synchronously. if (!picture) { - DCHECK(view_renderer_host_); view_renderer_host_->CapturePictureSync(); picture = RendererPictureMap::GetInstance()->GetRendererPicture( web_contents_->GetRoutingID()); @@ -580,10 +599,20 @@ void BrowserViewRendererImpl::Invalidate() { } bool BrowserViewRendererImpl::RenderSW(SkCanvas* canvas) { - // TODO(leandrogracia): once Ubercompositor is ready and we support software - // rendering mode, we should avoid this as much as we can, ideally always. - // This includes finding a proper replacement for onDraw calls in hardware - // mode with software canvases. http://crbug.com/170086. + float content_scale = dpi_scale_ * page_scale_; + canvas->scale(content_scale, content_scale); + + // Clear to white any parts of the view not covered by the scaled contents. + // TODO(leandrogracia): this should be automatically done by the SW rendering + // path once multiple layers are supported. + gfx::Size physical_content_size = gfx::ToCeiledSize( + gfx::ScaleSize(content_size_css_, content_scale)); + if (physical_content_size.width() < view_size_.width() || + physical_content_size.height() < view_size_.height()) + canvas->clear(SK_ColorWHITE); + + // TODO(leandrogracia): use the appropriate SW rendering path when available + // instead of abusing CapturePicture. return RenderPicture(canvas); } @@ -592,11 +621,16 @@ bool BrowserViewRendererImpl::RenderPicture(SkCanvas* canvas) { if (!picture) return false; - // Correct device scale. - canvas->scale(dpi_scale_, dpi_scale_); - picture->draw(canvas); return true; } +void BrowserViewRendererImpl::OnFrameInfoUpdated( + const gfx::SizeF& content_size, + const gfx::Vector2dF& scroll_offset, + float page_scale_factor) { + page_scale_ = page_scale_factor; + content_size_css_ = content_size; +} + } // namespace android_webview diff --git a/android_webview/browser/browser_view_renderer_impl.h b/android_webview/browser/browser_view_renderer_impl.h index 323ddcb..050645d 100644 --- a/android_webview/browser/browser_view_renderer_impl.h +++ b/android_webview/browser/browser_view_renderer_impl.h @@ -8,10 +8,12 @@ #include "android_webview/browser/browser_view_renderer.h" #include "android_webview/browser/renderer_host/view_renderer_host.h" #include "content/public/browser/android/compositor.h" +#include "content/public/browser/android/content_view_core.h" #include "content/public/browser/web_contents_observer.h" #include "skia/ext/refptr.h" #include "ui/gfx/point.h" #include "ui/gfx/size.h" +#include "ui/gfx/size_f.h" typedef void* EGLContext; struct AwDrawSWFunctionTable; @@ -23,6 +25,10 @@ namespace content { class WebContents; } +namespace gfx { +class Vector2dF; +} + namespace android_webview { class BrowserViewRendererImpl @@ -38,6 +44,7 @@ class BrowserViewRendererImpl static void SetAwDrawSWFunctionTable(AwDrawSWFunctionTable* table); // BrowserViewRenderer implementation. + // |content_view_core| must not outlive |this| BrowserViewRenderer instance. virtual void SetContents( content::ContentViewCore* content_view_core) OVERRIDE; virtual void DrawGL(AwDrawGLInfo* draw_info) OVERRIDE; @@ -74,6 +81,10 @@ class BrowserViewRendererImpl bool RenderSW(SkCanvas* canvas); bool RenderPicture(SkCanvas* canvas); + void OnFrameInfoUpdated(const gfx::SizeF& content_size, + const gfx::Vector2dF& scroll_offset, + float page_scale_factor); + BrowserViewRenderer::Client* client_; BrowserViewRenderer::JavaHelper* java_helper_; @@ -97,7 +108,9 @@ class BrowserViewRendererImpl bool compositor_visible_; bool is_composite_pending_; float dpi_scale_; + float page_scale_; gfx::Size view_size_; + gfx::SizeF content_size_css_; OnNewPictureMode on_new_picture_mode_; // Used only for detecting Android View System context changes. @@ -107,6 +120,9 @@ class BrowserViewRendererImpl // Set via SetContents. Used to recognize updates to the local WebView. content::WebContents* web_contents_; + // Used to observe frame metadata updates. + content::ContentViewCore::UpdateFrameInfoCallback update_frame_info_callback_; + DISALLOW_COPY_AND_ASSIGN(BrowserViewRendererImpl); }; |