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

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

Issue 10365007: ui: Move compositor/ directory out of gfx/, up to ui/. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix DEPS Created 8 years, 8 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_animation_delegate.h » ('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
deleted file mode 100644
index 398ecc942f960609942a3bf989a7adf90f7ff331..0000000000000000000000000000000000000000
--- a/ui/gfx/compositor/layer.cc
+++ /dev/null
@@ -1,555 +0,0 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "ui/gfx/compositor/layer.h"
-
-#include <algorithm>
-
-#include "base/command_line.h"
-#include "base/debug/trace_event.h"
-#include "base/logging.h"
-#include "base/memory/scoped_ptr.h"
-#include "third_party/WebKit/Source/Platform/chromium/public/WebContentLayer.h"
-#include "third_party/WebKit/Source/Platform/chromium/public/WebExternalTextureLayer.h"
-#include "third_party/WebKit/Source/Platform/chromium/public/WebFilterOperation.h"
-#include "third_party/WebKit/Source/Platform/chromium/public/WebFilterOperations.h"
-#include "third_party/WebKit/Source/Platform/chromium/public/WebFloatPoint.h"
-#include "third_party/WebKit/Source/Platform/chromium/public/WebFloatRect.h"
-#include "third_party/WebKit/Source/Platform/chromium/public/WebSize.h"
-#include "third_party/WebKit/Source/Platform/chromium/public/WebSolidColorLayer.h"
-#include "ui/base/animation/animation.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/compositor/compositor_switches.h"
-#include "ui/gfx/compositor/layer_animator.h"
-#include "ui/gfx/interpolated_transform.h"
-#include "ui/gfx/point3.h"
-
-namespace {
-
-const float EPSILON = 1e-3f;
-
-bool IsApproximateMultipleOf(float value, float base) {
- float remainder = fmod(fabs(value), base);
- return remainder < EPSILON || base - remainder < EPSILON;
-}
-
-const ui::Layer* GetRoot(const ui::Layer* layer) {
- return layer->parent() ? GetRoot(layer->parent()) : layer;
-}
-
-} // namespace
-
-namespace ui {
-
-Layer::Layer()
- : type_(LAYER_TEXTURED),
- compositor_(NULL),
- parent_(NULL),
- visible_(true),
- fills_bounds_opaquely_(true),
- layer_updated_externally_(false),
- opacity_(1.0f),
- delegate_(NULL) {
- CreateWebLayer();
-}
-
-Layer::Layer(LayerType type)
- : type_(type),
- compositor_(NULL),
- parent_(NULL),
- visible_(true),
- fills_bounds_opaquely_(true),
- layer_updated_externally_(false),
- opacity_(1.0f),
- delegate_(NULL) {
- CreateWebLayer();
-}
-
-Layer::~Layer() {
- // Destroying the animator may cause observers to use the layer (and
- // indirectly the WebLayer). Destroy the animator first so that the WebLayer
- // is still around.
- animator_.reset();
- if (compositor_)
- compositor_->SetRootLayer(NULL);
- if (parent_)
- parent_->Remove(this);
- for (size_t i = 0; i < children_.size(); ++i)
- children_[i]->parent_ = NULL;
- web_layer_.removeFromParent();
-}
-
-Compositor* Layer::GetCompositor() {
- return GetRoot(this)->compositor_;
-}
-
-void Layer::SetCompositor(Compositor* compositor) {
- // This function must only be called to set the compositor on the root layer,
- // or to reset it.
- DCHECK(!compositor || !compositor_);
- DCHECK(!compositor || compositor->root_layer() == this);
- DCHECK(!parent_);
- compositor_ = compositor;
-}
-
-void Layer::Add(Layer* child) {
- DCHECK(!child->compositor_);
- if (child->parent_)
- child->parent_->Remove(child);
- child->parent_ = this;
- children_.push_back(child);
- web_layer_.addChild(child->web_layer_);
-}
-
-void Layer::Remove(Layer* child) {
- std::vector<Layer*>::iterator i =
- std::find(children_.begin(), children_.end(), child);
- DCHECK(i != children_.end());
- children_.erase(i);
- child->parent_ = NULL;
- child->web_layer_.removeFromParent();
-}
-
-void Layer::StackAtTop(Layer* child) {
- if (children_.size() <= 1 || child == children_.back())
- return; // Already in front.
- StackAbove(child, children_.back());
-}
-
-void Layer::StackAbove(Layer* child, Layer* other) {
- StackRelativeTo(child, other, true);
-}
-
-void Layer::StackAtBottom(Layer* child) {
- if (children_.size() <= 1 || child == children_.front())
- return; // Already on bottom.
- StackBelow(child, children_.front());
-}
-
-void Layer::StackBelow(Layer* child, Layer* other) {
- StackRelativeTo(child, other, false);
-}
-
-bool Layer::Contains(const Layer* other) const {
- for (const Layer* parent = other; parent; parent = parent->parent()) {
- if (parent == this)
- return true;
- }
- return false;
-}
-
-void Layer::SetAnimator(LayerAnimator* animator) {
- if (animator)
- animator->SetDelegate(this);
- animator_.reset(animator);
-}
-
-LayerAnimator* Layer::GetAnimator() {
- if (!animator_.get())
- SetAnimator(LayerAnimator::CreateDefaultAnimator());
- return animator_.get();
-}
-
-void Layer::SetTransform(const ui::Transform& transform) {
- GetAnimator()->SetTransform(transform);
-}
-
-Transform Layer::GetTargetTransform() const {
- if (animator_.get() && animator_->IsAnimatingProperty(
- LayerAnimationElement::TRANSFORM))
- return animator_->GetTargetTransform();
- return transform_;
-}
-
-void Layer::SetBounds(const gfx::Rect& bounds) {
- GetAnimator()->SetBounds(bounds);
-}
-
-gfx::Rect Layer::GetTargetBounds() const {
- if (animator_.get() && animator_->IsAnimatingProperty(
- LayerAnimationElement::BOUNDS))
- return animator_->GetTargetBounds();
- return bounds_;
-}
-
-void Layer::SetMasksToBounds(bool masks_to_bounds) {
- web_layer_.setMasksToBounds(masks_to_bounds);
-}
-
-bool Layer::GetMasksToBounds() const {
- return web_layer_.masksToBounds();
-}
-
-void Layer::SetOpacity(float opacity) {
- GetAnimator()->SetOpacity(opacity);
-}
-
-void Layer::SetBackgroundBlur(int blur_radius)
-{
- WebKit::WebFilterOperations filters;
- if (blur_radius)
- filters.append(WebKit::WebBlurFilterOperation(blur_radius));
- web_layer_.setBackgroundFilters(filters);
-
- background_blur_radius_ = blur_radius;
-}
-
-float Layer::GetTargetOpacity() const {
- if (animator_.get() && animator_->IsAnimatingProperty(
- LayerAnimationElement::OPACITY))
- return animator_->GetTargetOpacity();
- return opacity_;
-}
-
-void Layer::SetVisible(bool visible) {
- GetAnimator()->SetVisibility(visible);
-}
-
-bool Layer::GetTargetVisibility() const {
- if (animator_.get() && animator_->IsAnimatingProperty(
- LayerAnimationElement::VISIBILITY))
- return animator_->GetTargetVisibility();
- return visible_;
-}
-
-bool Layer::IsDrawn() const {
- const Layer* layer = this;
- while (layer && layer->visible_)
- layer = layer->parent_;
- return layer == NULL;
-}
-
-bool Layer::ShouldDraw() const {
- return type_ != LAYER_NOT_DRAWN && GetCombinedOpacity() > 0.0f;
-}
-
-// static
-void Layer::ConvertPointToLayer(const Layer* source,
- const Layer* target,
- gfx::Point* point) {
- if (source == target)
- return;
-
- const Layer* root_layer = GetRoot(source);
- CHECK_EQ(root_layer, GetRoot(target));
-
- if (source != root_layer)
- source->ConvertPointForAncestor(root_layer, point);
- if (target != root_layer)
- target->ConvertPointFromAncestor(root_layer, point);
-}
-
-void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) {
- if (fills_bounds_opaquely_ == fills_bounds_opaquely)
- return;
-
- fills_bounds_opaquely_ = fills_bounds_opaquely;
-
- web_layer_.setOpaque(fills_bounds_opaquely);
- RecomputeDebugBorderColor();
-}
-
-void Layer::SetExternalTexture(Texture* texture) {
- DCHECK_EQ(type_, LAYER_TEXTURED);
- layer_updated_externally_ = !!texture;
- texture_ = texture;
- if (web_layer_is_accelerated_ != layer_updated_externally_) {
- // Switch to a different type of layer.
- web_layer_.removeAllChildren();
- WebKit::WebLayer new_layer;
- if (layer_updated_externally_) {
- WebKit::WebExternalTextureLayer texture_layer =
- WebKit::WebExternalTextureLayer::create();
- texture_layer.setFlipped(texture_->flipped());
- new_layer = texture_layer;
- } else {
- new_layer = WebKit::WebContentLayer::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_ = layer_updated_externally_;
- 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_.setDebugBorderWidth(show_debug_borders_ ? 2 : 0);
- RecomputeTransform();
- RecomputeDebugBorderColor();
- }
- RecomputeDrawsContentAndUVRect();
-}
-
-void Layer::SetColor(SkColor color) {
- DCHECK_EQ(type_, LAYER_SOLID_COLOR);
- // WebColor is equivalent to SkColor, per WebColor.h.
- web_layer_.to<WebKit::WebSolidColorLayer>().setBackgroundColor(
- static_cast<WebKit::WebColor>(color));
- SetFillsBoundsOpaquely(SkColorGetA(color) == 0xFF);
-}
-
-bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) {
- if (type_ == LAYER_SOLID_COLOR || !delegate_)
- return false;
- damaged_region_.op(invalid_rect.x(),
- invalid_rect.y(),
- invalid_rect.right(),
- invalid_rect.bottom(),
- SkRegion::kUnion_Op);
- ScheduleDraw();
- return true;
-}
-
-void Layer::ScheduleDraw() {
- Compositor* compositor = GetCompositor();
- if (compositor)
- compositor->ScheduleDraw();
-}
-
-void Layer::SendDamagedRects() {
- if (delegate_ && !damaged_region_.isEmpty()) {
- for (SkRegion::Iterator iter(damaged_region_);
- !iter.done(); iter.next()) {
- const SkIRect& damaged = iter.rect();
- WebKit::WebFloatRect web_rect(
- damaged.x(),
- damaged.y(),
- damaged.width(),
- damaged.height());
- if (!web_layer_is_accelerated_)
- web_layer_.to<WebKit::WebContentLayer>().invalidateRect(web_rect);
- else
- web_layer_.to<WebKit::WebExternalTextureLayer>().invalidateRect(
- web_rect);
- }
- damaged_region_.setEmpty();
- }
- for (size_t i = 0; i < children_.size(); ++i)
- children_[i]->SendDamagedRects();
-}
-
-void Layer::SuppressPaint() {
- if (!delegate_)
- return;
- delegate_ = NULL;
- for (size_t i = 0; i < children_.size(); ++i)
- children_[i]->SuppressPaint();
-}
-
-void Layer::paintContents(WebKit::WebCanvas* web_canvas,
- const WebKit::WebRect& clip) {
- TRACE_EVENT0("ui", "Layer::paintContents");
- gfx::Canvas canvas(web_canvas);
- if (delegate_)
- delegate_->OnPaintLayer(&canvas);
-}
-
-float Layer::GetCombinedOpacity() const {
- float opacity = opacity_;
- Layer* current = this->parent_;
- while (current) {
- opacity *= current->opacity_;
- current = current->parent_;
- }
- return opacity;
-}
-
-void Layer::StackRelativeTo(Layer* child, Layer* other, bool above) {
- DCHECK_NE(child, other);
- DCHECK_EQ(this, child->parent());
- DCHECK_EQ(this, other->parent());
-
- const size_t child_i =
- std::find(children_.begin(), children_.end(), child) - children_.begin();
- const size_t other_i =
- std::find(children_.begin(), children_.end(), other) - children_.begin();
- if ((above && child_i == other_i + 1) || (!above && child_i + 1 == other_i))
- return;
-
- const size_t dest_i =
- above ?
- (child_i < other_i ? other_i : other_i + 1) :
- (child_i < other_i ? other_i - 1 : other_i);
- children_.erase(children_.begin() + child_i);
- children_.insert(children_.begin() + dest_i, child);
-
- child->web_layer_.removeFromParent();
- web_layer_.insertChild(child->web_layer_, dest_i);
-}
-
-bool Layer::ConvertPointForAncestor(const Layer* ancestor,
- gfx::Point* point) const {
- ui::Transform transform;
- bool result = GetTransformRelativeTo(ancestor, &transform);
- gfx::Point3f p(*point);
- transform.TransformPoint(p);
- *point = p.AsPoint();
- return result;
-}
-
-bool Layer::ConvertPointFromAncestor(const Layer* ancestor,
- gfx::Point* point) const {
- ui::Transform transform;
- bool result = GetTransformRelativeTo(ancestor, &transform);
- gfx::Point3f p(*point);
- transform.TransformPointReverse(p);
- *point = p.AsPoint();
- return result;
-}
-
-bool Layer::GetTransformRelativeTo(const Layer* ancestor,
- ui::Transform* transform) const {
- const Layer* p = this;
- for (; p && p != ancestor; p = p->parent()) {
- if (p->transform().HasChange())
- transform->ConcatTransform(p->transform());
- transform->ConcatTranslate(static_cast<float>(p->bounds().x()),
- static_cast<float>(p->bounds().y()));
- }
- return p == ancestor;
-}
-
-void Layer::SetBoundsImmediately(const gfx::Rect& bounds) {
- if (bounds == bounds_)
- return;
-
- bool was_move = bounds_.size() == bounds.size();
- bounds_ = bounds;
- if (IsDrawn()) {
- if (was_move)
- ScheduleDraw();
- else
- SchedulePaint(gfx::Rect(bounds.size()));
- }
-
- RecomputeTransform();
- RecomputeDrawsContentAndUVRect();
-}
-
-void Layer::SetTransformImmediately(const ui::Transform& transform) {
- transform_ = transform;
-
- RecomputeTransform();
-}
-
-void Layer::SetOpacityImmediately(float opacity) {
- bool schedule_draw = (opacity != opacity_ && IsDrawn());
- opacity_ = opacity;
-
- if (visible_)
- web_layer_.setOpacity(opacity);
- RecomputeDebugBorderColor();
- if (schedule_draw)
- ScheduleDraw();
-}
-
-void Layer::SetVisibilityImmediately(bool visible) {
- if (visible_ == visible)
- return;
-
- visible_ = visible;
- // TODO(piman): Expose a visibility flag on WebLayer.
- web_layer_.setOpacity(visible_ ? opacity_ : 0.f);
-}
-
-void Layer::SetBoundsFromAnimation(const gfx::Rect& bounds) {
- SetBoundsImmediately(bounds);
-}
-
-void Layer::SetTransformFromAnimation(const Transform& transform) {
- SetTransformImmediately(transform);
-}
-
-void Layer::SetOpacityFromAnimation(float opacity) {
- SetOpacityImmediately(opacity);
-}
-
-void Layer::SetVisibilityFromAnimation(bool visibility) {
- SetVisibilityImmediately(visibility);
-}
-
-void Layer::ScheduleDrawForAnimation() {
- ScheduleDraw();
-}
-
-const gfx::Rect& Layer::GetBoundsForAnimation() const {
- return bounds();
-}
-
-const Transform& Layer::GetTransformForAnimation() const {
- return transform();
-}
-
-float Layer::GetOpacityForAnimation() const {
- return opacity();
-}
-
-bool Layer::GetVisibilityForAnimation() const {
- return visible();
-}
-
-void Layer::CreateWebLayer() {
- if (type_ == LAYER_SOLID_COLOR)
- web_layer_ = WebKit::WebSolidColorLayer::create();
- else
- web_layer_ = WebKit::WebContentLayer::create(this);
- web_layer_.setAnchorPoint(WebKit::WebFloatPoint(0.f, 0.f));
- web_layer_.setOpaque(true);
- web_layer_is_accelerated_ = false;
- show_debug_borders_ = CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kUIShowLayerBorders);
- web_layer_.setDebugBorderWidth(show_debug_borders_ ? 2 : 0);
- RecomputeDrawsContentAndUVRect();
- RecomputeDebugBorderColor();
-}
-
-void Layer::RecomputeTransform() {
- ui::Transform transform = transform_;
- transform.ConcatTranslate(bounds_.x(), bounds_.y());
- web_layer_.setTransform(transform.matrix());
-}
-
-void Layer::RecomputeDrawsContentAndUVRect() {
- DCHECK(!web_layer_.isNull());
- bool should_draw = type_ != LAYER_NOT_DRAWN;
- if (!web_layer_is_accelerated_) {
- if (type_ != LAYER_SOLID_COLOR)
- web_layer_.to<WebKit::WebContentLayer>().setDrawsContent(should_draw);
- web_layer_.setBounds(bounds_.size());
- } else {
- DCHECK(texture_);
- unsigned int texture_id = texture_->texture_id();
- WebKit::WebExternalTextureLayer texture_layer =
- web_layer_.to<WebKit::WebExternalTextureLayer>();
- texture_layer.setTextureId(should_draw ? texture_id : 0);
- gfx::Size texture_size = texture_->size();
- gfx::Size size(std::min(bounds_.width(), texture_size.width()),
- std::min(bounds_.height(), texture_size.height()));
- WebKit::WebFloatRect rect(
- 0,
- 0,
- static_cast<float>(size.width())/texture_size.width(),
- static_cast<float>(size.height())/texture_size.height());
- texture_layer.setUVRect(rect);
- web_layer_.setBounds(size);
- }
-}
-
-void Layer::RecomputeDebugBorderColor() {
- if (!show_debug_borders_)
- return;
- unsigned int color = 0xFF000000;
- color |= web_layer_is_accelerated_ ? 0x0000FF00 : 0x00FF0000;
- bool opaque = fills_bounds_opaquely_ && (GetCombinedOpacity() == 1.f);
- if (!opaque)
- color |= 0xFF;
- web_layer_.setDebugBorderColor(color);
-}
-
-} // namespace ui
« no previous file with comments | « ui/gfx/compositor/layer.h ('k') | ui/gfx/compositor/layer_animation_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698