| Index: ui/gfx/compositor/layer.cc
|
| diff --git a/ui/gfx/compositor/layer.cc b/ui/gfx/compositor/layer.cc
|
| index 4b7529e3c6f094b146f24d3cc74ffb22c4f3cdf8..2220f82b6c8023a0640a47100e2ea41738185684 100644
|
| --- a/ui/gfx/compositor/layer.cc
|
| +++ b/ui/gfx/compositor/layer.cc
|
| @@ -22,9 +22,7 @@
|
| #include "ui/gfx/interpolated_transform.h"
|
| #include "ui/gfx/point3.h"
|
|
|
| -#if defined(USE_WEBKIT_COMPOSITOR)
|
| #include "ui/gfx/compositor/compositor_cc.h"
|
| -#endif
|
|
|
| namespace {
|
|
|
| @@ -49,13 +47,10 @@ Layer::Layer()
|
| parent_(NULL),
|
| visible_(true),
|
| fills_bounds_opaquely_(true),
|
| - recompute_hole_(false),
|
| layer_updated_externally_(false),
|
| opacity_(1.0f),
|
| delegate_(NULL) {
|
| -#if defined(USE_WEBKIT_COMPOSITOR)
|
| CreateWebLayer();
|
| -#endif
|
| }
|
|
|
| Layer::Layer(LayerType type)
|
| @@ -64,13 +59,10 @@ Layer::Layer(LayerType type)
|
| parent_(NULL),
|
| visible_(true),
|
| fills_bounds_opaquely_(true),
|
| - recompute_hole_(false),
|
| layer_updated_externally_(false),
|
| opacity_(1.0f),
|
| delegate_(NULL) {
|
| -#if defined(USE_WEBKIT_COMPOSITOR)
|
| CreateWebLayer();
|
| -#endif
|
| }
|
|
|
| Layer::~Layer() {
|
| @@ -80,9 +72,7 @@ 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() {
|
| @@ -104,11 +94,7 @@ 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
|
| -
|
| - SetNeedsToRecomputeHole();
|
| }
|
|
|
| void Layer::Remove(Layer* child) {
|
| @@ -117,13 +103,7 @@ 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
|
| -
|
| - SetNeedsToRecomputeHole();
|
| -
|
| - child->DropTextures();
|
| }
|
|
|
| void Layer::StackAtTop(Layer* child) {
|
| @@ -200,19 +180,9 @@ void Layer::SetVisible(bool visible) {
|
| if (visible_ == visible)
|
| return;
|
|
|
| - bool was_drawn = IsDrawn();
|
| visible_ = visible;
|
| -#if defined(USE_WEBKIT_COMPOSITOR)
|
| // TODO(piman): Expose a visibility flag on WebLayer.
|
| web_layer_.setOpacity(visible_ ? opacity_ : 0.f);
|
| -#endif
|
| - bool is_drawn = IsDrawn();
|
| - if (was_drawn == is_drawn)
|
| - return;
|
| -
|
| - if (!is_drawn)
|
| - DropTextures();
|
| - SetNeedsToRecomputeHole();
|
| }
|
|
|
| bool Layer::IsDrawn() const {
|
| @@ -223,8 +193,7 @@ bool Layer::IsDrawn() const {
|
| }
|
|
|
| bool Layer::ShouldDraw() const {
|
| - return type_ == LAYER_HAS_TEXTURE && GetCombinedOpacity() > 0.0f &&
|
| - !hole_rect_.Contains(gfx::Rect(gfx::Point(0, 0), bounds_.size()));
|
| + return type_ == LAYER_HAS_TEXTURE && GetCombinedOpacity() > 0.0f;
|
| }
|
|
|
| // static
|
| @@ -249,17 +218,13 @@ void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) {
|
|
|
| fills_bounds_opaquely_ = fills_bounds_opaquely;
|
|
|
| - SetNeedsToRecomputeHole();
|
| -#if defined(USE_WEBKIT_COMPOSITOR)
|
| web_layer_.setOpaque(fills_bounds_opaquely);
|
| RecomputeDebugBorderColor();
|
| -#endif
|
| }
|
|
|
| void Layer::SetExternalTexture(ui::Texture* texture) {
|
| layer_updated_externally_ = !!texture;
|
| texture_ = texture;
|
| -#if defined(USE_WEBKIT_COMPOSITOR)
|
| if (web_layer_is_accelerated_ != layer_updated_externally_) {
|
| // Switch to a different type of layer.
|
| web_layer_.removeAllChildren();
|
| @@ -293,25 +258,13 @@ void Layer::SetExternalTexture(ui::Texture* texture) {
|
| texture_layer.setFlipped(texture_cc->flipped());
|
| }
|
| RecomputeDrawsContentAndUVRect();
|
| -#endif
|
| }
|
|
|
| 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())
|
| - texture_ = GetCompositor()->CreateTexture();
|
| -
|
| - 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(),
|
| @@ -321,10 +274,6 @@ void Layer::SchedulePaint(const gfx::Rect& invalid_rect) {
|
| web_layer_.to<WebKit::WebContentLayer>().invalidateRect(web_rect);
|
| else
|
| web_layer_.to<WebKit::WebExternalTextureLayer>().invalidateRect(web_rect);
|
| -#else
|
| - invalid_rect_ = invalid_rect_.Union(invalid_rect);
|
| - ScheduleDraw();
|
| -#endif
|
| }
|
|
|
| void Layer::ScheduleDraw() {
|
| @@ -333,87 +282,12 @@ void Layer::ScheduleDraw() {
|
| compositor->ScheduleDraw();
|
| }
|
|
|
| -void Layer::Draw() {
|
| - TRACE_EVENT0("ui", "Layer::Draw");
|
| -#if defined(USE_WEBKIT_COMPOSITOR)
|
| - NOTREACHED();
|
| -#else
|
| - DCHECK(GetCompositor());
|
| -
|
| - if (recompute_hole_ && !parent_)
|
| - RecomputeHole();
|
| -
|
| - if (!ShouldDraw())
|
| - return;
|
| -
|
| - UpdateLayerCanvas();
|
| -
|
| - // Layer drew nothing, no texture was created.
|
| - if (!texture_.get())
|
| - return;
|
| -
|
| - ui::TextureDrawParams texture_draw_params;
|
| - for (Layer* layer = this; layer; layer = layer->parent_) {
|
| - texture_draw_params.transform.ConcatTransform(layer->transform_);
|
| - texture_draw_params.transform.ConcatTranslate(
|
| - static_cast<float>(layer->bounds_.x()),
|
| - static_cast<float>(layer->bounds_.y()));
|
| - }
|
| -
|
| - const float combined_opacity = GetCombinedOpacity();
|
| -
|
| - // Only blend for transparent child layers (and when we're forcing
|
| - // transparency). The root layer will clobber the cleared bg.
|
| - const bool is_root = parent_ == NULL;
|
| - const bool forcing_transparency = combined_opacity < 1.0f;
|
| - const bool is_opaque = fills_bounds_opaquely_ || !has_valid_alpha_channel();
|
| - texture_draw_params.blend = !is_root && (forcing_transparency || !is_opaque);
|
| -
|
| - texture_draw_params.compositor_size = GetCompositor()->size();
|
| - texture_draw_params.opacity = combined_opacity;
|
| - texture_draw_params.has_valid_alpha_channel = has_valid_alpha_channel();
|
| -
|
| -#if defined(OS_WIN)
|
| - // TODO(beng): figure out why the other branch of this code renders improperly
|
| - // on Windows, and fix it, otherwise just remove all of this when
|
| - // WK compositor is default.
|
| - texture_->Draw(texture_draw_params, gfx::Rect(gfx::Point(), bounds().size()));
|
| -#else
|
| - std::vector<gfx::Rect> regions_to_draw;
|
| - PunchHole(gfx::Rect(gfx::Point(), bounds().size()), hole_rect_,
|
| - ®ions_to_draw);
|
| -
|
| - for (size_t i = 0; i < regions_to_draw.size(); ++i) {
|
| - if (!regions_to_draw[i].IsEmpty())
|
| - texture_->Draw(texture_draw_params, regions_to_draw[i]);
|
| - }
|
| -#endif
|
| -#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::paintContents(WebKit::WebCanvas* web_canvas,
|
| const WebKit::WebRect& clip) {
|
| TRACE_EVENT0("ui", "Layer::paintContents");
|
| -#if defined(USE_WEBKIT_COMPOSITOR)
|
| gfx::CanvasSkia canvas(web_canvas);
|
| if (delegate_)
|
| delegate_->OnPaintLayer(&canvas);
|
| -#else
|
| - NOTREACHED();
|
| -#endif
|
| }
|
|
|
| float Layer::GetCombinedOpacity() const {
|
| @@ -426,31 +300,6 @@ float Layer::GetCombinedOpacity() const {
|
| return opacity;
|
| }
|
|
|
| -void Layer::UpdateLayerCanvas() {
|
| - TRACE_EVENT0("ui", "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_)
|
| - return;
|
| - gfx::Rect local_bounds = gfx::Rect(gfx::Point(), bounds_.size());
|
| - gfx::Rect draw_rect = texture_.get() ? invalid_rect_.Intersect(local_bounds) :
|
| - local_bounds;
|
| - if (draw_rect.IsEmpty()) {
|
| - invalid_rect_ = gfx::Rect();
|
| - return;
|
| - }
|
| - scoped_ptr<gfx::Canvas> canvas(gfx::Canvas::CreateCanvas(draw_rect.size(),
|
| - false));
|
| - canvas->Translate(gfx::Point().Subtract(draw_rect.origin()));
|
| - if (delegate_)
|
| - delegate_->OnPaintLayer(canvas.get());
|
| - SetCanvas(*canvas->GetSkCanvas(), draw_rect.origin());
|
| -#endif
|
| -}
|
| -
|
| void Layer::StackRelativeTo(Layer* child, Layer* other, bool above) {
|
| DCHECK_NE(child, other);
|
| DCHECK_EQ(this, child->parent());
|
| @@ -470,27 +319,8 @@ void Layer::StackRelativeTo(Layer* child, Layer* other, bool above) {
|
| children_.erase(children_.begin() + child_i);
|
| children_.insert(children_.begin() + dest_i, child);
|
|
|
| - SetNeedsToRecomputeHole();
|
| -
|
| -#if defined(USE_WEBKIT_COMPOSITOR)
|
| child->web_layer_.removeFromParent();
|
| web_layer_.insertChild(child->web_layer_, dest_i);
|
| -#endif
|
| -}
|
| -
|
| -void Layer::SetNeedsToRecomputeHole() {
|
| - Layer* root_layer = this;
|
| - while (root_layer->parent_)
|
| - root_layer = root_layer->parent_;
|
| -
|
| - root_layer->recompute_hole_ = true;
|
| -}
|
| -
|
| -void Layer::ClearHoleRects() {
|
| - hole_rect_ = gfx::Rect();
|
| -
|
| - for (size_t i = 0; i < children_.size(); i++)
|
| - children_[i]->ClearHoleRects();
|
| }
|
|
|
| void Layer::GetLayerProperties(const ui::Transform& parent_transform,
|
| @@ -517,110 +347,6 @@ void Layer::GetLayerProperties(const ui::Transform& parent_transform,
|
| children_[i]->GetLayerProperties(current_transform, traversal);
|
| }
|
|
|
| -void Layer::RecomputeHole() {
|
| - std::vector<LayerProperties> traversal;
|
| - ui::Transform transform;
|
| -
|
| - ClearHoleRects();
|
| - GetLayerProperties(transform, &traversal);
|
| -
|
| - for (size_t i = 0; i < traversal.size(); i++) {
|
| - Layer* layer = traversal[i].layer;
|
| - gfx::Rect bounds = gfx::Rect(layer->bounds().size());
|
| -
|
| - // Iterate through layers which are after traversal[i] in draw order
|
| - // and find the largest candidate hole.
|
| - for (size_t j = i + 1; j < traversal.size(); j++) {
|
| - gfx::Rect candidate_hole = gfx::Rect(traversal[j].layer->bounds().size());
|
| -
|
| - // Compute transform to go from bounds of layer |j| to local bounds of
|
| - // layer |i|.
|
| - ui::Transform candidate_hole_transform;
|
| - ui::Transform inverted;
|
| -
|
| - candidate_hole_transform.ConcatTransform(
|
| - traversal[j].transform_relative_to_root);
|
| -
|
| - if (!traversal[i].transform_relative_to_root.GetInverse(&inverted))
|
| - continue;
|
| -
|
| - candidate_hole_transform.ConcatTransform(inverted);
|
| -
|
| - // cannot punch a hole if the relative transform between the two layers
|
| - // is not multiple of 90.
|
| - float degrees;
|
| - gfx::Point p;
|
| - if (!InterpolatedTransform::FactorTRS(candidate_hole_transform, &p,
|
| - °rees, NULL) || !IsApproximateMultilpleOf(degrees, 90.0f))
|
| - continue;
|
| -
|
| - candidate_hole_transform.TransformRect(&candidate_hole);
|
| - candidate_hole = candidate_hole.Intersect(bounds);
|
| -
|
| - if (candidate_hole.size().GetArea() >
|
| - layer->hole_rect().size().GetArea()) {
|
| - layer->set_hole_rect(candidate_hole);
|
| - }
|
| - }
|
| - // Free up texture memory if the hole fills bounds of layer.
|
| - if (!layer->ShouldDraw() && !layer_updated_externally())
|
| - layer->DropTexture();
|
| -
|
| -#if defined(USE_WEBKIT_COMPOSITOR)
|
| - RecomputeDrawsContentAndUVRect();
|
| -#endif
|
| - }
|
| -
|
| - recompute_hole_ = false;
|
| -}
|
| -
|
| -// static
|
| -void Layer::PunchHole(const gfx::Rect& rect,
|
| - const gfx::Rect& region_to_punch_out,
|
| - std::vector<gfx::Rect>* sides) {
|
| - gfx::Rect trimmed_rect = rect.Intersect(region_to_punch_out);
|
| -
|
| - if (trimmed_rect.IsEmpty()) {
|
| - sides->push_back(rect);
|
| - return;
|
| - }
|
| -
|
| - // Top (above the hole).
|
| - sides->push_back(gfx::Rect(rect.x(),
|
| - rect.y(),
|
| - rect.width(),
|
| - trimmed_rect.y() - rect.y()));
|
| -
|
| - // Left (of the hole).
|
| - sides->push_back(gfx::Rect(rect.x(),
|
| - trimmed_rect.y(),
|
| - trimmed_rect.x() - rect.x(),
|
| - trimmed_rect.height()));
|
| -
|
| - // Right (of the hole).
|
| - sides->push_back(gfx::Rect(trimmed_rect.right(),
|
| - trimmed_rect.y(),
|
| - rect.right() - trimmed_rect.right(),
|
| - trimmed_rect.height()));
|
| -
|
| - // Bottom (below the hole).
|
| - sides->push_back(gfx::Rect(rect.x(),
|
| - trimmed_rect.bottom(),
|
| - rect.width(),
|
| - rect.bottom() - trimmed_rect.bottom()));
|
| -}
|
| -
|
| -void Layer::DropTexture() {
|
| - if (!layer_updated_externally_)
|
| - texture_ = NULL;
|
| -}
|
| -
|
| -void Layer::DropTextures() {
|
| - DropTexture();
|
| - for (size_t i = 0; i < children_.size(); ++i)
|
| - children_[i]->DropTextures();
|
| -}
|
| -
|
| bool Layer::ConvertPointForAncestor(const Layer* ancestor,
|
| gfx::Point* point) const {
|
| ui::Transform transform;
|
| @@ -666,37 +392,23 @@ void Layer::SetBoundsImmediately(const gfx::Rect& bounds) {
|
| SchedulePaint(gfx::Rect(bounds.size()));
|
| }
|
|
|
| - SetNeedsToRecomputeHole();
|
| -#if defined(USE_WEBKIT_COMPOSITOR)
|
| RecomputeTransform();
|
| RecomputeDrawsContentAndUVRect();
|
| -#endif
|
| }
|
|
|
| void Layer::SetTransformImmediately(const ui::Transform& transform) {
|
| transform_ = transform;
|
|
|
| - SetNeedsToRecomputeHole();
|
| -#if defined(USE_WEBKIT_COMPOSITOR)
|
| RecomputeTransform();
|
| -#endif
|
| }
|
|
|
| void Layer::SetOpacityImmediately(float opacity) {
|
| bool schedule_draw = (opacity != opacity_ && IsDrawn());
|
| - bool was_opaque = GetCombinedOpacity() == 1.0f;
|
| opacity_ = opacity;
|
| - bool is_opaque = GetCombinedOpacity() == 1.0f;
|
|
|
| - // If our opacity has changed we need to recompute our hole, our parent's hole
|
| - // and the holes of all our descendants.
|
| - if (was_opaque != is_opaque)
|
| - SetNeedsToRecomputeHole();
|
| -#if defined(USE_WEBKIT_COMPOSITOR)
|
| if (visible_)
|
| web_layer_.setOpacity(opacity);
|
| RecomputeDebugBorderColor();
|
| -#endif
|
| if (schedule_draw)
|
| ScheduleDraw();
|
| }
|
| @@ -729,7 +441,6 @@ float Layer::GetOpacityForAnimation() const {
|
| return opacity();
|
| }
|
|
|
| -#if defined(USE_WEBKIT_COMPOSITOR)
|
| void Layer::CreateWebLayer() {
|
| web_layer_ = WebKit::WebContentLayer::create(this);
|
| web_layer_.setAnchorPoint(WebKit::WebFloatPoint(0.f, 0.f));
|
| @@ -750,8 +461,7 @@ void Layer::RecomputeTransform() {
|
|
|
| void Layer::RecomputeDrawsContentAndUVRect() {
|
| DCHECK(!web_layer_.isNull());
|
| - bool should_draw = type_ == LAYER_HAS_TEXTURE &&
|
| - !hole_rect_.Contains(gfx::Rect(gfx::Point(0, 0), bounds_.size()));
|
| + bool should_draw = type_ == LAYER_HAS_TEXTURE;
|
| if (!web_layer_is_accelerated_) {
|
| web_layer_.to<WebKit::WebContentLayer>().setDrawsContent(should_draw);
|
| web_layer_.setBounds(bounds_.size());
|
| @@ -784,6 +494,5 @@ void Layer::RecomputeDebugBorderColor() {
|
| color |= 0xFF;
|
| web_layer_.setDebugBorderColor(color);
|
| }
|
| -#endif
|
|
|
| } // namespace ui
|
|
|