Chromium Code Reviews| Index: third_party/WebKit/Source/core/layout/ImageQualityController.cpp |
| diff --git a/third_party/WebKit/Source/core/layout/ImageQualityController.cpp b/third_party/WebKit/Source/core/layout/ImageQualityController.cpp |
| index d5e6622e97b610a78a9c76032ba19e01f17cfab9..517cd8e72af135007df6d2637effa82226c405bc 100644 |
| --- a/third_party/WebKit/Source/core/layout/ImageQualityController.cpp |
| +++ b/third_party/WebKit/Source/core/layout/ImageQualityController.cpp |
| @@ -89,7 +89,6 @@ ImageQualityController::~ImageQualityController() |
| ImageQualityController::ImageQualityController() |
| : m_timer(adoptPtr(new Timer<ImageQualityController>(this, &ImageQualityController::highQualityRepaintTimerFired))) |
| - , m_animatedResizeIsActive(false) |
| , m_liveResizeOptimizationIsActive(false) |
| { |
| } |
| @@ -108,14 +107,16 @@ void ImageQualityController::removeLayer(const LayoutObject& object, LayerSizeMa |
| } |
| } |
| -void ImageQualityController::set(const LayoutObject& object, LayerSizeMap* innerMap, const void* layer, const LayoutSize& size) |
| +void ImageQualityController::set(const LayoutObject& object, LayerSizeMap* innerMap, const void* layer, const LayoutSize& size, bool isResizing) |
| { |
| if (innerMap) { |
| innerMap->set(layer, size); |
| + m_objectLayerSizeMap.find(&object)->value.isResizing = isResizing; |
| } else { |
| - LayerSizeMap newInnerMap; |
| - newInnerMap.set(layer, size); |
| - m_objectLayerSizeMap.set(&object, newInnerMap); |
| + ObjectResizeInfo newResizeInfo; |
| + newResizeInfo.layerSizeMap.set(layer, size); |
| + newResizeInfo.isResizing = isResizing; |
| + m_objectLayerSizeMap.set(&object, newResizeInfo); |
| } |
| } |
| @@ -123,17 +124,12 @@ void ImageQualityController::objectDestroyed(const LayoutObject& object) |
| { |
| m_objectLayerSizeMap.remove(&object); |
| if (m_objectLayerSizeMap.isEmpty()) { |
| - m_animatedResizeIsActive = false; |
| m_timer->stop(); |
| } |
| } |
| void ImageQualityController::highQualityRepaintTimerFired(Timer<ImageQualityController>*) |
| { |
| - if (!m_animatedResizeIsActive && !m_liveResizeOptimizationIsActive) |
| - return; |
| - m_animatedResizeIsActive = false; |
| - |
| for (auto* layoutObject : m_objectLayerSizeMap.keys()) { |
| if (LocalFrame* frame = layoutObject->document().frame()) { |
| // If this layoutObject's containing FrameView is in live resize, punt the timer and hold back for now. |
| @@ -142,8 +138,15 @@ void ImageQualityController::highQualityRepaintTimerFired(Timer<ImageQualityCont |
| return; |
| } |
| } |
| - // TODO(wangxianzhu): Use LayoutObject::mutableForPainting(). |
| - const_cast<LayoutObject*>(layoutObject)->setShouldDoFullPaintInvalidation(); |
| + ObjectLayerSizeMap::iterator i = m_objectLayerSizeMap.find(layoutObject); |
| + if (i != m_objectLayerSizeMap.end()) { |
| + // Only invalidate the object if it is animating. |
| + if (i->value.isResizing) { |
| + // TODO(wangxianzhu): Use LayoutObject::mutableForPainting(). |
| + const_cast<LayoutObject*>(layoutObject)->setShouldDoFullPaintInvalidation(); |
| + } |
| + i->value.isResizing = false; |
| + } |
| } |
| m_liveResizeOptimizationIsActive = false; |
| @@ -169,7 +172,12 @@ bool ImageQualityController::shouldPaintAtLowQuality(const LayoutObject& object, |
| // Look ourselves up in the hashtables. |
| ObjectLayerSizeMap::iterator i = m_objectLayerSizeMap.find(&object); |
| - LayerSizeMap* innerMap = i != m_objectLayerSizeMap.end() ? &i->value : 0; |
| + LayerSizeMap* innerMap = nullptr; |
| + bool objectIsResizing = false; |
| + if (i != m_objectLayerSizeMap.end()) { |
| + innerMap = &i->value.layerSizeMap; |
| + objectIsResizing = i->value.isResizing; |
| + } |
| LayoutSize oldSize; |
| bool isFirstResize = true; |
| if (innerMap) { |
| @@ -184,7 +192,7 @@ bool ImageQualityController::shouldPaintAtLowQuality(const LayoutObject& object, |
| if (LocalFrame* frame = object.document().frame()) { |
| bool frameViewIsCurrentlyInLiveResize = frame->view() && frame->view()->inLiveResize(); |
| if (frameViewIsCurrentlyInLiveResize) { |
| - set(object, innerMap, layer, layoutSize); |
| + set(object, innerMap, layer, layoutSize, true); |
|
pdr.
2016/02/10 19:06:30
Should this be objectIsResizing instead of true?
chrishtr
2016/02/10 19:16:32
No, because otherwise the callback in ImageQuality
|
| restartTimer(); |
| m_liveResizeOptimizationIsActive = true; |
| return true; |
| @@ -202,10 +210,11 @@ bool ImageQualityController::shouldPaintAtLowQuality(const LayoutObject& object, |
| return false; |
| } |
| - // If an animated resize is active, paint in low quality and kick the timer ahead. |
| - if (m_animatedResizeIsActive) { |
| - set(object, innerMap, layer, layoutSize); |
| - if (oldSize != layoutSize) |
| + // If an animated resize is active for this object, paint in low quality and kick the timer ahead. |
| + if (objectIsResizing) { |
| + bool sizesChanged = oldSize != layoutSize; |
| + set(object, innerMap, layer, layoutSize, sizesChanged); |
| + if (sizesChanged) |
| restartTimer(); |
| return true; |
| } |
| @@ -214,7 +223,7 @@ bool ImageQualityController::shouldPaintAtLowQuality(const LayoutObject& object, |
| // size and set the timer. |
| if (isFirstResize || oldSize == layoutSize) { |
| restartTimer(); |
| - set(object, innerMap, layer, layoutSize); |
| + set(object, innerMap, layer, layoutSize, false); |
| return false; |
| } |
| // If the timer is no longer active, draw at high quality and don't |
| @@ -223,12 +232,10 @@ bool ImageQualityController::shouldPaintAtLowQuality(const LayoutObject& object, |
| removeLayer(object, innerMap, layer); |
| return false; |
| } |
| - |
| // This object has been resized to two different sizes while the timer |
| // is active, so draw at low quality, set the flag for animated resizes and |
| // the object to the list for high quality redraw. |
| - set(object, innerMap, layer, layoutSize); |
| - m_animatedResizeIsActive = true; |
| + set(object, innerMap, layer, layoutSize, true); |
| restartTimer(); |
| return true; |
| } |