OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/paint/ObjectPaintInvalidator.h" | 5 #include "core/paint/ObjectPaintInvalidator.h" |
6 | 6 |
7 #include "core/frame/FrameView.h" | 7 #include "core/frame/FrameView.h" |
8 #include "core/frame/LocalFrame.h" | 8 #include "core/frame/LocalFrame.h" |
9 #include "core/layout/LayoutBlockFlow.h" | 9 #include "core/layout/LayoutBlockFlow.h" |
10 #include "core/layout/LayoutView.h" | 10 #include "core/layout/LayoutView.h" |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
366 m_object.invalidateDisplayItemClients(PaintInvalidationRectangle); | 366 m_object.invalidateDisplayItemClients(PaintInvalidationRectangle); |
367 | 367 |
368 return dirtyRectOnBacking; | 368 return dirtyRectOnBacking; |
369 } | 369 } |
370 | 370 |
371 void ObjectPaintInvalidator::slowSetPaintingLayerNeedsRepaint() { | 371 void ObjectPaintInvalidator::slowSetPaintingLayerNeedsRepaint() { |
372 if (PaintLayer* paintingLayer = m_object.paintingLayer()) | 372 if (PaintLayer* paintingLayer = m_object.paintingLayer()) |
373 paintingLayer->setNeedsRepaint(); | 373 paintingLayer->setNeedsRepaint(); |
374 } | 374 } |
375 | 375 |
376 bool ObjectPaintInvalidatorWithContext::incrementallyInvalidatePaint() { | |
377 const LayoutRect& oldBounds = m_context.oldBounds; | |
378 const LayoutRect& newBounds = m_context.newBounds; | |
379 | |
380 DCHECK(oldBounds.location() == newBounds.location()); | |
381 | |
382 LayoutUnit deltaRight = newBounds.maxX() - oldBounds.maxX(); | |
383 LayoutUnit deltaBottom = newBounds.maxY() - oldBounds.maxY(); | |
384 if (!deltaRight && !deltaBottom) | |
385 return false; | |
386 | |
387 if (deltaRight > 0) { | |
388 LayoutRect invalidationRect(oldBounds.maxX(), newBounds.y(), deltaRight, | |
389 newBounds.height()); | |
390 invalidatePaintUsingContainer(*m_context.paintInvalidationContainer, | |
391 invalidationRect, | |
392 PaintInvalidationIncremental); | |
393 } else if (deltaRight < 0) { | |
394 LayoutRect invalidationRect(newBounds.maxX(), oldBounds.y(), -deltaRight, | |
395 oldBounds.height()); | |
396 invalidatePaintUsingContainer(*m_context.paintInvalidationContainer, | |
397 invalidationRect, | |
398 PaintInvalidationIncremental); | |
399 } | |
400 | |
401 if (deltaBottom > 0) { | |
402 LayoutRect invalidationRect(newBounds.x(), oldBounds.maxY(), | |
403 newBounds.width(), deltaBottom); | |
404 invalidatePaintUsingContainer(*m_context.paintInvalidationContainer, | |
405 invalidationRect, | |
406 PaintInvalidationIncremental); | |
407 } else if (deltaBottom < 0) { | |
408 LayoutRect invalidationRect(oldBounds.x(), newBounds.maxY(), | |
409 oldBounds.width(), -deltaBottom); | |
410 invalidatePaintUsingContainer(*m_context.paintInvalidationContainer, | |
411 invalidationRect, | |
412 PaintInvalidationIncremental); | |
413 } | |
414 | |
415 return true; | |
416 } | |
417 | |
418 void ObjectPaintInvalidatorWithContext::fullyInvalidatePaint( | 376 void ObjectPaintInvalidatorWithContext::fullyInvalidatePaint( |
419 PaintInvalidationReason reason, | 377 PaintInvalidationReason reason, |
420 const LayoutRect& oldBounds, | 378 const LayoutRect& oldBounds, |
421 const LayoutRect& newBounds) { | 379 const LayoutRect& newBounds) { |
422 // The following logic avoids invalidating twice if one set of bounds contains | 380 // The following logic avoids invalidating twice if one set of bounds contains |
423 // the other. | 381 // the other. |
424 if (!newBounds.contains(oldBounds)) { | 382 if (!newBounds.contains(oldBounds)) { |
425 LayoutRect invalidationRect = oldBounds; | 383 LayoutRect invalidationRect = oldBounds; |
426 invalidatePaintUsingContainer(*m_context.paintInvalidationContainer, | 384 invalidatePaintUsingContainer(*m_context.paintInvalidationContainer, |
427 invalidationRect, reason); | 385 invalidationRect, reason); |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 } | 492 } |
535 | 493 |
536 PaintInvalidationReason | 494 PaintInvalidationReason |
537 ObjectPaintInvalidatorWithContext::invalidatePaintIfNeededWithComputedReason( | 495 ObjectPaintInvalidatorWithContext::invalidatePaintIfNeededWithComputedReason( |
538 PaintInvalidationReason reason) { | 496 PaintInvalidationReason reason) { |
539 // We need to invalidate the selection before checking for whether we are | 497 // We need to invalidate the selection before checking for whether we are |
540 // doing a full invalidation. This is because we need to update the previous | 498 // doing a full invalidation. This is because we need to update the previous |
541 // selection rect regardless. | 499 // selection rect regardless. |
542 invalidateSelectionIfNeeded(reason); | 500 invalidateSelectionIfNeeded(reason); |
543 | 501 |
544 if (reason == PaintInvalidationIncremental && !incrementallyInvalidatePaint()) | 502 if (reason == PaintInvalidationIncremental) { |
545 reason = PaintInvalidationNone; | 503 reason = m_context.oldBounds == m_context.newBounds ? PaintInvalidationNone |
| 504 : PaintInvalidationFull; |
| 505 } |
546 | 506 |
547 switch (reason) { | 507 switch (reason) { |
548 case PaintInvalidationNone: | 508 case PaintInvalidationNone: |
549 // TODO(trchen): Currently we don't keep track of paint offset of layout | 509 // TODO(trchen): Currently we don't keep track of paint offset of layout |
550 // objects. There are corner cases that the display items need to be | 510 // objects. There are corner cases that the display items need to be |
551 // invalidated for paint offset mutation, but incurs no pixel difference | 511 // invalidated for paint offset mutation, but incurs no pixel difference |
552 // (i.e. bounds stay the same) so no rect-based invalidation is issued. | 512 // (i.e. bounds stay the same) so no rect-based invalidation is issued. |
553 // See crbug.com/508383 and crbug.com/515977. This is a workaround to | 513 // See crbug.com/508383 and crbug.com/515977. This is a workaround to |
554 // force display items to update paint offset. | 514 // force display items to update paint offset. |
555 if (m_context.forcedSubtreeInvalidationFlags & | 515 if (m_context.forcedSubtreeInvalidationFlags & |
556 PaintInvalidatorContext::ForcedSubtreeInvalidationChecking) { | 516 PaintInvalidatorContext::ForcedSubtreeInvalidationChecking) { |
557 reason = PaintInvalidationLocationChange; | 517 reason = PaintInvalidationLocationChange; |
558 break; | 518 break; |
559 } | 519 } |
560 return PaintInvalidationNone; | 520 return PaintInvalidationNone; |
561 case PaintInvalidationIncremental: | |
562 break; | |
563 case PaintInvalidationDelayedFull: | 521 case PaintInvalidationDelayedFull: |
564 return PaintInvalidationDelayedFull; | 522 return PaintInvalidationDelayedFull; |
565 default: | 523 default: |
566 DCHECK(isImmediateFullPaintInvalidationReason(reason)); | 524 DCHECK(isImmediateFullPaintInvalidationReason(reason)); |
567 fullyInvalidatePaint(reason, m_context.oldBounds, m_context.newBounds); | 525 fullyInvalidatePaint(reason, m_context.oldBounds, m_context.newBounds); |
568 } | 526 } |
569 | 527 |
570 m_context.paintingLayer->setNeedsRepaint(); | 528 m_context.paintingLayer->setNeedsRepaint(); |
571 m_object.invalidateDisplayItemClients(reason); | 529 m_object.invalidateDisplayItemClients(reason); |
572 return reason; | 530 return reason; |
573 } | 531 } |
574 | 532 |
575 DisablePaintInvalidationStateAsserts::DisablePaintInvalidationStateAsserts() | 533 DisablePaintInvalidationStateAsserts::DisablePaintInvalidationStateAsserts() |
576 : m_disabler(&gDisablePaintInvalidationStateAsserts, true) {} | 534 : m_disabler(&gDisablePaintInvalidationStateAsserts, true) {} |
577 | 535 |
578 } // namespace blink | 536 } // namespace blink |
OLD | NEW |