Chromium Code Reviews| Index: Source/core/rendering/RenderLayerBacking.cpp |
| diff --git a/Source/core/rendering/RenderLayerBacking.cpp b/Source/core/rendering/RenderLayerBacking.cpp |
| index 3e23e44cb8e96e5a5e14be9d9b2543ec60d766b3..aff829c785bd7f41f406f520b6947b92e11bc9a3 100644 |
| --- a/Source/core/rendering/RenderLayerBacking.cpp |
| +++ b/Source/core/rendering/RenderLayerBacking.cpp |
| @@ -321,7 +321,7 @@ bool RenderLayerBacking::shouldClipCompositedBounds() const |
| void RenderLayerBacking::updateCompositedBounds() |
| { |
| - IntRect layerBounds = compositor()->calculateCompositedBounds(m_owningLayer, m_owningLayer); |
| + LayoutRect layerBounds = compositor()->calculateCompositedBounds(m_owningLayer, m_owningLayer); |
| // Clip to the size of the document or enclosing overflow-scroll layer. |
| // If this or an ancestor is transformed, we can't currently compute the correct rect to intersect with. |
| @@ -343,7 +343,7 @@ void RenderLayerBacking::updateCompositedBounds() |
| m_owningLayer->convertToLayerCoords(rootLayer, delta); |
| clippingBounds.move(-delta.x(), -delta.y()); |
| - layerBounds.intersect(pixelSnappedIntRect(clippingBounds)); |
| + layerBounds.intersect(clippingBounds); |
| m_boundsConstrainedByClipping = true; |
| } else |
| m_boundsConstrainedByClipping = false; |
| @@ -366,7 +366,7 @@ void RenderLayerBacking::updateAfterWidgetResize() |
| if (renderer()->isRenderPart()) { |
| if (RenderLayerCompositor* innerCompositor = RenderLayerCompositor::frameContentsCompositor(toRenderPart(renderer()))) { |
| innerCompositor->frameViewDidChangeSize(); |
| - innerCompositor->frameViewDidChangeLocation(contentsBox().location()); |
| + innerCompositor->frameViewDidChangeLocation(flooredIntPoint(contentsBox().location())); |
|
eae
2013/07/26 20:30:51
Don't you need to account for the subpixel accumul
|
| } |
| } |
| } |
| @@ -529,11 +529,16 @@ void RenderLayerBacking::updateGraphicsLayerGeometry() |
| ancestorCompositingBounds = pixelSnappedIntRect(compAncestor->backing()->compositedBounds()); |
| } |
| - IntRect localCompositingBounds = pixelSnappedIntRect(compositedBounds()); |
| + LayoutRect localRawCompositingBounds = compositedBounds(); |
| + LayoutPoint rawDelta; |
| + m_owningLayer->convertToLayerCoords(compAncestor, rawDelta); |
| + IntPoint delta = flooredIntPoint(rawDelta); |
| + m_subpixelAccumulation = toLayoutSize(rawDelta.fraction()); |
|
eae
2013/07/26 20:30:51
Wouldn't it make more sense to have the fraction m
leviw_travelin_and_unemployed
2013/07/26 20:36:21
We certainly can. It makes sense to me to request
|
| + // Move the bounds by the subpixel accumulation so that it pixel-snaps relative to absolute pixels instead of local coordinates. |
| + localRawCompositingBounds.move(m_subpixelAccumulation); |
| + IntRect localCompositingBounds = pixelSnappedIntRect(localRawCompositingBounds); |
|
eae
2013/07/26 20:30:51
How about moving all of this snapping logic into a
leviw_travelin_and_unemployed
2013/07/26 20:36:21
Sure.
|
| IntRect relativeCompositingBounds(localCompositingBounds); |
| - IntPoint delta; |
| - m_owningLayer->convertToPixelSnappedLayerCoords(compAncestor, delta); |
| relativeCompositingBounds.moveBy(delta); |
| IntPoint graphicsLayerParentLocation; |
| @@ -608,7 +613,7 @@ void RenderLayerBacking::updateGraphicsLayerGeometry() |
| const IntRect borderBox = toRenderBox(renderer())->pixelSnappedBorderBoxRect(); |
| // Get layout bounds in the coords of compAncestor to match relativeCompositingBounds. |
| - IntRect layerBounds = IntRect(delta, borderBox.size()); |
| + IntRect layerBounds(delta, borderBox.size()); |
| // Update properties that depend on layer dimensions |
| FloatPoint3D transformOrigin = computeTransformOrigin(borderBox); |
| @@ -693,7 +698,7 @@ void RenderLayerBacking::updateGraphicsLayerGeometry() |
| clientBox.move(renderBox->verticalScrollbarWidth(), 0); |
| IntSize adjustedScrollOffset = m_owningLayer->adjustedScrollOffset(); |
| - m_scrollingLayer->setPosition(FloatPoint(clientBox.location() - localCompositingBounds.location())); |
| + m_scrollingLayer->setPosition(FloatPoint(clientBox.location() - localCompositingBounds.location() + roundedIntSize(m_subpixelAccumulation))); |
|
eae
2013/07/26 20:30:51
Why round here?
|
| m_scrollingLayer->setSize(clientBox.size()); |
| IntSize oldScrollingLayerOffset = m_scrollingLayer->offsetFromRenderer(); |
| @@ -800,13 +805,13 @@ void RenderLayerBacking::updateInternalHierarchy() |
| void RenderLayerBacking::updateContentsRect(bool isSimpleContainer) |
| { |
| - IntRect contentsRect; |
| + LayoutRect contentsRect; |
| if (isSimpleContainer && renderer()->hasBackground()) |
| contentsRect = backgroundBox(); |
| else |
| contentsRect = contentsBox(); |
| - m_graphicsLayer->setContentsRect(contentsRect); |
| + m_graphicsLayer->setContentsRect(pixelSnappedIntRect(contentsRect)); |
| } |
| void RenderLayerBacking::updateDrawsContent(bool isSimpleContainer) |
| @@ -934,7 +939,7 @@ bool RenderLayerBacking::updateOverflowControlsLayers(bool needsHorizontalScroll |
| void RenderLayerBacking::positionOverflowControlsLayers(const IntSize& offsetFromRoot) |
| { |
| - IntSize offsetFromRenderer = m_graphicsLayer->offsetFromRenderer(); |
| + IntSize offsetFromRenderer = m_graphicsLayer->offsetFromRenderer() - roundedIntSize(m_subpixelAccumulation); |
| if (GraphicsLayer* layer = layerForHorizontalScrollbar()) { |
| Scrollbar* hBar = m_owningLayer->horizontalScrollbar(); |
| if (hBar) { |
| @@ -1432,23 +1437,23 @@ FloatPoint RenderLayerBacking::computePerspectiveOrigin(const IntRect& borderBox |
| } |
| // Return the offset from the top-left of this compositing layer at which the renderer's contents are painted. |
| -IntSize RenderLayerBacking::contentOffsetInCompostingLayer() const |
| +LayoutSize RenderLayerBacking::contentOffsetInCompostingLayer() const |
| { |
| - return IntSize(-m_compositedBounds.x(), -m_compositedBounds.y()); |
| + return LayoutSize(-m_compositedBounds.x(), -m_compositedBounds.y()); |
| } |
| -IntRect RenderLayerBacking::contentsBox() const |
| +LayoutRect RenderLayerBacking::contentsBox() const |
| { |
| - IntRect contentsBox = contentsRect(renderer()); |
| + LayoutRect contentsBox = contentsRect(renderer()); |
| contentsBox.move(contentOffsetInCompostingLayer()); |
| return contentsBox; |
| } |
| IntRect RenderLayerBacking::backgroundBox() const |
| { |
| - IntRect backgroundBox = backgroundRect(renderer()); |
| + LayoutRect backgroundBox = backgroundRect(renderer()); |
| backgroundBox.move(contentOffsetInCompostingLayer()); |
| - return backgroundBox; |
| + return pixelSnappedIntRect(backgroundBox); |
| } |
| GraphicsLayer* RenderLayerBacking::parentForSublayers() const |
| @@ -1572,7 +1577,7 @@ void RenderLayerBacking::paintIntoLayer(const GraphicsLayer* graphicsLayer, Grap |
| paintFlags |= RenderLayer::PaintLayerPaintingSkipRootBackground; |
| // FIXME: GraphicsLayers need a way to split for RenderRegions. |
| - RenderLayer::LayerPaintingInfo paintingInfo(m_owningLayer, paintDirtyRect, paintBehavior, LayoutSize()); |
| + RenderLayer::LayerPaintingInfo paintingInfo(m_owningLayer, paintDirtyRect, paintBehavior, m_subpixelAccumulation); |
| m_owningLayer->paintLayerContents(context, paintingInfo, paintFlags); |
| ASSERT(graphicsLayer != m_backgroundLayer || paintFlags & RenderLayer::PaintLayerPaintingRootBackgroundOnly); |
| @@ -1614,8 +1619,13 @@ void RenderLayerBacking::paintContents(const GraphicsLayer* graphicsLayer, Graph |
| // The dirtyRect is in the coords of the painting root. |
| IntRect dirtyRect = clip; |
| - if (!(paintingPhase & GraphicsLayerPaintOverflowContents)) |
| - dirtyRect.intersect(compositedBounds()); |
| + if (!(paintingPhase & GraphicsLayerPaintOverflowContents)) { |
| + LayoutRect bounds = compositedBounds(); |
| + bounds.move(m_subpixelAccumulation); |
| + dirtyRect.intersect(pixelSnappedIntRect(bounds)); |
| + } else { |
| + dirtyRect.move(roundedIntSize(m_subpixelAccumulation)); |
| + } |
| // We have to use the same root as for hit testing, because both methods can compute and cache clipRects. |
| paintIntoLayer(graphicsLayer, &context, dirtyRect, PaintBehaviorNormal, paintingPhase); |
| @@ -1812,12 +1822,12 @@ void RenderLayerBacking::resumeAnimations() |
| m_graphicsLayer->resumeAnimations(); |
| } |
| -IntRect RenderLayerBacking::compositedBounds() const |
| +LayoutRect RenderLayerBacking::compositedBounds() const |
| { |
| return m_compositedBounds; |
| } |
| -void RenderLayerBacking::setCompositedBounds(const IntRect& bounds) |
| +void RenderLayerBacking::setCompositedBounds(const LayoutRect& bounds) |
| { |
| m_compositedBounds = bounds; |
| } |