OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/layout/PaintInvalidationState.h" | 5 #include "core/layout/PaintInvalidationState.h" |
6 | 6 |
7 #include "core/frame/FrameView.h" | 7 #include "core/frame/FrameView.h" |
8 #include "core/frame/Settings.h" | 8 #include "core/frame/Settings.h" |
9 #include "core/layout/LayoutInline.h" | 9 #include "core/layout/LayoutInline.h" |
10 #include "core/layout/LayoutPart.h" | 10 #include "core/layout/LayoutPart.h" |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 m_paintOffset -= toLayoutBox(m_currentObject).locationOffset(); | 314 m_paintOffset -= toLayoutBox(m_currentObject).locationOffset(); |
315 } | 315 } |
316 | 316 |
317 if (!m_currentObject.hasOverflowClip()) | 317 if (!m_currentObject.hasOverflowClip()) |
318 return; | 318 return; |
319 | 319 |
320 const LayoutBox& box = toLayoutBox(m_currentObject); | 320 const LayoutBox& box = toLayoutBox(m_currentObject); |
321 | 321 |
322 // Do not clip scroll layer contents because the compositor expects the whol
e layer | 322 // Do not clip scroll layer contents because the compositor expects the whol
e layer |
323 // to be always invalidated in-time. | 323 // to be always invalidated in-time. |
324 if (box.usesCompositedScrolling()) | 324 if (box == m_paintInvalidationContainer && box.scrollsOverflow()) |
325 ASSERT(!m_clipped); // The box should establish paint invalidation conta
iner, so no m_clipped inherited. | 325 ASSERT(!m_clipped); // The box establishes paint invalidation container,
so no m_clipped inherited. |
326 else | 326 else |
327 addClipRectRelativeToPaintOffset(box.overflowClipRect(LayoutPoint())); | 327 addClipRectRelativeToPaintOffset(box.overflowClipRect(LayoutPoint())); |
328 | 328 |
329 m_paintOffset -= box.scrolledContentOffset(); | 329 m_paintOffset -= box.scrolledContentOffset(); |
330 | 330 |
331 // FIXME: <http://bugs.webkit.org/show_bug.cgi?id=13443> Apply control clip
if present. | 331 // FIXME: <http://bugs.webkit.org/show_bug.cgi?id=13443> Apply control clip
if present. |
332 } | 332 } |
333 | 333 |
334 static FloatPoint slowLocalToAncestorPoint(const LayoutObject& object, const Lay
outBoxModelObject& ancestor, const FloatPoint& point) | 334 static FloatPoint slowLocalToAncestorPoint(const LayoutObject& object, const Lay
outBoxModelObject& ancestor, const FloatPoint& point) |
335 { | 335 { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
378 LayoutRect PaintInvalidationState::computePaintInvalidationRectInBackingForSVG()
const | 378 LayoutRect PaintInvalidationState::computePaintInvalidationRectInBackingForSVG()
const |
379 { | 379 { |
380 LayoutRect rect; | 380 LayoutRect rect; |
381 if (m_cachedOffsetsEnabled) { | 381 if (m_cachedOffsetsEnabled) { |
382 FloatRect svgRect = SVGLayoutSupport::localOverflowRectForPaintInvalidat
ion(m_currentObject); | 382 FloatRect svgRect = SVGLayoutSupport::localOverflowRectForPaintInvalidat
ion(m_currentObject); |
383 rect = SVGLayoutSupport::transformPaintInvalidationRect(m_currentObject,
m_svgTransform, svgRect); | 383 rect = SVGLayoutSupport::transformPaintInvalidationRect(m_currentObject,
m_svgTransform, svgRect); |
384 rect.move(m_paintOffset); | 384 rect.move(m_paintOffset); |
385 if (m_clipped) | 385 if (m_clipped) |
386 rect.intersect(m_clipRect); | 386 rect.intersect(m_clipRect); |
387 #if ASSERT_SAME_RESULT_SLOW_AND_FAST_PATH | 387 #if ASSERT_SAME_RESULT_SLOW_AND_FAST_PATH |
388 // TODO(crbug.com/597902): Slow path misses clipping of paintInvalidatio
nContainer. | |
389 LayoutRect slowPathRect = SVGLayoutSupport::clippedOverflowRectForPaintI
nvalidation(m_currentObject, *m_paintInvalidationContainer); | 388 LayoutRect slowPathRect = SVGLayoutSupport::clippedOverflowRectForPaintI
nvalidation(m_currentObject, *m_paintInvalidationContainer); |
390 if (m_clipped) | |
391 slowPathRect.intersect(m_clipRect); | |
392 assertRectsEqual(m_currentObject, m_paintInvalidationContainer, rect, sl
owPathRect); | 389 assertRectsEqual(m_currentObject, m_paintInvalidationContainer, rect, sl
owPathRect); |
393 #endif | 390 #endif |
394 } else { | 391 } else { |
395 // TODO(wangxianzhu): Sometimes m_cachedOffsetsEnabled==false doesn't me
an we can't use cached | 392 // TODO(wangxianzhu): Sometimes m_cachedOffsetsEnabled==false doesn't me
an we can't use cached |
396 // m_svgTransform. We can use hybrid fast path (for SVG) and slow path (
for things above the SVGRoot). | 393 // m_svgTransform. We can use hybrid fast path (for SVG) and slow path (
for things above the SVGRoot). |
397 rect = SVGLayoutSupport::clippedOverflowRectForPaintInvalidation(m_curre
ntObject, *m_paintInvalidationContainer); | 394 rect = SVGLayoutSupport::clippedOverflowRectForPaintInvalidation(m_curre
ntObject, *m_paintInvalidationContainer); |
398 } | 395 } |
399 | 396 |
400 if (m_paintInvalidationContainer->layer()->groupedMapping()) | 397 if (m_paintInvalidationContainer->layer()->groupedMapping()) |
401 PaintLayer::mapRectInPaintInvalidationContainerToBacking(*m_paintInvalid
ationContainer, rect); | 398 PaintLayer::mapRectInPaintInvalidationContainerToBacking(*m_paintInvalid
ationContainer, rect); |
402 return rect; | 399 return rect; |
403 } | 400 } |
404 | 401 |
405 static void slowMapToVisualRectInAncestorSpace(const LayoutObject& object, const
LayoutBoxModelObject& ancestor, LayoutRect& rect) | 402 static void slowMapToVisualRectInAncestorSpace(const LayoutObject& object, const
LayoutBoxModelObject& ancestor, LayoutRect& rect) |
406 { | 403 { |
407 if (object.isLayoutView()) { | 404 if (object.isLayoutView()) |
408 toLayoutView(object).mapToVisualRectInAncestorSpace(&ancestor, rect, Inp
utIsInFrameCoordinates, DefaultVisualRectFlags); | 405 toLayoutView(object).mapToVisualRectInAncestorSpace(&ancestor, rect, Inp
utIsInFrameCoordinates, DefaultVisualRectFlags); |
409 } else { | 406 else |
410 object.mapToVisualRectInAncestorSpace(&ancestor, rect); | 407 object.mapToVisualRectInAncestorSpace(&ancestor, rect); |
411 } | |
412 } | 408 } |
413 | 409 |
414 void PaintInvalidationState::mapLocalRectToPaintInvalidationContainer(LayoutRect
& rect) const | 410 void PaintInvalidationState::mapLocalRectToPaintInvalidationContainer(LayoutRect
& rect) const |
415 { | 411 { |
416 ASSERT(!m_didUpdateForChildren); | 412 ASSERT(!m_didUpdateForChildren); |
417 | 413 |
418 if (m_cachedOffsetsEnabled) { | 414 if (m_cachedOffsetsEnabled) { |
419 #if ASSERT_SAME_RESULT_SLOW_AND_FAST_PATH | 415 #if ASSERT_SAME_RESULT_SLOW_AND_FAST_PATH |
420 LayoutRect slowPathRect(rect); | 416 LayoutRect slowPathRect(rect); |
421 slowMapToVisualRectInAncestorSpace(m_currentObject, *m_paintInvalidation
Container, slowPathRect); | 417 slowMapToVisualRectInAncestorSpace(m_currentObject, *m_paintInvalidation
Container, slowPathRect); |
422 #endif | 418 #endif |
423 rect.move(m_paintOffset); | 419 rect.move(m_paintOffset); |
424 if (m_clipped) | 420 if (m_clipped) |
425 rect.intersect(m_clipRect); | 421 rect.intersect(m_clipRect); |
426 #if ASSERT_SAME_RESULT_SLOW_AND_FAST_PATH | 422 #if ASSERT_SAME_RESULT_SLOW_AND_FAST_PATH |
427 // TODO(crbug.com/597902): Slow path misses clipping of paintInvalidatio
nContainer. | |
428 if (m_clipped) | |
429 slowPathRect.intersect(m_clipRect); | |
430 assertRectsEqual(m_currentObject, *m_paintInvalidationContainer, rect, s
lowPathRect); | 423 assertRectsEqual(m_currentObject, *m_paintInvalidationContainer, rect, s
lowPathRect); |
431 #endif | 424 #endif |
432 } else { | 425 } else { |
433 slowMapToVisualRectInAncestorSpace(m_currentObject, *m_paintInvalidation
Container, rect); | 426 slowMapToVisualRectInAncestorSpace(m_currentObject, *m_paintInvalidation
Container, rect); |
434 } | 427 } |
435 } | 428 } |
436 | 429 |
437 void PaintInvalidationState::mapLocalRectToPaintInvalidationBacking(LayoutRect&
rect) const | 430 void PaintInvalidationState::mapLocalRectToPaintInvalidationBacking(LayoutRect&
rect) const |
438 { | 431 { |
439 mapLocalRectToPaintInvalidationContainer(rect); | 432 mapLocalRectToPaintInvalidationContainer(rect); |
(...skipping 16 matching lines...) Expand all Loading... |
456 | 449 |
457 PaintLayer& PaintInvalidationState::enclosingSelfPaintingLayer(const LayoutObjec
t& layoutObject) const | 450 PaintLayer& PaintInvalidationState::enclosingSelfPaintingLayer(const LayoutObjec
t& layoutObject) const |
458 { | 451 { |
459 if (layoutObject.hasLayer() && toLayoutBoxModelObject(layoutObject).hasSelfP
aintingLayer()) | 452 if (layoutObject.hasLayer() && toLayoutBoxModelObject(layoutObject).hasSelfP
aintingLayer()) |
460 return *toLayoutBoxModelObject(layoutObject).layer(); | 453 return *toLayoutBoxModelObject(layoutObject).layer(); |
461 | 454 |
462 return m_enclosingSelfPaintingLayer; | 455 return m_enclosingSelfPaintingLayer; |
463 } | 456 } |
464 | 457 |
465 } // namespace blink | 458 } // namespace blink |
OLD | NEW |