Title: [147638] trunk/Source/WebCore
Revision
147638
Author
[email protected]
Date
2013-04-04 09:28:43 -0700 (Thu, 04 Apr 2013)

Log Message

Render images with low-quality scaling while FrameView is being resized.
<http://webkit.org/b/113764>
<rdar://problem/13555154>

Reviewed by Antti Koivisto.

Have ImageQualityController ask the renderer's containing FrameView if it's currently in live
resize, and if so, paint all images with low-quality scaling. A high-quality repaint will happen
~0.5 sec after live resizing ends, piggybacking on the same mechanism we use to do JS-animated
resizing with low-quality scaling.

This reduces CPU time spent generating new tiles during live window resize, especially on Retina
systems where a lot of upscaling happens on legacy web content.

* rendering/RenderBoxModelObject.cpp:
(ImageQualityController):

    Added an m_liveResizeOptimizationIsActive flag that tracks whether the ImageQualityController
    is painting everything in low quality due to live window resize. It gets unset when the HQ
    repaint timer fires and everything has been repainted properly.

(WebCore::ImageQualityController::highQualityRepaintTimerFired):

    When the HQ repaint timer fires, check if the renderer's containing FrameView is still in
    live resize, and if so, abort HQ repaint for now and reschedule the timer.

(WebCore::ImageQualityController::ImageQualityController):
(WebCore::ImageQualityController::objectDestroyed):
(WebCore::ImageQualityController::shouldPaintAtLowQuality):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (147637 => 147638)


--- trunk/Source/WebCore/ChangeLog	2013-04-04 16:18:30 UTC (rev 147637)
+++ trunk/Source/WebCore/ChangeLog	2013-04-04 16:28:43 UTC (rev 147638)
@@ -1,3 +1,35 @@
+2013-04-04  Andreas Kling  <[email protected]>
+
+        Render images with low-quality scaling while FrameView is being resized.
+        <http://webkit.org/b/113764>
+        <rdar://problem/13555154>
+
+        Reviewed by Antti Koivisto.
+
+        Have ImageQualityController ask the renderer's containing FrameView if it's currently in live
+        resize, and if so, paint all images with low-quality scaling. A high-quality repaint will happen
+        ~0.5 sec after live resizing ends, piggybacking on the same mechanism we use to do JS-animated
+        resizing with low-quality scaling.
+
+        This reduces CPU time spent generating new tiles during live window resize, especially on Retina
+        systems where a lot of upscaling happens on legacy web content.
+
+        * rendering/RenderBoxModelObject.cpp:
+        (ImageQualityController):
+
+            Added an m_liveResizeOptimizationIsActive flag that tracks whether the ImageQualityController
+            is painting everything in low quality due to live window resize. It gets unset when the HQ
+            repaint timer fires and everything has been repainted properly.
+
+        (WebCore::ImageQualityController::highQualityRepaintTimerFired):
+
+            When the HQ repaint timer fires, check if the renderer's containing FrameView is still in
+            live resize, and if so, abort HQ repaint for now and reschedule the timer.
+
+        (WebCore::ImageQualityController::ImageQualityController):
+        (WebCore::ImageQualityController::objectDestroyed):
+        (WebCore::ImageQualityController::shouldPaintAtLowQuality):
+
 2013-04-04  Seokju Kwon  <[email protected]>
 
         Web Inspector: fix closure compiler warnings in IndexedDBModel.js

Modified: trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp (147637 => 147638)


--- trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp	2013-04-04 16:18:30 UTC (rev 147637)
+++ trunk/Source/WebCore/rendering/RenderBoxModelObject.cpp	2013-04-04 16:28:43 UTC (rev 147638)
@@ -90,11 +90,13 @@
     ObjectLayerSizeMap m_objectLayerSizeMap;
     Timer<ImageQualityController> m_timer;
     bool m_animatedResizeIsActive;
+    bool m_liveResizeOptimizationIsActive;
 };
 
 ImageQualityController::ImageQualityController()
     : m_timer(this, &ImageQualityController::highQualityRepaintTimerFired)
     , m_animatedResizeIsActive(false)
+    , m_liveResizeOptimizationIsActive(false)
 {
 }
 
@@ -129,11 +131,22 @@
 
 void ImageQualityController::highQualityRepaintTimerFired(Timer<ImageQualityController>*)
 {
-    if (m_animatedResizeIsActive) {
-        m_animatedResizeIsActive = false;
-        for (ObjectLayerSizeMap::iterator it = m_objectLayerSizeMap.begin(); it != m_objectLayerSizeMap.end(); ++it)
-            it->key->repaint();
+    if (!m_animatedResizeIsActive && !m_liveResizeOptimizationIsActive)
+        return;
+    m_animatedResizeIsActive = false;
+
+    for (ObjectLayerSizeMap::iterator it = m_objectLayerSizeMap.begin(); it != m_objectLayerSizeMap.end(); ++it) {
+        if (Frame* frame = it->key->document()->frame()) {
+            // If this renderer's containing FrameView is in live resize, punt the timer and hold back for now.
+            if (frame->view() && frame->view()->inLiveResize()) {
+                restartTimer();
+                return;
+            }
+        }
+        it->key->repaint();
     }
+
+    m_liveResizeOptimizationIsActive = false;
 }
 
 void ImageQualityController::restartTimer()
@@ -168,6 +181,22 @@
         }
     }
 
+    // If the containing FrameView is being resized, paint at low quality until resizing is finished.
+    if (Frame* frame = object->document()->frame()) {
+        bool frameViewIsCurrentlyInLiveResize = frame->view() && frame->view()->inLiveResize();
+        if (frameViewIsCurrentlyInLiveResize) {
+            set(object, innerMap, layer, size);
+            restartTimer();
+            m_liveResizeOptimizationIsActive = true;
+            return true;
+        }
+        if (m_liveResizeOptimizationIsActive) {
+            // Live resize has ended, paint in HQ and remove this object from the list.
+            removeLayer(object, innerMap, layer);
+            return false;
+        }
+    }
+
     const AffineTransform& currentTransform = context->getCTM();
     bool contextIsScaled = !currentTransform.isIdentityOrTranslationOrFlipped();
     if (!contextIsScaled && size == imageSize) {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to