Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(191)

Unified Diff: ui/gfx/compositor/layer.cc

Issue 8222028: Use WebKit compositor in ui::Layer (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: rebase Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/gfx/compositor/layer.h ('k') | ui/gfx/compositor/layer_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/compositor/layer.cc
diff --git a/ui/gfx/compositor/layer.cc b/ui/gfx/compositor/layer.cc
index c094b1e67bec1481de59eee59bf8bea6e9e7b0eb..1a427547f6f0527d35736702ee98a7d05db74979 100644
--- a/ui/gfx/compositor/layer.cc
+++ b/ui/gfx/compositor/layer.cc
@@ -8,6 +8,9 @@
#include "base/logging.h"
#include "base/memory/scoped_ptr.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"
#include "ui/gfx/compositor/layer_animator.h"
#include "ui/gfx/canvas_skia.h"
@@ -36,6 +39,9 @@ Layer::Layer(Compositor* compositor)
layer_updated_externally_(false),
opacity_(1.0f),
delegate_(NULL) {
+#if defined(USE_WEBKIT_COMPOSITOR)
+ CreateWebLayer();
+#endif
}
Layer::Layer(Compositor* compositor, LayerType type)
@@ -47,6 +53,9 @@ Layer::Layer(Compositor* compositor, LayerType type)
layer_updated_externally_(false),
opacity_(1.0f),
delegate_(NULL) {
+#if defined(USE_WEBKIT_COMPOSITOR)
+ CreateWebLayer();
+#endif
}
Layer::~Layer() {
@@ -54,6 +63,9 @@ Layer::~Layer() {
parent_->Remove(this);
for (size_t i = 0; i < children_.size(); ++i)
children_[i]->parent_ = NULL;
+#if defined(USE_WEBKIT_COMPOSITOR)
+ web_layer_.removeFromParent();
+#endif
}
Compositor* Layer::GetCompositor() {
@@ -74,6 +86,9 @@ void Layer::Add(Layer* child) {
child->parent_->Remove(child);
child->parent_ = this;
children_.push_back(child);
+#if defined(USE_WEBKIT_COMPOSITOR)
+ web_layer_.addChild(child->web_layer_);
+#endif
RecomputeHole();
}
@@ -84,6 +99,9 @@ void Layer::Remove(Layer* child) {
DCHECK(i != children_.end());
children_.erase(i);
child->parent_ = NULL;
+#if defined(USE_WEBKIT_COMPOSITOR)
+ child->web_layer_.removeFromParent();
+#endif
RecomputeHole();
@@ -96,6 +114,10 @@ void Layer::MoveToFront(Layer* child) {
DCHECK(i != children_.end());
children_.erase(i);
children_.push_back(child);
+#if defined(USE_WEBKIT_COMPOSITOR)
+ child->web_layer_.removeFromParent();
+ web_layer_.addChild(child->web_layer_);
+#endif
}
bool Layer::Contains(const Layer* other) const {
@@ -165,6 +187,10 @@ void Layer::SetVisible(bool visible) {
DropTextures();
if (parent_)
parent_->RecomputeHole();
+#if defined(USE_WEBKIT_COMPOSITOR)
+ // TODO(piman): Expose a visibility flag on WebLayer.
+ web_layer_.setOpacity(visible_ ? opacity_ : 0.f);
+#endif
}
bool Layer::IsDrawn() const {
@@ -174,7 +200,7 @@ bool Layer::IsDrawn() const {
return layer == NULL;
}
-bool Layer::ShouldDraw() {
+bool Layer::ShouldDraw() const {
return type_ == LAYER_HAS_TEXTURE && GetCombinedOpacity() > 0.0f &&
!hole_rect_.Contains(gfx::Rect(gfx::Point(0, 0), bounds_.size()));
}
@@ -206,6 +232,9 @@ void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) {
if (parent())
parent()->RecomputeHole();
+#if defined(USE_WEBKIT_COMPOSITOR)
+ web_layer_.setOpaque(fills_bounds_opaquely);
+#endif
}
void Layer::SetExternalTexture(ui::Texture* texture) {
@@ -215,6 +244,9 @@ void Layer::SetExternalTexture(ui::Texture* texture) {
}
void Layer::SetCanvas(const SkCanvas& canvas, const gfx::Point& origin) {
+#if defined(USE_WEBKIT_COMPOSITOR)
+ NOTREACHED();
+#else
DCHECK_EQ(type_, LAYER_HAS_TEXTURE);
if (!texture_.get())
@@ -222,19 +254,32 @@ void Layer::SetCanvas(const SkCanvas& canvas, const gfx::Point& origin) {
texture_->SetCanvas(canvas, origin, bounds_.size());
invalid_rect_ = gfx::Rect();
+#endif
}
void Layer::SchedulePaint(const gfx::Rect& invalid_rect) {
+#if defined(USE_WEBKIT_COMPOSITOR)
+ WebKit::WebFloatRect web_rect(invalid_rect.x(),
+ invalid_rect.y(),
+ invalid_rect.width(),
+ invalid_rect.height());
+ web_layer_.invalidateRect(web_rect);
+#else
invalid_rect_ = invalid_rect_.Union(invalid_rect);
ScheduleDraw();
+#endif
}
void Layer::ScheduleDraw() {
- if (GetCompositor())
- GetCompositor()->ScheduleDraw();
+ Compositor* compositor = GetCompositor();
+ if (compositor)
+ compositor->ScheduleDraw();
}
void Layer::Draw() {
+#if defined(USE_WEBKIT_COMPOSITOR)
+ NOTREACHED();
+#else
DCHECK(GetCompositor());
if (!ShouldDraw())
return;
@@ -274,15 +319,38 @@ void Layer::Draw() {
if (!regions_to_draw[i].IsEmpty())
texture_->Draw(texture_draw_params, regions_to_draw[i]);
}
+#endif
}
void Layer::DrawTree() {
+#if defined(USE_WEBKIT_COMPOSITOR)
+ NOTREACHED();
+#else
if (!visible_)
return;
Draw();
for (size_t i = 0; i < children_.size(); ++i)
children_.at(i)->DrawTree();
+#endif
+}
+
+void Layer::notifyNeedsComposite() {
+#if defined(USE_WEBKIT_COMPOSITOR)
+ ScheduleDraw();
+#else
+ NOTREACHED();
+#endif
+}
+
+void Layer::paintContents(WebKit::WebCanvas* web_canvas,
+ const WebKit::WebRect& clip) {
+#if defined(USE_WEBKIT_COMPOSITOR)
+ gfx::CanvasSkia canvas(web_canvas);
+ delegate_->OnPaintLayer(&canvas);
+#else
+ NOTREACHED();
+#endif
}
float Layer::GetCombinedOpacity() const {
@@ -296,6 +364,9 @@ float Layer::GetCombinedOpacity() const {
}
void Layer::UpdateLayerCanvas() {
+#if defined(USE_WEBKIT_COMPOSITOR)
+ NOTREACHED();
+#else
// If we have no delegate, that means that whoever constructed the Layer is
// setting its canvas directly with SetCanvas().
if (!delegate_ || layer_updated_externally_)
@@ -312,6 +383,7 @@ void Layer::UpdateLayerCanvas() {
canvas->TranslateInt(-draw_rect.x(), -draw_rect.y());
delegate_->OnPaintLayer(canvas.get());
SetCanvas(*canvas->GetSkCanvas(), draw_rect.origin());
+#endif
}
void Layer::RecomputeHole() {
@@ -357,6 +429,10 @@ void Layer::RecomputeHole() {
// Free up texture memory if the hole fills bounds of layer.
if (!ShouldDraw() && !layer_updated_externally_)
texture_ = NULL;
+
+#if defined(USE_WEBKIT_COMPOSITOR)
+ RecomputeDrawsContent();
+#endif
}
bool Layer::IsCompletelyOpaque() const {
@@ -466,6 +542,11 @@ void Layer::SetBoundsImmediately(const gfx::Rect& bounds) {
if (parent())
parent()->RecomputeHole();
+#if defined(USE_WEBKIT_COMPOSITOR)
+ web_layer_.setBounds(bounds.size());
+ RecomputeTransform();
+ RecomputeDrawsContent();
+#endif
}
void Layer::SetTransformImmediately(const ui::Transform& transform) {
@@ -473,6 +554,9 @@ void Layer::SetTransformImmediately(const ui::Transform& transform) {
if (parent())
parent()->RecomputeHole();
+#if defined(USE_WEBKIT_COMPOSITOR)
+ RecomputeTransform();
+#endif
}
void Layer::SetOpacityImmediately(float opacity) {
@@ -495,6 +579,11 @@ void Layer::SetOpacityImmediately(float opacity) {
to_process.push(current->children_.at(i));
}
}
+#if defined(USE_WEBKIT_COMPOSITOR)
+ if (visible_)
+ web_layer_.setOpacity(opacity);
+ RecomputeDrawsContent();
+#endif
}
void Layer::SetBoundsFromAnimator(const gfx::Rect& bounds) {
@@ -509,4 +598,23 @@ void Layer::SetOpacityFromAnimator(float opacity) {
SetOpacityImmediately(opacity);
}
+#if defined(USE_WEBKIT_COMPOSITOR)
+void Layer::CreateWebLayer() {
+ web_layer_ = WebKit::WebContentLayer::create(this, this);
+ web_layer_.setAnchorPoint(WebKit::WebFloatPoint(0.f, 0.f));
+ web_layer_.setOpaque(true);
+ RecomputeDrawsContent();
+}
+
+void Layer::RecomputeTransform() {
+ ui::Transform transform = transform_;
+ transform.ConcatTranslate(bounds_.x(), bounds_.y());
+ web_layer_.setTransform(transform.matrix());
+}
+
+void Layer::RecomputeDrawsContent() {
+ web_layer_.setDrawsContent(ShouldDraw());
+}
+#endif
+
} // namespace ui
« no previous file with comments | « ui/gfx/compositor/layer.h ('k') | ui/gfx/compositor/layer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698