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

Side by Side Diff: cc/layers/layer_impl.cc

Issue 1479883002: cc: Fix draw transform computation for non-drawn layers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove LayerImpl::draw_transform() Created 5 years 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
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 "cc/layers/layer_impl.h" 5 #include "cc/layers/layer_impl.h"
6 6
7 #include "base/json/json_reader.h" 7 #include "base/json/json_reader.h"
8 #include "base/numerics/safe_conversions.h" 8 #include "base/numerics/safe_conversions.h"
9 #include "base/strings/stringprintf.h" 9 #include "base/strings/stringprintf.h"
10 #include "base/trace_event/trace_event.h" 10 #include "base/trace_event/trace_event.h"
11 #include "base/trace_event/trace_event_argument.h" 11 #include "base/trace_event/trace_event_argument.h"
12 #include "cc/animation/animation_registrar.h" 12 #include "cc/animation/animation_registrar.h"
13 #include "cc/base/math_util.h" 13 #include "cc/base/math_util.h"
14 #include "cc/base/simple_enclosed_region.h" 14 #include "cc/base/simple_enclosed_region.h"
15 #include "cc/debug/debug_colors.h" 15 #include "cc/debug/debug_colors.h"
16 #include "cc/debug/layer_tree_debug_state.h" 16 #include "cc/debug/layer_tree_debug_state.h"
17 #include "cc/debug/micro_benchmark_impl.h" 17 #include "cc/debug/micro_benchmark_impl.h"
18 #include "cc/debug/traced_value.h" 18 #include "cc/debug/traced_value.h"
19 #include "cc/input/scroll_state.h" 19 #include "cc/input/scroll_state.h"
20 #include "cc/layers/layer.h" 20 #include "cc/layers/layer.h"
21 #include "cc/layers/layer_utils.h" 21 #include "cc/layers/layer_utils.h"
22 #include "cc/output/copy_output_request.h" 22 #include "cc/output/copy_output_request.h"
23 #include "cc/quads/debug_border_draw_quad.h" 23 #include "cc/quads/debug_border_draw_quad.h"
24 #include "cc/quads/render_pass.h" 24 #include "cc/quads/render_pass.h"
25 #include "cc/trees/draw_property_utils.h"
25 #include "cc/trees/layer_tree_host_common.h" 26 #include "cc/trees/layer_tree_host_common.h"
26 #include "cc/trees/layer_tree_impl.h" 27 #include "cc/trees/layer_tree_impl.h"
27 #include "cc/trees/layer_tree_settings.h" 28 #include "cc/trees/layer_tree_settings.h"
28 #include "cc/trees/proxy.h" 29 #include "cc/trees/proxy.h"
29 #include "ui/gfx/geometry/box_f.h" 30 #include "ui/gfx/geometry/box_f.h"
30 #include "ui/gfx/geometry/point_conversions.h" 31 #include "ui/gfx/geometry/point_conversions.h"
31 #include "ui/gfx/geometry/quad_f.h" 32 #include "ui/gfx/geometry/quad_f.h"
32 #include "ui/gfx/geometry/rect_conversions.h" 33 #include "ui/gfx/geometry/rect_conversions.h"
33 #include "ui/gfx/geometry/size_conversions.h" 34 #include "ui/gfx/geometry/size_conversions.h"
34 #include "ui/gfx/geometry/vector2d_conversions.h" 35 #include "ui/gfx/geometry/vector2d_conversions.h"
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 copy_requests_.clear(); 300 copy_requests_.clear();
300 301
301 for (size_t i = first_inserted_request; i < requests->size(); ++i) { 302 for (size_t i = first_inserted_request; i < requests->size(); ++i) {
302 CopyOutputRequest* request = (*requests)[i].get(); 303 CopyOutputRequest* request = (*requests)[i].get();
303 if (!request->has_area()) 304 if (!request->has_area())
304 continue; 305 continue;
305 306
306 gfx::Rect request_in_layer_space = request->area(); 307 gfx::Rect request_in_layer_space = request->area();
307 request_in_layer_space.Intersect(gfx::Rect(bounds())); 308 request_in_layer_space.Intersect(gfx::Rect(bounds()));
308 request->set_area(MathUtil::MapEnclosingClippedRect( 309 request->set_area(MathUtil::MapEnclosingClippedRect(
309 draw_properties_.target_space_transform, request_in_layer_space)); 310 DrawTransform(), request_in_layer_space));
310 } 311 }
311 312
312 layer_tree_impl()->RemoveLayerWithCopyOutputRequest(this); 313 layer_tree_impl()->RemoveLayerWithCopyOutputRequest(this);
313 layer_tree_impl()->set_needs_update_draw_properties(); 314 layer_tree_impl()->set_needs_update_draw_properties();
314 } 315 }
315 316
316 void LayerImpl::ClearRenderSurfaceLayerList() { 317 void LayerImpl::ClearRenderSurfaceLayerList() {
317 if (render_surface_) 318 if (render_surface_)
318 render_surface_->ClearLayerLists(); 319 render_surface_->ClearLayerLists();
319 } 320 }
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
694 base::ListValue* list = new base::ListValue; 695 base::ListValue* list = new base::ListValue;
695 list->AppendInteger(bounds().width()); 696 list->AppendInteger(bounds().width());
696 list->AppendInteger(bounds().height()); 697 list->AppendInteger(bounds().height());
697 result->Set("Bounds", list); 698 result->Set("Bounds", list);
698 699
699 list = new base::ListValue; 700 list = new base::ListValue;
700 list->AppendDouble(position_.x()); 701 list->AppendDouble(position_.x());
701 list->AppendDouble(position_.y()); 702 list->AppendDouble(position_.y());
702 result->Set("Position", list); 703 result->Set("Position", list);
703 704
704 const gfx::Transform& gfx_transform = draw_properties_.target_space_transform; 705 const gfx::Transform& gfx_transform = DrawTransform();
705 double transform[16]; 706 double transform[16];
706 gfx_transform.matrix().asColMajord(transform); 707 gfx_transform.matrix().asColMajord(transform);
707 list = new base::ListValue; 708 list = new base::ListValue;
708 for (int i = 0; i < 16; ++i) 709 for (int i = 0; i < 16; ++i)
709 list->AppendDouble(transform[i]); 710 list->AppendDouble(transform[i]);
710 result->Set("DrawTransform", list); 711 result->Set("DrawTransform", list);
711 712
712 result->SetBoolean("DrawsContent", draws_content_); 713 result->SetBoolean("DrawsContent", draws_content_);
713 result->SetBoolean("Is3dSorted", Is3dSorted()); 714 result->SetBoolean("Is3dSorted", Is3dSorted());
714 result->SetDouble("OPACITY", opacity()); 715 result->SetDouble("OPACITY", opacity());
(...skipping 1051 matching lines...) Expand 10 before | Expand all | Expand 10 after
1766 1767
1767 SetNeedsPushProperties(); 1768 SetNeedsPushProperties();
1768 layer_tree_impl()->set_needs_update_draw_properties(); 1769 layer_tree_impl()->set_needs_update_draw_properties();
1769 if (should_have_render_surface) { 1770 if (should_have_render_surface) {
1770 render_surface_ = make_scoped_ptr(new RenderSurfaceImpl(this)); 1771 render_surface_ = make_scoped_ptr(new RenderSurfaceImpl(this));
1771 return; 1772 return;
1772 } 1773 }
1773 render_surface_.reset(); 1774 render_surface_.reset();
1774 } 1775 }
1775 1776
1777 gfx::Transform LayerImpl::DrawTransform() const {
1778 // Only drawn layers have up-to-date draw properties when property trees are
1779 // enabled.
1780 if (layer_tree_impl()->settings().use_property_trees &&
1781 !IsDrawnRenderSurfaceLayerListMember()) {
1782 if (layer_tree_impl()->property_trees()->non_root_surfaces_enabled) {
1783 return DrawTransformFromPropertyTrees(
1784 this, layer_tree_impl()->property_trees()->transform_tree);
1785 } else {
1786 return ScreenSpaceTransformFromPropertyTrees(
1787 this, layer_tree_impl()->property_trees()->transform_tree);
1788 }
1789 }
1790
1791 return draw_properties().target_space_transform;
1792 }
1793
1776 Region LayerImpl::GetInvalidationRegion() { 1794 Region LayerImpl::GetInvalidationRegion() {
1777 return Region(update_rect_); 1795 return Region(update_rect_);
1778 } 1796 }
1779 1797
1780 gfx::Rect LayerImpl::GetEnclosingRectInTargetSpace() const { 1798 gfx::Rect LayerImpl::GetEnclosingRectInTargetSpace() const {
1781 return MathUtil::MapEnclosingClippedRect( 1799 return MathUtil::MapEnclosingClippedRect(DrawTransform(),
1782 draw_properties_.target_space_transform, gfx::Rect(bounds())); 1800 gfx::Rect(bounds()));
1783 } 1801 }
1784 1802
1785 gfx::Rect LayerImpl::GetScaledEnclosingRectInTargetSpace(float scale) const { 1803 gfx::Rect LayerImpl::GetScaledEnclosingRectInTargetSpace(float scale) const {
1786 gfx::Transform scaled_draw_transform = 1804 gfx::Transform scaled_draw_transform = DrawTransform();
1787 draw_properties_.target_space_transform;
1788 scaled_draw_transform.Scale(SK_MScalar1 / scale, SK_MScalar1 / scale); 1805 scaled_draw_transform.Scale(SK_MScalar1 / scale, SK_MScalar1 / scale);
1789 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(bounds(), scale); 1806 gfx::Size scaled_bounds = gfx::ScaleToCeiledSize(bounds(), scale);
1790 return MathUtil::MapEnclosingClippedRect(scaled_draw_transform, 1807 return MathUtil::MapEnclosingClippedRect(scaled_draw_transform,
1791 gfx::Rect(scaled_bounds)); 1808 gfx::Rect(scaled_bounds));
1792 } 1809 }
1793 1810
1794 float LayerImpl::GetIdealContentsScale() const { 1811 float LayerImpl::GetIdealContentsScale() const {
1795 float page_scale = IsAffectedByPageScale() 1812 float page_scale = IsAffectedByPageScale()
1796 ? layer_tree_impl()->current_page_scale_factor() 1813 ? layer_tree_impl()->current_page_scale_factor()
1797 : 1.f; 1814 : 1.f;
1798 float device_scale = layer_tree_impl()->device_scale_factor(); 1815 float device_scale = layer_tree_impl()->device_scale_factor();
1799 1816
1800 float default_scale = page_scale * device_scale; 1817 float default_scale = page_scale * device_scale;
1801 if (!layer_tree_impl() 1818 if (!layer_tree_impl()
1802 ->settings() 1819 ->settings()
1803 .layer_transforms_should_scale_layer_contents) { 1820 .layer_transforms_should_scale_layer_contents) {
1804 return default_scale; 1821 return default_scale;
1805 } 1822 }
1806 1823
1807 // TODO(enne): the transform needs to come from property trees instead of
1808 // draw properties.
1809 gfx::Vector2dF transform_scales = MathUtil::ComputeTransform2dScaleComponents( 1824 gfx::Vector2dF transform_scales = MathUtil::ComputeTransform2dScaleComponents(
1810 draw_properties().target_space_transform, default_scale); 1825 DrawTransform(), default_scale);
1811 return std::max(transform_scales.x(), transform_scales.y()); 1826 return std::max(transform_scales.x(), transform_scales.y());
1812 } 1827 }
1813 1828
1814 } // namespace cc 1829 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698