2007-11-28 Alp Toker <alp@atoker.com>
authoralp@webkit.org <alp@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 28 Nov 2007 12:47:37 +0000 (12:47 +0000)
committeralp@webkit.org <alp@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 28 Nov 2007 12:47:37 +0000 (12:47 +0000)
        Reviewed by Mark Rowe.

        http://bugs.webkit.org/show_bug.cgi?id=15689
        [GTK] Background of loading images is always black

        frameHasAlphaAtIndex() exists only to allow optimization for cases we
        are certain the image can be blitted rather than composited.

        Thus we need to be conservative, returning false only when we are
        absolutely certain there is no need for composited copying, and true
        otherwise.

        CG doesn't even bother with this optimization at all and always
        returns true.

        Patch includes a workaround for
          http://bugs.webkit.org/show_bug.cgi?id=16169
          GIF ImageDecoder hasAlpha() return value incorrect

        * platform/graphics/cairo/ImageSourceCairo.cpp:
        (WebCore::ImageSource::frameHasAlphaAtIndex):

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

WebCore/ChangeLog
WebCore/platform/graphics/cairo/ImageSourceCairo.cpp

index 853f9befc3ac1b6d107c26a724da14698f74ba4e..7826cbdf9f86f34e4d5da1b47d60a16982412f67 100644 (file)
@@ -1,3 +1,27 @@
+2007-11-28  Alp Toker  <alp@atoker.com>
+
+        Reviewed by Mark Rowe.
+
+        http://bugs.webkit.org/show_bug.cgi?id=15689
+        [GTK] Background of loading images is always black
+
+        frameHasAlphaAtIndex() exists only to allow optimization for cases we
+        are certain the image can be blitted rather than composited.
+
+        Thus we need to be conservative, returning false only when we are
+        absolutely certain there is no need for composited copying, and true
+        otherwise.
+
+        CG doesn't even bother with this optimization at all and always
+        returns true.
+
+        Patch includes a workaround for
+          http://bugs.webkit.org/show_bug.cgi?id=16169
+          GIF ImageDecoder hasAlpha() return value incorrect
+
+        * platform/graphics/cairo/ImageSourceCairo.cpp:
+        (WebCore::ImageSource::frameHasAlphaAtIndex):
+
 2007-11-28  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Darin and Geoff.
 2007-11-28  Maciej Stachowiak  <mjs@apple.com>
 
         Reviewed by Darin and Geoff.
index a5d9243dd601699c1da423360a28c6f8daf390ec..fd591662746c31940471b3945ea91ed458bd5d00 100644 (file)
@@ -193,12 +193,34 @@ float ImageSource::frameDurationAtIndex(size_t index)
 
 bool ImageSource::frameHasAlphaAtIndex(size_t index)
 {
 
 bool ImageSource::frameHasAlphaAtIndex(size_t index)
 {
-    if (!m_decoder || !m_decoder->supportsAlpha())
-        return false;
-
+    // We almost always want to support alpha, especially for images that are
+    // only partially loaded.
+    //
+    // There is one exception:
+    //
+    // As an optimization we can allow the image renderer to blit the image
+    // (implemented as CompositeCopy in ImageCairo) by returning false if and
+    // only if:
+    //
+    //   * The image has been fully loaded
+    //   * The buffer is marked as not having alpha transparency
+
+    if (!frameIsCompleteAtIndex(index))
+        return true;
+
+    ASSERT(m_decoder);
     RGBA32Buffer* buffer = m_decoder->frameBufferAtIndex(index);
     RGBA32Buffer* buffer = m_decoder->frameBufferAtIndex(index);
-    if (!buffer || buffer->status() == RGBA32Buffer::FrameEmpty)
-        return false;
+    ASSERT(buffer);
+
+    // FIXME: This is a hack that makes the whole optimization useless in
+    // many cases. It is necessary because buffer->hasAlpha() incorrectly
+    // returns false when it should return true for certain GIF images.
+    //
+    // We should ideally never have to check if the decoder supports alpha.
+    //
+    // See http://bugs.webkit.org/show_bug.cgi?id=16169
+    if (m_decoder->supportsAlpha())
+        return true;
 
     return buffer->hasAlpha();
 }
 
     return buffer->hasAlpha();
 }