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

Side by Side Diff: third_party/WebKit/Source/core/paint/PaintInvalidator.cpp

Issue 2763833003: Optimize PaintInvalidatorContext::mapLocalRectToVisualRectInBacking() (Closed)
Patch Set: - Created 3 years, 9 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "core/paint/PaintInvalidator.h" 5 #include "core/paint/PaintInvalidator.h"
6 6
7 #include "core/editing/FrameSelection.h" 7 #include "core/editing/FrameSelection.h"
8 #include "core/frame/FrameView.h" 8 #include "core/frame/FrameView.h"
9 #include "core/frame/LocalFrame.h" 9 #include "core/frame/LocalFrame.h"
10 #include "core/frame/Settings.h" 10 #include "core/frame/Settings.h"
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
45 45
46 // TODO(wangxianzhu): Combine this into 46 // TODO(wangxianzhu): Combine this into
47 // PaintInvalidator::mapLocalRectToBacking() when removing 47 // PaintInvalidator::mapLocalRectToBacking() when removing
48 // PaintInvalidationState. 48 // PaintInvalidationState.
49 // This function is templatized to avoid FloatRect<->LayoutRect conversions 49 // This function is templatized to avoid FloatRect<->LayoutRect conversions
50 // which affect performance. 50 // which affect performance.
51 template <typename Rect, typename Point> 51 template <typename Rect, typename Point>
52 static LayoutRect mapLocalRectToVisualRectInBacking( 52 static LayoutRect mapLocalRectToVisualRectInBacking(
53 const LayoutObject& object, 53 const LayoutObject& object,
54 const Rect& localRect, 54 const Rect& localRect,
55 const PaintInvalidatorContext& context, 55 const PaintInvalidatorContext& context) {
56 GeometryMapper& geometryMapper) {
57 if (localRect.isEmpty()) 56 if (localRect.isEmpty())
58 return LayoutRect(); 57 return LayoutRect();
59 58
60 bool isSVGChild = object.isSVGChild(); 59 bool isSVGChild = object.isSVGChild();
61 60
62 // TODO(wkorman): The flip below is required because visual rects are 61 // TODO(wkorman): The flip below is required because visual rects are
63 // currently in "physical coordinates with flipped block-flow direction" 62 // currently in "physical coordinates with flipped block-flow direction"
64 // (see LayoutBoxModelObject.h) but we need them to be in physical 63 // (see LayoutBoxModelObject.h) but we need them to be in physical
65 // coordinates. 64 // coordinates.
66 Rect rect = localRect; 65 Rect rect = localRect;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
123 if (!isSVGChild && 122 if (!isSVGChild &&
124 context.treeBuilderContext.current.transform != 123 context.treeBuilderContext.current.transform !=
125 containerContentsProperties->transform()) 124 containerContentsProperties->transform())
126 rect = Rect(enclosingIntRect(rect)); 125 rect = Rect(enclosingIntRect(rect));
127 126
128 PropertyTreeState currentTreeState( 127 PropertyTreeState currentTreeState(
129 context.treeBuilderContext.current.transform, 128 context.treeBuilderContext.current.transform,
130 context.treeBuilderContext.current.clip, nullptr); 129 context.treeBuilderContext.current.clip, nullptr);
131 130
132 FloatRect floatRect(rect); 131 FloatRect floatRect(rect);
133 geometryMapper.sourceToDestinationVisualRect( 132 context.geometryMapper.sourceToDestinationVisualRect(
134 currentTreeState, *containerContentsProperties, floatRect); 133 currentTreeState, *containerContentsProperties, floatRect);
135 result = LayoutRect(floatRect); 134 result = LayoutRect(floatRect);
136 } 135 }
137 136
138 // Convert the result to the container's contents space. 137 // Convert the result to the container's contents space.
139 result.moveBy(-context.paintInvalidationContainer->paintOffset()); 138 result.moveBy(-context.paintInvalidationContainer->paintOffset());
140 } 139 }
141 140
142 object.adjustVisualRectForRasterEffects(result); 141 object.adjustVisualRectForRasterEffects(result);
143 142
144 PaintLayer::mapRectInPaintInvalidationContainerToBacking( 143 PaintLayer::mapRectInPaintInvalidationContainerToBacking(
145 *context.paintInvalidationContainer, result); 144 *context.paintInvalidationContainer, result);
146 145
147 result.move(object.scrollAdjustmentForPaintInvalidation( 146 result.move(object.scrollAdjustmentForPaintInvalidation(
148 *context.paintInvalidationContainer)); 147 *context.paintInvalidationContainer));
149 148
150 return result; 149 return result;
151 } 150 }
152 151
153 void PaintInvalidatorContext::mapLocalRectToVisualRectInBacking( 152 void PaintInvalidatorContext::mapLocalRectToVisualRectInBacking(
154 const LayoutObject& object, 153 const LayoutObject& object,
155 LayoutRect& rect) const { 154 LayoutRect& rect) const {
156 std::unique_ptr<GeometryMapper> geometryMapper = GeometryMapper::create();
157 rect = blink::mapLocalRectToVisualRectInBacking<LayoutRect, LayoutPoint>( 155 rect = blink::mapLocalRectToVisualRectInBacking<LayoutRect, LayoutPoint>(
158 object, rect, *this, *geometryMapper); 156 object, rect, *this);
159 } 157 }
160 158
161 LayoutRect PaintInvalidator::computeVisualRectInBacking( 159 LayoutRect PaintInvalidator::computeVisualRectInBacking(
162 const LayoutObject& object, 160 const LayoutObject& object,
163 const PaintInvalidatorContext& context) { 161 const PaintInvalidatorContext& context) {
164 if (object.isSVGChild()) { 162 if (object.isSVGChild()) {
165 FloatRect localRect = SVGLayoutSupport::localVisualRect(object); 163 FloatRect localRect = SVGLayoutSupport::localVisualRect(object);
166 return mapLocalRectToVisualRectInBacking<FloatRect, FloatPoint>( 164 return mapLocalRectToVisualRectInBacking<FloatRect, FloatPoint>(
167 object, localRect, context, m_geometryMapper); 165 object, localRect, context);
168 } 166 }
169 return mapLocalRectToVisualRectInBacking<LayoutRect, LayoutPoint>( 167 return mapLocalRectToVisualRectInBacking<LayoutRect, LayoutPoint>(
170 object, object.localVisualRect(), context, m_geometryMapper); 168 object, object.localVisualRect(), context);
171 } 169 }
172 170
173 LayoutPoint PaintInvalidator::computeLocationInBacking( 171 LayoutPoint PaintInvalidator::computeLocationInBacking(
174 const LayoutObject& object, 172 const LayoutObject& object,
175 const PaintInvalidatorContext& context) { 173 const PaintInvalidatorContext& context) {
176 // In SPv2, locationInBacking is in the space of their local transform node. 174 // In SPv2, locationInBacking is in the space of their local transform node.
177 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled()) 175 if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
178 return object.paintOffset(); 176 return object.paintOffset();
179 177
180 LayoutPoint point; 178 LayoutPoint point;
181 if (object != context.paintInvalidationContainer) { 179 if (object != context.paintInvalidationContainer) {
182 point.moveBy(object.paintOffset()); 180 point.moveBy(object.paintOffset());
183 181
184 const auto* containerTransform = 182 const auto* containerTransform =
185 context.paintInvalidationContainer->paintProperties() 183 context.paintInvalidationContainer->paintProperties()
186 ->contentsProperties() 184 ->contentsProperties()
187 ->transform(); 185 ->transform();
188 if (context.treeBuilderContext.current.transform != containerTransform) { 186 if (context.treeBuilderContext.current.transform != containerTransform) {
189 FloatRect rect = FloatRect(FloatPoint(point), FloatSize()); 187 FloatRect rect = FloatRect(FloatPoint(point), FloatSize());
190 m_geometryMapper.sourceToDestinationRect( 188 context.geometryMapper.sourceToDestinationRect(
191 context.treeBuilderContext.current.transform, containerTransform, 189 context.treeBuilderContext.current.transform, containerTransform,
192 rect); 190 rect);
193 point = LayoutPoint(rect.location()); 191 point = LayoutPoint(rect.location());
194 } 192 }
195 193
196 // Convert the result to the container's contents space. 194 // Convert the result to the container's contents space.
197 point.moveBy(-context.paintInvalidationContainer->paintOffset()); 195 point.moveBy(-context.paintInvalidationContainer->paintOffset());
198 } 196 }
199 197
200 if (context.paintInvalidationContainer->layer()->groupedMapping()) { 198 if (context.paintInvalidationContainer->layer()->groupedMapping()) {
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
491 } 489 }
492 } 490 }
493 491
494 void PaintInvalidator::processPendingDelayedPaintInvalidations() { 492 void PaintInvalidator::processPendingDelayedPaintInvalidations() {
495 for (auto target : m_pendingDelayedPaintInvalidations) 493 for (auto target : m_pendingDelayedPaintInvalidations)
496 target->getMutableForPainting().setShouldDoFullPaintInvalidation( 494 target->getMutableForPainting().setShouldDoFullPaintInvalidation(
497 PaintInvalidationDelayedFull); 495 PaintInvalidationDelayedFull);
498 } 496 }
499 497
500 } // namespace blink 498 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/paint/PaintInvalidator.h ('k') | third_party/WebKit/Source/core/paint/PrePaintTreeWalk.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698