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

Unified Diff: ui/compositor/layer.cc

Issue 851853002: It is time. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Trying to reup because the last upload failed. Created 5 years, 11 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/compositor/layer.h ('k') | ui/compositor/layer_animation_delegate.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/compositor/layer.cc
diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc
deleted file mode 100644
index 2d7b5b36c2d66a9402907a537a408ef381db19cb..0000000000000000000000000000000000000000
--- a/ui/compositor/layer.cc
+++ /dev/null
@@ -1,1063 +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/compositor/layer.h"
-
-#include <algorithm>
-
-#include "base/command_line.h"
-#include "base/debug/trace_event.h"
-#include "base/json/json_writer.h"
-#include "base/lazy_instance.h"
-#include "base/logging.h"
-#include "base/memory/scoped_ptr.h"
-#include "cc/base/scoped_ptr_algorithm.h"
-#include "cc/layers/content_layer.h"
-#include "cc/layers/delegated_renderer_layer.h"
-#include "cc/layers/nine_patch_layer.h"
-#include "cc/layers/picture_layer.h"
-#include "cc/layers/solid_color_layer.h"
-#include "cc/layers/surface_layer.h"
-#include "cc/layers/texture_layer.h"
-#include "cc/output/copy_output_request.h"
-#include "cc/output/delegated_frame_data.h"
-#include "cc/output/filter_operation.h"
-#include "cc/output/filter_operations.h"
-#include "cc/resources/transferable_resource.h"
-#include "ui/compositor/compositor_switches.h"
-#include "ui/compositor/dip_util.h"
-#include "ui/compositor/layer_animator.h"
-#include "ui/gfx/animation/animation.h"
-#include "ui/gfx/canvas.h"
-#include "ui/gfx/display.h"
-#include "ui/gfx/interpolated_transform.h"
-#include "ui/gfx/point3_f.h"
-#include "ui/gfx/point_conversions.h"
-#include "ui/gfx/size_conversions.h"
-
-namespace {
-
-const ui::Layer* GetRoot(const ui::Layer* layer) {
- while (layer->parent())
- layer = layer->parent();
- return layer;
-}
-
-struct UIImplSidePaintingStatus {
- UIImplSidePaintingStatus()
- : enabled(ui::IsUIImplSidePaintingEnabled()) {
- }
- bool enabled;
-};
-base::LazyInstance<UIImplSidePaintingStatus> g_ui_impl_side_painting_status =
- LAZY_INSTANCE_INITIALIZER;
-
-} // namespace
-
-namespace ui {
-
-Layer::Layer()
- : type_(LAYER_TEXTURED),
- compositor_(NULL),
- parent_(NULL),
- visible_(true),
- force_render_surface_(false),
- fills_bounds_opaquely_(true),
- fills_bounds_completely_(false),
- background_blur_radius_(0),
- layer_saturation_(0.0f),
- layer_brightness_(0.0f),
- layer_grayscale_(0.0f),
- layer_inverted_(false),
- layer_mask_(NULL),
- layer_mask_back_link_(NULL),
- zoom_(1),
- zoom_inset_(0),
- delegate_(NULL),
- owner_(NULL),
- cc_layer_(NULL),
- device_scale_factor_(1.0f) {
- CreateCcLayer();
-}
-
-Layer::Layer(LayerType type)
- : type_(type),
- compositor_(NULL),
- parent_(NULL),
- visible_(true),
- force_render_surface_(false),
- fills_bounds_opaquely_(true),
- fills_bounds_completely_(false),
- background_blur_radius_(0),
- layer_saturation_(0.0f),
- layer_brightness_(0.0f),
- layer_grayscale_(0.0f),
- layer_inverted_(false),
- layer_mask_(NULL),
- layer_mask_back_link_(NULL),
- zoom_(1),
- zoom_inset_(0),
- delegate_(NULL),
- owner_(NULL),
- cc_layer_(NULL),
- device_scale_factor_(1.0f) {
- CreateCcLayer();
-}
-
-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.
- if (animator_.get())
- animator_->SetDelegate(NULL);
- animator_ = NULL;
- if (compositor_)
- compositor_->SetRootLayer(NULL);
- if (parent_)
- parent_->Remove(this);
- if (layer_mask_)
- SetMaskLayer(NULL);
- if (layer_mask_back_link_)
- layer_mask_back_link_->SetMaskLayer(NULL);
- for (size_t i = 0; i < children_.size(); ++i)
- children_[i]->parent_ = NULL;
- cc_layer_->RemoveLayerAnimationEventObserver(this);
- cc_layer_->RemoveFromParent();
-}
-
-// static
-bool Layer::UsingPictureLayer() {
- return g_ui_impl_side_painting_status.Get().enabled;
-}
-
-Compositor* Layer::GetCompositor() {
- return GetRoot(this)->compositor_;
-}
-
-float Layer::opacity() const {
- return cc_layer_->opacity();
-}
-
-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_);
- if (compositor_) {
- RemoveAnimatorsInTreeFromCollection(
- compositor_->layer_animator_collection());
- }
- compositor_ = compositor;
- if (compositor) {
- OnDeviceScaleFactorChanged(compositor->device_scale_factor());
- SendPendingThreadedAnimations();
- AddAnimatorsInTreeToCollection(compositor_->layer_animator_collection());
- }
-}
-
-void Layer::Add(Layer* child) {
- DCHECK(!child->compositor_);
- if (child->parent_)
- child->parent_->Remove(child);
- child->parent_ = this;
- children_.push_back(child);
- cc_layer_->AddChild(child->cc_layer_);
- child->OnDeviceScaleFactorChanged(device_scale_factor_);
- if (GetCompositor())
- child->SendPendingThreadedAnimations();
- LayerAnimatorCollection* collection = GetLayerAnimatorCollection();
- if (collection)
- child->AddAnimatorsInTreeToCollection(collection);
-}
-
-void Layer::Remove(Layer* child) {
- // Current bounds are used to calculate offsets when layers are reparented.
- // Stop (and complete) an ongoing animation to update the bounds immediately.
- LayerAnimator* child_animator = child->animator_.get();
- if (child_animator)
- child_animator->StopAnimatingProperty(ui::LayerAnimationElement::BOUNDS);
- LayerAnimatorCollection* collection = GetLayerAnimatorCollection();
- if (collection)
- child->RemoveAnimatorsInTreeFromCollection(collection);
-
- std::vector<Layer*>::iterator i =
- std::find(children_.begin(), children_.end(), child);
- DCHECK(i != children_.end());
- children_.erase(i);
- child->parent_ = NULL;
- child->cc_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_ = animator;
-}
-
-LayerAnimator* Layer::GetAnimator() {
- if (!animator_.get())
- SetAnimator(LayerAnimator::CreateDefaultAnimator());
- return animator_.get();
-}
-
-void Layer::SetTransform(const gfx::Transform& transform) {
- GetAnimator()->SetTransform(transform);
-}
-
-gfx::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);
-}
-
-void Layer::SetSubpixelPositionOffset(const gfx::Vector2dF offset) {
- subpixel_position_offset_ = offset;
- RecomputePosition();
-}
-
-gfx::Rect Layer::GetTargetBounds() const {
- if (animator_.get() && animator_->IsAnimatingProperty(
- LayerAnimationElement::BOUNDS)) {
- return animator_->GetTargetBounds();
- }
- return bounds_;
-}
-
-void Layer::SetMasksToBounds(bool masks_to_bounds) {
- cc_layer_->SetMasksToBounds(masks_to_bounds);
-}
-
-bool Layer::GetMasksToBounds() const {
- return cc_layer_->masks_to_bounds();
-}
-
-void Layer::SetOpacity(float opacity) {
- GetAnimator()->SetOpacity(opacity);
-}
-
-float Layer::GetCombinedOpacity() const {
- float opacity = this->opacity();
- Layer* current = this->parent_;
- while (current) {
- opacity *= current->opacity();
- current = current->parent_;
- }
- return opacity;
-}
-
-void Layer::SetBackgroundBlur(int blur_radius) {
- background_blur_radius_ = blur_radius;
-
- SetLayerBackgroundFilters();
-}
-
-void Layer::SetLayerSaturation(float saturation) {
- layer_saturation_ = saturation;
- SetLayerFilters();
-}
-
-void Layer::SetLayerBrightness(float brightness) {
- GetAnimator()->SetBrightness(brightness);
-}
-
-float Layer::GetTargetBrightness() const {
- if (animator_.get() && animator_->IsAnimatingProperty(
- LayerAnimationElement::BRIGHTNESS)) {
- return animator_->GetTargetBrightness();
- }
- return layer_brightness();
-}
-
-void Layer::SetLayerGrayscale(float grayscale) {
- GetAnimator()->SetGrayscale(grayscale);
-}
-
-float Layer::GetTargetGrayscale() const {
- if (animator_.get() && animator_->IsAnimatingProperty(
- LayerAnimationElement::GRAYSCALE)) {
- return animator_->GetTargetGrayscale();
- }
- return layer_grayscale();
-}
-
-void Layer::SetLayerInverted(bool inverted) {
- layer_inverted_ = inverted;
- SetLayerFilters();
-}
-
-void Layer::SetMaskLayer(Layer* layer_mask) {
- // The provided mask should not have a layer mask itself.
- DCHECK(!layer_mask ||
- (!layer_mask->layer_mask_layer() &&
- layer_mask->children().empty() &&
- !layer_mask->layer_mask_back_link_));
- DCHECK(!layer_mask_back_link_);
- if (layer_mask_ == layer_mask)
- return;
- // We need to de-reference the currently linked object so that no problem
- // arises if the mask layer gets deleted before this object.
- if (layer_mask_)
- layer_mask_->layer_mask_back_link_ = NULL;
- layer_mask_ = layer_mask;
- cc_layer_->SetMaskLayer(
- layer_mask ? layer_mask->cc_layer() : NULL);
- // We need to reference the linked object so that it can properly break the
- // link to us when it gets deleted.
- if (layer_mask) {
- layer_mask->layer_mask_back_link_ = this;
- layer_mask->OnDeviceScaleFactorChanged(device_scale_factor_);
- }
-}
-
-void Layer::SetBackgroundZoom(float zoom, int inset) {
- zoom_ = zoom;
- zoom_inset_ = inset;
-
- SetLayerBackgroundFilters();
-}
-
-void Layer::SetAlphaShape(scoped_ptr<SkRegion> region) {
- alpha_shape_ = region.Pass();
-
- SetLayerFilters();
-}
-
-void Layer::SetLayerFilters() {
- cc::FilterOperations filters;
- if (layer_saturation_) {
- filters.Append(cc::FilterOperation::CreateSaturateFilter(
- layer_saturation_));
- }
- if (layer_grayscale_) {
- filters.Append(cc::FilterOperation::CreateGrayscaleFilter(
- layer_grayscale_));
- }
- if (layer_inverted_)
- filters.Append(cc::FilterOperation::CreateInvertFilter(1.0));
- // Brightness goes last, because the resulting colors neeed clamping, which
- // cause further color matrix filters to be applied separately. In this order,
- // they all can be combined in a single pass.
- if (layer_brightness_) {
- filters.Append(cc::FilterOperation::CreateSaturatingBrightnessFilter(
- layer_brightness_));
- }
- if (alpha_shape_) {
- filters.Append(cc::FilterOperation::CreateAlphaThresholdFilter(
- *alpha_shape_, 0.f, 0.f));
- }
-
- cc_layer_->SetFilters(filters);
-}
-
-void Layer::SetLayerBackgroundFilters() {
- cc::FilterOperations filters;
- if (zoom_ != 1)
- filters.Append(cc::FilterOperation::CreateZoomFilter(zoom_, zoom_inset_));
-
- if (background_blur_radius_) {
- filters.Append(cc::FilterOperation::CreateBlurFilter(
- background_blur_radius_));
- }
-
- cc_layer_->SetBackgroundFilters(filters);
-}
-
-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);
-}
-
-bool Layer::GetTargetTransformRelativeTo(const Layer* ancestor,
- gfx::Transform* transform) const {
- const Layer* p = this;
- for (; p && p != ancestor; p = p->parent()) {
- gfx::Transform translation;
- translation.Translate(static_cast<float>(p->bounds().x()),
- static_cast<float>(p->bounds().y()));
- // Use target transform so that result will be correct once animation is
- // finished.
- if (!p->GetTargetTransform().IsIdentity())
- transform->ConcatTransform(p->GetTargetTransform());
- transform->ConcatTransform(translation);
- }
- return p == ancestor;
-}
-
-void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) {
- if (fills_bounds_opaquely_ == fills_bounds_opaquely)
- return;
-
- fills_bounds_opaquely_ = fills_bounds_opaquely;
-
- cc_layer_->SetContentsOpaque(fills_bounds_opaquely);
-}
-
-void Layer::SetFillsBoundsCompletely(bool fills_bounds_completely) {
- fills_bounds_completely_ = fills_bounds_completely;
-}
-
-void Layer::SwitchToLayer(scoped_refptr<cc::Layer> new_layer) {
- // Finish animations being handled by cc_layer_.
- if (animator_.get()) {
- animator_->StopAnimatingProperty(LayerAnimationElement::TRANSFORM);
- animator_->StopAnimatingProperty(LayerAnimationElement::OPACITY);
- }
-
- if (texture_layer_.get())
- texture_layer_->ClearClient();
- // TODO(piman): delegated_renderer_layer_ cleanup.
-
- cc_layer_->RemoveAllChildren();
- if (cc_layer_->parent()) {
- cc_layer_->parent()->ReplaceChild(cc_layer_, new_layer);
- }
- cc_layer_->SetLayerClient(NULL);
- cc_layer_->RemoveLayerAnimationEventObserver(this);
- new_layer->SetOpacity(cc_layer_->opacity());
- new_layer->SetTransform(cc_layer_->transform());
- new_layer->SetPosition(cc_layer_->position());
- new_layer->SetBackgroundColor(cc_layer_->background_color());
-
- cc_layer_ = new_layer.get();
- content_layer_ = NULL;
- solid_color_layer_ = NULL;
- texture_layer_ = NULL;
- delegated_renderer_layer_ = NULL;
- surface_layer_ = NULL;
-
- cc_layer_->AddLayerAnimationEventObserver(this);
- for (size_t i = 0; i < children_.size(); ++i) {
- DCHECK(children_[i]->cc_layer_);
- cc_layer_->AddChild(children_[i]->cc_layer_);
- }
- cc_layer_->SetLayerClient(this);
- cc_layer_->SetTransformOrigin(gfx::Point3F());
- cc_layer_->SetContentsOpaque(fills_bounds_opaquely_);
- cc_layer_->SetForceRenderSurface(force_render_surface_);
- cc_layer_->SetIsDrawable(type_ != LAYER_NOT_DRAWN);
- cc_layer_->SetHideLayerAndSubtree(!visible_);
-
- SetLayerFilters();
- SetLayerBackgroundFilters();
-}
-
-void Layer::SwitchCCLayerForTest() {
- scoped_refptr<cc::Layer> new_layer;
- if (Layer::UsingPictureLayer())
- new_layer = cc::PictureLayer::Create(this);
- else
- new_layer = cc::ContentLayer::Create(this);
- SwitchToLayer(new_layer);
- content_layer_ = new_layer;
-}
-
-void Layer::SetTextureMailbox(
- const cc::TextureMailbox& mailbox,
- scoped_ptr<cc::SingleReleaseCallback> release_callback,
- gfx::Size texture_size_in_dip) {
- DCHECK(type_ == LAYER_TEXTURED || type_ == LAYER_SOLID_COLOR);
- DCHECK(mailbox.IsValid());
- DCHECK(release_callback);
- if (!texture_layer_.get()) {
- scoped_refptr<cc::TextureLayer> new_layer =
- cc::TextureLayer::CreateForMailbox(this);
- new_layer->SetFlipped(true);
- SwitchToLayer(new_layer);
- texture_layer_ = new_layer;
- }
- if (mailbox_release_callback_)
- mailbox_release_callback_->Run(0, false);
- mailbox_release_callback_ = release_callback.Pass();
- mailbox_ = mailbox;
- SetTextureSize(texture_size_in_dip);
-}
-
-void Layer::SetTextureSize(gfx::Size texture_size_in_dip) {
- DCHECK(texture_layer_.get());
- if (frame_size_in_dip_ == texture_size_in_dip)
- return;
- frame_size_in_dip_ = texture_size_in_dip;
- RecomputeDrawsContentAndUVRect();
- texture_layer_->SetNeedsDisplay();
-}
-
-void Layer::SetShowDelegatedContent(cc::DelegatedFrameProvider* frame_provider,
- gfx::Size frame_size_in_dip) {
- DCHECK(type_ == LAYER_TEXTURED || type_ == LAYER_SOLID_COLOR);
-
- scoped_refptr<cc::DelegatedRendererLayer> new_layer =
- cc::DelegatedRendererLayer::Create(frame_provider);
- SwitchToLayer(new_layer);
- delegated_renderer_layer_ = new_layer;
-
- frame_size_in_dip_ = frame_size_in_dip;
- RecomputeDrawsContentAndUVRect();
-}
-
-void Layer::SetShowSurface(
- cc::SurfaceId id,
- const cc::SurfaceLayer::SatisfyCallback& satisfy_callback,
- const cc::SurfaceLayer::RequireCallback& require_callback,
- gfx::Size frame_size_in_dip) {
- DCHECK(type_ == LAYER_TEXTURED || type_ == LAYER_SOLID_COLOR);
-
- scoped_refptr<cc::SurfaceLayer> new_layer =
- cc::SurfaceLayer::Create(satisfy_callback, require_callback);
- new_layer->SetSurfaceId(id, 1.f, frame_size_in_dip);
- SwitchToLayer(new_layer);
- surface_layer_ = new_layer;
-
- frame_size_in_dip_ = frame_size_in_dip;
- RecomputeDrawsContentAndUVRect();
-}
-
-void Layer::SetShowSolidColorContent() {
- DCHECK_EQ(type_, LAYER_SOLID_COLOR);
-
- if (solid_color_layer_.get())
- return;
-
- scoped_refptr<cc::SolidColorLayer> new_layer = cc::SolidColorLayer::Create();
- SwitchToLayer(new_layer);
- solid_color_layer_ = new_layer;
-
- mailbox_ = cc::TextureMailbox();
- if (mailbox_release_callback_) {
- mailbox_release_callback_->Run(0, false);
- mailbox_release_callback_.reset();
- }
- RecomputeDrawsContentAndUVRect();
-}
-
-void Layer::UpdateNinePatchLayerBitmap(const SkBitmap& bitmap) {
- DCHECK(type_ == LAYER_NINE_PATCH && nine_patch_layer_.get());
- SkBitmap bitmap_copy;
- if (bitmap.isImmutable()) {
- bitmap_copy = bitmap;
- } else {
- // UIResourceBitmap requires an immutable copy of the input |bitmap|.
- bitmap.copyTo(&bitmap_copy);
- bitmap_copy.setImmutable();
- }
- nine_patch_layer_->SetBitmap(bitmap_copy);
-}
-
-void Layer::UpdateNinePatchLayerAperture(const gfx::Rect& aperture) {
- DCHECK(type_ == LAYER_NINE_PATCH && nine_patch_layer_.get());
- nine_patch_layer_->SetAperture(aperture);
-}
-
-void Layer::UpdateNinePatchLayerBorder(const gfx::Rect& border) {
- DCHECK(type_ == LAYER_NINE_PATCH && nine_patch_layer_.get());
- nine_patch_layer_->SetBorder(border);
-}
-
-void Layer::SetColor(SkColor color) { GetAnimator()->SetColor(color); }
-
-bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) {
- if ((type_ == LAYER_SOLID_COLOR && !texture_layer_.get()) ||
- type_ == LAYER_NINE_PATCH || (!delegate_ && !mailbox_.IsValid()))
- 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_ || mailbox_.IsValid()) && !damaged_region_.isEmpty()) {
- for (SkRegion::Iterator iter(damaged_region_); !iter.done(); iter.next()) {
- const SkIRect& sk_damaged = iter.rect();
- gfx::Rect damaged(
- sk_damaged.x(),
- sk_damaged.y(),
- sk_damaged.width(),
- sk_damaged.height());
- cc_layer_->SetNeedsDisplayRect(damaged);
- }
- damaged_region_.setEmpty();
- }
- for (size_t i = 0; i < children_.size(); ++i)
- children_[i]->SendDamagedRects();
-}
-
-void Layer::CompleteAllAnimations() {
- typedef std::vector<scoped_refptr<LayerAnimator> > LayerAnimatorVector;
- LayerAnimatorVector animators;
- CollectAnimators(&animators);
- for (LayerAnimatorVector::const_iterator it = animators.begin();
- it != animators.end();
- ++it) {
- (*it)->StopAnimating();
- }
-}
-
-void Layer::SuppressPaint() {
- if (!delegate_)
- return;
- delegate_ = NULL;
- for (size_t i = 0; i < children_.size(); ++i)
- children_[i]->SuppressPaint();
-}
-
-void Layer::OnDeviceScaleFactorChanged(float device_scale_factor) {
- if (device_scale_factor_ == device_scale_factor)
- return;
- if (animator_.get())
- animator_->StopAnimatingProperty(LayerAnimationElement::TRANSFORM);
- device_scale_factor_ = device_scale_factor;
- RecomputeDrawsContentAndUVRect();
- RecomputePosition();
- SchedulePaint(gfx::Rect(bounds_.size()));
- if (delegate_)
- delegate_->OnDeviceScaleFactorChanged(device_scale_factor);
- for (size_t i = 0; i < children_.size(); ++i)
- children_[i]->OnDeviceScaleFactorChanged(device_scale_factor);
- if (layer_mask_)
- layer_mask_->OnDeviceScaleFactorChanged(device_scale_factor);
-}
-
-void Layer::OnDelegatedFrameDamage(const gfx::Rect& damage_rect_in_dip) {
- DCHECK(delegated_renderer_layer_.get() || surface_layer_.get());
- if (!delegate_)
- return;
- delegate_->OnDelegatedFrameDamage(damage_rect_in_dip);
-}
-
-void Layer::RequestCopyOfOutput(scoped_ptr<cc::CopyOutputRequest> request) {
- cc_layer_->RequestCopyOfOutput(request.Pass());
-}
-
-void Layer::PaintContents(SkCanvas* sk_canvas,
- const gfx::Rect& clip,
- ContentLayerClient::GraphicsContextStatus gc_status) {
- TRACE_EVENT0("ui", "Layer::PaintContents");
- scoped_ptr<gfx::Canvas> canvas(gfx::Canvas::CreateCanvasWithoutScaling(
- sk_canvas, device_scale_factor_));
- if (delegate_)
- delegate_->OnPaintLayer(canvas.get());
-}
-
-scoped_refptr<cc::DisplayItemList> Layer::PaintContentsToDisplayList(
- const gfx::Rect& clip,
- ContentLayerClient::GraphicsContextStatus gc_status) {
- NOTIMPLEMENTED();
- return cc::DisplayItemList::Create();
-}
-
-bool Layer::FillsBoundsCompletely() const { return fills_bounds_completely_; }
-
-bool Layer::PrepareTextureMailbox(
- cc::TextureMailbox* mailbox,
- scoped_ptr<cc::SingleReleaseCallback>* release_callback,
- bool use_shared_memory) {
- if (!mailbox_release_callback_)
- return false;
- *mailbox = mailbox_;
- *release_callback = mailbox_release_callback_.Pass();
- return true;
-}
-
-void Layer::SetForceRenderSurface(bool force) {
- if (force_render_surface_ == force)
- return;
-
- force_render_surface_ = force;
- cc_layer_->SetForceRenderSurface(force_render_surface_);
-}
-
-class LayerDebugInfo : public base::debug::ConvertableToTraceFormat {
- public:
- explicit LayerDebugInfo(std::string name) : name_(name) { }
- void AppendAsTraceFormat(std::string* out) const override {
- base::DictionaryValue dictionary;
- dictionary.SetString("layer_name", name_);
- base::JSONWriter::Write(&dictionary, out);
- }
-
- private:
- ~LayerDebugInfo() override {}
- std::string name_;
-};
-
-scoped_refptr<base::debug::ConvertableToTraceFormat> Layer::TakeDebugInfo() {
- return new LayerDebugInfo(name_);
-}
-
-void Layer::OnAnimationStarted(const cc::AnimationEvent& event) {
- if (animator_.get())
- animator_->OnThreadedAnimationStarted(event);
-}
-
-void Layer::CollectAnimators(
- std::vector<scoped_refptr<LayerAnimator> >* animators) {
- if (IsAnimating())
- animators->push_back(animator_);
- std::for_each(children_.begin(), children_.end(),
- std::bind2nd(std::mem_fun(&Layer::CollectAnimators),
- animators));
-}
-
-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->cc_layer_->RemoveFromParent();
- cc_layer_->InsertChild(child->cc_layer_, dest_i);
-}
-
-bool Layer::ConvertPointForAncestor(const Layer* ancestor,
- gfx::Point* point) const {
- gfx::Transform transform;
- bool result = GetTargetTransformRelativeTo(ancestor, &transform);
- gfx::Point3F p(*point);
- transform.TransformPoint(&p);
- *point = gfx::ToFlooredPoint(p.AsPointF());
- return result;
-}
-
-bool Layer::ConvertPointFromAncestor(const Layer* ancestor,
- gfx::Point* point) const {
- gfx::Transform transform;
- bool result = GetTargetTransformRelativeTo(ancestor, &transform);
- gfx::Point3F p(*point);
- transform.TransformPointReverse(&p);
- *point = gfx::ToFlooredPoint(p.AsPointF());
- return result;
-}
-
-void Layer::SetBoundsFromAnimation(const gfx::Rect& bounds) {
- if (bounds == bounds_)
- return;
-
- base::Closure closure;
- if (delegate_)
- closure = delegate_->PrepareForLayerBoundsChange();
- bool was_move = bounds_.size() == bounds.size();
- bounds_ = bounds;
-
- RecomputeDrawsContentAndUVRect();
- RecomputePosition();
-
- if (!closure.is_null())
- closure.Run();
-
- if (was_move) {
- // Don't schedule a draw if we're invisible. We'll schedule one
- // automatically when we get visible.
- if (IsDrawn())
- ScheduleDraw();
- } else {
- // Always schedule a paint, even if we're invisible.
- SchedulePaint(gfx::Rect(bounds.size()));
- }
-}
-
-void Layer::SetTransformFromAnimation(const gfx::Transform& transform) {
- cc_layer_->SetTransform(transform);
-}
-
-void Layer::SetOpacityFromAnimation(float opacity) {
- cc_layer_->SetOpacity(opacity);
- ScheduleDraw();
-}
-
-void Layer::SetVisibilityFromAnimation(bool visible) {
- if (visible_ == visible)
- return;
-
- visible_ = visible;
- cc_layer_->SetHideLayerAndSubtree(!visible_);
-}
-
-void Layer::SetBrightnessFromAnimation(float brightness) {
- layer_brightness_ = brightness;
- SetLayerFilters();
-}
-
-void Layer::SetGrayscaleFromAnimation(float grayscale) {
- layer_grayscale_ = grayscale;
- SetLayerFilters();
-}
-
-void Layer::SetColorFromAnimation(SkColor color) {
- DCHECK_EQ(type_, LAYER_SOLID_COLOR);
- cc_layer_->SetBackgroundColor(color);
- SetFillsBoundsOpaquely(SkColorGetA(color) == 0xFF);
-}
-
-void Layer::ScheduleDrawForAnimation() {
- ScheduleDraw();
-}
-
-const gfx::Rect& Layer::GetBoundsForAnimation() const {
- return bounds();
-}
-
-gfx::Transform Layer::GetTransformForAnimation() const {
- return transform();
-}
-
-float Layer::GetOpacityForAnimation() const {
- return opacity();
-}
-
-bool Layer::GetVisibilityForAnimation() const {
- return visible();
-}
-
-float Layer::GetBrightnessForAnimation() const {
- return layer_brightness();
-}
-
-float Layer::GetGrayscaleForAnimation() const {
- return layer_grayscale();
-}
-
-SkColor Layer::GetColorForAnimation() const {
- // WebColor is equivalent to SkColor, per WebColor.h.
- // The NULL check is here since this is invoked regardless of whether we have
- // been configured as LAYER_SOLID_COLOR.
- return solid_color_layer_.get() ?
- solid_color_layer_->background_color() : SK_ColorBLACK;
-}
-
-float Layer::GetDeviceScaleFactor() const {
- return device_scale_factor_;
-}
-
-void Layer::AddThreadedAnimation(scoped_ptr<cc::Animation> animation) {
- DCHECK(cc_layer_);
- // Until this layer has a compositor (and hence cc_layer_ has a
- // LayerTreeHost), addAnimation will fail.
- if (GetCompositor())
- cc_layer_->AddAnimation(animation.Pass());
- else
- pending_threaded_animations_.push_back(animation.Pass());
-}
-
-namespace{
-
-struct HasAnimationId {
- HasAnimationId(int id): id_(id) {
- }
-
- bool operator()(cc::Animation* animation) const {
- return animation->id() == id_;
- }
-
- private:
- int id_;
-};
-
-}
-
-void Layer::RemoveThreadedAnimation(int animation_id) {
- DCHECK(cc_layer_);
- if (pending_threaded_animations_.size() == 0) {
- cc_layer_->RemoveAnimation(animation_id);
- return;
- }
-
- pending_threaded_animations_.erase(
- cc::remove_if(&pending_threaded_animations_,
- pending_threaded_animations_.begin(),
- pending_threaded_animations_.end(),
- HasAnimationId(animation_id)),
- pending_threaded_animations_.end());
-}
-
-LayerAnimatorCollection* Layer::GetLayerAnimatorCollection() {
- Compositor* compositor = GetCompositor();
- return compositor ? compositor->layer_animator_collection() : NULL;
-}
-
-void Layer::SendPendingThreadedAnimations() {
- for (cc::ScopedPtrVector<cc::Animation>::iterator it =
- pending_threaded_animations_.begin();
- it != pending_threaded_animations_.end();
- ++it)
- cc_layer_->AddAnimation(pending_threaded_animations_.take(it));
-
- pending_threaded_animations_.clear();
-
- for (size_t i = 0; i < children_.size(); ++i)
- children_[i]->SendPendingThreadedAnimations();
-}
-
-void Layer::CreateCcLayer() {
- if (type_ == LAYER_SOLID_COLOR) {
- solid_color_layer_ = cc::SolidColorLayer::Create();
- cc_layer_ = solid_color_layer_.get();
- } else if (type_ == LAYER_NINE_PATCH) {
- nine_patch_layer_ = cc::NinePatchLayer::Create();
- cc_layer_ = nine_patch_layer_.get();
- } else {
- if (Layer::UsingPictureLayer())
- content_layer_ = cc::PictureLayer::Create(this);
- else
- content_layer_ = cc::ContentLayer::Create(this);
- cc_layer_ = content_layer_.get();
- }
- cc_layer_->SetTransformOrigin(gfx::Point3F());
- cc_layer_->SetContentsOpaque(true);
- cc_layer_->SetIsDrawable(type_ != LAYER_NOT_DRAWN);
- cc_layer_->AddLayerAnimationEventObserver(this);
- cc_layer_->SetLayerClient(this);
- RecomputePosition();
-}
-
-gfx::Transform Layer::transform() const {
- return cc_layer_->transform();
-}
-
-void Layer::RecomputeDrawsContentAndUVRect() {
- DCHECK(cc_layer_);
- gfx::Size size(bounds_.size());
- if (texture_layer_.get()) {
- size.SetToMin(frame_size_in_dip_);
- gfx::PointF uv_top_left(0.f, 0.f);
- gfx::PointF uv_bottom_right(
- static_cast<float>(size.width()) / frame_size_in_dip_.width(),
- static_cast<float>(size.height()) / frame_size_in_dip_.height());
- texture_layer_->SetUV(uv_top_left, uv_bottom_right);
- } else if (delegated_renderer_layer_.get() || surface_layer_.get()) {
- size.SetToMin(frame_size_in_dip_);
- }
- cc_layer_->SetBounds(size);
-}
-
-void Layer::RecomputePosition() {
- cc_layer_->SetPosition(bounds_.origin() + subpixel_position_offset_);
-}
-
-void Layer::AddAnimatorsInTreeToCollection(
- LayerAnimatorCollection* collection) {
- DCHECK(collection);
- if (IsAnimating())
- animator_->AddToCollection(collection);
- std::for_each(
- children_.begin(),
- children_.end(),
- std::bind2nd(std::mem_fun(&Layer::AddAnimatorsInTreeToCollection),
- collection));
-}
-
-void Layer::RemoveAnimatorsInTreeFromCollection(
- LayerAnimatorCollection* collection) {
- DCHECK(collection);
- if (IsAnimating())
- animator_->RemoveFromCollection(collection);
- std::for_each(
- children_.begin(),
- children_.end(),
- std::bind2nd(std::mem_fun(&Layer::RemoveAnimatorsInTreeFromCollection),
- collection));
-}
-
-bool Layer::IsAnimating() const {
- return animator_.get() && animator_->is_animating();
-}
-
-} // namespace ui
« no previous file with comments | « ui/compositor/layer.h ('k') | ui/compositor/layer_animation_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698