| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * | 7 * |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 159 // FIXME: Make this create rounded quad-paths, just like the axis-aligned ca
se. | 159 // FIXME: Make this create rounded quad-paths, just like the axis-aligned ca
se. |
| 160 path.moveTo(quad.p1()); | 160 path.moveTo(quad.p1()); |
| 161 path.addLineTo(quad.p2()); | 161 path.addLineTo(quad.p2()); |
| 162 path.addLineTo(quad.p3()); | 162 path.addLineTo(quad.p3()); |
| 163 path.addLineTo(quad.p4()); | 163 path.addLineTo(quad.p4()); |
| 164 path.closeSubpath(); | 164 path.closeSubpath(); |
| 165 } | 165 } |
| 166 | 166 |
| 167 void LinkHighlight::computeQuads(const Node& node, Vector<FloatQuad>& outQuads)
const | 167 void LinkHighlight::computeQuads(const Node& node, Vector<FloatQuad>& outQuads)
const |
| 168 { | 168 { |
| 169 if (!node.renderer()) | 169 if (!node.layoutObject()) |
| 170 return; | 170 return; |
| 171 | 171 |
| 172 LayoutObject* renderer = node.renderer(); | 172 LayoutObject* renderer = node.layoutObject(); |
| 173 | 173 |
| 174 // For inline elements, absoluteQuads will return a line box based on the li
ne-height | 174 // For inline elements, absoluteQuads will return a line box based on the li
ne-height |
| 175 // and font metrics, which is technically incorrect as replaced elements lik
e images | 175 // and font metrics, which is technically incorrect as replaced elements lik
e images |
| 176 // should use their intristic height and expand the linebox as needed. To g
et an | 176 // should use their intristic height and expand the linebox as needed. To g
et an |
| 177 // appropriately sized highlight we descend into the children and have them
add their | 177 // appropriately sized highlight we descend into the children and have them
add their |
| 178 // boxes. | 178 // boxes. |
| 179 if (renderer->isLayoutInline()) { | 179 if (renderer->isLayoutInline()) { |
| 180 for (Node* child = NodeRenderingTraversal::firstChild(node); child; chil
d = NodeRenderingTraversal::nextSibling(*child)) | 180 for (Node* child = NodeRenderingTraversal::firstChild(node); child; chil
d = NodeRenderingTraversal::nextSibling(*child)) |
| 181 computeQuads(*child, outQuads); | 181 computeQuads(*child, outQuads); |
| 182 } else { | 182 } else { |
| 183 // FIXME: this does not need to be absolute, just in the paint invalidat
ion container's space. | 183 // FIXME: this does not need to be absolute, just in the paint invalidat
ion container's space. |
| 184 renderer->absoluteQuads(outQuads); | 184 renderer->absoluteQuads(outQuads); |
| 185 } | 185 } |
| 186 } | 186 } |
| 187 | 187 |
| 188 bool LinkHighlight::computeHighlightLayerPathAndPosition(const LayoutBoxModelObj
ect* paintInvalidationContainer) | 188 bool LinkHighlight::computeHighlightLayerPathAndPosition(const LayoutBoxModelObj
ect* paintInvalidationContainer) |
| 189 { | 189 { |
| 190 if (!m_node || !m_node->renderer() || !m_currentGraphicsLayer) | 190 if (!m_node || !m_node->layoutObject() || !m_currentGraphicsLayer) |
| 191 return false; | 191 return false; |
| 192 ASSERT(paintInvalidationContainer); | 192 ASSERT(paintInvalidationContainer); |
| 193 | 193 |
| 194 // FIXME: This is defensive code to avoid crashes such as those described in | 194 // FIXME: This is defensive code to avoid crashes such as those described in |
| 195 // crbug.com/440887. This should be cleaned up once we fix the root cause of | 195 // crbug.com/440887. This should be cleaned up once we fix the root cause of |
| 196 // of the paint invalidation container not being composited. | 196 // of the paint invalidation container not being composited. |
| 197 if (!paintInvalidationContainer->layer()->compositedLayerMapping() && !paint
InvalidationContainer->layer()->groupedMapping()) | 197 if (!paintInvalidationContainer->layer()->compositedLayerMapping() && !paint
InvalidationContainer->layer()->groupedMapping()) |
| 198 return false; | 198 return false; |
| 199 | 199 |
| 200 // Get quads for node in absolute coordinates. | 200 // Get quads for node in absolute coordinates. |
| 201 Vector<FloatQuad> quads; | 201 Vector<FloatQuad> quads; |
| 202 computeQuads(*m_node, quads); | 202 computeQuads(*m_node, quads); |
| 203 ASSERT(quads.size()); | 203 ASSERT(quads.size()); |
| 204 Path newPath; | 204 Path newPath; |
| 205 | 205 |
| 206 FloatPoint positionAdjustForCompositedScrolling = IntPoint(m_currentGraphics
Layer->offsetFromRenderer()); | 206 FloatPoint positionAdjustForCompositedScrolling = IntPoint(m_currentGraphics
Layer->offsetFromRenderer()); |
| 207 | 207 |
| 208 for (size_t quadIndex = 0; quadIndex < quads.size(); ++quadIndex) { | 208 for (size_t quadIndex = 0; quadIndex < quads.size(); ++quadIndex) { |
| 209 FloatQuad absoluteQuad = quads[quadIndex]; | 209 FloatQuad absoluteQuad = quads[quadIndex]; |
| 210 | 210 |
| 211 // FIXME: this hack should not be necessary. It's a consequence of the f
act that composited layers for scrolling are represented | 211 // FIXME: this hack should not be necessary. It's a consequence of the f
act that composited layers for scrolling are represented |
| 212 // differently in Blink than other composited layers. | 212 // differently in Blink than other composited layers. |
| 213 if (paintInvalidationContainer->layer()->needsCompositedScrolling() && m
_node->renderer() != paintInvalidationContainer) | 213 if (paintInvalidationContainer->layer()->needsCompositedScrolling() && m
_node->layoutObject() != paintInvalidationContainer) |
| 214 absoluteQuad.move(-positionAdjustForCompositedScrolling.x(), -positi
onAdjustForCompositedScrolling.y()); | 214 absoluteQuad.move(-positionAdjustForCompositedScrolling.x(), -positi
onAdjustForCompositedScrolling.y()); |
| 215 | 215 |
| 216 // Transform node quads in target absolute coords to local coordinates i
n the compositor layer. | 216 // Transform node quads in target absolute coords to local coordinates i
n the compositor layer. |
| 217 FloatQuad transformedQuad; | 217 FloatQuad transformedQuad; |
| 218 convertTargetSpaceQuadToCompositedLayer(absoluteQuad, m_node->renderer()
, paintInvalidationContainer, transformedQuad); | 218 convertTargetSpaceQuadToCompositedLayer(absoluteQuad, m_node->layoutObje
ct(), paintInvalidationContainer, transformedQuad); |
| 219 | 219 |
| 220 // FIXME: for now, we'll only use rounded paths if we have a single node
quad. The reason for this is that | 220 // FIXME: for now, we'll only use rounded paths if we have a single node
quad. The reason for this is that |
| 221 // we may sometimes get a chain of adjacent boxes (e.g. for text nodes)
which end up looking like sausage | 221 // we may sometimes get a chain of adjacent boxes (e.g. for text nodes)
which end up looking like sausage |
| 222 // links: these should ideally be merged into a single rect before creat
ing the path, but that's | 222 // links: these should ideally be merged into a single rect before creat
ing the path, but that's |
| 223 // another CL. | 223 // another CL. |
| 224 if (quads.size() == 1 && transformedQuad.isRectilinear() | 224 if (quads.size() == 1 && transformedQuad.isRectilinear() |
| 225 && !m_owningWebViewImpl->settingsImpl()->mockGestureTapHighlightsEna
bled()) { | 225 && !m_owningWebViewImpl->settingsImpl()->mockGestureTapHighlightsEna
bled()) { |
| 226 FloatSize rectRoundingRadii(3, 3); | 226 FloatSize rectRoundingRadii(3, 3); |
| 227 newPath.addRoundedRect(transformedQuad.boundingBox(), rectRoundingRa
dii); | 227 newPath.addRoundedRect(transformedQuad.boundingBox(), rectRoundingRa
dii); |
| 228 } else | 228 } else |
| 229 addQuadToPath(transformedQuad, newPath); | 229 addQuadToPath(transformedQuad, newPath); |
| 230 } | 230 } |
| 231 | 231 |
| 232 FloatRect boundingRect = newPath.boundingRect(); | 232 FloatRect boundingRect = newPath.boundingRect(); |
| 233 newPath.translate(-toFloatSize(boundingRect.location())); | 233 newPath.translate(-toFloatSize(boundingRect.location())); |
| 234 | 234 |
| 235 bool pathHasChanged = !(newPath == m_path); | 235 bool pathHasChanged = !(newPath == m_path); |
| 236 if (pathHasChanged) { | 236 if (pathHasChanged) { |
| 237 m_path = newPath; | 237 m_path = newPath; |
| 238 m_contentLayer->layer()->setBounds(enclosingIntRect(boundingRect).size()
); | 238 m_contentLayer->layer()->setBounds(enclosingIntRect(boundingRect).size()
); |
| 239 } | 239 } |
| 240 | 240 |
| 241 m_contentLayer->layer()->setPosition(boundingRect.location()); | 241 m_contentLayer->layer()->setPosition(boundingRect.location()); |
| 242 | 242 |
| 243 return pathHasChanged; | 243 return pathHasChanged; |
| 244 } | 244 } |
| 245 | 245 |
| 246 void LinkHighlight::paintContents(WebCanvas* canvas, const WebRect& webClipRect,
WebContentLayerClient::PaintingControlSetting paintingControl) | 246 void LinkHighlight::paintContents(WebCanvas* canvas, const WebRect& webClipRect,
WebContentLayerClient::PaintingControlSetting paintingControl) |
| 247 { | 247 { |
| 248 if (!m_node || !m_node->renderer()) | 248 if (!m_node || !m_node->layoutObject()) |
| 249 return; | 249 return; |
| 250 | 250 |
| 251 GraphicsContext::DisabledMode disabledMode = GraphicsContext::NothingDisable
d; | 251 GraphicsContext::DisabledMode disabledMode = GraphicsContext::NothingDisable
d; |
| 252 if (paintingControl == WebContentLayerClient::DisplayListConstructionDisable
d) | 252 if (paintingControl == WebContentLayerClient::DisplayListConstructionDisable
d) |
| 253 disabledMode = GraphicsContext::FullyDisabled; | 253 disabledMode = GraphicsContext::FullyDisabled; |
| 254 | 254 |
| 255 OwnPtr<GraphicsContext> graphicsContext; | 255 OwnPtr<GraphicsContext> graphicsContext; |
| 256 OwnPtr<DisplayItemList> displayItemList; | 256 OwnPtr<DisplayItemList> displayItemList; |
| 257 if (RuntimeEnabledFeatures::slimmingPaintEnabled()) { | 257 if (RuntimeEnabledFeatures::slimmingPaintEnabled()) { |
| 258 displayItemList = DisplayItemList::create(); | 258 displayItemList = DisplayItemList::create(); |
| 259 graphicsContext = adoptPtr(new GraphicsContext(nullptr, displayItemList.
get(), disabledMode)); | 259 graphicsContext = adoptPtr(new GraphicsContext(nullptr, displayItemList.
get(), disabledMode)); |
| 260 } else { | 260 } else { |
| 261 graphicsContext = adoptPtr(new GraphicsContext(canvas, nullptr, disabled
Mode)); | 261 graphicsContext = adoptPtr(new GraphicsContext(canvas, nullptr, disabled
Mode)); |
| 262 } | 262 } |
| 263 | 263 |
| 264 IntRect clipRect(IntPoint(webClipRect.x, webClipRect.y), IntSize(webClipRect
.width, webClipRect.height)); | 264 IntRect clipRect(IntPoint(webClipRect.x, webClipRect.y), IntSize(webClipRect
.width, webClipRect.height)); |
| 265 { | 265 { |
| 266 DrawingRecorder drawingRecorder(graphicsContext.get(), displayItemClient
(), DisplayItem::LinkHighlight, clipRect); | 266 DrawingRecorder drawingRecorder(graphicsContext.get(), displayItemClient
(), DisplayItem::LinkHighlight, clipRect); |
| 267 | 267 |
| 268 graphicsContext->clip(clipRect); | 268 graphicsContext->clip(clipRect); |
| 269 graphicsContext->setFillColor(m_node->renderer()->style()->tapHighlightC
olor()); | 269 graphicsContext->setFillColor(m_node->layoutObject()->style()->tapHighli
ghtColor()); |
| 270 graphicsContext->fillPath(m_path); | 270 graphicsContext->fillPath(m_path); |
| 271 } | 271 } |
| 272 | 272 |
| 273 if (RuntimeEnabledFeatures::slimmingPaintEnabled()) { | 273 if (RuntimeEnabledFeatures::slimmingPaintEnabled()) { |
| 274 GraphicsContext canvasGraphicsContext(canvas, nullptr, disabledMode); | 274 GraphicsContext canvasGraphicsContext(canvas, nullptr, disabledMode); |
| 275 displayItemList->replay(&canvasGraphicsContext); | 275 displayItemList->replay(&canvasGraphicsContext); |
| 276 } | 276 } |
| 277 } | 277 } |
| 278 | 278 |
| 279 void LinkHighlight::startHighlightAnimationIfNeeded() | 279 void LinkHighlight::startHighlightAnimationIfNeeded() |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 | 332 |
| 333 void LinkHighlight::updateGeometry() | 333 void LinkHighlight::updateGeometry() |
| 334 { | 334 { |
| 335 // To avoid unnecessary updates (e.g. other entities have requested animatio
ns from our WebViewImpl), | 335 // To avoid unnecessary updates (e.g. other entities have requested animatio
ns from our WebViewImpl), |
| 336 // only proceed if we actually requested an update. | 336 // only proceed if we actually requested an update. |
| 337 if (!m_geometryNeedsUpdate) | 337 if (!m_geometryNeedsUpdate) |
| 338 return; | 338 return; |
| 339 | 339 |
| 340 m_geometryNeedsUpdate = false; | 340 m_geometryNeedsUpdate = false; |
| 341 | 341 |
| 342 bool hasRenderer = m_node && m_node->renderer(); | 342 bool hasRenderer = m_node && m_node->layoutObject(); |
| 343 const LayoutBoxModelObject* paintInvalidationContainer = hasRenderer ? m_nod
e->renderer()->containerForPaintInvalidation() : 0; | 343 const LayoutBoxModelObject* paintInvalidationContainer = hasRenderer ? m_nod
e->layoutObject()->containerForPaintInvalidation() : 0; |
| 344 if (paintInvalidationContainer) | 344 if (paintInvalidationContainer) |
| 345 attachLinkHighlightToCompositingLayer(paintInvalidationContainer); | 345 attachLinkHighlightToCompositingLayer(paintInvalidationContainer); |
| 346 if (paintInvalidationContainer && computeHighlightLayerPathAndPosition(paint
InvalidationContainer)) { | 346 if (paintInvalidationContainer && computeHighlightLayerPathAndPosition(paint
InvalidationContainer)) { |
| 347 // We only need to invalidate the layer if the highlight size has change
d, otherwise | 347 // We only need to invalidate the layer if the highlight size has change
d, otherwise |
| 348 // we can just re-position the layer without needing to repaint. | 348 // we can just re-position the layer without needing to repaint. |
| 349 m_contentLayer->layer()->invalidate(); | 349 m_contentLayer->layer()->invalidate(); |
| 350 | 350 |
| 351 if (m_currentGraphicsLayer) | 351 if (m_currentGraphicsLayer) |
| 352 m_currentGraphicsLayer->addRepaintRect(FloatRect(layer()->position()
.x, layer()->position().y, layer()->bounds().width, layer()->bounds().height)); | 352 m_currentGraphicsLayer->addRepaintRect(FloatRect(layer()->position()
.x, layer()->position().y, layer()->bounds().width, layer()->bounds().height)); |
| 353 } else if (!hasRenderer) { | 353 } else if (!hasRenderer) { |
| (...skipping 13 matching lines...) Expand all Loading... |
| 367 // Make sure we update geometry on the next callback from WebViewImpl::layou
t(). | 367 // Make sure we update geometry on the next callback from WebViewImpl::layou
t(). |
| 368 m_geometryNeedsUpdate = true; | 368 m_geometryNeedsUpdate = true; |
| 369 } | 369 } |
| 370 | 370 |
| 371 WebLayer* LinkHighlight::layer() | 371 WebLayer* LinkHighlight::layer() |
| 372 { | 372 { |
| 373 return clipLayer(); | 373 return clipLayer(); |
| 374 } | 374 } |
| 375 | 375 |
| 376 } // namespace blink | 376 } // namespace blink |
| OLD | NEW |