Chromium Code Reviews| Index: Source/core/rendering/RenderBoxModelObject.cpp |
| diff --git a/Source/core/rendering/RenderBoxModelObject.cpp b/Source/core/rendering/RenderBoxModelObject.cpp |
| index 4e2bfec0a8e614ec65fac32d5345672734620a26..c425f99e191c47953ecdda93ab50d69464d3c77b 100644 |
| --- a/Source/core/rendering/RenderBoxModelObject.cpp |
| +++ b/Source/core/rendering/RenderBoxModelObject.cpp |
| @@ -2479,9 +2479,9 @@ void RenderBoxModelObject::paintBoxShadow(const PaintInfo& info, const LayoutRec |
| if (shadow.style() != shadowStyle) |
| continue; |
| - IntSize shadowOffset(shadow.x(), shadow.y()); |
| - int shadowBlur = shadow.blur(); |
| - int shadowSpread = shadow.spread(); |
| + FloatSize shadowOffset(shadow.x(), shadow.y()); |
| + float shadowBlur = shadow.blur(); |
| + float shadowSpread = shadow.spread(); |
| if (shadowOffset.isZero() && !shadowBlur && !shadowSpread) |
| continue; |
| @@ -2489,12 +2489,12 @@ void RenderBoxModelObject::paintBoxShadow(const PaintInfo& info, const LayoutRec |
| const Color& shadowColor = resolveColor(shadow.color()); |
| if (shadow.style() == Normal) { |
| - RoundedRect fillRect = border; |
| + FloatRect fillRect = border.rect(); |
| fillRect.inflate(shadowSpread); |
| if (fillRect.isEmpty()) |
| continue; |
| - IntRect shadowRect(border.rect()); |
| + FloatRect shadowRect(border.rect()); |
| shadowRect.inflate(shadowBlur + shadowSpread); |
| shadowRect.move(shadowOffset); |
| @@ -2515,6 +2515,8 @@ void RenderBoxModelObject::paintBoxShadow(const PaintInfo& info, const LayoutRec |
| context->clipOutRoundedRect(rectToClipOut); |
| } |
| } else { |
| + // This IntRect is correct even with fractional shadows, because it is used for the rectangle |
| + // of the box itself, which is always pixel-aligned. |
| IntRect rectToClipOut = border.rect(); |
| // If the box is opaque, it is unnecessary to clip it out. However, doing so saves time |
| @@ -2542,20 +2544,24 @@ void RenderBoxModelObject::paintBoxShadow(const PaintInfo& info, const LayoutRec |
| context->setDrawLooper(drawLooper); |
| if (hasBorderRadius) { |
| - RoundedRect influenceRect(shadowRect, border.radii()); |
| + RoundedRect influenceRect(pixelSnappedIntRect(LayoutRect(shadowRect)), border.radii()); |
| influenceRect.expandRadii(2 * shadowBlur + shadowSpread); |
| if (allCornersClippedOut(influenceRect, info.rect)) |
| - context->fillRect(fillRect.rect(), Color::black); |
| + context->fillRect(fillRect, Color::black); |
| else { |
| - fillRect.expandRadii(shadowSpread); |
| - if (!fillRect.isRenderable()) |
| - fillRect.adjustRadii(); |
| - context->fillRoundedRect(fillRect, Color::black); |
| + RoundedRect roundedFillRect = border; |
| + roundedFillRect.inflate(shadowSpread); |
| + |
| + roundedFillRect.expandRadii(shadowSpread); |
| + if (!roundedFillRect.isRenderable()) |
| + roundedFillRect.adjustRadii(); |
| + context->fillRoundedRect(roundedFillRect, Color::black); |
| } |
| } else { |
| - context->fillRect(fillRect.rect(), Color::black); |
| + context->fillRect(fillRect, Color::black); |
| } |
| } else { |
| + // The inset shadow case. |
| GraphicsContext::Edges clippedEdges = GraphicsContext::NoEdge; |
| if (!includeLogicalLeftEdge) { |
| if (isHorizontal) |
| @@ -2569,7 +2575,8 @@ void RenderBoxModelObject::paintBoxShadow(const PaintInfo& info, const LayoutRec |
| else |
| clippedEdges |= GraphicsContext::BottomEdge; |
| } |
| - context->drawInnerShadow(border, shadowColor, shadowOffset, shadowBlur, shadowSpread, clippedEdges); |
| + // TODO: support non-integer shadows |
|
leviw_travelin_and_unemployed
2014/01/14 22:28:35
Can we get a bug?
cbiesinger
2014/01/15 21:27:40
Done.
|
| + context->drawInnerShadow(border, shadowColor, flooredIntSize(shadowOffset), shadowBlur, shadowSpread, clippedEdges); |
| } |
| } |
| } |