diff options
| author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-24 16:36:50 +0100 |
|---|---|---|
| committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-24 16:36:50 +0100 |
| commit | ad0d549d4cc13433f77c1ac8f0ab379c83d93f28 (patch) | |
| tree | b34b0daceb7c8e7fdde4b4ec43650ab7caadb0a9 /Source/WebCore/rendering/RenderBoxModelObject.cpp | |
| parent | 03e12282df9aa1e1fb05a8b90f1cfc2e08764cec (diff) | |
| download | qtwebkit-ad0d549d4cc13433f77c1ac8f0ab379c83d93f28.tar.gz | |
Imported WebKit commit bb52bf3c0119e8a128cd93afe5572413a8617de9 (http://svn.webkit.org/repository/webkit/trunk@108790)
Diffstat (limited to 'Source/WebCore/rendering/RenderBoxModelObject.cpp')
| -rw-r--r-- | Source/WebCore/rendering/RenderBoxModelObject.cpp | 209 |
1 files changed, 157 insertions, 52 deletions
diff --git a/Source/WebCore/rendering/RenderBoxModelObject.cpp b/Source/WebCore/rendering/RenderBoxModelObject.cpp index 3aadee902..e3ab32180 100644 --- a/Source/WebCore/rendering/RenderBoxModelObject.cpp +++ b/Source/WebCore/rendering/RenderBoxModelObject.cpp @@ -168,8 +168,6 @@ bool ImageQualityController::shouldPaintAtLowQuality(GraphicsContext* context, R const AffineTransform& currentTransform = context->getCTM(); bool contextIsScaled = !currentTransform.isIdentityOrTranslationOrFlipped(); - // FIXME: Change to use roughlyEquals when we move to float. - // See https://bugs.webkit.org/show_bug.cgi?id=66148 if (!contextIsScaled && size == imageSize) { // There is no scale in effect. If we had a scale in effect before, we can just remove this object from the list. removeLayer(object, innerMap, layer); @@ -192,8 +190,6 @@ bool ImageQualityController::shouldPaintAtLowQuality(GraphicsContext* context, R // If this is the first time resizing this image, or its size is the // same as the last resize, draw at high res, but record the paint // size and set the timer. - // FIXME: Change to use roughlyEquals when we move to float. - // See https://bugs.webkit.org/show_bug.cgi?id=66148 if (isFirstResize || oldSize == size) { restartTimer(); set(object, innerMap, layer, size); @@ -362,7 +358,7 @@ void RenderBoxModelObject::styleDidChange(StyleDifference diff, const RenderStyl updateBoxModelInfoFromStyle(); if (requiresLayer()) { - if (!layer()) { + if (!layer() && layerCreationAllowedForSubtree()) { if (s_wasFloating && isFloating()) setChildNeedsLayout(true); m_layer = new (renderArena()) RenderLayer(this); @@ -401,8 +397,26 @@ void RenderBoxModelObject::updateBoxModelInfoFromStyle() setHorizontalWritingMode(styleToUse->isHorizontalWritingMode()); } +enum RelPosAxis { RelPosX, RelPosY }; + +static LayoutUnit accumulateRelativePositionOffsets(const RenderObject* child, RelPosAxis axis) +{ + if (!child->isAnonymousBlock() || !child->isRelPositioned()) + return 0; + LayoutUnit offset = 0; + RenderObject* p = toRenderBlock(child)->inlineElementContinuation(); + while (p && p->isRenderInline()) { + if (p->isRelPositioned()) + offset += (axis == RelPosX) ? toRenderInline(p)->relativePositionOffsetX() : toRenderInline(p)->relativePositionOffsetY(); + p = p->parent(); + } + return offset; +} + LayoutUnit RenderBoxModelObject::relativePositionOffsetX() const { + LayoutUnit offset = accumulateRelativePositionOffsets(this, RelPosX); + // Objects that shrink to avoid floats normally use available line width when computing containing block width. However // in the case of relative positioning using percentages, we can't do this. The offset should always be resolved using the // available width of the containing block. Therefore we don't use containingBlockLogicalWidthForContent() here, but instead explicitly @@ -411,19 +425,20 @@ LayoutUnit RenderBoxModelObject::relativePositionOffsetX() const RenderBlock* cb = containingBlock(); if (!style()->right().isAuto() && !cb->style()->isLeftToRightDirection()) return -style()->right().calcValue(cb->availableWidth()); - return style()->left().calcValue(cb->availableWidth()); + return offset + style()->left().calcValue(cb->availableWidth()); } if (!style()->right().isAuto()) { RenderBlock* cb = containingBlock(); - return -style()->right().calcValue(cb->availableWidth()); + return offset + -style()->right().calcValue(cb->availableWidth()); } - return 0; + return offset; } LayoutUnit RenderBoxModelObject::relativePositionOffsetY() const { + LayoutUnit offset = accumulateRelativePositionOffsets(this, RelPosY); + RenderBlock* containingBlock = this->containingBlock(); - // If the containing block of a relatively positioned element does not // specify a height, a percentage top or bottom offset should be resolved as // auto. An exception to this is if the containing block has the WinIE quirk @@ -434,15 +449,15 @@ LayoutUnit RenderBoxModelObject::relativePositionOffsetY() const && (!containingBlock->style()->height().isAuto() || !style()->top().isPercent() || containingBlock->stretchesToViewport())) - return style()->top().calcValue(containingBlock->availableHeight()); + return offset + style()->top().calcValue(containingBlock->availableHeight()); if (!style()->bottom().isAuto() && (!containingBlock->style()->height().isAuto() || !style()->bottom().isPercent() || containingBlock->stretchesToViewport())) - return -style()->bottom().calcValue(containingBlock->availableHeight()); + return offset + -style()->bottom().calcValue(containingBlock->availableHeight()); - return 0; + return offset; } LayoutUnit RenderBoxModelObject::offsetLeft() const @@ -453,7 +468,7 @@ LayoutUnit RenderBoxModelObject::offsetLeft() const return 0; RenderBoxModelObject* offsetPar = offsetParent(); - LayoutUnit xPos = (isBox() ? toRenderBox(this)->left() : 0); + LayoutUnit xPos = (isBox() ? toRenderBox(this)->left() : zeroLayoutUnit); // If the offsetParent of the element is null, or is the HTML body element, // return the distance between the canvas origin and the left border edge @@ -487,7 +502,7 @@ LayoutUnit RenderBoxModelObject::offsetTop() const return 0; RenderBoxModelObject* offsetPar = offsetParent(); - LayoutUnit yPos = (isBox() ? toRenderBox(this)->top() : 0); + LayoutUnit yPos = (isBox() ? toRenderBox(this)->top() : zeroLayoutUnit); // If the offsetParent of the element is null, or is the HTML body element, // return the distance between the canvas origin and the top border edge @@ -619,6 +634,19 @@ static LayoutRect backgroundRectAdjustedForBleedAvoidance(GraphicsContext* conte return adjustedRect; } +static void applyBoxShadowForBackground(GraphicsContext* context, RenderStyle* style) +{ + const ShadowData* boxShadow = style->boxShadow(); + while (boxShadow->style() != Normal) + boxShadow = boxShadow->next(); + + FloatSize shadowOffset(boxShadow->x(), boxShadow->y()); + if (!boxShadow->isWebkitBoxShadow()) + context->setShadow(shadowOffset, boxShadow->blur(), boxShadow->color(), style->colorSpace()); + else + context->setLegacyShadow(shadowOffset, boxShadow->blur(), boxShadow->color(), style->colorSpace()); +} + void RenderBoxModelObject::paintFillLayerExtended(const PaintInfo& paintInfo, const Color& color, const FillLayer* bgLayer, const LayoutRect& rect, BackgroundBleedAvoidance bleedAvoidance, InlineFlowBox* box, const LayoutSize& boxSize, CompositeOperator op, RenderObject* backgroundObject) { @@ -669,11 +697,16 @@ void RenderBoxModelObject::paintFillLayerExtended(const PaintInfo& paintInfo, co if (!colorVisible) return; + bool boxShadowShouldBeAppliedToBackground = this->boxShadowShouldBeAppliedToBackground(bleedAvoidance, box); + GraphicsContextStateSaver shadowStateSaver(*context, boxShadowShouldBeAppliedToBackground); + if (boxShadowShouldBeAppliedToBackground) + applyBoxShadowForBackground(context, style()); + if (hasRoundedBorder && bleedAvoidance != BackgroundBleedUseTransparencyLayer) { RoundedRect border = getBackgroundRoundedRect(backgroundRectAdjustedForBleedAvoidance(context, rect, bleedAvoidance), box, boxSize.width(), boxSize.height(), includeLeftEdge, includeRightEdge); context->fillRoundedRect(border, bgColor, style()->colorSpace()); } else - context->fillRect(rect, bgColor, style()->colorSpace()); + context->fillRect(pixelSnappedIntRect(rect), bgColor, style()->colorSpace()); return; } @@ -685,49 +718,53 @@ void RenderBoxModelObject::paintFillLayerExtended(const PaintInfo& paintInfo, co context->addRoundedRectClip(border); } - LayoutUnit bLeft = includeLeftEdge ? borderLeft() : 0; - LayoutUnit bRight = includeRightEdge ? borderRight() : 0; - LayoutUnit pLeft = includeLeftEdge ? paddingLeft() : 0; - LayoutUnit pRight = includeRightEdge ? paddingRight() : 0; + LayoutUnit bLeft = includeLeftEdge ? borderLeft() : zeroLayoutUnit; + LayoutUnit bRight = includeRightEdge ? borderRight() : zeroLayoutUnit; + LayoutUnit pLeft = includeLeftEdge ? paddingLeft() : zeroLayoutUnit; + LayoutUnit pRight = includeRightEdge ? paddingRight() : zeroLayoutUnit; GraphicsContextStateSaver clipWithScrollingStateSaver(*context, clippedWithLocalScrolling); LayoutRect scrolledPaintRect = rect; if (clippedWithLocalScrolling) { // Clip to the overflow area. - context->clip(toRenderBox(this)->overflowClipRect(rect.location(), paintInfo.renderRegion)); + RenderBox* thisBox = toRenderBox(this); + context->clip(thisBox->overflowClipRect(rect.location(), paintInfo.renderRegion)); // Adjust the paint rect to reflect a scrolled content box with borders at the ends. - LayoutSize offset = layer()->scrolledContentOffset(); + IntSize offset = thisBox->scrolledContentOffset(); scrolledPaintRect.move(-offset); scrolledPaintRect.setWidth(bLeft + layer()->scrollWidth() + bRight); scrolledPaintRect.setHeight(borderTop() + layer()->scrollHeight() + borderBottom()); } GraphicsContextStateSaver backgroundClipStateSaver(*context, false); + OwnPtr<ImageBuffer> maskImage; + IntRect maskRect; + if (bgLayer->clip() == PaddingFillBox || bgLayer->clip() == ContentFillBox) { // Clip to the padding or content boxes as necessary. bool includePadding = bgLayer->clip() == ContentFillBox; - LayoutRect clipRect = LayoutRect(scrolledPaintRect.x() + bLeft + (includePadding ? pLeft : 0), - scrolledPaintRect.y() + borderTop() + (includePadding ? paddingTop() : 0), - scrolledPaintRect.width() - bLeft - bRight - (includePadding ? pLeft + pRight : 0), - scrolledPaintRect.height() - borderTop() - borderBottom() - (includePadding ? paddingTop() + paddingBottom() : 0)); + LayoutRect clipRect = LayoutRect(scrolledPaintRect.x() + bLeft + (includePadding ? pLeft : zeroLayoutUnit), + scrolledPaintRect.y() + borderTop() + (includePadding ? paddingTop() : zeroLayoutUnit), + scrolledPaintRect.width() - bLeft - bRight - (includePadding ? pLeft + pRight : zeroLayoutUnit), + scrolledPaintRect.height() - borderTop() - borderBottom() - (includePadding ? paddingTop() + paddingBottom() : zeroLayoutUnit)); backgroundClipStateSaver.save(); context->clip(clipRect); } else if (bgLayer->clip() == TextFillBox) { // We have to draw our text into a mask that can then be used to clip background drawing. // First figure out how big the mask has to be. It should be no bigger than what we need // to actually render, so we should intersect the dirty rect with the border box of the background. - LayoutRect maskRect = rect; + maskRect = pixelSnappedIntRect(rect); maskRect.intersect(paintInfo.rect); - + // Now create the mask. - OwnPtr<ImageBuffer> maskImage = context->createCompatibleBuffer(maskRect.size()); + maskImage = context->createCompatibleBuffer(maskRect.size()); if (!maskImage) return; - + GraphicsContext* maskImageContext = maskImage->context(); maskImageContext->translate(-maskRect.x(), -maskRect.y()); - + // Now add the text to the clip. We do this by painting using a special paint phase that signals to // InlineTextBoxes that they should just add their contents to the clip. PaintInfo info(maskImageContext, maskRect, PaintPhaseTextClip, true, 0, paintInfo.renderRegion, 0); @@ -738,12 +775,13 @@ void RenderBoxModelObject::paintFillLayerExtended(const PaintInfo& paintInfo, co LayoutSize localOffset = isBox() ? toRenderBox(this)->locationOffset() : LayoutSize(); paint(info, scrolledPaintRect.location() - localOffset); } - + // The mask has been created. Now we just need to clip to it. backgroundClipStateSaver.save(); - context->clipToImageBuffer(maskImage.get(), maskRect); + context->clip(maskRect); + context->beginTransparencyLayer(1); } - + // Only fill with a base color (e.g., white) if we're the root document, since iframes/frames with // no background in the child document should show the parent's background. bool isOpaqueRoot = false; @@ -777,8 +815,11 @@ void RenderBoxModelObject::paintFillLayerExtended(const PaintInfo& paintInfo, co // Paint the color first underneath all images. if (!bgLayer->next()) { - LayoutRect backgroundRect(scrolledPaintRect); - backgroundRect.intersect(paintInfo.rect); + IntRect backgroundRect(pixelSnappedIntRect(scrolledPaintRect)); + bool boxShadowShouldBeAppliedToBackground = this->boxShadowShouldBeAppliedToBackground(bleedAvoidance, box); + if (!boxShadowShouldBeAppliedToBackground) + backgroundRect.intersect(paintInfo.rect); + // If we have an alpha and we are painting the root element, go ahead and blend with the base background color. Color baseColor; bool shouldClearBackground = false; @@ -788,6 +829,10 @@ void RenderBoxModelObject::paintFillLayerExtended(const PaintInfo& paintInfo, co shouldClearBackground = true; } + GraphicsContextStateSaver shadowStateSaver(*context, boxShadowShouldBeAppliedToBackground); + if (boxShadowShouldBeAppliedToBackground) + applyBoxShadowForBackground(context, style()); + if (baseColor.alpha()) { if (bgColor.alpha()) baseColor = baseColor.blend(bgColor); @@ -814,6 +859,11 @@ void RenderBoxModelObject::paintFillLayerExtended(const PaintInfo& paintInfo, co compositeOp, useLowQualityScaling); } } + + if (bgLayer->clip() == TextFillBox) { + context->drawImageBuffer(maskImage.get(), ColorSpaceDeviceRGB, maskRect, CompositeDestinationIn); + context->endTransparencyLayer(); + } } static inline LayoutUnit resolveWidthForRatio(LayoutUnit height, const FloatSize& intrinsicRatio) @@ -1064,7 +1114,7 @@ void RenderBoxModelObject::calculateBackgroundImageGeometry(const FillLayer* fil } else positioningAreaSize = LayoutSize(paintRect.width() - left - right, paintRect.height() - top - bottom); } else { - geometry.setDestRect(viewRect()); + geometry.setDestRect(pixelSnappedIntRect(viewRect())); positioningAreaSize = geometry.destRect().size(); } @@ -1404,6 +1454,14 @@ static inline bool includesEdge(BorderEdgeFlags flags, BoxSide side) return flags & edgeFlagForSide(side); } +static inline bool includesAdjacentEdges(BorderEdgeFlags flags) +{ + return (flags & (TopBorderEdge | RightBorderEdge)) == (TopBorderEdge | RightBorderEdge) + || (flags & (RightBorderEdge | BottomBorderEdge)) == (RightBorderEdge | BottomBorderEdge) + || (flags & (BottomBorderEdge | LeftBorderEdge)) == (BottomBorderEdge | LeftBorderEdge) + || (flags & (LeftBorderEdge | TopBorderEdge)) == (LeftBorderEdge | TopBorderEdge); +} + inline bool edgesShareColor(const BorderEdge& firstEdge, const BorderEdge& secondEdge) { return firstEdge.color == secondEdge.color; @@ -1527,7 +1585,7 @@ static bool joinRequiresMitre(BoxSide side, BoxSide adjacentSide, const BorderEd } void RenderBoxModelObject::paintOneBorderSide(GraphicsContext* graphicsContext, const RenderStyle* style, const RoundedRect& outerBorder, const RoundedRect& innerBorder, - const LayoutRect& sideRect, BoxSide side, BoxSide adjacentSide1, BoxSide adjacentSide2, const BorderEdge edges[], const Path* path, + const IntRect& sideRect, BoxSide side, BoxSide adjacentSide1, BoxSide adjacentSide2, const BorderEdge edges[], const Path* path, BackgroundBleedAvoidance bleedAvoidance, bool includeLogicalLeftEdge, bool includeLogicalRightEdge, bool antialias, const Color* overrideColor) { const BorderEdge& edgeToRender = edges[side]; @@ -1572,9 +1630,9 @@ void RenderBoxModelObject::paintOneBorderSide(GraphicsContext* graphicsContext, } } -static LayoutRect calculateSideRect(const RoundedRect& outerBorder, const BorderEdge edges[], int side) +static IntRect calculateSideRect(const RoundedRect& outerBorder, const BorderEdge edges[], int side) { - LayoutRect sideRect = outerBorder.rect(); + IntRect sideRect = outerBorder.rect(); int width = edges[side].width; if (side == BSTop) @@ -1600,7 +1658,7 @@ void RenderBoxModelObject::paintBorderSides(GraphicsContext* graphicsContext, co roundedPath.addRoundedRect(outerBorder); if (edges[BSTop].shouldRender() && includesEdge(edgeSet, BSTop)) { - LayoutRect sideRect = outerBorder.rect(); + IntRect sideRect = outerBorder.rect(); sideRect.setHeight(edges[BSTop].width); bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSTop].style) || borderWillArcInnerEdge(innerBorder.radii().topLeft(), innerBorder.radii().topRight())); @@ -1608,7 +1666,7 @@ void RenderBoxModelObject::paintBorderSides(GraphicsContext* graphicsContext, co } if (edges[BSBottom].shouldRender() && includesEdge(edgeSet, BSBottom)) { - LayoutRect sideRect = outerBorder.rect(); + IntRect sideRect = outerBorder.rect(); sideRect.shiftYEdgeTo(sideRect.maxY() - edges[BSBottom].width); bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSBottom].style) || borderWillArcInnerEdge(innerBorder.radii().bottomLeft(), innerBorder.radii().bottomRight())); @@ -1616,7 +1674,7 @@ void RenderBoxModelObject::paintBorderSides(GraphicsContext* graphicsContext, co } if (edges[BSLeft].shouldRender() && includesEdge(edgeSet, BSLeft)) { - LayoutRect sideRect = outerBorder.rect(); + IntRect sideRect = outerBorder.rect(); sideRect.setWidth(edges[BSLeft].width); bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSLeft].style) || borderWillArcInnerEdge(innerBorder.radii().bottomLeft(), innerBorder.radii().topLeft())); @@ -1624,7 +1682,7 @@ void RenderBoxModelObject::paintBorderSides(GraphicsContext* graphicsContext, co } if (edges[BSRight].shouldRender() && includesEdge(edgeSet, BSRight)) { - LayoutRect sideRect = outerBorder.rect(); + IntRect sideRect = outerBorder.rect(); sideRect.shiftXEdgeTo(sideRect.maxX() - edges[BSRight].width); bool usePath = renderRadii && (borderStyleHasInnerDetail(edges[BSRight].style) || borderWillArcInnerEdge(innerBorder.radii().bottomRight(), innerBorder.radii().topRight())); @@ -1657,7 +1715,7 @@ void RenderBoxModelObject::paintTranslucentBorderSides(GraphicsContext* graphics commonColorEdgeSet |= edgeFlagForSide(currSide); } - bool useTransparencyLayer = commonColor.hasAlpha(); + bool useTransparencyLayer = includesAdjacentEdges(commonColorEdgeSet) && commonColor.hasAlpha(); if (useTransparencyLayer) { graphicsContext->beginTransparencyLayer(static_cast<float>(commonColor.alpha()) / 255); commonColor = Color(commonColor.red(), commonColor.green(), commonColor.blue()); @@ -1753,7 +1811,7 @@ void RenderBoxModelObject::paintBorder(const PaintInfo& info, const LayoutRect& for (int i = BSTop; i <= BSLeft; ++i) { const BorderEdge& currEdge = edges[i]; if (currEdge.shouldRender()) { - LayoutRect sideRect = calculateSideRect(outerBorder, edges, i); + IntRect sideRect = calculateSideRect(outerBorder, edges, i); path.addRect(sideRect); } } @@ -1933,7 +1991,7 @@ void RenderBoxModelObject::drawBoxSideFromPath(GraphicsContext* graphicsContext, graphicsContext->setStrokeStyle(NoStroke); graphicsContext->setFillColor(color, style->colorSpace()); - graphicsContext->drawRect(borderRect); + graphicsContext->drawRect(pixelSnappedIntRect(borderRect)); } #else void RenderBoxModelObject::paintBorder(const PaintInfo& info, const IntRect& rect, const RenderStyle* style, @@ -2375,9 +2433,9 @@ void RenderBoxModelObject::clipBorderSidePolygon(GraphicsContext* graphicsContex graphicsContext->clipConvexPolygon(4, secondQuad, !secondEdgeMatches); } -static LayoutRect calculateSideRectIncludingInner(const RoundedRect& outerBorder, const BorderEdge edges[], BoxSide side) +static IntRect calculateSideRectIncludingInner(const RoundedRect& outerBorder, const BorderEdge edges[], BoxSide side) { - LayoutRect sideRect = outerBorder.rect(); + IntRect sideRect = outerBorder.rect(); int width; switch (side) { @@ -2556,6 +2614,53 @@ bool RenderBoxModelObject::borderObscuresBackground() const return true; } +bool RenderBoxModelObject::boxShadowShouldBeAppliedToBackground(BackgroundBleedAvoidance bleedAvoidance, InlineFlowBox* inlineFlowBox) const +{ + if (bleedAvoidance != BackgroundBleedNone) + return false; + + if (style()->hasAppearance()) + return false; + + bool hasOneNormalBoxShadow = false; + for (const ShadowData* currentShadow = style()->boxShadow(); currentShadow; currentShadow = currentShadow->next()) { + if (currentShadow->style() != Normal) + continue; + + if (hasOneNormalBoxShadow) + return false; + hasOneNormalBoxShadow = true; + + if (currentShadow->spread()) + return false; + } + + if (!hasOneNormalBoxShadow) + return false; + + Color backgroundColor = style()->visitedDependentColor(CSSPropertyBackgroundColor); + if (!backgroundColor.isValid() || backgroundColor.alpha() < 255) + return false; + + const FillLayer* lastBackgroundLayer = style()->backgroundLayers(); + for (const FillLayer* next = lastBackgroundLayer->next(); next; next = lastBackgroundLayer->next()) + lastBackgroundLayer = next; + + if (lastBackgroundLayer->clip() != BorderFillBox) + return false; + + if (lastBackgroundLayer->image() && style()->hasBorderRadius()) + return false; + + if (inlineFlowBox && !inlineFlowBox->boxShadowCanBeAppliedToBackground(*lastBackgroundLayer)) + return false; + + if (hasOverflowClip() && lastBackgroundLayer->attachment() == LocalBackgroundAttachment) + return false; + + return true; +} + static inline LayoutRect areaCastingShadowInHole(const LayoutRect& holeRect, int shadowBlur, int shadowSpread, const LayoutSize& shadowOffset) { LayoutRect bounds(holeRect); @@ -2634,7 +2739,7 @@ void RenderBoxModelObject::paintBoxShadow(const PaintInfo& info, const LayoutRec if (!rectToClipOut.isEmpty()) context->clipOutRoundedRect(rectToClipOut); - RoundedRect influenceRect(shadowRect, border.radii()); + RoundedRect influenceRect(pixelSnappedIntRect(shadowRect), border.radii()); influenceRect.expandRadii(2 * shadowBlur + shadowSpread); if (allCornersClippedOut(influenceRect, info.rect)) context->fillRect(fillRect.rect(), Color::black, s->colorSpace()); @@ -2658,7 +2763,7 @@ void RenderBoxModelObject::paintBoxShadow(const PaintInfo& info, const LayoutRec } if (!rectToClipOut.isEmpty()) - context->clipOut(rectToClipOut); + context->clipOut(pixelSnappedIntRect(rectToClipOut)); context->fillRect(fillRect.rect(), Color::black, s->colorSpace()); } } else { @@ -2693,7 +2798,7 @@ void RenderBoxModelObject::paintBoxShadow(const PaintInfo& info, const LayoutRec Color fillColor(shadowColor.red(), shadowColor.green(), shadowColor.blue(), 255); LayoutRect outerRect = areaCastingShadowInHole(border.rect(), shadowBlur, shadowSpread, shadowOffset); - RoundedRect roundedHole(holeRect, border.radii()); + RoundedRect roundedHole(pixelSnappedIntRect(holeRect), border.radii()); GraphicsContextStateSaver stateSaver(*context); if (hasBorderRadius) { @@ -2713,7 +2818,7 @@ void RenderBoxModelObject::paintBoxShadow(const PaintInfo& info, const LayoutRec else context->setShadow(shadowOffset, shadowBlur, shadowColor, s->colorSpace()); - context->fillRectWithRoundedHole(outerRect, roundedHole, fillColor, s->colorSpace()); + context->fillRectWithRoundedHole(pixelSnappedIntRect(outerRect), roundedHole, fillColor, s->colorSpace()); } } } |
