OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/compositor/layer.h" | 5 #include "ui/compositor/layer.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 layer_updated_externally_(false), | 54 layer_updated_externally_(false), |
55 opacity_(1.0f), | 55 opacity_(1.0f), |
56 background_blur_radius_(0), | 56 background_blur_radius_(0), |
57 layer_saturation_(0.0f), | 57 layer_saturation_(0.0f), |
58 layer_brightness_(0.0f), | 58 layer_brightness_(0.0f), |
59 layer_grayscale_(0.0f), | 59 layer_grayscale_(0.0f), |
60 layer_inverted_(false), | 60 layer_inverted_(false), |
61 layer_mask_(NULL), | 61 layer_mask_(NULL), |
62 layer_mask_back_link_(NULL), | 62 layer_mask_back_link_(NULL), |
63 delegate_(NULL), | 63 delegate_(NULL), |
64 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
65 web_layer_(NULL), | 64 web_layer_(NULL), |
66 #endif | |
67 scale_content_(true), | 65 scale_content_(true), |
68 device_scale_factor_(1.0f) { | 66 device_scale_factor_(1.0f) { |
69 CreateWebLayer(); | 67 CreateWebLayer(); |
70 } | 68 } |
71 | 69 |
72 Layer::Layer(LayerType type) | 70 Layer::Layer(LayerType type) |
73 : type_(type), | 71 : type_(type), |
74 compositor_(NULL), | 72 compositor_(NULL), |
75 parent_(NULL), | 73 parent_(NULL), |
76 visible_(true), | 74 visible_(true), |
(...skipping 22 matching lines...) Expand all Loading... |
99 if (compositor_) | 97 if (compositor_) |
100 compositor_->SetRootLayer(NULL); | 98 compositor_->SetRootLayer(NULL); |
101 if (parent_) | 99 if (parent_) |
102 parent_->Remove(this); | 100 parent_->Remove(this); |
103 if (layer_mask_) | 101 if (layer_mask_) |
104 SetMaskLayer(NULL); | 102 SetMaskLayer(NULL); |
105 if (layer_mask_back_link_) | 103 if (layer_mask_back_link_) |
106 layer_mask_back_link_->SetMaskLayer(NULL); | 104 layer_mask_back_link_->SetMaskLayer(NULL); |
107 for (size_t i = 0; i < children_.size(); ++i) | 105 for (size_t i = 0; i < children_.size(); ++i) |
108 children_[i]->parent_ = NULL; | 106 children_[i]->parent_ = NULL; |
109 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
110 web_layer_->removeFromParent(); | 107 web_layer_->removeFromParent(); |
111 #else | |
112 web_layer_.removeFromParent(); | |
113 #endif | |
114 } | 108 } |
115 | 109 |
116 Compositor* Layer::GetCompositor() { | 110 Compositor* Layer::GetCompositor() { |
117 return GetRoot(this)->compositor_; | 111 return GetRoot(this)->compositor_; |
118 } | 112 } |
119 | 113 |
120 void Layer::SetCompositor(Compositor* compositor) { | 114 void Layer::SetCompositor(Compositor* compositor) { |
121 // This function must only be called to set the compositor on the root layer, | 115 // This function must only be called to set the compositor on the root layer, |
122 // or to reset it. | 116 // or to reset it. |
123 DCHECK(!compositor || !compositor_); | 117 DCHECK(!compositor || !compositor_); |
124 DCHECK(!compositor || compositor->root_layer() == this); | 118 DCHECK(!compositor || compositor->root_layer() == this); |
125 DCHECK(!parent_); | 119 DCHECK(!parent_); |
126 compositor_ = compositor; | 120 compositor_ = compositor; |
127 if (compositor) | 121 if (compositor) |
128 OnDeviceScaleFactorChanged(compositor->device_scale_factor()); | 122 OnDeviceScaleFactorChanged(compositor->device_scale_factor()); |
129 } | 123 } |
130 | 124 |
131 void Layer::Add(Layer* child) { | 125 void Layer::Add(Layer* child) { |
132 DCHECK(!child->compositor_); | 126 DCHECK(!child->compositor_); |
133 if (child->parent_) | 127 if (child->parent_) |
134 child->parent_->Remove(child); | 128 child->parent_->Remove(child); |
135 child->parent_ = this; | 129 child->parent_ = this; |
136 children_.push_back(child); | 130 children_.push_back(child); |
137 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
138 web_layer_->addChild(child->web_layer_); | 131 web_layer_->addChild(child->web_layer_); |
139 #else | |
140 web_layer_.addChild(child->web_layer_); | |
141 #endif | |
142 child->OnDeviceScaleFactorChanged(device_scale_factor_); | 132 child->OnDeviceScaleFactorChanged(device_scale_factor_); |
143 } | 133 } |
144 | 134 |
145 void Layer::Remove(Layer* child) { | 135 void Layer::Remove(Layer* child) { |
146 std::vector<Layer*>::iterator i = | 136 std::vector<Layer*>::iterator i = |
147 std::find(children_.begin(), children_.end(), child); | 137 std::find(children_.begin(), children_.end(), child); |
148 DCHECK(i != children_.end()); | 138 DCHECK(i != children_.end()); |
149 children_.erase(i); | 139 children_.erase(i); |
150 child->parent_ = NULL; | 140 child->parent_ = NULL; |
151 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
152 child->web_layer_->removeFromParent(); | 141 child->web_layer_->removeFromParent(); |
153 #else | |
154 child->web_layer_.removeFromParent(); | |
155 #endif | |
156 } | 142 } |
157 | 143 |
158 void Layer::StackAtTop(Layer* child) { | 144 void Layer::StackAtTop(Layer* child) { |
159 if (children_.size() <= 1 || child == children_.back()) | 145 if (children_.size() <= 1 || child == children_.back()) |
160 return; // Already in front. | 146 return; // Already in front. |
161 StackAbove(child, children_.back()); | 147 StackAbove(child, children_.back()); |
162 } | 148 } |
163 | 149 |
164 void Layer::StackAbove(Layer* child, Layer* other) { | 150 void Layer::StackAbove(Layer* child, Layer* other) { |
165 StackRelativeTo(child, other, true); | 151 StackRelativeTo(child, other, true); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 | 199 |
214 gfx::Rect Layer::GetTargetBounds() const { | 200 gfx::Rect Layer::GetTargetBounds() const { |
215 if (animator_.get() && animator_->IsAnimatingProperty( | 201 if (animator_.get() && animator_->IsAnimatingProperty( |
216 LayerAnimationElement::BOUNDS)) { | 202 LayerAnimationElement::BOUNDS)) { |
217 return animator_->GetTargetBounds(); | 203 return animator_->GetTargetBounds(); |
218 } | 204 } |
219 return bounds_; | 205 return bounds_; |
220 } | 206 } |
221 | 207 |
222 void Layer::SetMasksToBounds(bool masks_to_bounds) { | 208 void Layer::SetMasksToBounds(bool masks_to_bounds) { |
223 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
224 web_layer_->setMasksToBounds(masks_to_bounds); | 209 web_layer_->setMasksToBounds(masks_to_bounds); |
225 #else | |
226 web_layer_.setMasksToBounds(masks_to_bounds); | |
227 #endif | |
228 } | 210 } |
229 | 211 |
230 bool Layer::GetMasksToBounds() const { | 212 bool Layer::GetMasksToBounds() const { |
231 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
232 return web_layer_->masksToBounds(); | 213 return web_layer_->masksToBounds(); |
233 #else | |
234 return web_layer_.masksToBounds(); | |
235 #endif | |
236 } | 214 } |
237 | 215 |
238 void Layer::SetOpacity(float opacity) { | 216 void Layer::SetOpacity(float opacity) { |
239 GetAnimator()->SetOpacity(opacity); | 217 GetAnimator()->SetOpacity(opacity); |
240 } | 218 } |
241 | 219 |
242 void Layer::SetBackgroundBlur(int blur_radius) { | 220 void Layer::SetBackgroundBlur(int blur_radius) { |
243 background_blur_radius_ = blur_radius; | 221 background_blur_radius_ = blur_radius; |
244 | 222 |
245 WebKit::WebFilterOperations filters; | 223 WebKit::WebFilterOperations filters; |
246 if (background_blur_radius_) { | 224 if (background_blur_radius_) { |
247 filters.append(WebKit::WebFilterOperation::createBlurFilter( | 225 filters.append(WebKit::WebFilterOperation::createBlurFilter( |
248 background_blur_radius_)); | 226 background_blur_radius_)); |
249 } | 227 } |
250 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
251 web_layer_->setBackgroundFilters(filters); | 228 web_layer_->setBackgroundFilters(filters); |
252 #else | |
253 web_layer_.setBackgroundFilters(filters); | |
254 #endif | |
255 } | 229 } |
256 | 230 |
257 void Layer::SetLayerSaturation(float saturation) { | 231 void Layer::SetLayerSaturation(float saturation) { |
258 layer_saturation_ = saturation; | 232 layer_saturation_ = saturation; |
259 SetLayerFilters(); | 233 SetLayerFilters(); |
260 } | 234 } |
261 | 235 |
262 void Layer::SetLayerBrightness(float brightness) { | 236 void Layer::SetLayerBrightness(float brightness) { |
263 GetAnimator()->SetBrightness(brightness); | 237 GetAnimator()->SetBrightness(brightness); |
264 } | 238 } |
(...skipping 30 matching lines...) Expand all Loading... |
295 layer_mask->children().empty() && | 269 layer_mask->children().empty() && |
296 !layer_mask->layer_mask_back_link_)); | 270 !layer_mask->layer_mask_back_link_)); |
297 DCHECK(!layer_mask_back_link_); | 271 DCHECK(!layer_mask_back_link_); |
298 if (layer_mask_ == layer_mask) | 272 if (layer_mask_ == layer_mask) |
299 return; | 273 return; |
300 // We need to de-reference the currently linked object so that no problem | 274 // We need to de-reference the currently linked object so that no problem |
301 // arises if the mask layer gets deleted before this object. | 275 // arises if the mask layer gets deleted before this object. |
302 if (layer_mask_) | 276 if (layer_mask_) |
303 layer_mask_->layer_mask_back_link_ = NULL; | 277 layer_mask_->layer_mask_back_link_ = NULL; |
304 layer_mask_ = layer_mask; | 278 layer_mask_ = layer_mask; |
305 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
306 web_layer_->setMaskLayer( | 279 web_layer_->setMaskLayer( |
307 layer_mask ? layer_mask->web_layer() : NULL); | 280 layer_mask ? layer_mask->web_layer() : NULL); |
308 #else | |
309 web_layer_.setMaskLayer( | |
310 layer_mask ? layer_mask->web_layer() : WebKit::WebLayer()); | |
311 #endif | |
312 // We need to reference the linked object so that it can properly break the | 281 // We need to reference the linked object so that it can properly break the |
313 // link to us when it gets deleted. | 282 // link to us when it gets deleted. |
314 if (layer_mask) | 283 if (layer_mask) |
315 layer_mask->layer_mask_back_link_ = this; | 284 layer_mask->layer_mask_back_link_ = this; |
316 } | 285 } |
317 | 286 |
318 void Layer::SetLayerFilters() { | 287 void Layer::SetLayerFilters() { |
319 WebKit::WebFilterOperations filters; | 288 WebKit::WebFilterOperations filters; |
320 if (layer_saturation_) { | 289 if (layer_saturation_) { |
321 filters.append(WebKit::WebFilterOperation::createSaturateFilter( | 290 filters.append(WebKit::WebFilterOperation::createSaturateFilter( |
322 layer_saturation_)); | 291 layer_saturation_)); |
323 } | 292 } |
324 if (layer_grayscale_) { | 293 if (layer_grayscale_) { |
325 filters.append(WebKit::WebFilterOperation::createGrayscaleFilter( | 294 filters.append(WebKit::WebFilterOperation::createGrayscaleFilter( |
326 layer_grayscale_)); | 295 layer_grayscale_)); |
327 } | 296 } |
328 if (layer_inverted_) | 297 if (layer_inverted_) |
329 filters.append(WebKit::WebFilterOperation::createInvertFilter(1.0)); | 298 filters.append(WebKit::WebFilterOperation::createInvertFilter(1.0)); |
330 // Brightness goes last, because the resulting colors neeed clamping, which | 299 // Brightness goes last, because the resulting colors neeed clamping, which |
331 // cause further color matrix filters to be applied separately. In this order, | 300 // cause further color matrix filters to be applied separately. In this order, |
332 // they all can be combined in a single pass. | 301 // they all can be combined in a single pass. |
333 if (layer_brightness_) { | 302 if (layer_brightness_) { |
334 filters.append(WebKit::WebFilterOperation::createBrightnessFilter( | 303 filters.append(WebKit::WebFilterOperation::createBrightnessFilter( |
335 layer_brightness_)); | 304 layer_brightness_)); |
336 } | 305 } |
337 | 306 |
338 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
339 web_layer_->setFilters(filters); | 307 web_layer_->setFilters(filters); |
340 #else | |
341 web_layer_.setFilters(filters); | |
342 #endif | |
343 } | 308 } |
344 | 309 |
345 float Layer::GetTargetOpacity() const { | 310 float Layer::GetTargetOpacity() const { |
346 if (animator_.get() && animator_->IsAnimatingProperty( | 311 if (animator_.get() && animator_->IsAnimatingProperty( |
347 LayerAnimationElement::OPACITY)) | 312 LayerAnimationElement::OPACITY)) |
348 return animator_->GetTargetOpacity(); | 313 return animator_->GetTargetOpacity(); |
349 return opacity_; | 314 return opacity_; |
350 } | 315 } |
351 | 316 |
352 void Layer::SetVisible(bool visible) { | 317 void Layer::SetVisible(bool visible) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 if (target != root_layer) | 351 if (target != root_layer) |
387 target->ConvertPointFromAncestor(root_layer, point); | 352 target->ConvertPointFromAncestor(root_layer, point); |
388 } | 353 } |
389 | 354 |
390 void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) { | 355 void Layer::SetFillsBoundsOpaquely(bool fills_bounds_opaquely) { |
391 if (fills_bounds_opaquely_ == fills_bounds_opaquely) | 356 if (fills_bounds_opaquely_ == fills_bounds_opaquely) |
392 return; | 357 return; |
393 | 358 |
394 fills_bounds_opaquely_ = fills_bounds_opaquely; | 359 fills_bounds_opaquely_ = fills_bounds_opaquely; |
395 | 360 |
396 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
397 web_layer_->setOpaque(fills_bounds_opaquely); | 361 web_layer_->setOpaque(fills_bounds_opaquely); |
398 #else | |
399 web_layer_.setOpaque(fills_bounds_opaquely); | |
400 #endif | |
401 RecomputeDebugBorderColor(); | 362 RecomputeDebugBorderColor(); |
402 } | 363 } |
403 | 364 |
404 void Layer::SetExternalTexture(Texture* texture) { | 365 void Layer::SetExternalTexture(Texture* texture) { |
405 DCHECK_EQ(type_, LAYER_TEXTURED); | 366 DCHECK_EQ(type_, LAYER_TEXTURED); |
406 layer_updated_externally_ = !!texture; | 367 layer_updated_externally_ = !!texture; |
407 texture_ = texture; | 368 texture_ = texture; |
408 if (web_layer_is_accelerated_ != layer_updated_externally_) { | 369 if (web_layer_is_accelerated_ != layer_updated_externally_) { |
409 // Switch to a different type of layer. | 370 // Switch to a different type of layer. |
410 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
411 web_layer_->removeAllChildren(); | 371 web_layer_->removeAllChildren(); |
412 scoped_ptr<WebKit::WebContentLayer> old_content_layer( | 372 scoped_ptr<WebKit::WebContentLayer> old_content_layer( |
413 content_layer_.release()); | 373 content_layer_.release()); |
414 scoped_ptr<WebKit::WebSolidColorLayer> old_solid_layer( | 374 scoped_ptr<WebKit::WebSolidColorLayer> old_solid_layer( |
415 solid_color_layer_.release()); | 375 solid_color_layer_.release()); |
416 scoped_ptr<WebKit::WebExternalTextureLayer> old_texture_layer( | 376 scoped_ptr<WebKit::WebExternalTextureLayer> old_texture_layer( |
417 texture_layer_.release()); | 377 texture_layer_.release()); |
418 WebKit::WebLayer* new_layer = NULL; | 378 WebKit::WebLayer* new_layer = NULL; |
419 #else | |
420 web_layer_.removeAllChildren(); | |
421 WebKit::WebLayer new_layer; | |
422 #endif | |
423 if (layer_updated_externally_) { | 379 if (layer_updated_externally_) { |
424 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
425 texture_layer_.reset(WebKit::WebExternalTextureLayer::create()); | 380 texture_layer_.reset(WebKit::WebExternalTextureLayer::create()); |
426 texture_layer_->setFlipped(texture_->flipped()); | 381 texture_layer_->setFlipped(texture_->flipped()); |
427 new_layer = texture_layer_->layer(); | 382 new_layer = texture_layer_->layer(); |
428 #else | |
429 WebKit::WebExternalTextureLayer texture_layer = | |
430 WebKit::WebExternalTextureLayer::create(); | |
431 texture_layer.setFlipped(texture_->flipped()); | |
432 new_layer = texture_layer; | |
433 #endif | |
434 } else { | 383 } else { |
435 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
436 content_layer_.reset(WebKit::WebContentLayer::create(this)); | 384 content_layer_.reset(WebKit::WebContentLayer::create(this)); |
437 new_layer = content_layer_->layer(); | 385 new_layer = content_layer_->layer(); |
438 #else | |
439 new_layer = WebKit::WebContentLayer::create(this); | |
440 #endif | |
441 } | 386 } |
442 if (parent_) { | 387 if (parent_) { |
443 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
444 DCHECK(parent_->web_layer_); | 388 DCHECK(parent_->web_layer_); |
445 parent_->web_layer_->replaceChild(web_layer_, new_layer); | 389 parent_->web_layer_->replaceChild(web_layer_, new_layer); |
446 #else | |
447 DCHECK(!parent_->web_layer_.isNull()); | |
448 parent_->web_layer_.replaceChild(web_layer_, new_layer); | |
449 #endif | |
450 } | 390 } |
451 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
452 web_layer_= new_layer; | 391 web_layer_= new_layer; |
453 #else | |
454 web_layer_ = new_layer; | |
455 #endif | |
456 web_layer_is_accelerated_ = layer_updated_externally_; | 392 web_layer_is_accelerated_ = layer_updated_externally_; |
457 for (size_t i = 0; i < children_.size(); ++i) { | 393 for (size_t i = 0; i < children_.size(); ++i) { |
458 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
459 DCHECK(children_[i]->web_layer_); | 394 DCHECK(children_[i]->web_layer_); |
460 web_layer_->addChild(children_[i]->web_layer_); | 395 web_layer_->addChild(children_[i]->web_layer_); |
461 #else | |
462 DCHECK(!children_[i]->web_layer_.isNull()); | |
463 web_layer_.addChild(children_[i]->web_layer_); | |
464 #endif | |
465 } | 396 } |
466 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
467 web_layer_->setAnchorPoint(WebKit::WebFloatPoint(0.f, 0.f)); | 397 web_layer_->setAnchorPoint(WebKit::WebFloatPoint(0.f, 0.f)); |
468 web_layer_->setOpaque(fills_bounds_opaquely_); | 398 web_layer_->setOpaque(fills_bounds_opaquely_); |
469 web_layer_->setOpacity(visible_ ? opacity_ : 0.f); | 399 web_layer_->setOpacity(visible_ ? opacity_ : 0.f); |
470 web_layer_->setDebugBorderWidth(show_debug_borders_ ? 2 : 0); | 400 web_layer_->setDebugBorderWidth(show_debug_borders_ ? 2 : 0); |
471 web_layer_->setForceRenderSurface(force_render_surface_); | 401 web_layer_->setForceRenderSurface(force_render_surface_); |
472 #else | |
473 web_layer_.setAnchorPoint(WebKit::WebFloatPoint(0.f, 0.f)); | |
474 web_layer_.setOpaque(fills_bounds_opaquely_); | |
475 web_layer_.setOpacity(visible_ ? opacity_ : 0.f); | |
476 web_layer_.setDebugBorderWidth(show_debug_borders_ ? 2 : 0); | |
477 web_layer_.setForceRenderSurface(force_render_surface_); | |
478 #endif | |
479 RecomputeTransform(); | 402 RecomputeTransform(); |
480 RecomputeDebugBorderColor(); | 403 RecomputeDebugBorderColor(); |
481 } | 404 } |
482 RecomputeDrawsContentAndUVRect(); | 405 RecomputeDrawsContentAndUVRect(); |
483 } | 406 } |
484 | 407 |
485 void Layer::SetColor(SkColor color) { | 408 void Layer::SetColor(SkColor color) { |
486 DCHECK_EQ(type_, LAYER_SOLID_COLOR); | 409 DCHECK_EQ(type_, LAYER_SOLID_COLOR); |
487 // WebColor is equivalent to SkColor, per WebColor.h. | 410 // WebColor is equivalent to SkColor, per WebColor.h. |
488 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
489 solid_color_layer_->setBackgroundColor(static_cast<WebKit::WebColor>(color)); | 411 solid_color_layer_->setBackgroundColor(static_cast<WebKit::WebColor>(color)); |
490 #else | |
491 web_layer_.to<WebKit::WebSolidColorLayer>().setBackgroundColor( | |
492 static_cast<WebKit::WebColor>(color)); | |
493 #endif | |
494 SetFillsBoundsOpaquely(SkColorGetA(color) == 0xFF); | 412 SetFillsBoundsOpaquely(SkColorGetA(color) == 0xFF); |
495 } | 413 } |
496 | 414 |
497 bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) { | 415 bool Layer::SchedulePaint(const gfx::Rect& invalid_rect) { |
498 if (type_ == LAYER_SOLID_COLOR || (!delegate_ && !texture_)) | 416 if (type_ == LAYER_SOLID_COLOR || (!delegate_ && !texture_)) |
499 return false; | 417 return false; |
500 | 418 |
501 damaged_region_.op(invalid_rect.x(), | 419 damaged_region_.op(invalid_rect.x(), |
502 invalid_rect.y(), | 420 invalid_rect.y(), |
503 invalid_rect.right(), | 421 invalid_rect.right(), |
(...skipping 24 matching lines...) Expand all Loading... |
528 damaged.Inset(-1, -1); | 446 damaged.Inset(-1, -1); |
529 damaged = damaged.Intersect(gfx::Rect(bounds_.size())); | 447 damaged = damaged.Intersect(gfx::Rect(bounds_.size())); |
530 } | 448 } |
531 | 449 |
532 gfx::Rect damaged_in_pixel = ConvertRectToPixel(this, damaged); | 450 gfx::Rect damaged_in_pixel = ConvertRectToPixel(this, damaged); |
533 WebKit::WebFloatRect web_rect( | 451 WebKit::WebFloatRect web_rect( |
534 damaged_in_pixel.x(), | 452 damaged_in_pixel.x(), |
535 damaged_in_pixel.y(), | 453 damaged_in_pixel.y(), |
536 damaged_in_pixel.width(), | 454 damaged_in_pixel.width(), |
537 damaged_in_pixel.height()); | 455 damaged_in_pixel.height()); |
538 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
539 web_layer_->invalidateRect(web_rect); | 456 web_layer_->invalidateRect(web_rect); |
540 #else | |
541 if (!web_layer_is_accelerated_) | |
542 web_layer_.to<WebKit::WebContentLayer>().invalidateRect(web_rect); | |
543 else | |
544 web_layer_.to<WebKit::WebExternalTextureLayer>().invalidateRect( | |
545 web_rect); | |
546 #endif | |
547 } | 457 } |
548 damaged_region_.setEmpty(); | 458 damaged_region_.setEmpty(); |
549 } | 459 } |
550 for (size_t i = 0; i < children_.size(); ++i) | 460 for (size_t i = 0; i < children_.size(); ++i) |
551 children_[i]->SendDamagedRects(); | 461 children_[i]->SendDamagedRects(); |
552 } | 462 } |
553 | 463 |
554 void Layer::SuppressPaint() { | 464 void Layer::SuppressPaint() { |
555 if (!delegate_) | 465 if (!delegate_) |
556 return; | 466 return; |
(...skipping 10 matching lines...) Expand all Loading... |
567 RecomputeDrawsContentAndUVRect(); | 477 RecomputeDrawsContentAndUVRect(); |
568 SchedulePaint(gfx::Rect(bounds_.size())); | 478 SchedulePaint(gfx::Rect(bounds_.size())); |
569 if (delegate_) | 479 if (delegate_) |
570 delegate_->OnDeviceScaleFactorChanged(device_scale_factor); | 480 delegate_->OnDeviceScaleFactorChanged(device_scale_factor); |
571 for (size_t i = 0; i < children_.size(); ++i) | 481 for (size_t i = 0; i < children_.size(); ++i) |
572 children_[i]->OnDeviceScaleFactorChanged(device_scale_factor); | 482 children_[i]->OnDeviceScaleFactorChanged(device_scale_factor); |
573 } | 483 } |
574 | 484 |
575 void Layer::paintContents(WebKit::WebCanvas* web_canvas, | 485 void Layer::paintContents(WebKit::WebCanvas* web_canvas, |
576 const WebKit::WebRect& clip, | 486 const WebKit::WebRect& clip, |
577 #if defined(WEBCONTENTLAYERCLIENT_FLOAT_OPAQUE_RECT) | |
578 WebKit::WebFloatRect& opaque) { | 487 WebKit::WebFloatRect& opaque) { |
579 #else | |
580 WebKit::WebRect& opaque) { | |
581 #endif | |
582 TRACE_EVENT0("ui", "Layer::paintContents"); | 488 TRACE_EVENT0("ui", "Layer::paintContents"); |
583 scoped_ptr<gfx::Canvas> canvas(gfx::Canvas::CreateCanvasWithoutScaling( | 489 scoped_ptr<gfx::Canvas> canvas(gfx::Canvas::CreateCanvasWithoutScaling( |
584 web_canvas, ui::GetScaleFactorFromScale(device_scale_factor_))); | 490 web_canvas, ui::GetScaleFactorFromScale(device_scale_factor_))); |
585 | 491 |
586 if (scale_content_) { | 492 if (scale_content_) { |
587 canvas->Save(); | 493 canvas->Save(); |
588 canvas->sk_canvas()->scale(SkFloatToScalar(device_scale_factor_), | 494 canvas->sk_canvas()->scale(SkFloatToScalar(device_scale_factor_), |
589 SkFloatToScalar(device_scale_factor_)); | 495 SkFloatToScalar(device_scale_factor_)); |
590 } | 496 } |
591 | 497 |
592 if (delegate_) | 498 if (delegate_) |
593 delegate_->OnPaintLayer(canvas.get()); | 499 delegate_->OnPaintLayer(canvas.get()); |
594 if (scale_content_) | 500 if (scale_content_) |
595 canvas->Restore(); | 501 canvas->Restore(); |
596 } | 502 } |
597 | 503 |
598 void Layer::SetForceRenderSurface(bool force) { | 504 void Layer::SetForceRenderSurface(bool force) { |
599 if (force_render_surface_ == force) | 505 if (force_render_surface_ == force) |
600 return; | 506 return; |
601 | 507 |
602 force_render_surface_ = force; | 508 force_render_surface_ = force; |
603 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
604 web_layer_->setForceRenderSurface(force_render_surface_); | 509 web_layer_->setForceRenderSurface(force_render_surface_); |
605 #else | |
606 web_layer_.setForceRenderSurface(force_render_surface_); | |
607 #endif | |
608 } | 510 } |
609 | 511 |
610 float Layer::GetCombinedOpacity() const { | 512 float Layer::GetCombinedOpacity() const { |
611 float opacity = opacity_; | 513 float opacity = opacity_; |
612 Layer* current = this->parent_; | 514 Layer* current = this->parent_; |
613 while (current) { | 515 while (current) { |
614 opacity *= current->opacity_; | 516 opacity *= current->opacity_; |
615 current = current->parent_; | 517 current = current->parent_; |
616 } | 518 } |
617 return opacity; | 519 return opacity; |
(...skipping 11 matching lines...) Expand all Loading... |
629 if ((above && child_i == other_i + 1) || (!above && child_i + 1 == other_i)) | 531 if ((above && child_i == other_i + 1) || (!above && child_i + 1 == other_i)) |
630 return; | 532 return; |
631 | 533 |
632 const size_t dest_i = | 534 const size_t dest_i = |
633 above ? | 535 above ? |
634 (child_i < other_i ? other_i : other_i + 1) : | 536 (child_i < other_i ? other_i : other_i + 1) : |
635 (child_i < other_i ? other_i - 1 : other_i); | 537 (child_i < other_i ? other_i - 1 : other_i); |
636 children_.erase(children_.begin() + child_i); | 538 children_.erase(children_.begin() + child_i); |
637 children_.insert(children_.begin() + dest_i, child); | 539 children_.insert(children_.begin() + dest_i, child); |
638 | 540 |
639 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
640 child->web_layer_->removeFromParent(); | 541 child->web_layer_->removeFromParent(); |
641 web_layer_->insertChild(child->web_layer_, dest_i); | 542 web_layer_->insertChild(child->web_layer_, dest_i); |
642 #else | |
643 child->web_layer_.removeFromParent(); | |
644 web_layer_.insertChild(child->web_layer_, dest_i); | |
645 #endif | |
646 } | 543 } |
647 | 544 |
648 bool Layer::ConvertPointForAncestor(const Layer* ancestor, | 545 bool Layer::ConvertPointForAncestor(const Layer* ancestor, |
649 gfx::Point* point) const { | 546 gfx::Point* point) const { |
650 ui::Transform transform; | 547 ui::Transform transform; |
651 bool result = GetTransformRelativeTo(ancestor, &transform); | 548 bool result = GetTransformRelativeTo(ancestor, &transform); |
652 gfx::Point3f p(*point); | 549 gfx::Point3f p(*point); |
653 transform.TransformPoint(p); | 550 transform.TransformPoint(p); |
654 *point = p.AsPoint(); | 551 *point = p.AsPoint(); |
655 return result; | 552 return result; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
707 transform_ = transform; | 604 transform_ = transform; |
708 | 605 |
709 RecomputeTransform(); | 606 RecomputeTransform(); |
710 } | 607 } |
711 | 608 |
712 void Layer::SetOpacityImmediately(float opacity) { | 609 void Layer::SetOpacityImmediately(float opacity) { |
713 bool schedule_draw = (opacity != opacity_ && IsDrawn()); | 610 bool schedule_draw = (opacity != opacity_ && IsDrawn()); |
714 opacity_ = opacity; | 611 opacity_ = opacity; |
715 | 612 |
716 if (visible_) | 613 if (visible_) |
717 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
718 web_layer_->setOpacity(opacity); | 614 web_layer_->setOpacity(opacity); |
719 #else | |
720 web_layer_.setOpacity(opacity); | |
721 #endif | |
722 RecomputeDebugBorderColor(); | 615 RecomputeDebugBorderColor(); |
723 if (schedule_draw) | 616 if (schedule_draw) |
724 ScheduleDraw(); | 617 ScheduleDraw(); |
725 } | 618 } |
726 | 619 |
727 void Layer::SetVisibilityImmediately(bool visible) { | 620 void Layer::SetVisibilityImmediately(bool visible) { |
728 if (visible_ == visible) | 621 if (visible_ == visible) |
729 return; | 622 return; |
730 | 623 |
731 visible_ = visible; | 624 visible_ = visible; |
732 // TODO(piman): Expose a visibility flag on WebLayer. | 625 // TODO(piman): Expose a visibility flag on WebLayer. |
733 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
734 web_layer_->setOpacity(visible_ ? opacity_ : 0.f); | 626 web_layer_->setOpacity(visible_ ? opacity_ : 0.f); |
735 #else | |
736 web_layer_.setOpacity(visible_ ? opacity_ : 0.f); | |
737 #endif | |
738 } | 627 } |
739 | 628 |
740 void Layer::SetBrightnessImmediately(float brightness) { | 629 void Layer::SetBrightnessImmediately(float brightness) { |
741 layer_brightness_ = brightness; | 630 layer_brightness_ = brightness; |
742 SetLayerFilters(); | 631 SetLayerFilters(); |
743 } | 632 } |
744 | 633 |
745 void Layer::SetGrayscaleImmediately(float grayscale) { | 634 void Layer::SetGrayscaleImmediately(float grayscale) { |
746 layer_grayscale_ = grayscale; | 635 layer_grayscale_ = grayscale; |
747 SetLayerFilters(); | 636 SetLayerFilters(); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
792 | 681 |
793 float Layer::GetBrightnessForAnimation() const { | 682 float Layer::GetBrightnessForAnimation() const { |
794 return layer_brightness(); | 683 return layer_brightness(); |
795 } | 684 } |
796 | 685 |
797 float Layer::GetGrayscaleForAnimation() const { | 686 float Layer::GetGrayscaleForAnimation() const { |
798 return layer_grayscale(); | 687 return layer_grayscale(); |
799 } | 688 } |
800 | 689 |
801 void Layer::CreateWebLayer() { | 690 void Layer::CreateWebLayer() { |
802 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
803 if (type_ == LAYER_SOLID_COLOR) { | 691 if (type_ == LAYER_SOLID_COLOR) { |
804 solid_color_layer_.reset(WebKit::WebSolidColorLayer::create()); | 692 solid_color_layer_.reset(WebKit::WebSolidColorLayer::create()); |
805 web_layer_ = solid_color_layer_->layer(); | 693 web_layer_ = solid_color_layer_->layer(); |
806 } else { | 694 } else { |
807 content_layer_.reset(WebKit::WebContentLayer::create(this)); | 695 content_layer_.reset(WebKit::WebContentLayer::create(this)); |
808 web_layer_ = content_layer_->layer(); | 696 web_layer_ = content_layer_->layer(); |
809 } | 697 } |
810 #else | |
811 if (type_ == LAYER_SOLID_COLOR) | |
812 web_layer_ = WebKit::WebSolidColorLayer::create(); | |
813 else | |
814 web_layer_ = WebKit::WebContentLayer::create(this); | |
815 #endif | |
816 web_layer_is_accelerated_ = false; | 698 web_layer_is_accelerated_ = false; |
817 show_debug_borders_ = CommandLine::ForCurrentProcess()->HasSwitch( | 699 show_debug_borders_ = CommandLine::ForCurrentProcess()->HasSwitch( |
818 switches::kUIShowLayerBorders); | 700 switches::kUIShowLayerBorders); |
819 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
820 web_layer_->setAnchorPoint(WebKit::WebFloatPoint(0.f, 0.f)); | 701 web_layer_->setAnchorPoint(WebKit::WebFloatPoint(0.f, 0.f)); |
821 web_layer_->setOpaque(true); | 702 web_layer_->setOpaque(true); |
822 web_layer_->setDebugBorderWidth(show_debug_borders_ ? 2 : 0); | 703 web_layer_->setDebugBorderWidth(show_debug_borders_ ? 2 : 0); |
823 #else | |
824 web_layer_.setAnchorPoint(WebKit::WebFloatPoint(0.f, 0.f)); | |
825 web_layer_.setOpaque(true); | |
826 web_layer_.setDebugBorderWidth(show_debug_borders_ ? 2 : 0); | |
827 #endif | |
828 } | 704 } |
829 | 705 |
830 void Layer::RecomputeTransform() { | 706 void Layer::RecomputeTransform() { |
831 ui::Transform scale_translate; | 707 ui::Transform scale_translate; |
832 scale_translate.matrix().set3x3(device_scale_factor_, 0, 0, | 708 scale_translate.matrix().set3x3(device_scale_factor_, 0, 0, |
833 0, device_scale_factor_, 0, | 709 0, device_scale_factor_, 0, |
834 0, 0, 1); | 710 0, 0, 1); |
835 // Start with the inverse matrix of above. | 711 // Start with the inverse matrix of above. |
836 Transform transform; | 712 Transform transform; |
837 transform.matrix().set3x3(1.0f / device_scale_factor_, 0, 0, | 713 transform.matrix().set3x3(1.0f / device_scale_factor_, 0, 0, |
838 0, 1.0f / device_scale_factor_, 0, | 714 0, 1.0f / device_scale_factor_, 0, |
839 0, 0, 1); | 715 0, 0, 1); |
840 transform.ConcatTransform(transform_); | 716 transform.ConcatTransform(transform_); |
841 transform.ConcatTranslate(bounds_.x(), bounds_.y()); | 717 transform.ConcatTranslate(bounds_.x(), bounds_.y()); |
842 transform.ConcatTransform(scale_translate); | 718 transform.ConcatTransform(scale_translate); |
843 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
844 web_layer_->setTransform(transform.matrix()); | 719 web_layer_->setTransform(transform.matrix()); |
845 #else | |
846 web_layer_.setTransform(transform.matrix()); | |
847 #endif | |
848 } | 720 } |
849 | 721 |
850 void Layer::RecomputeDrawsContentAndUVRect() { | 722 void Layer::RecomputeDrawsContentAndUVRect() { |
851 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
852 DCHECK(web_layer_); | 723 DCHECK(web_layer_); |
853 #else | |
854 DCHECK(!web_layer_.isNull()); | |
855 #endif | |
856 bool should_draw = type_ != LAYER_NOT_DRAWN; | 724 bool should_draw = type_ != LAYER_NOT_DRAWN; |
857 if (!web_layer_is_accelerated_) { | 725 if (!web_layer_is_accelerated_) { |
858 if (type_ != LAYER_SOLID_COLOR) { | 726 if (type_ != LAYER_SOLID_COLOR) { |
859 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
860 web_layer_->setDrawsContent(should_draw); | 727 web_layer_->setDrawsContent(should_draw); |
861 #else | |
862 web_layer_.to<WebKit::WebContentLayer>().setDrawsContent(should_draw); | |
863 #endif | |
864 } | 728 } |
865 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
866 web_layer_->setBounds(ConvertSizeToPixel(this, bounds_.size())); | 729 web_layer_->setBounds(ConvertSizeToPixel(this, bounds_.size())); |
867 #else | |
868 web_layer_.setBounds(ConvertSizeToPixel(this, bounds_.size())); | |
869 #endif | |
870 } else { | 730 } else { |
871 DCHECK(texture_); | 731 DCHECK(texture_); |
872 unsigned int texture_id = texture_->texture_id(); | 732 unsigned int texture_id = texture_->texture_id(); |
873 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
874 texture_layer_->setTextureId(should_draw ? texture_id : 0); | 733 texture_layer_->setTextureId(should_draw ? texture_id : 0); |
875 #else | |
876 WebKit::WebExternalTextureLayer texture_layer = | |
877 web_layer_.to<WebKit::WebExternalTextureLayer>(); | |
878 texture_layer.setTextureId(should_draw ? texture_id : 0); | |
879 #endif | |
880 | 734 |
881 gfx::Size texture_size; | 735 gfx::Size texture_size; |
882 if (scale_content_) | 736 if (scale_content_) |
883 texture_size = texture_->size(); | 737 texture_size = texture_->size(); |
884 else | 738 else |
885 texture_size = ConvertSizeToDIP(this, texture_->size()); | 739 texture_size = ConvertSizeToDIP(this, texture_->size()); |
886 | 740 |
887 gfx::Size size(std::min(bounds().width(), texture_size.width()), | 741 gfx::Size size(std::min(bounds().width(), texture_size.width()), |
888 std::min(bounds().height(), texture_size.height())); | 742 std::min(bounds().height(), texture_size.height())); |
889 WebKit::WebFloatRect rect( | 743 WebKit::WebFloatRect rect( |
890 0, | 744 0, |
891 0, | 745 0, |
892 static_cast<float>(size.width())/texture_size.width(), | 746 static_cast<float>(size.width())/texture_size.width(), |
893 static_cast<float>(size.height())/texture_size.height()); | 747 static_cast<float>(size.height())/texture_size.height()); |
894 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
895 texture_layer_->setUVRect(rect); | 748 texture_layer_->setUVRect(rect); |
896 #else | |
897 texture_layer.setUVRect(rect); | |
898 #endif | |
899 | 749 |
900 gfx::Size size_in_pixel = ConvertSizeToPixel(this, size); | 750 gfx::Size size_in_pixel = ConvertSizeToPixel(this, size); |
901 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
902 web_layer_->setBounds(size_in_pixel); | 751 web_layer_->setBounds(size_in_pixel); |
903 #else | |
904 web_layer_.setBounds(size_in_pixel); | |
905 #endif | |
906 } | 752 } |
907 } | 753 } |
908 | 754 |
909 void Layer::RecomputeDebugBorderColor() { | 755 void Layer::RecomputeDebugBorderColor() { |
910 if (!show_debug_borders_) | 756 if (!show_debug_borders_) |
911 return; | 757 return; |
912 unsigned int color = 0xFF000000; | 758 unsigned int color = 0xFF000000; |
913 color |= web_layer_is_accelerated_ ? 0x0000FF00 : 0x00FF0000; | 759 color |= web_layer_is_accelerated_ ? 0x0000FF00 : 0x00FF0000; |
914 bool opaque = fills_bounds_opaquely_ && (GetCombinedOpacity() == 1.f); | 760 bool opaque = fills_bounds_opaquely_ && (GetCombinedOpacity() == 1.f); |
915 if (!opaque) | 761 if (!opaque) |
916 color |= 0xFF; | 762 color |= 0xFF; |
917 #if defined(WEBLAYER_IS_PURE_VIRTUAL) | |
918 web_layer_->setDebugBorderColor(color); | 763 web_layer_->setDebugBorderColor(color); |
919 #else | |
920 web_layer_.setDebugBorderColor(color); | |
921 #endif | |
922 } | 764 } |
923 | 765 |
924 } // namespace ui | 766 } // namespace ui |
OLD | NEW |