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

Side by Side Diff: ui/compositor/paint_context.cc

Issue 2877483003: Implements core logic for Pixel Canvas (Closed)
Patch Set: nits Created 3 years, 6 months 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 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/paint_context.h" 5 #include "ui/compositor/paint_context.h"
6 6
7 #include "ui/gfx/canvas.h" 7 #include "ui/gfx/canvas.h"
8 8
9 namespace ui { 9 namespace ui {
10 namespace {
11
12 // Scales the given |rect| by scaling its corner points.
13 gfx::Rect ScaleToCornerScaledRect(gfx::Rect rect,
14 float x_scale,
15 float y_scale = -1) {
16 y_scale = y_scale < 0 ? x_scale : y_scale;
17 const gfx::Vector2d& origin = rect.OffsetFromOrigin();
18
19 int right = origin.x() + rect.width();
20 int bottom = origin.y() + rect.height();
21
22 int new_x = std::round(origin.x() * x_scale);
23 int new_y = std::round(origin.y() * y_scale);
24
25 return gfx::Rect(new_x, new_y, std::round(right * x_scale) - new_x,
26 std::round(bottom * y_scale) - new_y);
27 }
28
29 } // namespace
10 30
11 PaintContext::PaintContext(cc::DisplayItemList* list, 31 PaintContext::PaintContext(cc::DisplayItemList* list,
12 float device_scale_factor, 32 float device_scale_factor,
13 const gfx::Rect& invalidation) 33 const gfx::Rect& invalidation,
34 const gfx::Size& size)
14 : list_(list), 35 : list_(list),
15 device_scale_factor_(device_scale_factor), 36 device_scale_factor_(device_scale_factor),
16 invalidation_(invalidation) { 37 invalidation_(gfx::ScaleToEnclosingRect(
38 invalidation,
39 IsPixelCanvas() ? device_scale_factor : 1.f)),
40 bounds_(size),
41 pixel_bounds_(ScaleToCornerScaledRect(
42 bounds_,
43 IsPixelCanvas() ? device_scale_factor : 1.f)) {
17 #if DCHECK_IS_ON() 44 #if DCHECK_IS_ON()
18 root_visited_ = nullptr; 45 root_visited_ = nullptr;
19 inside_paint_recorder_ = false; 46 inside_paint_recorder_ = false;
20 #endif 47 #endif
21 } 48 }
22 49
23 PaintContext::PaintContext(const PaintContext& other, 50 PaintContext::PaintContext(const PaintContext& other,
24 const gfx::Vector2d& offset) 51 const gfx::Rect& bounds,
52 int scale_type)
25 : list_(other.list_), 53 : list_(other.list_),
26 device_scale_factor_(other.device_scale_factor_), 54 device_scale_factor_(other.device_scale_factor_),
27 invalidation_(other.invalidation_), 55 invalidation_(other.invalidation_),
28 offset_(other.offset_ + offset) { 56 bounds_(bounds),
57 pixel_bounds_(other.GetSnappedPixelBounds(bounds_)),
58 offset_(other.offset_ + pixel_bounds_.OffsetFromOrigin()),
59 scale_type_(scale_type) {
oshima 2017/06/17 00:55:47 I wasn't clear, sorry. Scale type shouldn't be a p
29 #if DCHECK_IS_ON() 60 #if DCHECK_IS_ON()
30 root_visited_ = other.root_visited_; 61 root_visited_ = other.root_visited_;
31 inside_paint_recorder_ = other.inside_paint_recorder_; 62 inside_paint_recorder_ = other.inside_paint_recorder_;
32 #endif 63 #endif
33 } 64 }
34 65
35 PaintContext::PaintContext(const PaintContext& other, 66 PaintContext::PaintContext(const PaintContext& other,
36 CloneWithoutInvalidation c) 67 CloneWithoutInvalidation c)
37 : list_(other.list_), 68 : list_(other.list_),
38 device_scale_factor_(other.device_scale_factor_), 69 device_scale_factor_(other.device_scale_factor_),
39 invalidation_(), 70 invalidation_(),
71 bounds_(other.bounds_),
72 pixel_bounds_(other.pixel_bounds_),
40 offset_(other.offset_) { 73 offset_(other.offset_) {
41 #if DCHECK_IS_ON() 74 #if DCHECK_IS_ON()
42 root_visited_ = other.root_visited_; 75 root_visited_ = other.root_visited_;
43 inside_paint_recorder_ = other.inside_paint_recorder_; 76 inside_paint_recorder_ = other.inside_paint_recorder_;
44 #endif 77 #endif
45 } 78 }
46 79
47 PaintContext::~PaintContext() { 80 PaintContext::~PaintContext() {
48 } 81 }
49 82
50 gfx::Rect PaintContext::ToLayerSpaceBounds( 83 gfx::Rect PaintContext::ToLayerSpaceBounds(
51 const gfx::Size& size_in_context) const { 84 const gfx::Size& size_in_context) const {
52 return gfx::Rect(size_in_context) + offset_; 85 return gfx::Rect(size_in_context) + offset_;
53 } 86 }
54 87
55 gfx::Rect PaintContext::ToLayerSpaceRect(const gfx::Rect& rect) const { 88 float PaintContext::effective_scale_factor_x() const {
56 return rect + offset_; 89 if (scale_type_ == SCALE_TO_SCALE_FACTOR || pixel_bounds_.width() == 0)
90 return IsPixelCanvas() ? device_scale_factor_ : 1.f;
91 return static_cast<float>(pixel_bounds_.width()) /
92 static_cast<float>(bounds_.width());
93 }
94
95 float PaintContext::effective_scale_factor_y() const {
96 if (scale_type_ == SCALE_TO_SCALE_FACTOR || pixel_bounds_.height() == 0)
97 return IsPixelCanvas() ? device_scale_factor_ : 1.f;
98 return static_cast<float>(pixel_bounds_.height()) /
99 static_cast<float>(bounds_.height());
100 }
101
102 gfx::Size PaintContext::ScaleToCorneredPixelSize(const gfx::Size& size) const {
103 // effective_scale_factor_x/y() would return 1.f value if pixel canvas is
104 // disabled. This early return is only an optimization.
105 if (!IsPixelCanvas())
106 return size;
107 return ScaleToCornerScaledRect(gfx::Rect(size), effective_scale_factor_x(),
108 effective_scale_factor_y())
109 .size();
110 }
111
112 gfx::Rect PaintContext::GetSnappedPixelBounds(
113 const gfx::Rect& child_bounds) const {
114 if (!IsPixelCanvas())
115 return child_bounds;
116
117 const gfx::Vector2d& child_origin = child_bounds.OffsetFromOrigin();
118
119 int right = child_origin.x() + child_bounds.width();
120 int bottom = child_origin.y() + child_bounds.height();
121
122 int new_x = std::round(child_origin.x() * device_scale_factor_);
123 int new_y = std::round(child_origin.y() * device_scale_factor_);
124
125 int new_right;
126 int new_bottom;
127
128 if (right == bounds_.width()) {
129 new_right = pixel_bounds_.width();
130 } else {
131 new_right = std::round(right * device_scale_factor_);
132 }
133
134 if (bottom == bounds_.height()) {
135 new_bottom = pixel_bounds_.height();
136 } else {
137 new_bottom = std::round(bottom * device_scale_factor_);
138 }
139 return gfx::Rect(new_x, new_y, new_right - new_x, new_bottom - new_y);
57 } 140 }
58 141
59 } // namespace ui 142 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698