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 326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 foregroundRect = backgroundRect; | 337 foregroundRect = backgroundRect; |
338 | 338 |
339 LayoutPoint offset; | 339 LayoutPoint offset; |
340 if (offsetFromRoot) | 340 if (offsetFromRoot) |
341 offset = *offsetFromRoot; | 341 offset = *offsetFromRoot; |
342 else | 342 else |
343 m_layer.convertToLayerCoords(context.rootLayer, offset); | 343 m_layer.convertToLayerCoords(context.rootLayer, offset); |
344 layerBounds = LayoutRect(offset, LayoutSize(m_layer.size())); | 344 layerBounds = LayoutRect(offset, LayoutSize(m_layer.size())); |
345 | 345 |
346 // Update the clip rects that will be passed to child layers. | 346 // Update the clip rects that will be passed to child layers. |
347 if ((layoutObject.hasOverflowClip() || | 347 if (shouldClipOverflow(context)) { |
348 layoutObject.styleRef().containsPaint()) && | |
349 shouldRespectOverflowClip(context)) { | |
350 foregroundRect.intersect( | 348 foregroundRect.intersect( |
351 toLayoutBox(layoutObject) | 349 toLayoutBox(layoutObject) |
352 .overflowClipRect(offset, context.overlayScrollbarClipBehavior)); | 350 .overflowClipRect(offset, context.overlayScrollbarClipBehavior)); |
353 if (layoutObject.styleRef().hasBorderRadius()) | 351 if (layoutObject.styleRef().hasBorderRadius()) |
354 foregroundRect.setHasRadius(true); | 352 foregroundRect.setHasRadius(true); |
355 | 353 |
356 // FIXME: Does not do the right thing with columns yet, since we don't yet | 354 // FIXME: Does not do the right thing with columns yet, since we don't yet |
357 // factor in the individual column boxes as overflow. | 355 // factor in the individual column boxes as overflow. |
358 | 356 |
359 // The LayoutView is special since its overflow clipping rect may be larger | 357 // The LayoutView is special since its overflow clipping rect may be larger |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 // Ensure that our parent's clip has been calculated so that we can examine | 398 // Ensure that our parent's clip has been calculated so that we can examine |
401 // the values. | 399 // the values. |
402 if (parentLayer) { | 400 if (parentLayer) { |
403 parentLayer->clipper().getOrCalculateClipRects(context, clipRects); | 401 parentLayer->clipper().getOrCalculateClipRects(context, clipRects); |
404 } else { | 402 } else { |
405 clipRects.reset(LayoutRect(LayoutRect::infiniteIntRect())); | 403 clipRects.reset(LayoutRect(LayoutRect::infiniteIntRect())); |
406 } | 404 } |
407 | 405 |
408 adjustClipRectsForChildren(layoutObject, clipRects); | 406 adjustClipRectsForChildren(layoutObject, clipRects); |
409 | 407 |
410 if ((layoutObject.hasOverflowClip() && shouldRespectOverflowClip(context)) || | 408 if (shouldClipOverflow(context) || layoutObject.hasClip() || |
411 (layoutObject.isSVGRoot() && | 409 (layoutObject.isSVGRoot() && |
412 toLayoutSVGRoot(&layoutObject)->shouldApplyViewportClip()) || | 410 toLayoutSVGRoot(&layoutObject)->shouldApplyViewportClip())) { |
413 layoutObject.hasClip() || layoutObject.styleRef().containsPaint()) { | |
414 // This offset cannot use convertToLayerCoords, because sometimes our | 411 // This offset cannot use convertToLayerCoords, because sometimes our |
415 // rootLayer may be across some transformed layer boundary, for example, in | 412 // rootLayer may be across some transformed layer boundary, for example, in |
416 // the PaintLayerCompositor overlapMap, where clipRects are needed in view | 413 // the PaintLayerCompositor overlapMap, where clipRects are needed in view |
417 // space. | 414 // space. |
418 applyClipRects(context, layoutObject, | 415 applyClipRects(context, layoutObject, |
419 roundedLayoutPoint(layoutObject.localToAncestorPoint( | 416 roundedLayoutPoint(layoutObject.localToAncestorPoint( |
420 FloatPoint(), context.rootLayer->layoutObject())), | 417 FloatPoint(), context.rootLayer->layoutObject())), |
421 clipRects); | 418 clipRects); |
422 } | 419 } |
423 } | 420 } |
(...skipping 16 matching lines...) Expand all Loading... |
440 LayoutRect source(LayoutRect::infiniteIntRect()); | 437 LayoutRect source(LayoutRect::infiniteIntRect()); |
441 bool success = false; | 438 bool success = false; |
442 const ObjectPaintProperties* properties = | 439 const ObjectPaintProperties* properties = |
443 m_layer.layoutObject()->objectPaintProperties(); | 440 m_layer.layoutObject()->objectPaintProperties(); |
444 PropertyTreeState propertyTreeState = | 441 PropertyTreeState propertyTreeState = |
445 properties->localBorderBoxProperties()->propertyTreeState; | 442 properties->localBorderBoxProperties()->propertyTreeState; |
446 | 443 |
447 if (properties->cssClip()) | 444 if (properties->cssClip()) |
448 propertyTreeState.setClip(properties->cssClip()); | 445 propertyTreeState.setClip(properties->cssClip()); |
449 | 446 |
450 const LayoutObject& layoutObject = *m_layer.layoutObject(); | 447 if (isForeground && shouldClipOverflow(context) && properties->overflowClip()) |
451 if (shouldRespectOverflowClip(context) && isForeground && | 448 propertyTreeState.setClip(properties->overflowClip()); |
452 (layoutObject.hasOverflowClip() || | |
453 layoutObject.styleRef().containsPaint())) { | |
454 if (properties->overflowClip()) | |
455 propertyTreeState.setClip(properties->overflowClip()); | |
456 } | |
457 | 449 |
458 const ObjectPaintProperties* ancestorProperties = | 450 const ObjectPaintProperties* ancestorProperties = |
459 context.rootLayer->layoutObject()->objectPaintProperties(); | 451 context.rootLayer->layoutObject()->objectPaintProperties(); |
460 PropertyTreeState destinationPropertyTreeState = | 452 PropertyTreeState destinationPropertyTreeState = |
461 ancestorProperties->localBorderBoxProperties()->propertyTreeState; | 453 ancestorProperties->localBorderBoxProperties()->propertyTreeState; |
462 if (!context.rootLayer->clipper().shouldRespectOverflowClip(context)) { | 454 if (!context.rootLayer->clipper().shouldRespectOverflowClip(context)) { |
463 if (ancestorProperties->overflowClip()) | 455 if (ancestorProperties->overflowClip()) |
464 destinationPropertyTreeState.setClip(ancestorProperties->overflowClip()); | 456 destinationPropertyTreeState.setClip(ancestorProperties->overflowClip()); |
465 } | 457 } |
466 FloatRect clippedRectInRootLayerSpace = | 458 FloatRect clippedRectInRootLayerSpace = |
467 m_geometryMapper->mapToVisualRectInDestinationSpace( | 459 m_geometryMapper->mapToVisualRectInDestinationSpace( |
468 FloatRect(source), propertyTreeState, destinationPropertyTreeState, | 460 FloatRect(source), propertyTreeState, destinationPropertyTreeState, |
469 success); | 461 success); |
470 DCHECK(success); | 462 DCHECK(success); |
471 return ClipRect(LayoutRect(clippedRectInRootLayerSpace)); | 463 return ClipRect(LayoutRect(clippedRectInRootLayerSpace)); |
472 } | 464 } |
473 | 465 |
474 ClipRect PaintLayerClipper::applyOverflowClipToBackgroundRectWithGeometryMapper( | 466 ClipRect PaintLayerClipper::applyOverflowClipToBackgroundRectWithGeometryMapper( |
475 const ClipRectsContext& context, | 467 const ClipRectsContext& context, |
476 const ClipRect& clip) const { | 468 const ClipRect& clip) const { |
477 const LayoutObject& layoutObject = *m_layer.layoutObject(); | 469 const LayoutObject& layoutObject = *m_layer.layoutObject(); |
478 FloatRect clipRect(clip.rect()); | 470 FloatRect clipRect(clip.rect()); |
479 if ((layoutObject.hasOverflowClip() || | 471 if (shouldClipOverflow(context)) { |
480 layoutObject.styleRef().containsPaint()) && | |
481 shouldRespectOverflowClip(context)) { | |
482 LayoutRect layerBoundsWithVisualOverflow = | 472 LayoutRect layerBoundsWithVisualOverflow = |
483 layoutObject.isLayoutView() | 473 layoutObject.isLayoutView() |
484 ? toLayoutView(layoutObject).viewRect() | 474 ? toLayoutView(layoutObject).viewRect() |
485 : toLayoutBox(layoutObject).visualOverflowRect(); | 475 : toLayoutBox(layoutObject).visualOverflowRect(); |
486 toLayoutBox(layoutObject) | 476 toLayoutBox(layoutObject) |
487 .flipForWritingMode( | 477 .flipForWritingMode( |
488 // PaintLayer are in physical coordinates, so the overflow has to be | 478 // PaintLayer are in physical coordinates, so the overflow has to be |
489 // flipped. | 479 // flipped. |
490 layerBoundsWithVisualOverflow); | 480 layerBoundsWithVisualOverflow); |
491 mapLocalToRootWithGeometryMapper(context, layerBoundsWithVisualOverflow); | 481 mapLocalToRootWithGeometryMapper(context, layerBoundsWithVisualOverflow); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
531 } | 521 } |
532 | 522 |
533 void PaintLayerClipper::getOrCalculateClipRects(const ClipRectsContext& context, | 523 void PaintLayerClipper::getOrCalculateClipRects(const ClipRectsContext& context, |
534 ClipRects& clipRects) const { | 524 ClipRects& clipRects) const { |
535 if (context.usesCache()) | 525 if (context.usesCache()) |
536 clipRects = getClipRects(context); | 526 clipRects = getClipRects(context); |
537 else | 527 else |
538 calculateClipRects(context, clipRects); | 528 calculateClipRects(context, clipRects); |
539 } | 529 } |
540 | 530 |
| 531 bool PaintLayerClipper::shouldClipOverflow( |
| 532 const ClipRectsContext& context) const { |
| 533 return (m_layer.layoutObject()->hasOverflowClip() || |
| 534 m_layer.layoutObject()->styleRef().containsPaint()) && |
| 535 shouldRespectOverflowClip(context); |
| 536 } |
| 537 |
541 bool PaintLayerClipper::shouldRespectOverflowClip( | 538 bool PaintLayerClipper::shouldRespectOverflowClip( |
542 const ClipRectsContext& context) const { | 539 const ClipRectsContext& context) const { |
543 if (&m_layer != context.rootLayer) | 540 if (&m_layer != context.rootLayer) |
544 return true; | 541 return true; |
545 | 542 |
546 if (context.respectOverflowClip == IgnoreOverflowClip) | 543 if (context.respectOverflowClip == IgnoreOverflowClip) |
547 return false; | 544 return false; |
548 | 545 |
549 if (m_layer.isRootLayer() && | 546 if (m_layer.isRootLayer() && |
550 context.respectOverflowClipForViewport == IgnoreOverflowClip) | 547 context.respectOverflowClipForViewport == IgnoreOverflowClip) |
551 return false; | 548 return false; |
552 | 549 |
553 return true; | 550 return true; |
554 } | 551 } |
555 | 552 |
556 ClipRects& PaintLayerClipper::paintingClipRects( | 553 ClipRects& PaintLayerClipper::paintingClipRects( |
557 const PaintLayer* rootLayer, | 554 const PaintLayer* rootLayer, |
558 ShouldRespectOverflowClipType respectOverflowClip, | 555 ShouldRespectOverflowClipType respectOverflowClip, |
559 const LayoutSize& subpixelAccumulation) const { | 556 const LayoutSize& subpixelAccumulation) const { |
560 DCHECK(!m_geometryMapper); | 557 DCHECK(!m_geometryMapper); |
561 ClipRectsContext context(rootLayer, PaintingClipRects, | 558 ClipRectsContext context(rootLayer, PaintingClipRects, |
562 IgnoreOverlayScrollbarSize, subpixelAccumulation); | 559 IgnoreOverlayScrollbarSize, subpixelAccumulation); |
563 if (respectOverflowClip == IgnoreOverflowClip) | 560 if (respectOverflowClip == IgnoreOverflowClip) |
564 context.setIgnoreOverflowClip(); | 561 context.setIgnoreOverflowClip(); |
565 return getClipRects(context); | 562 return getClipRects(context); |
566 } | 563 } |
567 | 564 |
568 } // namespace blink | 565 } // namespace blink |
OLD | NEW |