| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. |
| 3 * | 3 * |
| 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
| 5 * | 5 * |
| 6 * Other contributors: | 6 * Other contributors: |
| 7 * Robert O'Callahan <roc+@cs.cmu.edu> | 7 * Robert O'Callahan <roc+@cs.cmu.edu> |
| 8 * David Baron <dbaron@fas.harvard.edu> | 8 * David Baron <dbaron@fas.harvard.edu> |
| 9 * Christian Biesinger <cbiesinger@web.de> | 9 * Christian Biesinger <cbiesinger@web.de> |
| 10 * Randall Jesup <rjesup@wgate.com> | 10 * Randall Jesup <rjesup@wgate.com> |
| (...skipping 3599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3610 | 3610 |
| 3611 if (localPaintFlags & PaintLayerPaintingRootBackgroundOnly && !renderer()->i
sRenderView() && !renderer()->isRoot()) | 3611 if (localPaintFlags & PaintLayerPaintingRootBackgroundOnly && !renderer()->i
sRenderView() && !renderer()->isRoot()) |
| 3612 return; | 3612 return; |
| 3613 | 3613 |
| 3614 // Ensure our lists are up-to-date. | 3614 // Ensure our lists are up-to-date. |
| 3615 updateLayerListsIfNeeded(); | 3615 updateLayerListsIfNeeded(); |
| 3616 | 3616 |
| 3617 LayoutPoint offsetFromRoot; | 3617 LayoutPoint offsetFromRoot; |
| 3618 convertToLayerCoords(paintingInfo.rootLayer, offsetFromRoot); | 3618 convertToLayerCoords(paintingInfo.rootLayer, offsetFromRoot); |
| 3619 | 3619 |
| 3620 IntRect rootRelativeBounds; | 3620 LayoutRect rootRelativeBounds; |
| 3621 bool rootRelativeBoundsComputed = false; | 3621 bool rootRelativeBoundsComputed = false; |
| 3622 | 3622 |
| 3623 // Apply clip-path to context. | 3623 // Apply clip-path to context. |
| 3624 bool hasClipPath = false; | 3624 bool hasClipPath = false; |
| 3625 RenderStyle* style = renderer()->style(); | 3625 RenderStyle* style = renderer()->style(); |
| 3626 if (renderer()->hasClipPath() && !context->paintingDisabled() && style) { | 3626 if (renderer()->hasClipPath() && !context->paintingDisabled() && style) { |
| 3627 ASSERT(style->clipPath()); | 3627 ASSERT(style->clipPath()); |
| 3628 if (style->clipPath()->getOperationType() == ClipPathOperation::SHAPE) { | 3628 if (style->clipPath()->getOperationType() == ClipPathOperation::SHAPE) { |
| 3629 hasClipPath = true; | 3629 hasClipPath = true; |
| 3630 context->save(); | 3630 context->save(); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3711 paintBehavior |= PaintBehaviorSkipRootBackground; | 3711 paintBehavior |= PaintBehaviorSkipRootBackground; |
| 3712 else if (localPaintFlags & PaintLayerPaintingRootBackgroundOnly) | 3712 else if (localPaintFlags & PaintLayerPaintingRootBackgroundOnly) |
| 3713 paintBehavior |= PaintBehaviorRootBackgroundOnly; | 3713 paintBehavior |= PaintBehaviorRootBackgroundOnly; |
| 3714 | 3714 |
| 3715 LayerFragments layerFragments; | 3715 LayerFragments layerFragments; |
| 3716 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars)
{ | 3716 if (shouldPaintContent || shouldPaintOutline || isPaintingOverlayScrollbars)
{ |
| 3717 // Collect the fragments. This will compute the clip rectangles and pain
t offsets for each layer fragment, as well as whether or not the content of each | 3717 // Collect the fragments. This will compute the clip rectangles and pain
t offsets for each layer fragment, as well as whether or not the content of each |
| 3718 // fragment should paint. | 3718 // fragment should paint. |
| 3719 collectFragments(layerFragments, localPaintingInfo.rootLayer, localPaint
ingInfo.region, localPaintingInfo.paintDirtyRect, | 3719 collectFragments(layerFragments, localPaintingInfo.rootLayer, localPaint
ingInfo.region, localPaintingInfo.paintDirtyRect, |
| 3720 (localPaintFlags & PaintLayerTemporaryClipRects) ? TemporaryClipRect
s : PaintingClipRects, IgnoreOverlayScrollbarSize, | 3720 (localPaintFlags & PaintLayerTemporaryClipRects) ? TemporaryClipRect
s : PaintingClipRects, IgnoreOverlayScrollbarSize, |
| 3721 (isPaintingOverflowContents) ? IgnoreOverflowClip : RespectOverflowC
lip, &offsetFromRoot); | 3721 (isPaintingOverflowContents) ? IgnoreOverflowClip : RespectOverflowC
lip, &offsetFromRoot, localPaintingInfo.subPixelAccumulation); |
| 3722 updatePaintingInfoForFragments(layerFragments, localPaintingInfo, localP
aintFlags, shouldPaintContent, &offsetFromRoot); | 3722 updatePaintingInfoForFragments(layerFragments, localPaintingInfo, localP
aintFlags, shouldPaintContent, &offsetFromRoot); |
| 3723 } | 3723 } |
| 3724 | 3724 |
| 3725 if (isPaintingCompositedBackground) { | 3725 if (isPaintingCompositedBackground) { |
| 3726 // Paint only the backgrounds for all of the fragments of the layer. | 3726 // Paint only the backgrounds for all of the fragments of the layer. |
| 3727 if (shouldPaintContent && !selectionOnly) | 3727 if (shouldPaintContent && !selectionOnly) |
| 3728 paintBackgroundForFragments(layerFragments, context, transparencyLay
erContext, paintingInfo.paintDirtyRect, haveTransparency, | 3728 paintBackgroundForFragments(layerFragments, context, transparencyLay
erContext, paintingInfo.paintDirtyRect, haveTransparency, |
| 3729 localPaintingInfo, paintBehavior, paintingRootForRenderer); | 3729 localPaintingInfo, paintBehavior, paintingRootForRenderer); |
| 3730 } | 3730 } |
| 3731 | 3731 |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3819 RenderLayer* childLayer = list->at(i); | 3819 RenderLayer* childLayer = list->at(i); |
| 3820 if (!childLayer->isPaginated()) | 3820 if (!childLayer->isPaginated()) |
| 3821 childLayer->paintLayer(context, paintingInfo, paintFlags); | 3821 childLayer->paintLayer(context, paintingInfo, paintFlags); |
| 3822 else | 3822 else |
| 3823 paintPaginatedChildLayer(childLayer, context, paintingInfo, paintFla
gs); | 3823 paintPaginatedChildLayer(childLayer, context, paintingInfo, paintFla
gs); |
| 3824 } | 3824 } |
| 3825 } | 3825 } |
| 3826 | 3826 |
| 3827 void RenderLayer::collectFragments(LayerFragments& fragments, const RenderLayer*
rootLayer, RenderRegion* region, const LayoutRect& dirtyRect, | 3827 void RenderLayer::collectFragments(LayerFragments& fragments, const RenderLayer*
rootLayer, RenderRegion* region, const LayoutRect& dirtyRect, |
| 3828 ClipRectsType clipRectsType, OverlayScrollbarSizeRelevancy inOverlayScrollba
rSizeRelevancy, ShouldRespectOverflowClip respectOverflowClip, const LayoutPoint
* offsetFromRoot, | 3828 ClipRectsType clipRectsType, OverlayScrollbarSizeRelevancy inOverlayScrollba
rSizeRelevancy, ShouldRespectOverflowClip respectOverflowClip, const LayoutPoint
* offsetFromRoot, |
| 3829 const LayoutRect* layerBoundingBox) | 3829 const LayoutSize& subPixelAccumulation, const LayoutRect* layerBoundingBox) |
| 3830 { | 3830 { |
| 3831 if (!enclosingPaginationLayer() || hasTransform()) { | 3831 if (!enclosingPaginationLayer() || hasTransform()) { |
| 3832 // For unpaginated layers, there is only one fragment. | 3832 // For unpaginated layers, there is only one fragment. |
| 3833 LayerFragment fragment; | 3833 LayerFragment fragment; |
| 3834 ClipRectsContext clipRectsContext(rootLayer, region, clipRectsType, inOv
erlayScrollbarSizeRelevancy, respectOverflowClip); | 3834 ClipRectsContext clipRectsContext(rootLayer, region, clipRectsType, inOv
erlayScrollbarSizeRelevancy, respectOverflowClip, subPixelAccumulation); |
| 3835 calculateRects(clipRectsContext, dirtyRect, fragment.layerBounds, fragme
nt.backgroundRect, fragment.foregroundRect, fragment.outlineRect, offsetFromRoot
); | 3835 calculateRects(clipRectsContext, dirtyRect, fragment.layerBounds, fragme
nt.backgroundRect, fragment.foregroundRect, fragment.outlineRect, offsetFromRoot
); |
| 3836 fragments.append(fragment); | 3836 fragments.append(fragment); |
| 3837 return; | 3837 return; |
| 3838 } | 3838 } |
| 3839 | 3839 |
| 3840 // Compute our offset within the enclosing pagination layer. | 3840 // Compute our offset within the enclosing pagination layer. |
| 3841 LayoutPoint offsetWithinPaginatedLayer; | 3841 LayoutPoint offsetWithinPaginatedLayer; |
| 3842 convertToLayerCoords(enclosingPaginationLayer(), offsetWithinPaginatedLayer)
; | 3842 convertToLayerCoords(enclosingPaginationLayer(), offsetWithinPaginatedLayer)
; |
| 3843 | 3843 |
| 3844 // Calculate clip rects relative to the enclosingPaginationLayer. The purpos
e of this call is to determine our bounds clipped to intermediate | 3844 // Calculate clip rects relative to the enclosingPaginationLayer. The purpos
e of this call is to determine our bounds clipped to intermediate |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3910 } | 3910 } |
| 3911 } | 3911 } |
| 3912 | 3912 |
| 3913 void RenderLayer::paintTransformedLayerIntoFragments(GraphicsContext* context, c
onst LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) | 3913 void RenderLayer::paintTransformedLayerIntoFragments(GraphicsContext* context, c
onst LayerPaintingInfo& paintingInfo, PaintLayerFlags paintFlags) |
| 3914 { | 3914 { |
| 3915 LayerFragments enclosingPaginationFragments; | 3915 LayerFragments enclosingPaginationFragments; |
| 3916 LayoutPoint offsetOfPaginationLayerFromRoot; | 3916 LayoutPoint offsetOfPaginationLayerFromRoot; |
| 3917 LayoutRect transformedExtent = transparencyClipBox(this, enclosingPagination
Layer(), PaintingTransparencyClipBox, RootOfTransparencyClipBox, paintingInfo.pa
intBehavior); | 3917 LayoutRect transformedExtent = transparencyClipBox(this, enclosingPagination
Layer(), PaintingTransparencyClipBox, RootOfTransparencyClipBox, paintingInfo.pa
intBehavior); |
| 3918 enclosingPaginationLayer()->collectFragments(enclosingPaginationFragments, p
aintingInfo.rootLayer, paintingInfo.region, paintingInfo.paintDirtyRect, | 3918 enclosingPaginationLayer()->collectFragments(enclosingPaginationFragments, p
aintingInfo.rootLayer, paintingInfo.region, paintingInfo.paintDirtyRect, |
| 3919 (paintFlags & PaintLayerTemporaryClipRects) ? TemporaryClipRects : Paint
ingClipRects, IgnoreOverlayScrollbarSize, | 3919 (paintFlags & PaintLayerTemporaryClipRects) ? TemporaryClipRects : Paint
ingClipRects, IgnoreOverlayScrollbarSize, |
| 3920 (paintFlags & PaintLayerPaintingOverflowContents) ? IgnoreOverflowClip :
RespectOverflowClip, &offsetOfPaginationLayerFromRoot, &transformedExtent); | 3920 (paintFlags & PaintLayerPaintingOverflowContents) ? IgnoreOverflowClip :
RespectOverflowClip, &offsetOfPaginationLayerFromRoot, paintingInfo.subPixelAcc
umulation, &transformedExtent); |
| 3921 | 3921 |
| 3922 for (size_t i = 0; i < enclosingPaginationFragments.size(); ++i) { | 3922 for (size_t i = 0; i < enclosingPaginationFragments.size(); ++i) { |
| 3923 const LayerFragment& fragment = enclosingPaginationFragments.at(i); | 3923 const LayerFragment& fragment = enclosingPaginationFragments.at(i); |
| 3924 | 3924 |
| 3925 // Apply the page/column clip for this fragment, as well as any clips es
tablished by layers in between us and | 3925 // Apply the page/column clip for this fragment, as well as any clips es
tablished by layers in between us and |
| 3926 // the enclosing pagination layer. | 3926 // the enclosing pagination layer. |
| 3927 LayoutRect clipRect = fragment.backgroundRect.rect(); | 3927 LayoutRect clipRect = fragment.backgroundRect.rect(); |
| 3928 | 3928 |
| 3929 // Now compute the clips within a given fragment | 3929 // Now compute the clips within a given fragment |
| 3930 if (parent() != enclosingPaginationLayer()) { | 3930 if (parent() != enclosingPaginationLayer()) { |
| (...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4543 return false; | 4543 return false; |
| 4544 } | 4544 } |
| 4545 | 4545 |
| 4546 RenderLayer* RenderLayer::hitTestTransformedLayerInFragments(RenderLayer* rootLa
yer, RenderLayer* containerLayer, const HitTestRequest& request, HitTestResult&
result, | 4546 RenderLayer* RenderLayer::hitTestTransformedLayerInFragments(RenderLayer* rootLa
yer, RenderLayer* containerLayer, const HitTestRequest& request, HitTestResult&
result, |
| 4547 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const
HitTestingTransformState* transformState, double* zOffset) | 4547 const LayoutRect& hitTestRect, const HitTestLocation& hitTestLocation, const
HitTestingTransformState* transformState, double* zOffset) |
| 4548 { | 4548 { |
| 4549 LayerFragments enclosingPaginationFragments; | 4549 LayerFragments enclosingPaginationFragments; |
| 4550 LayoutPoint offsetOfPaginationLayerFromRoot; | 4550 LayoutPoint offsetOfPaginationLayerFromRoot; |
| 4551 LayoutRect transformedExtent = transparencyClipBox(this, enclosingPagination
Layer(), HitTestingTransparencyClipBox, RootOfTransparencyClipBox); | 4551 LayoutRect transformedExtent = transparencyClipBox(this, enclosingPagination
Layer(), HitTestingTransparencyClipBox, RootOfTransparencyClipBox); |
| 4552 enclosingPaginationLayer()->collectFragments(enclosingPaginationFragments, r
ootLayer, hitTestLocation.region(), hitTestRect, | 4552 enclosingPaginationLayer()->collectFragments(enclosingPaginationFragments, r
ootLayer, hitTestLocation.region(), hitTestRect, |
| 4553 RootRelativeClipRects, IncludeOverlayScrollbarSize, RespectOverflowClip,
&offsetOfPaginationLayerFromRoot, &transformedExtent); | 4553 RootRelativeClipRects, IncludeOverlayScrollbarSize, RespectOverflowClip,
&offsetOfPaginationLayerFromRoot, LayoutSize(), &transformedExtent); |
| 4554 | 4554 |
| 4555 for (int i = enclosingPaginationFragments.size() - 1; i >= 0; --i) { | 4555 for (int i = enclosingPaginationFragments.size() - 1; i >= 0; --i) { |
| 4556 const LayerFragment& fragment = enclosingPaginationFragments.at(i); | 4556 const LayerFragment& fragment = enclosingPaginationFragments.at(i); |
| 4557 | 4557 |
| 4558 // Apply the page/column clip for this fragment, as well as any clips es
tablished by layers in between us and | 4558 // Apply the page/column clip for this fragment, as well as any clips es
tablished by layers in between us and |
| 4559 // the enclosing pagination layer. | 4559 // the enclosing pagination layer. |
| 4560 LayoutRect clipRect = fragment.backgroundRect.rect(); | 4560 LayoutRect clipRect = fragment.backgroundRect.rect(); |
| 4561 | 4561 |
| 4562 // Now compute the clips within a given fragment | 4562 // Now compute the clips within a given fragment |
| 4563 if (parent() != enclosingPaginationLayer()) { | 4563 if (parent() != enclosingPaginationLayer()) { |
| (...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4975 if (offsetFromRoot) | 4975 if (offsetFromRoot) |
| 4976 offset = *offsetFromRoot; | 4976 offset = *offsetFromRoot; |
| 4977 else | 4977 else |
| 4978 convertToLayerCoords(clipRectsContext.rootLayer, offset); | 4978 convertToLayerCoords(clipRectsContext.rootLayer, offset); |
| 4979 layerBounds = LayoutRect(offset, size()); | 4979 layerBounds = LayoutRect(offset, size()); |
| 4980 | 4980 |
| 4981 // Update the clip rects that will be passed to child layers. | 4981 // Update the clip rects that will be passed to child layers. |
| 4982 if (renderer()->hasOverflowClip()) { | 4982 if (renderer()->hasOverflowClip()) { |
| 4983 // This layer establishes a clip of some kind. | 4983 // This layer establishes a clip of some kind. |
| 4984 if (this != clipRectsContext.rootLayer || clipRectsContext.respectOverfl
owClip == RespectOverflowClip) { | 4984 if (this != clipRectsContext.rootLayer || clipRectsContext.respectOverfl
owClip == RespectOverflowClip) { |
| 4985 foregroundRect.intersect(toRenderBox(renderer())->overflowClipRect(o
ffset, clipRectsContext.region, clipRectsContext.overlayScrollbarSizeRelevancy))
; | 4985 foregroundRect.intersect(toRenderBox(renderer())->overflowClipRect(o
ffset + clipRectsContext.subPixelAccumulation, clipRectsContext.region, clipRect
sContext.overlayScrollbarSizeRelevancy)); |
| 4986 if (renderer()->style()->hasBorderRadius()) | 4986 if (renderer()->style()->hasBorderRadius()) |
| 4987 foregroundRect.setHasRadius(true); | 4987 foregroundRect.setHasRadius(true); |
| 4988 } | 4988 } |
| 4989 | 4989 |
| 4990 // If we establish an overflow clip at all, then go ahead and make sure
our background | 4990 // If we establish an overflow clip at all, then go ahead and make sure
our background |
| 4991 // rect is intersected with our layer's bounds including our visual over
flow, | 4991 // rect is intersected with our layer's bounds including our visual over
flow, |
| 4992 // since any visual overflow like box-shadow or border-outset is not cli
pped by overflow:auto/hidden. | 4992 // since any visual overflow like box-shadow or border-outset is not cli
pped by overflow:auto/hidden. |
| 4993 if (renderBox()->hasVisualOverflow()) { | 4993 if (renderBox()->hasVisualOverflow()) { |
| 4994 // FIXME: Perhaps we should be propagating the borderbox as the clip
rect for children, even though | 4994 // FIXME: Perhaps we should be propagating the borderbox as the clip
rect for children, even though |
| 4995 // we may need to inflate our clip specifically for shadows o
r outsets. | 4995 // we may need to inflate our clip specifically for shadows o
r outsets. |
| 4996 // FIXME: Does not do the right thing with CSS regions yet, since we
don't yet factor in the | 4996 // FIXME: Does not do the right thing with CSS regions yet, since we
don't yet factor in the |
| 4997 // individual region boxes as overflow. | 4997 // individual region boxes as overflow. |
| 4998 LayoutRect layerBoundsWithVisualOverflow = renderBox()->visualOverfl
owRect(); | 4998 LayoutRect layerBoundsWithVisualOverflow = renderBox()->visualOverfl
owRect(); |
| 4999 renderBox()->flipForWritingMode(layerBoundsWithVisualOverflow); // L
ayers are in physical coordinates, so the overflow has to be flipped. | 4999 renderBox()->flipForWritingMode(layerBoundsWithVisualOverflow); // L
ayers are in physical coordinates, so the overflow has to be flipped. |
| 5000 layerBoundsWithVisualOverflow.moveBy(offset); | 5000 layerBoundsWithVisualOverflow.moveBy(offset + clipRectsContext.subPi
xelAccumulation); |
| 5001 if (this != clipRectsContext.rootLayer || clipRectsContext.respectOv
erflowClip == RespectOverflowClip) | 5001 if (this != clipRectsContext.rootLayer || clipRectsContext.respectOv
erflowClip == RespectOverflowClip) |
| 5002 backgroundRect.intersect(layerBoundsWithVisualOverflow); | 5002 backgroundRect.intersect(layerBoundsWithVisualOverflow); |
| 5003 } else { | 5003 } else { |
| 5004 // Shift the bounds to be for our region only. | 5004 // Shift the bounds to be for our region only. |
| 5005 LayoutRect bounds = renderBox()->borderBoxRectInRegion(clipRectsCont
ext.region); | 5005 LayoutRect bounds = renderBox()->borderBoxRectInRegion(clipRectsCont
ext.region); |
| 5006 bounds.moveBy(offset); | 5006 bounds.moveBy(offset + clipRectsContext.subPixelAccumulation); |
| 5007 if (this != clipRectsContext.rootLayer || clipRectsContext.respectOv
erflowClip == RespectOverflowClip) | 5007 if (this != clipRectsContext.rootLayer || clipRectsContext.respectOv
erflowClip == RespectOverflowClip) |
| 5008 backgroundRect.intersect(bounds); | 5008 backgroundRect.intersect(bounds); |
| 5009 } | 5009 } |
| 5010 } | 5010 } |
| 5011 | 5011 |
| 5012 // CSS clip (different than clipping due to overflow) can clip to any box, e
ven if it falls outside of the border box. | 5012 // CSS clip (different than clipping due to overflow) can clip to any box, e
ven if it falls outside of the border box. |
| 5013 if (renderer()->hasClip()) { | 5013 if (renderer()->hasClip()) { |
| 5014 // Clip applies to *us* as well, so go ahead and update the damageRect. | 5014 // Clip applies to *us* as well, so go ahead and update the damageRect. |
| 5015 LayoutRect newPosClip = toRenderBox(renderer())->clipRect(offset, clipRe
ctsContext.region); | 5015 LayoutRect newPosClip = toRenderBox(renderer())->clipRect(offset + clipR
ectsContext.subPixelAccumulation, clipRectsContext.region); |
| 5016 backgroundRect.intersect(newPosClip); | 5016 backgroundRect.intersect(newPosClip); |
| 5017 foregroundRect.intersect(newPosClip); | 5017 foregroundRect.intersect(newPosClip); |
| 5018 outlineRect.intersect(newPosClip); | 5018 outlineRect.intersect(newPosClip); |
| 5019 } | 5019 } |
| 5020 } | 5020 } |
| 5021 | 5021 |
| 5022 LayoutRect RenderLayer::childrenClipRect() const | 5022 LayoutRect RenderLayer::childrenClipRect() const |
| 5023 { | 5023 { |
| 5024 // FIXME: border-radius not accounted for. | 5024 // FIXME: border-radius not accounted for. |
| 5025 // FIXME: Regions not accounted for. | 5025 // FIXME: Regions not accounted for. |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5204 | 5204 |
| 5205 result.moveBy(delta); | 5205 result.moveBy(delta); |
| 5206 return result; | 5206 return result; |
| 5207 } | 5207 } |
| 5208 | 5208 |
| 5209 IntRect RenderLayer::absoluteBoundingBox() const | 5209 IntRect RenderLayer::absoluteBoundingBox() const |
| 5210 { | 5210 { |
| 5211 return pixelSnappedIntRect(boundingBox(root())); | 5211 return pixelSnappedIntRect(boundingBox(root())); |
| 5212 } | 5212 } |
| 5213 | 5213 |
| 5214 IntRect RenderLayer::calculateLayerBounds(const RenderLayer* ancestorLayer, cons
t LayoutPoint* offsetFromRoot, CalculateLayerBoundsFlags flags) const | 5214 LayoutRect RenderLayer::calculateLayerBounds(const RenderLayer* ancestorLayer, c
onst LayoutPoint* offsetFromRoot, CalculateLayerBoundsFlags flags) const |
| 5215 { | 5215 { |
| 5216 if (!isSelfPaintingLayer()) | 5216 if (!isSelfPaintingLayer()) |
| 5217 return IntRect(); | 5217 return LayoutRect(); |
| 5218 | 5218 |
| 5219 // FIXME: This could be improved to do a check like hasVisibleNonCompositing
DescendantLayers() (bug 92580). | 5219 // FIXME: This could be improved to do a check like hasVisibleNonCompositing
DescendantLayers() (bug 92580). |
| 5220 if ((flags & ExcludeHiddenDescendants) && this != ancestorLayer && !hasVisib
leContent() && !hasVisibleDescendant()) | 5220 if ((flags & ExcludeHiddenDescendants) && this != ancestorLayer && !hasVisib
leContent() && !hasVisibleDescendant()) |
| 5221 return IntRect(); | 5221 return LayoutRect(); |
| 5222 | 5222 |
| 5223 RenderLayerModelObject* renderer = this->renderer(); | 5223 RenderLayerModelObject* renderer = this->renderer(); |
| 5224 | 5224 |
| 5225 if (isRootLayer()) { | 5225 if (isRootLayer()) { |
| 5226 // The root layer is always just the size of the document. | 5226 // The root layer is always just the size of the document. |
| 5227 return renderer->view()->unscaledDocumentRect(); | 5227 return renderer->view()->unscaledDocumentRect(); |
| 5228 } | 5228 } |
| 5229 | 5229 |
| 5230 LayoutRect boundingBoxRect = localBoundingBox(flags); | 5230 LayoutRect boundingBoxRect = localBoundingBox(flags); |
| 5231 | 5231 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 5251 | 5251 |
| 5252 if (flags & UseLocalClipRectIfPossible) { | 5252 if (flags & UseLocalClipRectIfPossible) { |
| 5253 LayoutRect localClipRect = this->localClipRect(); | 5253 LayoutRect localClipRect = this->localClipRect(); |
| 5254 if (localClipRect != PaintInfo::infiniteRect()) { | 5254 if (localClipRect != PaintInfo::infiniteRect()) { |
| 5255 if ((flags & IncludeSelfTransform) && paintsWithTransform(PaintBehav
iorNormal)) | 5255 if ((flags & IncludeSelfTransform) && paintsWithTransform(PaintBehav
iorNormal)) |
| 5256 localClipRect = transform()->mapRect(localClipRect); | 5256 localClipRect = transform()->mapRect(localClipRect); |
| 5257 | 5257 |
| 5258 LayoutPoint ancestorRelOffset; | 5258 LayoutPoint ancestorRelOffset; |
| 5259 convertToLayerCoords(ancestorLayer, ancestorRelOffset); | 5259 convertToLayerCoords(ancestorLayer, ancestorRelOffset); |
| 5260 localClipRect.moveBy(ancestorRelOffset); | 5260 localClipRect.moveBy(ancestorRelOffset); |
| 5261 return pixelSnappedIntRect(localClipRect); | 5261 return localClipRect; |
| 5262 } | 5262 } |
| 5263 } | 5263 } |
| 5264 | 5264 |
| 5265 // FIXME: should probably just pass 'flags' down to descendants. | 5265 // FIXME: should probably just pass 'flags' down to descendants. |
| 5266 CalculateLayerBoundsFlags descendantFlags = DefaultCalculateLayerBoundsFlags
| (flags & ExcludeHiddenDescendants) | (flags & IncludeCompositedDescendants); | 5266 CalculateLayerBoundsFlags descendantFlags = DefaultCalculateLayerBoundsFlags
| (flags & ExcludeHiddenDescendants) | (flags & IncludeCompositedDescendants); |
| 5267 | 5267 |
| 5268 const_cast<RenderLayer*>(this)->updateLayerListsIfNeeded(); | 5268 const_cast<RenderLayer*>(this)->updateLayerListsIfNeeded(); |
| 5269 | 5269 |
| 5270 if (RenderLayer* reflection = reflectionLayer()) { | 5270 if (RenderLayer* reflection = reflectionLayer()) { |
| 5271 if (!reflection->isComposited()) { | 5271 if (!reflection->isComposited()) { |
| 5272 IntRect childUnionBounds = reflection->calculateLayerBounds(this, 0,
descendantFlags); | 5272 LayoutRect childUnionBounds = reflection->calculateLayerBounds(this,
0, descendantFlags); |
| 5273 unionBounds.unite(childUnionBounds); | 5273 unionBounds.unite(childUnionBounds); |
| 5274 } | 5274 } |
| 5275 } | 5275 } |
| 5276 | 5276 |
| 5277 ASSERT(isStackingContainer() || (!posZOrderList() || !posZOrderList()->size(
))); | 5277 ASSERT(isStackingContainer() || (!posZOrderList() || !posZOrderList()->size(
))); |
| 5278 | 5278 |
| 5279 #if !ASSERT_DISABLED | 5279 #if !ASSERT_DISABLED |
| 5280 LayerListMutationDetector mutationChecker(const_cast<RenderLayer*>(this)); | 5280 LayerListMutationDetector mutationChecker(const_cast<RenderLayer*>(this)); |
| 5281 #endif | 5281 #endif |
| 5282 | 5282 |
| 5283 if (Vector<RenderLayer*>* negZOrderList = this->negZOrderList()) { | 5283 if (Vector<RenderLayer*>* negZOrderList = this->negZOrderList()) { |
| 5284 size_t listSize = negZOrderList->size(); | 5284 size_t listSize = negZOrderList->size(); |
| 5285 for (size_t i = 0; i < listSize; ++i) { | 5285 for (size_t i = 0; i < listSize; ++i) { |
| 5286 RenderLayer* curLayer = negZOrderList->at(i); | 5286 RenderLayer* curLayer = negZOrderList->at(i); |
| 5287 if (flags & IncludeCompositedDescendants || !curLayer->isComposited(
)) { | 5287 if (flags & IncludeCompositedDescendants || !curLayer->isComposited(
)) { |
| 5288 IntRect childUnionBounds = curLayer->calculateLayerBounds(this,
0, descendantFlags); | 5288 LayoutRect childUnionBounds = curLayer->calculateLayerBounds(thi
s, 0, descendantFlags); |
| 5289 unionBounds.unite(childUnionBounds); | 5289 unionBounds.unite(childUnionBounds); |
| 5290 } | 5290 } |
| 5291 } | 5291 } |
| 5292 } | 5292 } |
| 5293 | 5293 |
| 5294 if (Vector<RenderLayer*>* posZOrderList = this->posZOrderList()) { | 5294 if (Vector<RenderLayer*>* posZOrderList = this->posZOrderList()) { |
| 5295 size_t listSize = posZOrderList->size(); | 5295 size_t listSize = posZOrderList->size(); |
| 5296 for (size_t i = 0; i < listSize; ++i) { | 5296 for (size_t i = 0; i < listSize; ++i) { |
| 5297 RenderLayer* curLayer = posZOrderList->at(i); | 5297 RenderLayer* curLayer = posZOrderList->at(i); |
| 5298 if (flags & IncludeCompositedDescendants || !curLayer->isComposited(
)) { | 5298 if (flags & IncludeCompositedDescendants || !curLayer->isComposited(
)) { |
| 5299 IntRect childUnionBounds = curLayer->calculateLayerBounds(this,
0, descendantFlags); | 5299 LayoutRect childUnionBounds = curLayer->calculateLayerBounds(thi
s, 0, descendantFlags); |
| 5300 unionBounds.unite(childUnionBounds); | 5300 unionBounds.unite(childUnionBounds); |
| 5301 } | 5301 } |
| 5302 } | 5302 } |
| 5303 } | 5303 } |
| 5304 | 5304 |
| 5305 if (Vector<RenderLayer*>* normalFlowList = this->normalFlowList()) { | 5305 if (Vector<RenderLayer*>* normalFlowList = this->normalFlowList()) { |
| 5306 size_t listSize = normalFlowList->size(); | 5306 size_t listSize = normalFlowList->size(); |
| 5307 for (size_t i = 0; i < listSize; ++i) { | 5307 for (size_t i = 0; i < listSize; ++i) { |
| 5308 RenderLayer* curLayer = normalFlowList->at(i); | 5308 RenderLayer* curLayer = normalFlowList->at(i); |
| 5309 if (flags & IncludeCompositedDescendants || !curLayer->isComposited(
)) { | 5309 if (flags & IncludeCompositedDescendants || !curLayer->isComposited(
)) { |
| 5310 IntRect curAbsBounds = curLayer->calculateLayerBounds(this, 0, d
escendantFlags); | 5310 LayoutRect curAbsBounds = curLayer->calculateLayerBounds(this, 0
, descendantFlags); |
| 5311 unionBounds.unite(curAbsBounds); | 5311 unionBounds.unite(curAbsBounds); |
| 5312 } | 5312 } |
| 5313 } | 5313 } |
| 5314 } | 5314 } |
| 5315 | 5315 |
| 5316 // FIXME: We can optimize the size of the composited layers, by not enlargin
g | 5316 // FIXME: We can optimize the size of the composited layers, by not enlargin
g |
| 5317 // filtered areas with the outsets if we know that the filter is going to re
nder in hardware. | 5317 // filtered areas with the outsets if we know that the filter is going to re
nder in hardware. |
| 5318 // https://bugs.webkit.org/show_bug.cgi?id=81239 | 5318 // https://bugs.webkit.org/show_bug.cgi?id=81239 |
| 5319 if (flags & IncludeLayerFilterOutsets) | 5319 if (flags & IncludeLayerFilterOutsets) |
| 5320 renderer->style()->filterOutsets().expandRect(unionBounds); | 5320 renderer->style()->filterOutsets().expandRect(unionBounds); |
| 5321 | 5321 |
| 5322 if ((flags & IncludeSelfTransform) && paintsWithTransform(PaintBehaviorNorma
l)) { | 5322 if ((flags & IncludeSelfTransform) && paintsWithTransform(PaintBehaviorNorma
l)) { |
| 5323 TransformationMatrix* affineTrans = transform(); | 5323 TransformationMatrix* affineTrans = transform(); |
| 5324 boundingBoxRect = affineTrans->mapRect(boundingBoxRect); | 5324 boundingBoxRect = affineTrans->mapRect(boundingBoxRect); |
| 5325 unionBounds = affineTrans->mapRect(unionBounds); | 5325 unionBounds = affineTrans->mapRect(unionBounds); |
| 5326 } | 5326 } |
| 5327 | 5327 |
| 5328 LayoutPoint ancestorRelOffset; | 5328 LayoutPoint ancestorRelOffset; |
| 5329 if (offsetFromRoot) | 5329 if (offsetFromRoot) |
| 5330 ancestorRelOffset = *offsetFromRoot; | 5330 ancestorRelOffset = *offsetFromRoot; |
| 5331 else | 5331 else |
| 5332 convertToLayerCoords(ancestorLayer, ancestorRelOffset); | 5332 convertToLayerCoords(ancestorLayer, ancestorRelOffset); |
| 5333 unionBounds.moveBy(ancestorRelOffset); | 5333 unionBounds.moveBy(ancestorRelOffset); |
| 5334 | 5334 |
| 5335 return pixelSnappedIntRect(unionBounds); | 5335 return unionBounds; |
| 5336 } | 5336 } |
| 5337 | 5337 |
| 5338 void RenderLayer::clearClipRectsIncludingDescendants(ClipRectsType typeToClear) | 5338 void RenderLayer::clearClipRectsIncludingDescendants(ClipRectsType typeToClear) |
| 5339 { | 5339 { |
| 5340 // FIXME: it's not clear how this layer not having clip rects guarantees tha
t no descendants have any. | 5340 // FIXME: it's not clear how this layer not having clip rects guarantees tha
t no descendants have any. |
| 5341 if (!m_clipRectsCache) | 5341 if (!m_clipRectsCache) |
| 5342 return; | 5342 return; |
| 5343 | 5343 |
| 5344 clearClipRects(typeToClear); | 5344 clearClipRects(typeToClear); |
| 5345 | 5345 |
| (...skipping 1034 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6380 } | 6380 } |
| 6381 } | 6381 } |
| 6382 | 6382 |
| 6383 void showLayerTree(const WebCore::RenderObject* renderer) | 6383 void showLayerTree(const WebCore::RenderObject* renderer) |
| 6384 { | 6384 { |
| 6385 if (!renderer) | 6385 if (!renderer) |
| 6386 return; | 6386 return; |
| 6387 showLayerTree(renderer->enclosingLayer()); | 6387 showLayerTree(renderer->enclosingLayer()); |
| 6388 } | 6388 } |
| 6389 #endif | 6389 #endif |
| OLD | NEW |