summaryrefslogtreecommitdiffstats
path: root/views
diff options
context:
space:
mode:
authorbacker@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-15 21:55:46 +0000
committerbacker@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-15 21:55:46 +0000
commit0e4ba0ce9d5b2db277316132ccf15953185c3d31 (patch)
treec6c946b7da0f8b20bf64c36e2b4a1d2421cf2eeb /views
parent5a8b12dc6eba4c0697a557eeec61eae805f8ee7d (diff)
downloadchromium_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.cc13
-rw-r--r--views/layer_helper.h13
-rw-r--r--views/view.cc17
-rw-r--r--views/widget/native_widget_view.cc5
-rw-r--r--views/widget/native_widget_view.h1
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();