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; |
} |