OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011 Google Inc. All rights reserved. | 2 * Copyright (C) 2011 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 are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * 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 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 return IntRect(); | 258 return IntRect(); |
259 | 259 |
260 IntRect localRect = pixelSnappedIntRect(m_layoutObject->localCaretRect( | 260 IntRect localRect = pixelSnappedIntRect(m_layoutObject->localCaretRect( |
261 m_inlineBox, m_offset, extraWidthToEndOfLine)); | 261 m_inlineBox, m_offset, extraWidthToEndOfLine)); |
262 return localRect == IntRect() | 262 return localRect == IntRect() |
263 ? IntRect() | 263 ? IntRect() |
264 : m_layoutObject->localToAbsoluteQuad(FloatRect(localRect)) | 264 : m_layoutObject->localToAbsoluteQuad(FloatRect(localRect)) |
265 .enclosingBoundingBox(); | 265 .enclosingBoundingBox(); |
266 } | 266 } |
267 | 267 |
| 268 // Convert a local point into the coordinate system of backing coordinates. |
| 269 // Also returns the backing layer if needed. |
| 270 FloatPoint RenderedPosition::localToInvalidationBackingPoint( |
| 271 const LayoutPoint& localPoint, |
| 272 GraphicsLayer** graphicsLayerBacking) const { |
| 273 const LayoutBoxModelObject& paintInvalidationContainer = |
| 274 m_layoutObject->containerForPaintInvalidation(); |
| 275 DCHECK(paintInvalidationContainer.layer()); |
| 276 |
| 277 FloatPoint containerPoint = m_layoutObject->localToAncestorPoint( |
| 278 FloatPoint(localPoint), &paintInvalidationContainer, |
| 279 TraverseDocumentBoundaries); |
| 280 |
| 281 // A layoutObject can have no invalidation backing if it is from a detached |
| 282 // frame, or when forced compositing is disabled. |
| 283 if (paintInvalidationContainer.layer()->compositingState() == NotComposited) |
| 284 return containerPoint; |
| 285 |
| 286 PaintLayer::mapPointInPaintInvalidationContainerToBacking( |
| 287 paintInvalidationContainer, containerPoint); |
| 288 |
| 289 // Must not use the scrolling contents layer, so pass |
| 290 // |paintInvalidationContainer|. |
| 291 if (GraphicsLayer* graphicsLayer = |
| 292 paintInvalidationContainer.layer()->graphicsLayerBacking( |
| 293 &paintInvalidationContainer)) { |
| 294 if (graphicsLayerBacking) |
| 295 *graphicsLayerBacking = graphicsLayer; |
| 296 |
| 297 containerPoint.move(-graphicsLayer->offsetFromLayoutObject()); |
| 298 } |
| 299 |
| 300 return containerPoint; |
| 301 } |
| 302 |
268 void RenderedPosition::positionInGraphicsLayerBacking( | 303 void RenderedPosition::positionInGraphicsLayerBacking( |
269 CompositedSelectionBound& bound, | 304 CompositedSelectionBound& bound, |
270 bool selectionStart) const { | 305 bool selectionStart) const { |
271 bound.layer = nullptr; | 306 bound.layer = nullptr; |
272 bound.edgeTopInLayer = bound.edgeBottomInLayer = FloatPoint(); | 307 bound.edgeTopInLayer = bound.edgeBottomInLayer = FloatPoint(); |
273 | 308 |
274 if (isNull()) | 309 if (isNull()) |
275 return; | 310 return; |
276 | 311 |
277 LayoutRect rect = m_layoutObject->localCaretRect(m_inlineBox, m_offset); | 312 LayoutRect rect = m_layoutObject->localCaretRect(m_inlineBox, m_offset); |
278 PaintLayer* layer = nullptr; | |
279 if (m_layoutObject->style()->isHorizontalWritingMode()) { | 313 if (m_layoutObject->style()->isHorizontalWritingMode()) { |
280 bound.edgeTopInLayer = m_layoutObject->localToInvalidationBackingPoint( | 314 bound.edgeTopInLayer = |
281 rect.minXMinYCorner(), &layer); | 315 localToInvalidationBackingPoint(rect.minXMinYCorner(), &bound.layer); |
282 bound.edgeBottomInLayer = m_layoutObject->localToInvalidationBackingPoint( | 316 bound.edgeBottomInLayer = |
283 rect.minXMaxYCorner(), nullptr); | 317 localToInvalidationBackingPoint(rect.minXMaxYCorner(), nullptr); |
284 } else { | 318 } else { |
285 bound.edgeTopInLayer = m_layoutObject->localToInvalidationBackingPoint( | 319 bound.edgeTopInLayer = |
286 rect.minXMinYCorner(), &layer); | 320 localToInvalidationBackingPoint(rect.minXMinYCorner(), &bound.layer); |
287 bound.edgeBottomInLayer = m_layoutObject->localToInvalidationBackingPoint( | 321 bound.edgeBottomInLayer = |
288 rect.maxXMinYCorner(), nullptr); | 322 localToInvalidationBackingPoint(rect.maxXMinYCorner(), nullptr); |
289 | 323 |
290 // When text is vertical, it looks better for the start handle baseline to | 324 // When text is vertical, it looks better for the start handle baseline to |
291 // be at the starting edge, to enclose the selection fully between the | 325 // be at the starting edge, to enclose the selection fully between the |
292 // handles. | 326 // handles. |
293 if (selectionStart) { | 327 if (selectionStart) { |
294 float xSwap = bound.edgeBottomInLayer.x(); | 328 float xSwap = bound.edgeBottomInLayer.x(); |
295 bound.edgeBottomInLayer.setX(bound.edgeTopInLayer.x()); | 329 bound.edgeBottomInLayer.setX(bound.edgeTopInLayer.x()); |
296 bound.edgeTopInLayer.setX(xSwap); | 330 bound.edgeTopInLayer.setX(xSwap); |
297 } | 331 } |
298 | 332 |
299 // Flipped blocks writing mode is not only vertical but also right to left. | 333 // Flipped blocks writing mode is not only vertical but also right to left. |
300 bound.isTextDirectionRTL = m_layoutObject->hasFlippedBlocksWritingMode(); | 334 bound.isTextDirectionRTL = m_layoutObject->hasFlippedBlocksWritingMode(); |
301 } | 335 } |
302 | |
303 bound.layer = layer ? layer->graphicsLayerBacking() : nullptr; | |
304 } | 336 } |
305 | 337 |
306 bool layoutObjectContainsPosition(LayoutObject* target, | 338 bool layoutObjectContainsPosition(LayoutObject* target, |
307 const Position& position) { | 339 const Position& position) { |
308 for (LayoutObject* layoutObject = layoutObjectFromPosition(position); | 340 for (LayoutObject* layoutObject = layoutObjectFromPosition(position); |
309 layoutObject && layoutObject->node(); | 341 layoutObject && layoutObject->node(); |
310 layoutObject = layoutObject->parent()) { | 342 layoutObject = layoutObject->parent()) { |
311 if (layoutObject == target) | 343 if (layoutObject == target) |
312 return true; | 344 return true; |
313 } | 345 } |
314 return false; | 346 return false; |
315 } | 347 } |
316 | 348 |
317 } // namespace blink | 349 } // namespace blink |
OLD | NEW |