Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 |
| OLD | NEW |