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

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 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
« no previous file with comments | « views/view.h ('k') | views/view_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 676 matching lines...) Expand 10 before | Expand all | Expand 10 after
1150 if (layer()) { 1136 if (layer()) {
1151 layer()->SetVisible(ancestor_visible && IsVisible()); 1137 layer()->SetVisible(ancestor_visible && IsVisible());
1152 } else { 1138 } else {
1153 for (int i = 0, count = child_count(); i < count; ++i) 1139 for (int i = 0, count = child_count(); i < count; ++i)
1154 child_at(i)->UpdateChildLayerVisibility(ancestor_visible && IsVisible()); 1140 child_at(i)->UpdateChildLayerVisibility(ancestor_visible && IsVisible());
1155 } 1141 }
1156 } 1142 }
1157 1143
1158 void View::UpdateChildLayerBounds(const gfx::Point& offset) { 1144 void View::UpdateChildLayerBounds(const gfx::Point& offset) {
1159 if (layer()) { 1145 if (layer()) {
1160 layer_property_setter_->SetBounds(layer(), gfx::Rect(offset.x(), offset.y(), 1146 layer()->SetBounds(gfx::Rect(offset.x(), offset.y(), width(), height()));
1161 width(), height()));
1162 } else { 1147 } else {
1163 for (int i = 0, count = child_count(); i < count; ++i) { 1148 for (int i = 0, count = child_count(); i < count; ++i) {
1164 gfx::Point new_offset(offset.x() + child_at(i)->x(), 1149 gfx::Point new_offset(offset.x() + child_at(i)->x(),
1165 offset.y() + child_at(i)->y()); 1150 offset.y() + child_at(i)->y());
1166 child_at(i)->UpdateChildLayerBounds(new_offset); 1151 child_at(i)->UpdateChildLayerBounds(new_offset);
1167 } 1152 }
1168 } 1153 }
1169 } 1154 }
1170 1155
1171 void View::OnPaintLayer(gfx::Canvas* canvas) { 1156 void View::OnPaintLayer(gfx::Canvas* canvas) {
1172 if (!layer() || !layer()->fills_bounds_opaquely()) 1157 if (!layer() || !layer()->fills_bounds_opaquely())
1173 canvas->GetSkCanvas()->drawColor(SK_ColorBLACK, SkXfermode::kClear_Mode); 1158 canvas->GetSkCanvas()->drawColor(SK_ColorBLACK, SkXfermode::kClear_Mode);
1174 PaintCommon(canvas); 1159 PaintCommon(canvas);
1175 } 1160 }
1176 1161
1177 void View::OnLayerAnimationEnded(const ui::Animation* animation) { 1162 void View::OnLayerAnimationEnded(const ui::LayerAnimationSequence* animation) {
1178 } 1163 }
1179 1164
1180 void View::ReorderLayers() { 1165 void View::ReorderLayers() {
1181 View* v = this; 1166 View* v = this;
1182 while (v && !v->layer()) 1167 while (v && !v->layer())
1183 v = v->parent(); 1168 v = v->parent();
1184 1169
1185 // Forward to widget in case we're in a NativeWidgetView. 1170 // Forward to widget in case we're in a NativeWidgetView.
1186 if (!v) { 1171 if (!v) {
1187 if (GetWidget()) 1172 if (GetWidget())
(...skipping 404 matching lines...) Expand 10 before | Expand all | Expand 10 after
1592 bounds_.size() == previous_bounds.size() ? SCHEDULE_PAINT_SIZE_SAME : 1577 bounds_.size() == previous_bounds.size() ? SCHEDULE_PAINT_SIZE_SAME :
1593 SCHEDULE_PAINT_SIZE_CHANGED); 1578 SCHEDULE_PAINT_SIZE_CHANGED);
1594 } 1579 }
1595 1580
1596 if (use_acceleration_when_possible) { 1581 if (use_acceleration_when_possible) {
1597 if (layer()) { 1582 if (layer()) {
1598 if (parent_) { 1583 if (parent_) {
1599 gfx::Point offset; 1584 gfx::Point offset;
1600 parent_->CalculateOffsetToAncestorWithLayer(&offset, NULL); 1585 parent_->CalculateOffsetToAncestorWithLayer(&offset, NULL);
1601 offset.Offset(x(), y()); 1586 offset.Offset(x(), y());
1602 layer_property_setter_->SetBounds(layer(), gfx::Rect(offset, size())); 1587 layer()->SetBounds(gfx::Rect(offset, size()));
1603 } else { 1588 } else {
1604 layer_property_setter_->SetBounds(layer(), bounds_); 1589 layer()->SetBounds(bounds_);
1605 } 1590 }
1606 // TODO(beng): this seems redundant with the SchedulePaint at the top of 1591 // TODO(beng): this seems redundant with the SchedulePaint at the top of
1607 // this function. explore collapsing. 1592 // this function. explore collapsing.
1608 if (previous_bounds.size() != bounds_.size() && 1593 if (previous_bounds.size() != bounds_.size() &&
1609 !layer()->layer_updated_externally()) { 1594 !layer()->layer_updated_externally()) {
1610 // If our bounds have changed then we need to update the complete 1595 // If our bounds have changed then we need to update the complete
1611 // texture. 1596 // texture.
1612 layer()->SchedulePaint(GetLocalBounds()); 1597 layer()->SchedulePaint(GetLocalBounds());
1613 } 1598 }
1614 } else { 1599 } else {
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
1778 // Accelerated painting -------------------------------------------------------- 1763 // Accelerated painting --------------------------------------------------------
1779 1764
1780 void View::CreateLayer() { 1765 void View::CreateLayer() {
1781 // A new layer is being created for the view. So all the layers of the 1766 // A new layer is being created for the view. So all the layers of the
1782 // sub-tree can inherit the visibility of the corresponding view. 1767 // sub-tree can inherit the visibility of the corresponding view.
1783 for (int i = 0, count = child_count(); i < count; ++i) 1768 for (int i = 0, count = child_count(); i < count; ++i)
1784 child_at(i)->UpdateChildLayerVisibility(true); 1769 child_at(i)->UpdateChildLayerVisibility(true);
1785 1770
1786 layer_.reset(new ui::Layer(NULL)); 1771 layer_.reset(new ui::Layer(NULL));
1787 layer_->set_delegate(this); 1772 layer_->set_delegate(this);
1788 if (layer_property_setter_.get())
1789 layer_property_setter_->Installed(layer());
1790 else
1791 SetLayerPropertySetter(NULL);
1792 1773
1793 UpdateParentLayers(); 1774 UpdateParentLayers();
1794 UpdateLayerVisibility(); 1775 UpdateLayerVisibility();
1795 1776
1796 // The new layer needs to be ordered in the layer tree according 1777 // The new layer needs to be ordered in the layer tree according
1797 // to the view tree. Children of this layer were added in order 1778 // to the view tree. Children of this layer were added in order
1798 // in UpdateParentLayers(). 1779 // in UpdateParentLayers().
1799 if (parent()) 1780 if (parent())
1800 parent()->ReorderLayers(); 1781 parent()->ReorderLayers();
1801 } 1782 }
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1852 1833
1853 void View::DestroyLayer() { 1834 void View::DestroyLayer() {
1854 ui::Layer* new_parent = layer()->parent(); 1835 ui::Layer* new_parent = layer()->parent();
1855 std::vector<ui::Layer*> children = layer()->children(); 1836 std::vector<ui::Layer*> children = layer()->children();
1856 for (size_t i = 0; i < children.size(); ++i) { 1837 for (size_t i = 0; i < children.size(); ++i) {
1857 layer()->Remove(children[i]); 1838 layer()->Remove(children[i]);
1858 if (new_parent) 1839 if (new_parent)
1859 new_parent->Add(children[i]); 1840 new_parent->Add(children[i]);
1860 } 1841 }
1861 1842
1862 if (layer_property_setter_.get())
1863 layer_property_setter_->Uninstalled(layer());
1864
1865 layer_.reset(); 1843 layer_.reset();
1866 1844
1867 if (new_parent) 1845 if (new_parent)
1868 ReorderLayers(); 1846 ReorderLayers();
1869 1847
1870 gfx::Point offset; 1848 gfx::Point offset;
1871 CalculateOffsetToAncestorWithLayer(&offset, NULL); 1849 CalculateOffsetToAncestorWithLayer(&offset, NULL);
1872 UpdateChildLayerBounds(offset); 1850 UpdateChildLayerBounds(offset);
1873 1851
1874 SchedulePaint(); 1852 SchedulePaint();
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
2078 2056
2079 OSExchangeData data; 2057 OSExchangeData data;
2080 WriteDragData(press_pt, &data); 2058 WriteDragData(press_pt, &data);
2081 2059
2082 // Message the RootView to do the drag and drop. That way if we're removed 2060 // Message the RootView to do the drag and drop. That way if we're removed
2083 // the RootView can detect it and avoid calling us back. 2061 // the RootView can detect it and avoid calling us back.
2084 GetWidget()->RunShellDrag(this, data, drag_operations); 2062 GetWidget()->RunShellDrag(this, data, drag_operations);
2085 } 2063 }
2086 2064
2087 } // namespace views 2065 } // namespace views
OLDNEW
« no previous file with comments | « views/view.h ('k') | views/view_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698