| OLD | NEW |
| 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 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 323 ClipRect& backgroundRect, | 323 ClipRect& backgroundRect, |
| 324 ClipRect& foregroundRect, | 324 ClipRect& foregroundRect, |
| 325 const LayoutPoint* offsetFromRoot) const { | 325 const LayoutPoint* offsetFromRoot) const { |
| 326 if (m_geometryMapper) { | 326 if (m_geometryMapper) { |
| 327 calculateRectsWithGeometryMapper(context, paintDirtyRect, layerBounds, | 327 calculateRectsWithGeometryMapper(context, paintDirtyRect, layerBounds, |
| 328 backgroundRect, foregroundRect, | 328 backgroundRect, foregroundRect, |
| 329 offsetFromRoot); | 329 offsetFromRoot); |
| 330 return; | 330 return; |
| 331 } | 331 } |
| 332 | 332 |
| 333 bool isClippingRoot = &m_layer == context.rootLayer; | |
| 334 LayoutBoxModelObject& layoutObject = *m_layer.layoutObject(); | 333 LayoutBoxModelObject& layoutObject = *m_layer.layoutObject(); |
| 335 | 334 |
| 336 if (!isClippingRoot && m_layer.parent()) { | 335 if (!isClippingRoot(context) && m_layer.parent()) { |
| 337 backgroundRect = backgroundClipRect(context); | 336 backgroundRect = backgroundClipRect(context); |
| 338 backgroundRect.move(context.subPixelAccumulation); | 337 backgroundRect.move(context.subPixelAccumulation); |
| 339 backgroundRect.intersect(paintDirtyRect); | 338 backgroundRect.intersect(paintDirtyRect); |
| 340 } else { | 339 } else { |
| 341 backgroundRect = paintDirtyRect; | 340 backgroundRect = paintDirtyRect; |
| 342 } | 341 } |
| 343 | 342 |
| 344 foregroundRect = backgroundRect; | 343 foregroundRect = backgroundRect; |
| 345 | 344 |
| 346 LayoutPoint offset; | 345 LayoutPoint offset; |
| 347 if (offsetFromRoot) | 346 if (offsetFromRoot) |
| 348 offset = *offsetFromRoot; | 347 offset = *offsetFromRoot; |
| 349 else | 348 else |
| 350 m_layer.convertToLayerCoords(context.rootLayer, offset); | 349 m_layer.convertToLayerCoords(context.rootLayer, offset); |
| 351 layerBounds = LayoutRect(offset, LayoutSize(m_layer.size())); | 350 layerBounds = LayoutRect(offset, LayoutSize(m_layer.size())); |
| 352 | 351 |
| 353 // Update the clip rects that will be passed to child layers. | 352 // Update the clip rects that will be passed to child layers. |
| 354 if (shouldClipOverflow(context)) { | 353 if (shouldClipOverflow(context)) { |
| 355 foregroundRect.intersect( | 354 foregroundRect.intersect( |
| 356 toLayoutBox(layoutObject) | 355 toLayoutBox(layoutObject) |
| 357 .overflowClipRect(offset, context.overlayScrollbarClipBehavior)); | 356 .overflowClipRect(offset, context.overlayScrollbarClipBehavior)); |
| 358 if (layoutObject.styleRef().hasBorderRadius()) | 357 if (layoutObject.styleRef().hasBorderRadius()) |
| 359 foregroundRect.setHasRadius(true); | 358 foregroundRect.setHasRadius(true); |
| 360 | 359 |
| 361 // FIXME: Does not do the right thing with columns yet, since we don't yet | 360 // FIXME: Does not do the right thing with columns yet, since we don't yet |
| 362 // factor in the individual column boxes as overflow. | 361 // factor in the individual column boxes as overflow. |
| 363 | 362 |
| 364 // The LayoutView is special since its overflow clipping rect may be larger | 363 // The RootScroller (typically LayoutView) is special since its overflow |
| 365 // than its box rect (crbug.com/492871). | 364 // clipping rect may be larger than its box rect (crbug.com/492871). |
| 365 DCHECK(!m_layer.isRootScrollerLayer() || |
| 366 layoutObject.document().topDocument().layoutView()); |
| 366 LayoutRect layerBoundsWithVisualOverflow = | 367 LayoutRect layerBoundsWithVisualOverflow = |
| 367 layoutObject.isLayoutView() | 368 m_layer.isRootScrollerLayer() |
| 368 ? toLayoutView(layoutObject).viewRect() | 369 ? layoutObject.document().topDocument().layoutView()->viewRect() |
| 369 : toLayoutBox(layoutObject).visualOverflowRect(); | 370 : toLayoutBox(layoutObject).visualOverflowRect(); |
| 370 // PaintLayer are in physical coordinates, so the overflow has to be | 371 // PaintLayer are in physical coordinates, so the overflow has to be |
| 371 // flipped. | 372 // flipped. |
| 372 toLayoutBox(layoutObject).flipForWritingMode(layerBoundsWithVisualOverflow); | 373 toLayoutBox(layoutObject).flipForWritingMode(layerBoundsWithVisualOverflow); |
| 373 layerBoundsWithVisualOverflow.moveBy(offset); | 374 layerBoundsWithVisualOverflow.moveBy(offset); |
| 374 backgroundRect.intersect(layerBoundsWithVisualOverflow); | 375 backgroundRect.intersect(layerBoundsWithVisualOverflow); |
| 375 } | 376 } |
| 376 | 377 |
| 377 // CSS clip (different than clipping due to overflow) can clip to any box, | 378 // CSS clip (different than clipping due to overflow) can clip to any box, |
| 378 // even if it falls outside of the border box. | 379 // even if it falls outside of the border box. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 389 void PaintLayerClipper::calculateClipRects(const ClipRectsContext& context, | 390 void PaintLayerClipper::calculateClipRects(const ClipRectsContext& context, |
| 390 ClipRects& clipRects) const { | 391 ClipRects& clipRects) const { |
| 391 const LayoutBoxModelObject& layoutObject = *m_layer.layoutObject(); | 392 const LayoutBoxModelObject& layoutObject = *m_layer.layoutObject(); |
| 392 if (!m_layer.parent() && | 393 if (!m_layer.parent() && |
| 393 !RuntimeEnabledFeatures::rootLayerScrollingEnabled()) { | 394 !RuntimeEnabledFeatures::rootLayerScrollingEnabled()) { |
| 394 // The root layer's clip rect is always infinite. | 395 // The root layer's clip rect is always infinite. |
| 395 clipRects.reset(LayoutRect(LayoutRect::infiniteIntRect())); | 396 clipRects.reset(LayoutRect(LayoutRect::infiniteIntRect())); |
| 396 return; | 397 return; |
| 397 } | 398 } |
| 398 | 399 |
| 399 bool isClippingRoot = &m_layer == context.rootLayer; | |
| 400 | |
| 401 // For transformed layers, the root layer was shifted to be us, so there is no | 400 // For transformed layers, the root layer was shifted to be us, so there is no |
| 402 // need to examine the parent. We want to cache clip rects with us as the | 401 // need to examine the parent. We want to cache clip rects with us as the |
| 403 // root. | 402 // root. |
| 404 PaintLayer* parentLayer = !isClippingRoot ? m_layer.parent() : nullptr; | 403 PaintLayer* parentLayer = |
| 404 !isClippingRoot(context) ? m_layer.parent() : nullptr; |
| 405 // Ensure that our parent's clip has been calculated so that we can examine | 405 // Ensure that our parent's clip has been calculated so that we can examine |
| 406 // the values. | 406 // the values. |
| 407 if (parentLayer) { | 407 if (parentLayer) { |
| 408 parentLayer->clipper().getOrCalculateClipRects(context, clipRects); | 408 parentLayer->clipper().getOrCalculateClipRects(context, clipRects); |
| 409 } else { | 409 } else { |
| 410 clipRects.reset(LayoutRect(LayoutRect::infiniteIntRect())); | 410 clipRects.reset(LayoutRect(LayoutRect::infiniteIntRect())); |
| 411 } | 411 } |
| 412 | 412 |
| 413 adjustClipRectsForChildren(layoutObject, clipRects); | 413 adjustClipRectsForChildren(layoutObject, clipRects); |
| 414 | 414 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 // PaintLayer are in physical coordinates, so the overflow has to be | 492 // PaintLayer are in physical coordinates, so the overflow has to be |
| 493 // flipped. | 493 // flipped. |
| 494 layerBoundsWithVisualOverflow); | 494 layerBoundsWithVisualOverflow); |
| 495 mapLocalToRootWithGeometryMapper(context, layerBoundsWithVisualOverflow); | 495 mapLocalToRootWithGeometryMapper(context, layerBoundsWithVisualOverflow); |
| 496 clipRect.intersect(FloatRect(layerBoundsWithVisualOverflow)); | 496 clipRect.intersect(FloatRect(layerBoundsWithVisualOverflow)); |
| 497 } | 497 } |
| 498 | 498 |
| 499 return ClipRect(LayoutRect(clipRect)); | 499 return ClipRect(LayoutRect(clipRect)); |
| 500 } | 500 } |
| 501 | 501 |
| 502 bool PaintLayerClipper::isClippingRoot(const ClipRectsContext& context) const { |
| 503 return &m_layer == context.rootLayer || m_layer.isRootScrollerLayer(); |
| 504 } |
| 505 |
| 502 ClipRect PaintLayerClipper::backgroundClipRect( | 506 ClipRect PaintLayerClipper::backgroundClipRect( |
| 503 const ClipRectsContext& context) const { | 507 const ClipRectsContext& context) const { |
| 504 if (m_geometryMapper) { | 508 if (m_geometryMapper) { |
| 505 ClipRect backgroundClipRect = clipRectWithGeometryMapper(context, false); | 509 ClipRect backgroundClipRect = clipRectWithGeometryMapper(context, false); |
| 506 #ifdef CHECK_CLIP_RECTS | 510 #ifdef CHECK_CLIP_RECTS |
| 507 ClipRect testBackgroundClipRect = | 511 ClipRect testBackgroundClipRect = |
| 508 PaintLayerClipper(m_layer, false).backgroundClipRect(context); | 512 PaintLayerClipper(m_layer, false).backgroundClipRect(context); |
| 509 CHECK_RECTS_EQ(testBackgroundClipRect, backgroundClipRect); | 513 CHECK_RECTS_EQ(testBackgroundClipRect, backgroundClipRect); |
| 510 #endif | 514 #endif |
| 511 return backgroundClipRect; | 515 return backgroundClipRect; |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 const LayoutSize& subpixelAccumulation) const { | 577 const LayoutSize& subpixelAccumulation) const { |
| 574 DCHECK(!m_geometryMapper); | 578 DCHECK(!m_geometryMapper); |
| 575 ClipRectsContext context(rootLayer, PaintingClipRects, | 579 ClipRectsContext context(rootLayer, PaintingClipRects, |
| 576 IgnoreOverlayScrollbarSize, subpixelAccumulation); | 580 IgnoreOverlayScrollbarSize, subpixelAccumulation); |
| 577 if (respectOverflowClip == IgnoreOverflowClip) | 581 if (respectOverflowClip == IgnoreOverflowClip) |
| 578 context.setIgnoreOverflowClip(); | 582 context.setIgnoreOverflowClip(); |
| 579 return getClipRects(context); | 583 return getClipRects(context); |
| 580 } | 584 } |
| 581 | 585 |
| 582 } // namespace blink | 586 } // namespace blink |
| OLD | NEW |