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

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

Issue 2701523003: Don't pixel-snap overflow clips in clip paint property nodes. (Closed)
Patch Set: Merge branch 'master' into fixclipping Created 3 years, 10 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 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
3 * reserved. 3 * reserved.
4 * 4 *
5 * Portions are Copyright (C) 1998 Netscape Communications Corporation. 5 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
6 * 6 *
7 * Other contributors: 7 * Other contributors:
8 * Robert O'Callahan <roc+@cs.cmu.edu> 8 * Robert O'Callahan <roc+@cs.cmu.edu>
9 * David Baron <dbaron@fas.harvard.edu> 9 * David Baron <dbaron@fas.harvard.edu>
10 * Christian Biesinger <cbiesinger@web.de> 10 * Christian Biesinger <cbiesinger@web.de>
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
240 240
241 LayoutPoint clippingRootOffset; 241 LayoutPoint clippingRootOffset;
242 m_layer.convertToLayerCoords(&clippingRootLayer, clippingRootOffset); 242 m_layer.convertToLayerCoords(&clippingRootLayer, clippingRootOffset);
243 clipRect.moveBy(-clippingRootOffset); 243 clipRect.moveBy(-clippingRootOffset);
244 244
245 return clipRect; 245 return clipRect;
246 } 246 }
247 247
248 #ifdef CHECK_CLIP_RECTS 248 #ifdef CHECK_CLIP_RECTS
249 #define CHECK_RECTS_EQ(expected, actual) \ 249 #define CHECK_RECTS_EQ(expected, actual) \
250 CHECK((expected.isEmpty() && actual.isEmpty()) || expected == actual) \ 250 do { \
251 << "expected=" << expected.toString() << " actual=" << actual.toString() 251 bool matches = \
252 (expected.isEmpty() && actual.isEmpty()) || expected == actual; \
253 if (!matches) { \
254 LOG(ERROR) << "Rects don't match for m_layer=" \
255 << m_layer.layoutObject()->debugName() \
256 << " expected=" << expected.toString() \
257 << " actual=" << actual.toString(); \
258 } \
259 } while (false);
252 #endif 260 #endif
253 261
254 void PaintLayerClipper::mapLocalToRootWithGeometryMapper( 262 void PaintLayerClipper::mapLocalToRootWithGeometryMapper(
255 const ClipRectsContext& context, 263 const ClipRectsContext& context,
256 LayoutRect& rectToMap) const { 264 LayoutRect& rectToMap) const {
257 DCHECK(m_geometryMapper); 265 DCHECK(m_geometryMapper);
258 266
259 const auto* layerTransform = m_layer.layoutObject() 267 const auto* layerTransform = m_layer.layoutObject()
260 ->paintProperties() 268 ->paintProperties()
261 ->localBorderBoxProperties() 269 ->localBorderBoxProperties()
262 ->transform(); 270 ->transform();
263 const auto* rootTransform = context.rootLayer->layoutObject() 271 const auto* rootTransform = context.rootLayer->layoutObject()
264 ->paintProperties() 272 ->paintProperties()
265 ->localBorderBoxProperties() 273 ->localBorderBoxProperties()
266 ->transform(); 274 ->transform();
267 275
268 FloatRect localRect(rectToMap); 276 FloatRect localRect(rectToMap);
269 localRect.moveBy(FloatPoint(m_layer.layoutObject()->paintOffset())); 277 localRect.moveBy(FloatPoint(m_layer.layoutObject()->paintOffset()));
270 rectToMap = LayoutRect(m_geometryMapper->sourceToDestinationRect( 278 rectToMap = LayoutRect(m_geometryMapper->sourceToDestinationRect(
271 localRect, layerTransform, rootTransform)); 279 localRect, layerTransform, rootTransform));
272 rectToMap.moveBy(-context.rootLayer->layoutObject()->paintOffset()); 280 rectToMap.moveBy(-context.rootLayer->layoutObject()->paintOffset());
281 rectToMap.move(context.subPixelAccumulation);
273 } 282 }
274 283
275 void PaintLayerClipper::calculateRectsWithGeometryMapper( 284 void PaintLayerClipper::calculateRectsWithGeometryMapper(
276 const ClipRectsContext& context, 285 const ClipRectsContext& context,
277 const LayoutRect& paintDirtyRect, 286 const LayoutRect& paintDirtyRect,
278 LayoutRect& layerBounds, 287 LayoutRect& layerBounds,
279 ClipRect& backgroundRect, 288 ClipRect& backgroundRect,
280 ClipRect& foregroundRect, 289 ClipRect& foregroundRect,
281 const LayoutPoint* offsetFromRoot) const { 290 const LayoutPoint* offsetFromRoot) const {
282 const auto* properties = m_layer.layoutObject()->paintProperties(); 291 const auto* properties = m_layer.layoutObject()->paintProperties();
283 // TODO(chrishtr): fix the underlying bug that causes this situation. 292 // TODO(chrishtr): fix the underlying bug that causes this situation.
284 if (!properties) { 293 if (!properties) {
285 backgroundRect = ClipRect(LayoutRect(LayoutRect::infiniteIntRect())); 294 backgroundRect = ClipRect(LayoutRect(LayoutRect::infiniteIntRect()));
286 foregroundRect = ClipRect(LayoutRect(LayoutRect::infiniteIntRect())); 295 foregroundRect = ClipRect(LayoutRect(LayoutRect::infiniteIntRect()));
287 } else { 296 } else {
288 backgroundRect = clipRectWithGeometryMapper(context, false); 297 backgroundRect = clipRectWithGeometryMapper(context, false);
298
299 backgroundRect.move(context.subPixelAccumulation);
300 backgroundRect.intersect(paintDirtyRect);
301
289 applyOverflowClipToBackgroundRectWithGeometryMapper(context, 302 applyOverflowClipToBackgroundRectWithGeometryMapper(context,
290 backgroundRect); 303 backgroundRect);
291 304
292 backgroundRect.move(
293 context.subPixelAccumulation); // TODO(chrishtr): is this needed?
294 backgroundRect.intersect(paintDirtyRect);
295
296 foregroundRect.move(
297 context.subPixelAccumulation); // TODO(chrishtr): is this needed?
298 foregroundRect = clipRectWithGeometryMapper(context, true); 305 foregroundRect = clipRectWithGeometryMapper(context, true);
306 foregroundRect.move(context.subPixelAccumulation);
299 foregroundRect.intersect(paintDirtyRect); 307 foregroundRect.intersect(paintDirtyRect);
300 } 308 }
301 LayoutPoint offset; 309 LayoutPoint offset;
302 if (offsetFromRoot) 310 if (offsetFromRoot)
303 offset = *offsetFromRoot; 311 offset = *offsetFromRoot;
304 else 312 else
305 m_layer.convertToLayerCoords(context.rootLayer, offset); 313 m_layer.convertToLayerCoords(context.rootLayer, offset);
306 layerBounds = LayoutRect(offset, LayoutSize(m_layer.size())); 314 layerBounds = LayoutRect(offset, LayoutSize(m_layer.size()));
307 315
308 #ifdef CHECK_CLIP_RECTS 316 #ifdef CHECK_CLIP_RECTS
309 ClipRect testBackgroundRect, testForegroundRect; 317 ClipRect testBackgroundRect, testForegroundRect;
310 LayoutRect testLayerBounds; 318 LayoutRect testLayerBounds;
311 PaintLayerClipper(m_layer, false) 319 PaintLayerClipper(m_layer, nullptr)
312 .calculateRects(context, paintDirtyRect, testLayerBounds, 320 .calculateRects(context, paintDirtyRect, testLayerBounds,
313 testBackgroundRect, testForegroundRect); 321 testBackgroundRect, testForegroundRect, offsetFromRoot);
314 CHECK_RECTS_EQ(testBackgroundRect, backgroundRect); 322 CHECK_RECTS_EQ(testBackgroundRect, backgroundRect);
315 CHECK_RECTS_EQ(testForegroundRect, foregroundRect); 323 CHECK_RECTS_EQ(testForegroundRect, foregroundRect);
316 CHECK_RECTS_EQ(testLayerBounds, layerBounds); 324 CHECK_RECTS_EQ(testLayerBounds, layerBounds);
317 #endif 325 #endif
318 } 326 }
319 327
320 void PaintLayerClipper::calculateRects( 328 void PaintLayerClipper::calculateRects(
321 const ClipRectsContext& context, 329 const ClipRectsContext& context,
322 const LayoutRect& paintDirtyRect, 330 const LayoutRect& paintDirtyRect,
323 LayoutRect& layerBounds, 331 LayoutRect& layerBounds,
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 mapLocalToRootWithGeometryMapper(context, layerBoundsWithVisualOverflow); 506 mapLocalToRootWithGeometryMapper(context, layerBoundsWithVisualOverflow);
499 clip.intersect(layerBoundsWithVisualOverflow); 507 clip.intersect(layerBoundsWithVisualOverflow);
500 } 508 }
501 509
502 ClipRect PaintLayerClipper::backgroundClipRect( 510 ClipRect PaintLayerClipper::backgroundClipRect(
503 const ClipRectsContext& context) const { 511 const ClipRectsContext& context) const {
504 if (m_geometryMapper) { 512 if (m_geometryMapper) {
505 ClipRect backgroundClipRect = clipRectWithGeometryMapper(context, false); 513 ClipRect backgroundClipRect = clipRectWithGeometryMapper(context, false);
506 #ifdef CHECK_CLIP_RECTS 514 #ifdef CHECK_CLIP_RECTS
507 ClipRect testBackgroundClipRect = 515 ClipRect testBackgroundClipRect =
508 PaintLayerClipper(m_layer, false).backgroundClipRect(context); 516 PaintLayerClipper(m_layer, nullptr).backgroundClipRect(context);
509 CHECK_RECTS_EQ(testBackgroundClipRect, backgroundClipRect); 517 CHECK_RECTS_EQ(testBackgroundClipRect, backgroundClipRect);
510 #endif 518 #endif
511 return backgroundClipRect; 519 return backgroundClipRect;
512 } 520 }
513 DCHECK(m_layer.parent()); 521 DCHECK(m_layer.parent());
514 LayoutView* layoutView = m_layer.layoutObject()->view(); 522 LayoutView* layoutView = m_layer.layoutObject()->view();
515 DCHECK(layoutView); 523 DCHECK(layoutView);
516 524
517 RefPtr<ClipRects> parentClipRects = ClipRects::create(); 525 RefPtr<ClipRects> parentClipRects = ClipRects::create();
518 if (&m_layer == context.rootLayer) { 526 if (&m_layer == context.rootLayer) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
578 const LayoutSize& subpixelAccumulation) const { 586 const LayoutSize& subpixelAccumulation) const {
579 DCHECK(!m_geometryMapper); 587 DCHECK(!m_geometryMapper);
580 ClipRectsContext context(rootLayer, PaintingClipRects, 588 ClipRectsContext context(rootLayer, PaintingClipRects,
581 IgnoreOverlayScrollbarSize, subpixelAccumulation); 589 IgnoreOverlayScrollbarSize, subpixelAccumulation);
582 if (respectOverflowClip == IgnoreOverflowClip) 590 if (respectOverflowClip == IgnoreOverflowClip)
583 context.setIgnoreOverflowClip(); 591 context.setIgnoreOverflowClip();
584 return getClipRects(context); 592 return getClipRects(context);
585 } 593 }
586 594
587 } // namespace blink 595 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/TestExpectations ('k') | third_party/WebKit/Source/core/paint/PaintLayerClipperTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698