diff options
author | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-24 12:32:19 +0000 |
---|---|---|
committer | backer@chromium.org <backer@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-24 12:32:19 +0000 |
commit | 1cbbee3cbff09ceb17af31686108e07bf4490c95 (patch) | |
tree | d9514c34b14a8b82b64ea04459f27ca8694d6863 /views | |
parent | 952e1b3390348d42d8fd76c9b439c3e35c38e0a6 (diff) | |
download | chromium_src-1cbbee3cbff09ceb17af31686108e07bf4490c95.zip chromium_src-1cbbee3cbff09ceb17af31686108e07bf4490c95.tar.gz chromium_src-1cbbee3cbff09ceb17af31686108e07bf4490c95.tar.bz2 |
Allow View to have a layer whose texture is updated externally.
This will be used to display texture produced by the GPU process for the RWHVV via the browser compositor.
BUG=none
TEST=none
Review URL: http://codereview.chromium.org/7231012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@90362 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r-- | views/view.cc | 28 | ||||
-rw-r--r-- | views/view.h | 14 |
2 files changed, 42 insertions, 0 deletions
diff --git a/views/view.cc b/views/view.cc index 0994639..84bb6ea 100644 --- a/views/view.cc +++ b/views/view.cc @@ -108,6 +108,7 @@ View::View() needs_layout_(true), flip_canvas_on_paint_for_rtl_ui_(false), layer_needs_updating_(true), + layer_updated_externally_(false), paint_to_layer_(false), accelerator_registration_delayed_(false), accelerator_focus_manager_(NULL), @@ -1218,6 +1219,31 @@ void View::PaintToLayer(const gfx::Rect& dirty_region) { void View::OnWillCompositeLayer() { } +bool View::SetExternalTexture(ui::Texture* texture) { + // A little heavy-handed -- it should be that each child has it's own layer. + // The desired use case is where there are no children. + DCHECK_EQ(child_count(), 0); + + bool use_external = (texture != NULL); + if (use_external != paint_to_layer_) + SetPaintToLayer(use_external); + else if (use_external && !layer_.get()) + CreateLayer(); + + if (use_external && !layer_.get()) + return false; + + layer_updated_externally_ = use_external; + layer_needs_updating_ = !use_external; + if (layer_.get()) + layer_->SetTexture(texture); + + if (IsVisible()) + SchedulePaintInternal(GetLocalBounds()); + + return true; +} + const ui::Compositor* View::GetCompositor() const { return parent_ ? parent_->GetCompositor() : NULL; } @@ -1617,6 +1643,8 @@ bool View::ShouldPaintToLayer() const { } void View::MarkLayerDirty() { + if (layer_updated_externally_) + return; View* owner = this; while (!((owner->transform_.get() && owner->transform_->HasChange()) || owner->paint_to_layer_) && owner->parent_) diff --git a/views/view.h b/views/view.h index 24f9ca7..e510d53 100644 --- a/views/view.h +++ b/views/view.h @@ -34,6 +34,7 @@ namespace ui { struct AccessibleViewState; class Compositor; class Layer; +class Texture; class ThemeProvider; class Transform; #if defined(TOUCH_UI) @@ -965,6 +966,15 @@ class View : public AcceleratorTarget { // layer is rendered by the compositor. virtual void OnWillCompositeLayer(); + // This creates a layer for the view, if one does not exist. It then + // passes the texture to a layer associated with the view. While an external + // texture is set, the view will not update the layer contents. + // + // Passing NULL resets to default behavior. + // + // Returns false if it cannot create a layer to which to assign the texture. + bool SetExternalTexture(ui::Texture* texture); + // Returns the Compositor. virtual const ui::Compositor* GetCompositor() const; virtual ui::Compositor* GetCompositor(); @@ -1370,6 +1380,10 @@ class View : public AcceleratorTarget { // Is the layer out of date? bool layer_needs_updating_; + // Is the texture backing the layer being updated externally? + // (i.e. by the GPU process when rendering 3D CSS) + bool layer_updated_externally_; + // Should we paint to a layer? See description above setter for details. bool paint_to_layer_; |