From 6d3a46e4e0238baf7373e46ce744811b434d476e Mon Sep 17 00:00:00 2001 From: "alexst@chromium.org" Date: Mon, 25 Nov 2013 23:08:53 +0000 Subject: [PATCH] Allow browser plugin compositing helper to enable transparency in webview. BUG=157628 Review URL: https://codereview.chromium.org/40563003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@237171 0039d316-1c4b-4281-b951-d872f2087c98 --- .../browser_plugin_compositing_helper.cc | 28 ++++++++++++++++------ .../browser_plugin_compositing_helper.h | 8 ++++--- 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/content/renderer/browser_plugin/browser_plugin_compositing_helper.cc b/content/renderer/browser_plugin/browser_plugin_compositing_helper.cc index 54704bce33bd..1678423f2af3 100644 --- a/content/renderer/browser_plugin/browser_plugin_compositing_helper.cc +++ b/content/renderer/browser_plugin/browser_plugin_compositing_helper.cc @@ -44,6 +44,7 @@ BrowserPluginCompositingHelper::BrowserPluginCompositingHelper( last_mailbox_valid_(false), ack_pending_(true), software_ack_pending_(false), + opaque_(true), container_(container), browser_plugin_manager_(manager) { } @@ -100,7 +101,7 @@ void BrowserPluginCompositingHelper::EnableCompositing(bool enable) { container_->setWebLayer(enable ? web_layer_.get() : NULL); } -void BrowserPluginCompositingHelper::CheckSizeAndAdjustLayerBounds( +void BrowserPluginCompositingHelper::CheckSizeAndAdjustLayerProperties( const gfx::Size& new_size, float device_scale_factor, cc::Layer* layer) { @@ -113,6 +114,10 @@ void BrowserPluginCompositingHelper::CheckSizeAndAdjustLayerBounds( gfx::ScaleSize(buffer_size_, 1.0f / device_scale_factor)); layer->SetBounds(device_scale_adjusted_size); } + + // Manually manage background layer for transparent webview. + if (!opaque_) + background_layer_->SetIsDrawable(false); } void BrowserPluginCompositingHelper::MailboxReleased( @@ -227,7 +232,7 @@ void BrowserPluginCompositingHelper::OnBuffersSwappedPrivate( if (!texture_layer_.get()) { texture_layer_ = cc::TextureLayer::CreateForMailbox(NULL); texture_layer_->SetIsDrawable(true); - texture_layer_->SetContentsOpaque(true); + SetContentsOpaque(opaque_); background_layer_->AddChild(texture_layer_); } @@ -242,9 +247,9 @@ void BrowserPluginCompositingHelper::OnBuffersSwappedPrivate( // when a new buffer arrives. // Visually, this will either display a smaller part of the buffer // or introduce a gutter around it. - CheckSizeAndAdjustLayerBounds(mailbox.size, - device_scale_factor, - texture_layer_.get()); + CheckSizeAndAdjustLayerProperties(mailbox.size, + device_scale_factor, + texture_layer_.get()); bool is_software_frame = mailbox.type == SOFTWARE_COMPOSITOR_FRAME; bool current_mailbox_valid = is_software_frame ? @@ -392,13 +397,13 @@ void BrowserPluginCompositingHelper::OnCompositorFrameSwapped( delegated_layer_ = cc::DelegatedRendererLayer::Create(NULL, frame_provider_.get()); delegated_layer_->SetIsDrawable(true); - delegated_layer_->SetContentsOpaque(true); + SetContentsOpaque(opaque_); background_layer_->AddChild(delegated_layer_); } else { frame_provider_->SetFrameData(frame->delegated_frame_data.Pass()); } - CheckSizeAndAdjustLayerBounds( + CheckSizeAndAdjustLayerProperties( frame_data->render_pass_list.back()->output_rect.size(), frame->metadata.device_scale_factor, delegated_layer_.get()); @@ -436,4 +441,13 @@ void BrowserPluginCompositingHelper::SendReturnedDelegatedResources() { ack)); } +void BrowserPluginCompositingHelper::SetContentsOpaque(bool opaque) { + opaque_ = opaque; + + if (texture_layer_.get()) + texture_layer_->SetContentsOpaque(opaque_); + if (delegated_layer_.get()) + delegated_layer_->SetContentsOpaque(opaque_); +} + } // namespace content diff --git a/content/renderer/browser_plugin/browser_plugin_compositing_helper.h b/content/renderer/browser_plugin/browser_plugin_compositing_helper.h index 4e836c6f180d..dcbd6a2ad686 100644 --- a/content/renderer/browser_plugin/browser_plugin_compositing_helper.h +++ b/content/renderer/browser_plugin/browser_plugin_compositing_helper.h @@ -62,6 +62,7 @@ class CONTENT_EXPORT BrowserPluginCompositingHelper : // cc::DelegatedFrameProviderClient implementation. virtual void UnusedResourcesAreAvailable() OVERRIDE; + void SetContentsOpaque(bool); protected: // Friend RefCounted so that the dtor can be non-public. @@ -85,9 +86,9 @@ class CONTENT_EXPORT BrowserPluginCompositingHelper : base::SharedMemory* shared_memory; }; virtual ~BrowserPluginCompositingHelper(); - void CheckSizeAndAdjustLayerBounds(const gfx::Size& new_size, - float device_scale_factor, - cc::Layer* layer); + void CheckSizeAndAdjustLayerProperties(const gfx::Size& new_size, + float device_scale_factor, + cc::Layer* layer); void OnBuffersSwappedPrivate(const SwapBuffersInfo& mailbox, unsigned sync_point, float device_scale_factor); @@ -104,6 +105,7 @@ class CONTENT_EXPORT BrowserPluginCompositingHelper : bool last_mailbox_valid_; bool ack_pending_; bool software_ack_pending_; + bool opaque_; std::vector unacked_software_frames_; gfx::Size buffer_size_; -- 2.11.4.GIT