blob: ec2bf413a0adcf929ec46b4874ea7abfead80da6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
// Copyright (c) 2011 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/logging.h"
#include "ui/gfx/compositor/compositor.h"
namespace ui {
Layer::Layer(Compositor* compositor)
: compositor_(compositor),
texture_(compositor->CreateTexture()),
parent_(NULL) {
}
Layer::~Layer() {
if (parent_)
parent_->Remove(this);
for (size_t i = 0; i < children_.size(); ++i)
children_[i]->parent_ = NULL;
}
void Layer::Add(Layer* child) {
if (child->parent_)
child->parent_->Remove(child);
child->parent_ = this;
children_.push_back(child);
}
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;
}
void Layer::SetTexture(ui::Texture* texture) {
if (texture == NULL)
texture_ = compositor_->CreateTexture();
else
texture_ = texture;
}
void Layer::SetCanvas(const SkCanvas& canvas, const gfx::Point& origin) {
texture_->SetCanvas(canvas, origin, bounds_.size());
}
void Layer::Draw() {
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()));
}
// Only blend for child layers. The root layer will clobber the cleared bg.
texture_draw_params.blend = parent_ != NULL;
texture_->Draw(texture_draw_params);
}
} // namespace ui
|