Chromium Code Reviews| Index: Source/web/LinkHighlight.cpp |
| diff --git a/Source/web/LinkHighlight.cpp b/Source/web/LinkHighlight.cpp |
| index bcbb4bac4414921d1998ffcdce03f97a2a894db9..1faa0c3de3f50be58eb141de83a6b030ed1614d6 100644 |
| --- a/Source/web/LinkHighlight.cpp |
| +++ b/Source/web/LinkHighlight.cpp |
| @@ -106,30 +106,11 @@ void LinkHighlight::releaseResources() |
| m_node.clear(); |
| } |
| -RenderLayer* LinkHighlight::computeEnclosingCompositingLayer() |
| +void LinkHighlight::attachLinkHighlightToCompositingLayer(const RenderLayerModelObject* paintInvalidationContainer) |
| { |
| - if (!m_node || !m_node->renderer()) |
| - return 0; |
| - |
| - // Find the nearest enclosing composited layer and attach to it. We may need to cross frame boundaries |
| - // to find a suitable layer. |
| - RenderObject* renderer = m_node->renderer(); |
| - RenderLayer* renderLayer; |
| - do { |
| - renderLayer = renderer->enclosingLayer()->enclosingLayerForPaintInvalidation(); |
| - if (!renderLayer) { |
| - renderer = renderer->frame()->ownerRenderer(); |
| - if (!renderer) |
| - return 0; |
| - } |
| - } while (!renderLayer); |
| - |
| - ASSERT(renderLayer->compositingState() != NotComposited); |
| - |
| - GraphicsLayer* newGraphicsLayer = renderLayer->graphicsLayerBacking(); |
| - if (!newGraphicsLayer->drawsContent()) { |
| - newGraphicsLayer = renderLayer->graphicsLayerBackingForScrolling(); |
| - } |
| + GraphicsLayer* newGraphicsLayer = paintInvalidationContainer->layer()->graphicsLayerBacking(); |
|
trchen
2014/10/29 23:57:30
I think we need to do a null check here. Multicol
chrishtr
2014/10/30 00:01:17
RenderObject::containerForPaintInvalidation should
trchen
2014/10/30 00:08:58
No I meant newGraphicsLayer may be null.
chrishtr
2014/10/30 00:21:59
Oh, yuck. Thanks for pointing that out. Fixed.
|
| + if (!newGraphicsLayer->drawsContent()) |
| + newGraphicsLayer = paintInvalidationContainer->layer()->graphicsLayerBackingForScrolling(); |
| m_clipLayer->setTransform(SkMatrix44(SkMatrix44::kIdentity_Constructor)); |
| @@ -140,15 +121,12 @@ RenderLayer* LinkHighlight::computeEnclosingCompositingLayer() |
| m_currentGraphicsLayer = newGraphicsLayer; |
| m_currentGraphicsLayer->addLinkHighlight(this); |
| } |
| - |
| - return renderLayer; |
| } |
| -static void convertTargetSpaceQuadToCompositedLayer(const FloatQuad& targetSpaceQuad, RenderObject* targetRenderer, RenderObject* compositedRenderer, FloatQuad& compositedSpaceQuad) |
| +static void convertTargetSpaceQuadToCompositedLayer(const FloatQuad& targetSpaceQuad, RenderObject* targetRenderer, const RenderLayerModelObject* paintInvalidationContainer, FloatQuad& compositedSpaceQuad) |
| { |
| ASSERT(targetRenderer); |
| - ASSERT(compositedRenderer); |
| - |
| + ASSERT(paintInvalidationContainer); |
| for (unsigned i = 0; i < 4; ++i) { |
| IntPoint point; |
| switch (i) { |
| @@ -158,9 +136,11 @@ static void convertTargetSpaceQuadToCompositedLayer(const FloatQuad& targetSpace |
| case 3: point = roundedIntPoint(targetSpaceQuad.p4()); break; |
| } |
| + // FIXME: this does not need to be absolute, just in the paint invalidation container's space. |
| point = targetRenderer->frame()->view()->contentsToWindow(point); |
| - point = compositedRenderer->frame()->view()->windowToContents(point); |
| - FloatPoint floatPoint = compositedRenderer->absoluteToLocal(point, UseTransforms); |
| + point = paintInvalidationContainer->frame()->view()->windowToContents(point); |
| + FloatPoint floatPoint = paintInvalidationContainer->absoluteToLocal(point, UseTransforms); |
| + RenderLayer::mapPointToPaintBackingCoordinates(paintInvalidationContainer, floatPoint); |
| switch (i) { |
| case 0: compositedSpaceQuad.setP1(floatPoint); break; |
| @@ -197,33 +177,28 @@ void LinkHighlight::computeQuads(const Node& node, Vector<FloatQuad>& outQuads) |
| for (Node* child = NodeRenderingTraversal::firstChild(&node); child; child = NodeRenderingTraversal::nextSibling(child)) |
| computeQuads(*child, outQuads); |
| } else { |
| + // FIXME: this does not need to be absolute, just in the paint invalidation container's space. |
| renderer->absoluteQuads(outQuads); |
| } |
| } |
| -bool LinkHighlight::computeHighlightLayerPathAndPosition(RenderLayer* compositingLayer) |
| +bool LinkHighlight::computeHighlightLayerPathAndPosition(const RenderLayerModelObject* paintInvalidationContainer) |
| { |
| if (!m_node || !m_node->renderer() || !m_currentGraphicsLayer) |
| return false; |
| - |
| - ASSERT(compositingLayer); |
| + ASSERT(paintInvalidationContainer); |
| // Get quads for node in absolute coordinates. |
| Vector<FloatQuad> quads; |
| computeQuads(*m_node, quads); |
| ASSERT(quads.size()); |
| - |
| - // Adjust for offset between target graphics layer and the node's renderer. |
| - FloatPoint positionAdjust = IntPoint(m_currentGraphicsLayer->offsetFromRenderer()); |
| - |
| Path newPath; |
| for (size_t quadIndex = 0; quadIndex < quads.size(); ++quadIndex) { |
| FloatQuad absoluteQuad = quads[quadIndex]; |
| - absoluteQuad.move(-positionAdjust.x(), -positionAdjust.y()); |
| // Transform node quads in target absolute coords to local coordinates in the compositor layer. |
| FloatQuad transformedQuad; |
| - convertTargetSpaceQuadToCompositedLayer(absoluteQuad, m_node->renderer(), compositingLayer->renderer(), transformedQuad); |
| + convertTargetSpaceQuadToCompositedLayer(absoluteQuad, m_node->renderer(), paintInvalidationContainer, transformedQuad); |
| // FIXME: for now, we'll only use rounded paths if we have a single node quad. The reason for this is that |
| // we may sometimes get a chain of adjacent boxes (e.g. for text nodes) which end up looking like sausage |
| @@ -331,10 +306,13 @@ void LinkHighlight::updateGeometry() |
| if (!m_geometryNeedsUpdate) |
| return; |
| - m_geometryNeedsUpdate = false; |
| + if (!m_node || !m_node->renderer()) |
| + return; |
| - RenderLayer* compositingLayer = computeEnclosingCompositingLayer(); |
| - if (compositingLayer && computeHighlightLayerPathAndPosition(compositingLayer)) { |
| + m_geometryNeedsUpdate = false; |
| + const RenderLayerModelObject* paintInvalidationContainer = m_node->renderer()->containerForPaintInvalidation(); |
| + attachLinkHighlightToCompositingLayer(paintInvalidationContainer); |
| + if (paintInvalidationContainer && computeHighlightLayerPathAndPosition(paintInvalidationContainer)) { |
| // We only need to invalidate the layer if the highlight size has changed, otherwise |
| // we can just re-position the layer without needing to repaint. |
| m_contentLayer->layer()->invalidate(); |