diff options
author | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-15 21:55:46 +0000 |
---|---|---|
committer | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-15 21:55:46 +0000 |
commit | 0e4ba0ce9d5b2db277316132ccf15953185c3d31 (patch) | |
tree | c6c946b7da0f8b20bf64c36e2b4a1d2421cf2eeb /views | |
parent | 5a8b12dc6eba4c0697a557eeec61eae805f8ee7d (diff) | |
download | chromium_src-0e4ba0ce9d5b2db277316132ccf15953185c3d31.zip chromium_src-0e4ba0ce9d5b2db277316132ccf15953185c3d31.tar.gz chromium_src-0e4ba0ce9d5b2db277316132ccf15953185c3d31.tar.bz2 |
External textures outlive layers.
When the View is hidden, we destroy the associated Layer, but the external texture should persist.
Similarly, if a View is made visible, we create a Layer and the Layer should have that external texture.
The solution is to push the external texture logic and state up into the LayerHelper, which persists.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/7904024
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@101388 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r-- | views/layer_helper.cc | 13 | ||||
-rw-r--r-- | views/layer_helper.h | 13 | ||||
-rw-r--r-- | views/view.cc | 17 | ||||
-rw-r--r-- | views/widget/native_widget_view.cc | 5 | ||||
-rw-r--r-- | views/widget/native_widget_view.h | 1 |
5 files changed, 35 insertions, 14 deletions
diff --git a/views/layer_helper.cc b/views/layer_helper.cc index 6ba2b5e..6ffd34a 100644 --- a/views/layer_helper.cc +++ b/views/layer_helper.cc @@ -5,6 +5,7 @@ #include "views/layer_helper.h" #include "views/layer_property_setter.h" +#include "ui/gfx/compositor/compositor.h" #include "ui/gfx/compositor/layer.h" #include "ui/gfx/transform.h" @@ -38,11 +39,19 @@ void LayerHelper::SetLayer(ui::Layer* layer) { if (!property_setter_.get()) property_setter_.reset(LayerPropertySetter::CreateDefaultSetter()); property_setter_->Installed(this->layer()); + if (layer_updated_externally()) + layer_->SetExternalTexture(external_texture_.get()); } else if (!property_setter_explicitly_set_) { property_setter_.reset(NULL); } } +void LayerHelper::SetExternalTexture(ui::Texture* texture) { + external_texture_ = texture; + if (layer_.get()) + layer_->SetExternalTexture(texture); +} + void LayerHelper::SetPropertySetter(LayerPropertySetter* setter) { if (property_setter_.get() && layer()) property_setter_->Uninstalled(layer()); @@ -55,7 +64,9 @@ void LayerHelper::SetPropertySetter(LayerPropertySetter* setter) { } bool LayerHelper::ShouldPaintToLayer() const { - return paint_to_layer_ || (transform_.get() && transform_->HasChange()); + return paint_to_layer_ || + layer_updated_externally() || + (transform_.get() && transform_->HasChange()); } } // namespace internal diff --git a/views/layer_helper.h b/views/layer_helper.h index 7417a4a..5246ae0 100644 --- a/views/layer_helper.h +++ b/views/layer_helper.h @@ -7,11 +7,13 @@ #pragma once #include "base/basictypes.h" +#include "base/memory/ref_counted.h" #include "base/memory/scoped_ptr.h" #include "ui/gfx/rect.h" namespace ui { class Layer; +class Texture; class Transform; } @@ -36,6 +38,15 @@ class LayerHelper { void SetLayer(ui::Layer* layer); ui::Layer* layer() { return layer_.get(); } + // Passing NULL will cause the layer to get a texture from its compositor. + void SetExternalTexture(ui::Texture* texture); + + // Sometimes the Layer is being updated by something other than SetCanvas + // (e.g. the GPU process on TOUCH_UI). + bool layer_updated_externally() const { + return external_texture_.get() != NULL; + } + // Rectangle that needs to be painted. void set_clip_rect(const gfx::Rect& rect) { clip_rect_ = rect; @@ -91,6 +102,8 @@ class LayerHelper { bool needs_paint_all_; + scoped_refptr<ui::Texture> external_texture_; + DISALLOW_COPY_AND_ASSIGN(LayerHelper); }; diff --git a/views/view.cc b/views/view.cc index dfd8f2f..b0f0b08 100644 --- a/views/view.cc +++ b/views/view.cc @@ -1116,25 +1116,15 @@ bool View::SetExternalTexture(ui::Texture* texture) { if (!layer_helper_.get()) layer_helper_.reset(new internal::LayerHelper()); - bool use_external = (texture != NULL); - if (use_external != layer_helper_->paint_to_layer()) - SetPaintToLayer(use_external); - else if (use_external && !layer()) - CreateLayer(); - - if (use_external && !layer()) - return false; + layer_helper_->SetExternalTexture(texture); // Child views must not paint into the external texture. So make sure each // child view has its own layer to paint into. - if (use_external) { + if (texture) { for (Views::iterator i = children_.begin(); i != children_.end(); ++i) (*i)->SetPaintToLayer(true); } - if (layer()) - layer()->SetExternalTexture(texture); - SchedulePaintInRect(GetLocalBounds()); return true; @@ -1700,7 +1690,8 @@ void View::DestroyLayer() { if (!layer_helper_->property_setter_explicitly_set() && !ShouldPaintToLayer() && - !layer_helper_->fills_bounds_opaquely()) + !layer_helper_->fills_bounds_opaquely() && + !layer_helper_->layer_updated_externally()) layer_helper_.reset(); else layer_helper_->SetLayer(NULL); diff --git a/views/widget/native_widget_view.cc b/views/widget/native_widget_view.cc index 8037e9b..aa327c6 100644 --- a/views/widget/native_widget_view.cc +++ b/views/widget/native_widget_view.cc @@ -190,5 +190,10 @@ void NativeWidgetView::UpdateLayerBounds(const gfx::Point& offset) { } } +void NativeWidgetView::CreateLayerIfNecessary() { + View::CreateLayerIfNecessary(); + GetAssociatedWidget()->GetRootView()->CreateLayerIfNecessary(); +} + } // namespace internal } // namespace views diff --git a/views/widget/native_widget_view.h b/views/widget/native_widget_view.h index f4b49cf..1d7f385 100644 --- a/views/widget/native_widget_view.h +++ b/views/widget/native_widget_view.h @@ -72,6 +72,7 @@ class VIEWS_EXPORT NativeWidgetView : public View { const gfx::Point& point) OVERRIDE; virtual void DestroyLayerRecurse() OVERRIDE; virtual void UpdateLayerBounds(const gfx::Point& offset) OVERRIDE; + virtual void CreateLayerIfNecessary() OVERRIDE; internal::NativeWidgetDelegate* delegate() { return native_widget_->delegate(); |