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

Side by Side Diff: views/view.cc

Issue 8362006: Reland r107720 - Enable the new layer animation framework. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge with master. Created 9 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "views/view.h" 5 #include "views/view.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/debug/trace_event.h" 9 #include "base/debug/trace_event.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/message_loop.h" 12 #include "base/message_loop.h"
13 #include "base/stringprintf.h" 13 #include "base/stringprintf.h"
14 #include "base/utf_string_conversions.h" 14 #include "base/utf_string_conversions.h"
15 #include "third_party/skia/include/core/SkRect.h" 15 #include "third_party/skia/include/core/SkRect.h"
16 #include "ui/base/accessibility/accessibility_types.h" 16 #include "ui/base/accessibility/accessibility_types.h"
17 #include "ui/base/dragdrop/drag_drop_types.h" 17 #include "ui/base/dragdrop/drag_drop_types.h"
18 #include "ui/gfx/canvas_skia.h" 18 #include "ui/gfx/canvas_skia.h"
19 #include "ui/gfx/compositor/compositor.h" 19 #include "ui/gfx/compositor/compositor.h"
20 #include "ui/gfx/compositor/layer.h" 20 #include "ui/gfx/compositor/layer.h"
21 #include "ui/gfx/compositor/layer_animator.h"
21 #include "ui/gfx/interpolated_transform.h" 22 #include "ui/gfx/interpolated_transform.h"
22 #include "ui/gfx/path.h" 23 #include "ui/gfx/path.h"
23 #include "ui/gfx/point3.h" 24 #include "ui/gfx/point3.h"
24 #include "ui/gfx/transform.h" 25 #include "ui/gfx/transform.h"
25 #include "views/background.h" 26 #include "views/background.h"
26 #include "views/context_menu_controller.h" 27 #include "views/context_menu_controller.h"
27 #include "views/drag_controller.h" 28 #include "views/drag_controller.h"
28 #include "views/layer_property_setter.h"
29 #include "views/layout/layout_manager.h" 29 #include "views/layout/layout_manager.h"
30 #include "views/views_delegate.h" 30 #include "views/views_delegate.h"
31 #include "views/widget/native_widget_private.h" 31 #include "views/widget/native_widget_private.h"
32 #include "views/widget/native_widget_views.h" 32 #include "views/widget/native_widget_views.h"
33 #include "views/widget/root_view.h" 33 #include "views/widget/root_view.h"
34 #include "views/widget/tooltip_manager.h" 34 #include "views/widget/tooltip_manager.h"
35 #include "views/widget/widget.h" 35 #include "views/widget/widget.h"
36 36
37 #if defined(OS_WIN) 37 #if defined(OS_WIN)
38 #include "base/win/scoped_gdi_object.h" 38 #include "base/win/scoped_gdi_object.h"
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 // Transformations ------------------------------------------------------------- 417 // Transformations -------------------------------------------------------------
418 418
419 const ui::Transform& View::GetTransform() const { 419 const ui::Transform& View::GetTransform() const {
420 static const ui::Transform* no_op = new ui::Transform; 420 static const ui::Transform* no_op = new ui::Transform;
421 return layer() ? layer()->transform() : *no_op; 421 return layer() ? layer()->transform() : *no_op;
422 } 422 }
423 423
424 void View::SetTransform(const ui::Transform& transform) { 424 void View::SetTransform(const ui::Transform& transform) {
425 if (!transform.HasChange()) { 425 if (!transform.HasChange()) {
426 if (layer()) { 426 if (layer()) {
427 layer_property_setter_->SetTransform(layer(), transform); 427 layer()->SetTransform(transform);
428 if (!paint_to_layer_) 428 if (!paint_to_layer_)
429 DestroyLayer(); 429 DestroyLayer();
430 } else { 430 } else {
431 // Nothing. 431 // Nothing.
432 } 432 }
433 } else { 433 } else {
434 if (!layer()) 434 if (!layer())
435 CreateLayer(); 435 CreateLayer();
436 layer_property_setter_->SetTransform(layer(), transform); 436 layer()->SetTransform(transform);
437 layer()->ScheduleDraw(); 437 layer()->ScheduleDraw();
438 } 438 }
439 } 439 }
440 440
441 void View::SetPaintToLayer(bool paint_to_layer) { 441 void View::SetPaintToLayer(bool paint_to_layer) {
442 paint_to_layer_ = paint_to_layer; 442 paint_to_layer_ = paint_to_layer;
443 if (paint_to_layer_ && !layer()) { 443 if (paint_to_layer_ && !layer()) {
444 CreateLayer(); 444 CreateLayer();
445 } else if (!paint_to_layer_ && layer()) { 445 } else if (!paint_to_layer_ && layer()) {
446 DestroyLayer(); 446 DestroyLayer();
447 } 447 }
448 } 448 }
449 449
450 void View::SetLayerPropertySetter(LayerPropertySetter* setter) {
451 DCHECK(layer());
452 LayerPropertySetter* old_setter = layer_property_setter_.get();
453 if (!layer() || (old_setter && old_setter == setter))
454 return;
455 if (!setter)
456 setter = LayerPropertySetter::CreateDefaultSetter();
457
458 if (old_setter)
459 old_setter->Uninstalled(layer());
460 layer_property_setter_.reset(setter);
461 layer_property_setter_->Installed(layer());
462 }
463
464 // RTL positioning ------------------------------------------------------------- 450 // RTL positioning -------------------------------------------------------------
465 451
466 gfx::Rect View::GetMirroredBounds() const { 452 gfx::Rect View::GetMirroredBounds() const {
467 gfx::Rect bounds(bounds_); 453 gfx::Rect bounds(bounds_);
468 bounds.set_x(GetMirroredX()); 454 bounds.set_x(GetMirroredX());
469 return bounds; 455 return bounds;
470 } 456 }
471 457
472 gfx::Point View::GetMirroredPosition() const { 458 gfx::Point View::GetMirroredPosition() const {
473 return gfx::Point(GetMirroredX(), y()); 459 return gfx::Point(GetMirroredX(), y());
(...skipping 674 matching lines...) Expand 10 before | Expand all | Expand 10 after
1148 if (layer()) { 1134 if (layer()) {
1149 layer()->SetVisible(ancestor_visible && IsVisible()); 1135 layer()->SetVisible(ancestor_visible && IsVisible());
1150 } else { 1136 } else {
1151 for (int i = 0, count = child_count(); i < count; ++i) 1137 for (int i = 0, count = child_count(); i < count; ++i)
1152 child_at(i)->UpdateChildLayerVisibility(ancestor_visible && IsVisible()); 1138 child_at(i)->UpdateChildLayerVisibility(ancestor_visible && IsVisible());
1153 } 1139 }
1154 } 1140 }
1155 1141
1156 void View::UpdateChildLayerBounds(const gfx::Point& offset) { 1142 void View::UpdateChildLayerBounds(const gfx::Point& offset) {
1157 if (layer()) { 1143 if (layer()) {
1158 layer_property_setter_->SetBounds(layer(), gfx::Rect(offset.x(), offset.y(), 1144 layer()->SetBounds(gfx::Rect(offset.x(), offset.y(), width(), height()));
1159 width(), height()));
1160 } else { 1145 } else {
1161 for (int i = 0, count = child_count(); i < count; ++i) { 1146 for (int i = 0, count = child_count(); i < count; ++i) {
1162 gfx::Point new_offset(offset.x() + child_at(i)->x(), 1147 gfx::Point new_offset(offset.x() + child_at(i)->x(),
1163 offset.y() + child_at(i)->y()); 1148 offset.y() + child_at(i)->y());
1164 child_at(i)->UpdateChildLayerBounds(new_offset); 1149 child_at(i)->UpdateChildLayerBounds(new_offset);
1165 } 1150 }
1166 } 1151 }
1167 } 1152 }
1168 1153
1169 void View::OnPaintLayer(gfx::Canvas* canvas) { 1154 void View::OnPaintLayer(gfx::Canvas* canvas) {
1170 canvas->GetSkCanvas()->drawColor(SK_ColorBLACK, SkXfermode::kClear_Mode); 1155 canvas->GetSkCanvas()->drawColor(SK_ColorBLACK, SkXfermode::kClear_Mode);
1171 PaintCommon(canvas); 1156 PaintCommon(canvas);
1172 } 1157 }
1173 1158
1174 void View::OnLayerAnimationEnded(const ui::Animation* animation) { 1159 void View::OnLayerAnimationEnded(const ui::LayerAnimationSequence* animation) {
1175 } 1160 }
1176 1161
1177 void View::ReorderLayers() { 1162 void View::ReorderLayers() {
1178 View* v = this; 1163 View* v = this;
1179 while (v && !v->layer()) 1164 while (v && !v->layer())
1180 v = v->parent(); 1165 v = v->parent();
1181 1166
1182 // Forward to widget in case we're in a NativeWidgetView. 1167 // Forward to widget in case we're in a NativeWidgetView.
1183 if (!v) { 1168 if (!v) {
1184 if (GetWidget()) 1169 if (GetWidget())
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after
1589 bounds_.size() == previous_bounds.size() ? SCHEDULE_PAINT_SIZE_SAME : 1574 bounds_.size() == previous_bounds.size() ? SCHEDULE_PAINT_SIZE_SAME :
1590 SCHEDULE_PAINT_SIZE_CHANGED); 1575 SCHEDULE_PAINT_SIZE_CHANGED);
1591 } 1576 }
1592 1577
1593 if (use_acceleration_when_possible) { 1578 if (use_acceleration_when_possible) {
1594 if (layer()) { 1579 if (layer()) {
1595 if (parent_) { 1580 if (parent_) {
1596 gfx::Point offset; 1581 gfx::Point offset;
1597 parent_->CalculateOffsetToAncestorWithLayer(&offset, NULL); 1582 parent_->CalculateOffsetToAncestorWithLayer(&offset, NULL);
1598 offset.Offset(x(), y()); 1583 offset.Offset(x(), y());
1599 layer_property_setter_->SetBounds(layer(), gfx::Rect(offset, size())); 1584 layer()->SetBounds(gfx::Rect(offset, size()));
1600 } else { 1585 } else {
1601 layer_property_setter_->SetBounds(layer(), bounds_); 1586 layer()->SetBounds(bounds_);
1602 } 1587 }
1603 // TODO(beng): this seems redundant with the SchedulePaint at the top of 1588 // TODO(beng): this seems redundant with the SchedulePaint at the top of
1604 // this function. explore collapsing. 1589 // this function. explore collapsing.
1605 if (previous_bounds.size() != bounds_.size() && 1590 if (previous_bounds.size() != bounds_.size() &&
1606 !layer()->layer_updated_externally()) { 1591 !layer()->layer_updated_externally()) {
1607 // If our bounds have changed then we need to update the complete 1592 // If our bounds have changed then we need to update the complete
1608 // texture. 1593 // texture.
1609 layer()->SchedulePaint(GetLocalBounds()); 1594 layer()->SchedulePaint(GetLocalBounds());
1610 } 1595 }
1611 } else { 1596 } else {
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
1775 // Accelerated painting -------------------------------------------------------- 1760 // Accelerated painting --------------------------------------------------------
1776 1761
1777 void View::CreateLayer() { 1762 void View::CreateLayer() {
1778 // A new layer is being created for the view. So all the layers of the 1763 // A new layer is being created for the view. So all the layers of the
1779 // sub-tree can inherit the visibility of the corresponding view. 1764 // sub-tree can inherit the visibility of the corresponding view.
1780 for (int i = 0, count = child_count(); i < count; ++i) 1765 for (int i = 0, count = child_count(); i < count; ++i)
1781 child_at(i)->UpdateChildLayerVisibility(true); 1766 child_at(i)->UpdateChildLayerVisibility(true);
1782 1767
1783 layer_.reset(new ui::Layer(NULL)); 1768 layer_.reset(new ui::Layer(NULL));
1784 layer_->set_delegate(this); 1769 layer_->set_delegate(this);
1785 if (layer_property_setter_.get())
1786 layer_property_setter_->Installed(layer());
1787 else
1788 SetLayerPropertySetter(NULL);
1789 1770
1790 UpdateParentLayers(); 1771 UpdateParentLayers();
1791 UpdateLayerVisibility(); 1772 UpdateLayerVisibility();
1792 1773
1793 // The new layer needs to be ordered in the layer tree according 1774 // The new layer needs to be ordered in the layer tree according
1794 // to the view tree. Children of this layer were added in order 1775 // to the view tree. Children of this layer were added in order
1795 // in UpdateParentLayers(). 1776 // in UpdateParentLayers().
1796 if (parent()) 1777 if (parent())
1797 parent()->ReorderLayers(); 1778 parent()->ReorderLayers();
1798 } 1779 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1849 1830
1850 void View::DestroyLayer() { 1831 void View::DestroyLayer() {
1851 ui::Layer* new_parent = layer()->parent(); 1832 ui::Layer* new_parent = layer()->parent();
1852 std::vector<ui::Layer*> children = layer()->children(); 1833 std::vector<ui::Layer*> children = layer()->children();
1853 for (size_t i = 0; i < children.size(); ++i) { 1834 for (size_t i = 0; i < children.size(); ++i) {
1854 layer()->Remove(children[i]); 1835 layer()->Remove(children[i]);
1855 if (new_parent) 1836 if (new_parent)
1856 new_parent->Add(children[i]); 1837 new_parent->Add(children[i]);
1857 } 1838 }
1858 1839
1859 if (layer_property_setter_.get())
1860 layer_property_setter_->Uninstalled(layer());
1861
1862 layer_.reset(); 1840 layer_.reset();
1863 1841
1864 if (new_parent) 1842 if (new_parent)
1865 ReorderLayers(); 1843 ReorderLayers();
1866 1844
1867 gfx::Point offset; 1845 gfx::Point offset;
1868 CalculateOffsetToAncestorWithLayer(&offset, NULL); 1846 CalculateOffsetToAncestorWithLayer(&offset, NULL);
1869 UpdateChildLayerBounds(offset); 1847 UpdateChildLayerBounds(offset);
1870 1848
1871 SchedulePaint(); 1849 SchedulePaint();
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
2075 2053
2076 OSExchangeData data; 2054 OSExchangeData data;
2077 WriteDragData(press_pt, &data); 2055 WriteDragData(press_pt, &data);
2078 2056
2079 // Message the RootView to do the drag and drop. That way if we're removed 2057 // Message the RootView to do the drag and drop. That way if we're removed
2080 // the RootView can detect it and avoid calling us back. 2058 // the RootView can detect it and avoid calling us back.
2081 GetWidget()->RunShellDrag(this, data, drag_operations); 2059 GetWidget()->RunShellDrag(this, data, drag_operations);
2082 } 2060 }
2083 2061
2084 } // namespace views 2062 } // namespace views
OLDNEW
« ui/gfx/compositor/layer_animator.cc ('K') | « views/view.h ('k') | views/view_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698