Index: ui/gfx/compositor/layer.cc |
diff --git a/ui/gfx/compositor/layer.cc b/ui/gfx/compositor/layer.cc |
index 91c3199b8496d9bca450c65d7b610b268c7f0ced..a447275c5d9bfc5093967d756edd025cc278207c 100644 |
--- a/ui/gfx/compositor/layer.cc |
+++ b/ui/gfx/compositor/layer.cc |
@@ -8,10 +8,15 @@ |
#include "base/logging.h" |
#include "base/memory/scoped_ptr.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebExternalTextureLayer.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebContentLayer.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFloatPoint.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFloatRect.h" |
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h" |
#include "ui/base/animation/animation.h" |
+#if defined(USE_WEBKIT_COMPOSITOR) |
+#include "ui/gfx/compositor/compositor_cc.h" |
+#endif |
#include "ui/gfx/compositor/layer_animation_manager.h" |
#include "ui/gfx/canvas_skia.h" |
#include "ui/gfx/interpolated_transform.h" |
@@ -241,6 +246,33 @@ void Layer::SetExternalTexture(ui::Texture* texture) { |
DCHECK(texture); |
layer_updated_externally_ = true; |
texture_ = texture; |
+#if defined(USE_WEBKIT_COMPOSITOR) |
+ if (!web_layer_is_accelerated_) { |
+ web_layer_.removeAllChildren(); |
+ WebKit::WebLayer new_layer = |
+ WebKit::WebExternalTextureLayer::create(this); |
+ if (parent_) { |
+ DCHECK(!parent_->web_layer_.isNull()); |
+ parent_->web_layer_.replaceChild(web_layer_, new_layer); |
+ } |
+ web_layer_ = new_layer; |
+ web_layer_is_accelerated_ = true; |
+ for (size_t i = 0; i < children_.size(); ++i) { |
+ DCHECK(!children_[i]->web_layer_.isNull()); |
+ web_layer_.addChild(children_[i]->web_layer_); |
+ } |
+ web_layer_.setAnchorPoint(WebKit::WebFloatPoint(0.f, 0.f)); |
+ web_layer_.setOpaque(fills_bounds_opaquely_); |
+ web_layer_.setOpacity(visible_ ? opacity_ : 0.f); |
+ web_layer_.setBounds(bounds_.size()); |
+ RecomputeTransform(); |
+ } |
+ TextureCC* texture_cc = static_cast<TextureCC*>(texture); |
+ texture_cc->Update(); |
+ web_layer_.to<WebKit::WebExternalTextureLayer>().setFlipped( |
+ texture_cc->flipped()); |
+ RecomputeDrawsContent(); |
+#endif |
} |
void Layer::SetCanvas(const SkCanvas& canvas, const gfx::Point& origin) { |
@@ -263,7 +295,8 @@ void Layer::SchedulePaint(const gfx::Rect& invalid_rect) { |
invalid_rect.y(), |
invalid_rect.width(), |
invalid_rect.height()); |
- web_layer_.invalidateRect(web_rect); |
+ if (!web_layer_is_accelerated_) |
+ web_layer_.to<WebKit::WebContentLayer>().invalidateRect(web_rect); |
#else |
invalid_rect_ = invalid_rect_.Union(invalid_rect); |
ScheduleDraw(); |
@@ -582,7 +615,6 @@ void Layer::SetOpacityImmediately(float opacity) { |
#if defined(USE_WEBKIT_COMPOSITOR) |
if (visible_) |
web_layer_.setOpacity(opacity); |
- RecomputeDrawsContent(); |
#endif |
} |
@@ -603,6 +635,7 @@ void Layer::CreateWebLayer() { |
web_layer_ = WebKit::WebContentLayer::create(this, this); |
web_layer_.setAnchorPoint(WebKit::WebFloatPoint(0.f, 0.f)); |
web_layer_.setOpaque(true); |
+ web_layer_is_accelerated_ = false; |
RecomputeDrawsContent(); |
} |
@@ -613,7 +646,22 @@ void Layer::RecomputeTransform() { |
} |
void Layer::RecomputeDrawsContent() { |
- web_layer_.setDrawsContent(ShouldDraw()); |
+ DCHECK(!web_layer_.isNull()); |
+ bool should_draw = type_ == LAYER_HAS_TEXTURE && |
+ !hole_rect_.Contains(gfx::Rect(gfx::Point(0, 0), bounds_.size())); |
+ if (!web_layer_is_accelerated_) { |
+ web_layer_.to<WebKit::WebContentLayer>().setDrawsContent(should_draw); |
+ } else { |
+ DCHECK(texture_); |
+#if defined(USE_WEBKIT_COMPOSITOR) |
+ unsigned int texture_id = |
+ static_cast<TextureCC*>(texture_.get())->texture_id(); |
+#else |
+ unsigned int texture_id = 0; |
+#endif |
+ web_layer_.to<WebKit::WebExternalTextureLayer>().setTextureId( |
+ should_draw ? texture_id : 0); |
+ } |
} |
#endif |