[iOS] Work around bug 136593 by disabling the PDFDocumentImage live resize optimizati...
authortimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 6 Sep 2014 00:15:44 +0000 (00:15 +0000)
committertimothy_horton@apple.com <timothy_horton@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 6 Sep 2014 00:15:44 +0000 (00:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=136594
rdar://problem/17457013

Reviewed by Simon Fraser.

* platform/graphics/cg/PDFDocumentImage.cpp:
(WebCore::PDFDocumentImage::updateCachedImageIfNeeded):
Disable the optimization on iOS, because bug 136593 rears its head
most often on iOS because it is more common to have contexts that always
use low-quality image interpolation on that platform.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@173345 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/cg/PDFDocumentImage.cpp

index 9b0b02a8c41f97f788411af606f4c02a477c14b9..8bceb7defe806ba60a4c69880f7cefa30e65b6d5 100644 (file)
@@ -1,3 +1,17 @@
+2014-09-05  Tim Horton  <timothy_horton@apple.com>
+
+        [iOS] Work around bug 136593 by disabling the PDFDocumentImage live resize optimization there
+        https://bugs.webkit.org/show_bug.cgi?id=136594
+        rdar://problem/17457013
+
+        Reviewed by Simon Fraser.
+
+        * platform/graphics/cg/PDFDocumentImage.cpp:
+        (WebCore::PDFDocumentImage::updateCachedImageIfNeeded):
+        Disable the optimization on iOS, because bug 136593 rears its head
+        most often on iOS because it is more common to have contexts that always
+        use low-quality image interpolation on that platform.
+
 2014-09-05  Tim Horton  <timothy_horton@apple.com>
 
         Doing a navigation on a non-opaque WKWebView can result in an empty layer tree
index 4022fad11e7a643f02ac4a15ea63f2a31593a1be..1cbcf53000569cd1e70e52a3d680e0de421d2dc2 100644 (file)
@@ -144,12 +144,21 @@ static void transformContextForPainting(GraphicsContext* context, const FloatRec
 
 void PDFDocumentImage::updateCachedImageIfNeeded(GraphicsContext* context, const FloatRect& dstRect, const FloatRect& srcRect)
 {
+#if PLATFORM(IOS)
+    // On iOS, some clients use low-quality image interpolation always, which throws off this optimization,
+    // as we never get the subsequent high-quality paint. Since live resize is rare on iOS, disable the optimization.
+    // FIXME (136593): It's also possible to do the wrong thing here if CSS specifies low-quality interpolation via the "image-rendering"
+    // property, on all platforms. We should only do this optimization if we're actually in a ImageQualityController live resize,
+    // and are guaranteed to do a high-quality paint later.
+    bool repaintIfNecessary = true;
+#else
     // If we have an existing image, reuse it if we're doing a low-quality paint, even if cache parameters don't match;
     // we'll rerender when we do the subsequent high-quality paint.
     InterpolationQuality interpolationQuality = context->imageInterpolationQuality();
-    bool useLowQualityInterpolation = interpolationQuality == InterpolationNone || interpolationQuality == InterpolationLow;
+    bool repaintIfNecessary = interpolationQuality != InterpolationNone && interpolationQuality != InterpolationLow;
+#endif
 
-    if (!m_cachedImageBuffer || (!cacheParametersMatch(context, dstRect, srcRect) && !useLowQualityInterpolation)) {
+    if (!m_cachedImageBuffer || (!cacheParametersMatch(context, dstRect, srcRect) && repaintIfNecessary)) {
         m_cachedImageBuffer = context->createCompatibleBuffer(FloatRect(enclosingIntRect(dstRect)).size());
         if (!m_cachedImageBuffer)
             return;