Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(649)

Unified Diff: third_party/WebKit/Source/core/layout/ImageQualityController.cpp

Issue 1685933002: Don't use a low-quality filter when painting images while others are animating. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}

Powered by Google App Engine
This is Rietveld 408576698