summaryrefslogtreecommitdiffstats
path: root/ui/compositor/layer.cc
diff options
context:
space:
mode:
authorjamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-18 03:06:06 +0000
committerjamesr@chromium.org <jamesr@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-08-18 03:06:06 +0000
commit66efabe63c5ae51099d701c78ea7cc797564f52d (patch)
tree4f562a877e6a1fe9b9b86ee4926fbfc2f8f97d90 /ui/compositor/layer.cc
parent726f32537a7ee9d8a6abf06771c5d569306f0a07 (diff)
downloadchromium_src-66efabe63c5ae51099d701c78ea7cc797564f52d.zip
chromium_src-66efabe63c5ae51099d701c78ea7cc797564f52d.tar.gz
chromium_src-66efabe63c5ae51099d701c78ea7cc797564f52d.tar.bz2
Prepare ui/compositor for WebLayer type change
This is chromium-side preparation for https://bugs.webkit.org/show_bug.cgi?id=94229. After that lands and rolls, I'll delete the #else branches. BUG=none Review URL: https://chromiumcodereview.appspot.com/10832355 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@152228 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/compositor/layer.cc')
-rw-r--r--ui/compositor/layer.cc162
1 files changed, 159 insertions, 3 deletions
diff --git a/ui/compositor/layer.cc b/ui/compositor/layer.cc
index d6b2257..94caf4b 100644
--- a/ui/compositor/layer.cc
+++ b/ui/compositor/layer.cc
@@ -61,6 +61,9 @@ Layer::Layer()
layer_mask_(NULL),
layer_mask_back_link_(NULL),
delegate_(NULL),
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_(NULL),
+#endif
scale_content_(true),
device_scale_factor_(1.0f) {
CreateWebLayer();
@@ -103,7 +106,11 @@ Layer::~Layer() {
layer_mask_back_link_->SetMaskLayer(NULL);
for (size_t i = 0; i < children_.size(); ++i)
children_[i]->parent_ = NULL;
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->removeFromParent();
+#else
web_layer_.removeFromParent();
+#endif
}
Compositor* Layer::GetCompositor() {
@@ -127,7 +134,11 @@ void Layer::Add(Layer* child) {
child->parent_->Remove(child);
child->parent_ = this;
children_.push_back(child);
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->addChild(child->web_layer_);
+#else
web_layer_.addChild(child->web_layer_);
+#endif
child->OnDeviceScaleFactorChanged(device_scale_factor_);
}
@@ -137,7 +148,11 @@ void Layer::Remove(Layer* child) {
DCHECK(i != children_.end());
children_.erase(i);
child->parent_ = NULL;
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ child->web_layer_->removeFromParent();
+#else
child->web_layer_.removeFromParent();
+#endif
}
void Layer::StackAtTop(Layer* child) {
@@ -205,11 +220,19 @@ gfx::Rect Layer::GetTargetBounds() const {
}
void Layer::SetMasksToBounds(bool masks_to_bounds) {
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->setMasksToBounds(masks_to_bounds);
+#else
web_layer_.setMasksToBounds(masks_to_bounds);
+#endif
}
bool Layer::GetMasksToBounds() const {
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ return web_layer_->masksToBounds();
+#else
return web_layer_.masksToBounds();
+#endif
}
void Layer::SetOpacity(float opacity) {
@@ -224,7 +247,11 @@ void Layer::SetBackgroundBlur(int blur_radius) {
filters.append(WebKit::WebFilterOperation::createBlurFilter(
background_blur_radius_));
}
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->setBackgroundFilters(filters);
+#else
web_layer_.setBackgroundFilters(filters);
+#endif
}
void Layer::SetLayerSaturation(float saturation) {
@@ -275,8 +302,13 @@ void Layer::SetMaskLayer(Layer* layer_mask) {
if (layer_mask_)
layer_mask_->layer_mask_back_link_ = NULL;
layer_mask_ = layer_mask;
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->setMaskLayer(
+ layer_mask ? layer_mask->web_layer() : NULL);
+#else
web_layer_.setMaskLayer(
layer_mask ? layer_mask->web_layer() : WebKit::WebLayer());
+#endif
// We need to reference the linked object so that it can properly break the
// link to us when it gets deleted.
if (layer_mask)
@@ -303,7 +335,11 @@ void Layer::SetLayerFilters() {
layer_brightness_));
}
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->setFilters(filters);
+#else
web_layer_.setFilters(filters);
+#endif
}
float Layer::GetTargetOpacity() const {
@@ -357,7 +393,11 @@ void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) {
fills_bounds_opaquely_ = fills_bounds_opaquely;
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->setOpaque(fills_bounds_opaquely);
+#else
web_layer_.setOpaque(fills_bounds_opaquely);
+#endif
RecomputeDebugBorderColor();
}
@@ -367,31 +407,73 @@ void Layer::SetExternalTexture(Texture* texture) {
texture_ = texture;
if (web_layer_is_accelerated_ != layer_updated_externally_) {
// Switch to a different type of layer.
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->removeAllChildren();
+ content_layer_.reset();
+ solid_color_layer_.reset();
+ WebKit::WebLayer* new_layer = NULL;
+#else
web_layer_.removeAllChildren();
WebKit::WebLayer new_layer;
+#endif
if (layer_updated_externally_) {
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ texture_layer_.reset(WebKit::WebExternalTextureLayer::create());
+ texture_layer_->setFlipped(texture_->flipped());
+ new_layer = texture_layer_->layer();
+#else
WebKit::WebExternalTextureLayer texture_layer =
WebKit::WebExternalTextureLayer::create();
texture_layer.setFlipped(texture_->flipped());
new_layer = texture_layer;
+#endif
} else {
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ texture_layer_.reset();
+ solid_color_layer_.reset();
+ content_layer_.reset(WebKit::WebContentLayer::create(this));
+ new_layer = content_layer_->layer();
+#else
new_layer = WebKit::WebContentLayer::create(this);
+#endif
}
if (parent_) {
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ DCHECK(parent_->web_layer_);
+ parent_->web_layer_->replaceChild(web_layer_, new_layer);
+#else
DCHECK(!parent_->web_layer_.isNull());
parent_->web_layer_.replaceChild(web_layer_, new_layer);
+#endif
}
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_= new_layer;
+#else
web_layer_ = new_layer;
+#endif
web_layer_is_accelerated_ = layer_updated_externally_;
for (size_t i = 0; i < children_.size(); ++i) {
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ DCHECK(children_[i]->web_layer_);
+ web_layer_->addChild(children_[i]->web_layer_);
+#else
DCHECK(!children_[i]->web_layer_.isNull());
web_layer_.addChild(children_[i]->web_layer_);
+#endif
}
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ 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);
+ web_layer_->setForceRenderSurface(force_render_surface_);
+#else
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);
web_layer_.setForceRenderSurface(force_render_surface_);
+#endif
RecomputeTransform();
RecomputeDebugBorderColor();
}
@@ -401,8 +483,12 @@ void Layer::SetExternalTexture(Texture* texture) {
void Layer::SetColor(SkColor color) {
DCHECK_EQ(type_, LAYER_SOLID_COLOR);
// WebColor is equivalent to SkColor, per WebColor.h.
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ solid_color_layer_->setBackgroundColor(static_cast<WebKit::WebColor>(color));
+#else
web_layer_.to<WebKit::WebSolidColorLayer>().setBackgroundColor(
static_cast<WebKit::WebColor>(color));
+#endif
SetFillsBoundsOpaquely(SkColorGetA(color) == 0xFF);
}
@@ -447,11 +533,15 @@ void Layer::SendDamagedRects() {
damaged_in_pixel.y(),
damaged_in_pixel.width(),
damaged_in_pixel.height());
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->invalidateRect(web_rect);
+#else
if (!web_layer_is_accelerated_)
web_layer_.to<WebKit::WebContentLayer>().invalidateRect(web_rect);
else
web_layer_.to<WebKit::WebExternalTextureLayer>().invalidateRect(
web_rect);
+#endif
}
damaged_region_.setEmpty();
}
@@ -508,7 +598,11 @@ void Layer::SetForceRenderSurface(bool force) {
return;
force_render_surface_ = force;
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->setForceRenderSurface(force_render_surface_);
+#else
web_layer_.setForceRenderSurface(force_render_surface_);
+#endif
}
float Layer::GetCombinedOpacity() const {
@@ -540,8 +634,13 @@ void Layer::StackRelativeTo(Layer* child, Layer* other, bool above) {
children_.erase(children_.begin() + child_i);
children_.insert(children_.begin() + dest_i, child);
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ child->web_layer_->removeFromParent();
+ web_layer_->insertChild(child->web_layer_, dest_i);
+#else
child->web_layer_.removeFromParent();
web_layer_.insertChild(child->web_layer_, dest_i);
+#endif
}
bool Layer::ConvertPointForAncestor(const Layer* ancestor,
@@ -613,7 +712,11 @@ void Layer::SetOpacityImmediately(float opacity) {
opacity_ = opacity;
if (visible_)
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->setOpacity(opacity);
+#else
web_layer_.setOpacity(opacity);
+#endif
RecomputeDebugBorderColor();
if (schedule_draw)
ScheduleDraw();
@@ -625,7 +728,11 @@ void Layer::SetVisibilityImmediately(bool visible) {
visible_ = visible;
// TODO(piman): Expose a visibility flag on WebLayer.
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->setOpacity(visible_ ? opacity_ : 0.f);
+#else
web_layer_.setOpacity(visible_ ? opacity_ : 0.f);
+#endif
}
void Layer::SetBrightnessImmediately(float brightness) {
@@ -690,16 +797,32 @@ float Layer::GetGrayscaleForAnimation() const {
}
void Layer::CreateWebLayer() {
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ if (type_ == LAYER_SOLID_COLOR) {
+ solid_color_layer_.reset(WebKit::WebSolidColorLayer::create());
+ web_layer_ = solid_color_layer_->layer();
+ } else {
+ content_layer_.reset(WebKit::WebContentLayer::create(this));
+ web_layer_ = content_layer_->layer();
+ }
+#else
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);
+#endif
web_layer_is_accelerated_ = false;
show_debug_borders_ = CommandLine::ForCurrentProcess()->HasSwitch(
switches::kUIShowLayerBorders);
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->setAnchorPoint(WebKit::WebFloatPoint(0.f, 0.f));
+ web_layer_->setOpaque(true);
+ web_layer_->setDebugBorderWidth(show_debug_borders_ ? 2 : 0);
+#else
+ web_layer_.setAnchorPoint(WebKit::WebFloatPoint(0.f, 0.f));
+ web_layer_.setOpaque(true);
web_layer_.setDebugBorderWidth(show_debug_borders_ ? 2 : 0);
+#endif
}
void Layer::RecomputeTransform() {
@@ -715,22 +838,43 @@ void Layer::RecomputeTransform() {
transform.ConcatTransform(transform_);
transform.ConcatTranslate(bounds_.x(), bounds_.y());
transform.ConcatTransform(scale_translate);
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->setTransform(transform.matrix());
+#else
web_layer_.setTransform(transform.matrix());
+#endif
}
void Layer::RecomputeDrawsContentAndUVRect() {
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ DCHECK(web_layer_);
+#else
DCHECK(!web_layer_.isNull());
+#endif
bool should_draw = type_ != LAYER_NOT_DRAWN;
if (!web_layer_is_accelerated_) {
- if (type_ != LAYER_SOLID_COLOR)
+ if (type_ != LAYER_SOLID_COLOR) {
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->setDrawsContent(should_draw);
+#else
web_layer_.to<WebKit::WebContentLayer>().setDrawsContent(should_draw);
+#endif
+ }
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->setBounds(ConvertSizeToPixel(this, bounds_.size()));
+#else
web_layer_.setBounds(ConvertSizeToPixel(this, bounds_.size()));
+#endif
} else {
DCHECK(texture_);
unsigned int texture_id = texture_->texture_id();
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ texture_layer_->setTextureId(should_draw ? texture_id : 0);
+#else
WebKit::WebExternalTextureLayer texture_layer =
web_layer_.to<WebKit::WebExternalTextureLayer>();
texture_layer.setTextureId(should_draw ? texture_id : 0);
+#endif
gfx::Size texture_size;
if (scale_content_)
@@ -745,10 +889,18 @@ void Layer::RecomputeDrawsContentAndUVRect() {
0,
static_cast<float>(size.width())/texture_size.width(),
static_cast<float>(size.height())/texture_size.height());
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ texture_layer_->setUVRect(rect);
+#else
texture_layer.setUVRect(rect);
+#endif
gfx::Size size_in_pixel = ConvertSizeToPixel(this, size);
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->setBounds(size_in_pixel);
+#else
web_layer_.setBounds(size_in_pixel);
+#endif
}
}
@@ -760,7 +912,11 @@ void Layer::RecomputeDebugBorderColor() {
bool opaque = fills_bounds_opaquely_ && (GetCombinedOpacity() == 1.f);
if (!opaque)
color |= 0xFF;
+#if defined(WEBLAYER_IS_PURE_VIRTUAL)
+ web_layer_->setDebugBorderColor(color);
+#else
web_layer_.setDebugBorderColor(color);
+#endif
}
} // namespace ui