Title: [142891] trunk/Source
Revision
142891
Author
commit-qu...@webkit.org
Date
2013-02-14 10:49:27 -0800 (Thu, 14 Feb 2013)

Log Message

Passing alpha to DeferredImageDecoder once decoding completes
https://bugs.webkit.org/show_bug.cgi?id=108892

Patch by Min Qin <qin...@chromium.org> on 2013-02-14
Reviewed by Stephen White.

Source/WebCore:

We should pass hasAlpha value back to the DeferredImageDecoder once decoding is completed
Added unit tests in ImageFrameGeneratorTest.

* platform/graphics/chromium/DeferredImageDecoder.cpp:
(WebCore::DeferredImageDecoder::frameHasAlphaAtIndex):
* platform/graphics/chromium/ImageFrameGenerator.cpp:
(WebCore::ImageFrameGenerator::tryToScale):
(WebCore::ImageFrameGenerator::decode):
* platform/graphics/chromium/LazyDecodingPixelRef.cpp:
(WebCore::LazyDecodingPixelRef::LazyDecodingPixelRef):
(WebCore::LazyDecodingPixelRef::onUnlockPixels):
* platform/graphics/chromium/LazyDecodingPixelRef.h:
(WebCore::LazyDecodingPixelRef::hasAlpha):
(LazyDecodingPixelRef):
* platform/graphics/chromium/ScaledImageFragment.cpp:
(WebCore::ScaledImageFragment::ScaledImageFragment):
* platform/graphics/chromium/ScaledImageFragment.h:
(WebCore::ScaledImageFragment::create):
(ScaledImageFragment):
(WebCore::ScaledImageFragment::hasAlpha):

Source/WebKit/chromium:

Add test to check that alpha value is passed from the decoder to ImageFrameGenerator.

* tests/ImageFrameGeneratorTest.cpp:
(WebCore::MockImageDecoderFactory::create):
(WebCore::TEST_F):
* tests/MockImageDecoder.h:
(WebCore::MockImageDecoder::MockImageDecoder):
(WebCore::MockImageDecoder::setFrameHasAlpha):
(MockImageDecoder):
(WebCore::MockImageDecoder::frameHasAlphaAtIndex):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (142890 => 142891)


--- trunk/Source/WebCore/ChangeLog	2013-02-14 18:17:54 UTC (rev 142890)
+++ trunk/Source/WebCore/ChangeLog	2013-02-14 18:49:27 UTC (rev 142891)
@@ -1,3 +1,31 @@
+2013-02-14  Min Qin  <qin...@chromium.org>
+
+        Passing alpha to DeferredImageDecoder once decoding completes
+        https://bugs.webkit.org/show_bug.cgi?id=108892
+
+        Reviewed by Stephen White.
+
+        We should pass hasAlpha value back to the DeferredImageDecoder once decoding is completed
+        Added unit tests in ImageFrameGeneratorTest.
+
+        * platform/graphics/chromium/DeferredImageDecoder.cpp:
+        (WebCore::DeferredImageDecoder::frameHasAlphaAtIndex):
+        * platform/graphics/chromium/ImageFrameGenerator.cpp:
+        (WebCore::ImageFrameGenerator::tryToScale):
+        (WebCore::ImageFrameGenerator::decode):
+        * platform/graphics/chromium/LazyDecodingPixelRef.cpp:
+        (WebCore::LazyDecodingPixelRef::LazyDecodingPixelRef):
+        (WebCore::LazyDecodingPixelRef::onUnlockPixels):
+        * platform/graphics/chromium/LazyDecodingPixelRef.h:
+        (WebCore::LazyDecodingPixelRef::hasAlpha):
+        (LazyDecodingPixelRef):
+        * platform/graphics/chromium/ScaledImageFragment.cpp:
+        (WebCore::ScaledImageFragment::ScaledImageFragment):
+        * platform/graphics/chromium/ScaledImageFragment.h:
+        (WebCore::ScaledImageFragment::create):
+        (ScaledImageFragment):
+        (WebCore::ScaledImageFragment::hasAlpha):
+
 2013-02-14  David Grogan  <dgro...@chromium.org>
 
         IndexedDB: Add a few more histogram calls

Modified: trunk/Source/WebCore/platform/graphics/chromium/DeferredImageDecoder.cpp (142890 => 142891)


--- trunk/Source/WebCore/platform/graphics/chromium/DeferredImageDecoder.cpp	2013-02-14 18:17:54 UTC (rev 142890)
+++ trunk/Source/WebCore/platform/graphics/chromium/DeferredImageDecoder.cpp	2013-02-14 18:49:27 UTC (rev 142891)
@@ -181,10 +181,7 @@
 
 bool DeferredImageDecoder::frameHasAlphaAtIndex(size_t index) const
 {
-    // FIXME: Synchronize this state with ImageDecodingStore when image is
-    // actually decoded. Return true here is correct in terms of rendering but
-    // may not go through some optimized rendering code path.
-    return m_actualDecoder ? m_actualDecoder->frameHasAlphaAtIndex(index) : true;
+    return m_actualDecoder ? m_actualDecoder->frameHasAlphaAtIndex(index) : m_frameGenerator->hasAlpha();
 }
 
 unsigned DeferredImageDecoder::frameBytesAtIndex(size_t index) const

Modified: trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.cpp (142890 => 142891)


--- trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.cpp	2013-02-14 18:17:54 UTC (rev 142890)
+++ trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.cpp	2013-02-14 18:49:27 UTC (rev 142891)
@@ -48,6 +48,7 @@
 ImageFrameGenerator::ImageFrameGenerator(const SkISize& fullSize, PassRefPtr<SharedBuffer> data, bool allDataReceived)
     : m_fullSize(fullSize)
     , m_decodeFailedAndEmpty(false)
+    , m_hasAlpha(true)
 {
     setData(data.get(), allDataReceived);
 }
@@ -211,9 +212,19 @@
 
     bool isComplete = frame->status() == ImageFrame::FrameComplete;
     SkBitmap fullSizeBitmap = frame->getSkBitmap();
+    {
+        MutexLocker lock(m_alphaMutex);
+        m_hasAlpha = !fullSizeBitmap.isOpaque();
+    }
     ASSERT(fullSizeBitmap.width() == m_fullSize.width() && fullSizeBitmap.height() == m_fullSize.height());
 
     return ScaledImageFragment::create(m_fullSize, fullSizeBitmap, isComplete);
 }
 
+bool ImageFrameGenerator::hasAlpha()
+{
+    MutexLocker lock(m_alphaMutex);
+    return m_hasAlpha;
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.h (142890 => 142891)


--- trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.h	2013-02-14 18:17:54 UTC (rev 142890)
+++ trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.h	2013-02-14 18:49:27 UTC (rev 142891)
@@ -67,6 +67,8 @@
 
     void setImageDecoderFactoryForTesting(PassOwnPtr<ImageDecoderFactory> factory) { m_imageDecoderFactory = factory; }
 
+    bool hasAlpha();
+
 private:
     // These methods are called while m_decodeMutex is locked.
     const ScaledImageFragment* tryToLockCompleteCache(const SkISize& scaledSize);
@@ -80,12 +82,16 @@
     SkISize m_fullSize;
     ThreadSafeDataTransport m_data;
     bool m_decodeFailedAndEmpty;
+    bool m_hasAlpha;
     DiscardablePixelRefAllocator m_allocator;
 
     OwnPtr<ImageDecoderFactory> m_imageDecoderFactory;
 
     // Prevents multiple decode operations on the same data.
     Mutex m_decodeMutex;
+
+    // Protect concurrent access to m_hasAlpha.
+    Mutex m_alphaMutex;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebKit/chromium/ChangeLog (142890 => 142891)


--- trunk/Source/WebKit/chromium/ChangeLog	2013-02-14 18:17:54 UTC (rev 142890)
+++ trunk/Source/WebKit/chromium/ChangeLog	2013-02-14 18:49:27 UTC (rev 142891)
@@ -1,3 +1,21 @@
+2013-02-14  Min Qin  <qin...@chromium.org>
+
+        Passing alpha to DeferredImageDecoder once decoding completes
+        https://bugs.webkit.org/show_bug.cgi?id=108892
+
+        Reviewed by Stephen White.
+
+        Add test to check that alpha value is passed from the decoder to ImageFrameGenerator.
+
+        * tests/ImageFrameGeneratorTest.cpp:
+        (WebCore::MockImageDecoderFactory::create):
+        (WebCore::TEST_F):
+        * tests/MockImageDecoder.h:
+        (WebCore::MockImageDecoder::MockImageDecoder):
+        (WebCore::MockImageDecoder::setFrameHasAlpha):
+        (MockImageDecoder):
+        (WebCore::MockImageDecoder::frameHasAlphaAtIndex):
+
 2013-02-08  Andrey Kosyakov  <ca...@chromium.org>
 
         Web Inspector: expose did{Begin,Cancel}Frame() and {will,did}Composite() on WebDebToolsAgent

Modified: trunk/Source/WebKit/chromium/tests/ImageFrameGeneratorTest.cpp (142890 => 142891)


--- trunk/Source/WebKit/chromium/tests/ImageFrameGeneratorTest.cpp	2013-02-14 18:17:54 UTC (rev 142890)
+++ trunk/Source/WebKit/chromium/tests/ImageFrameGeneratorTest.cpp	2013-02-14 18:49:27 UTC (rev 142891)
@@ -124,6 +124,7 @@
 {
     OwnPtr<MockImageDecoder> decoder = MockImageDecoder::create(m_test);
     decoder->setSize(fullSize().width(), fullSize().height());
+    decoder->setFrameHasAlpha(false);
     return decoder.release();
 }
 
@@ -137,6 +138,7 @@
     const ScaledImageFragment* tempImage = m_generator->decodeAndScale(fullSize());
     EXPECT_EQ(fullImage, tempImage);
     EXPECT_EQ(fullSize(), tempImage->scaledSize());
+    EXPECT_TRUE(m_generator->hasAlpha());
     ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
     EXPECT_EQ(0, m_frameBufferRequestCount);
 }
@@ -152,12 +154,14 @@
     const ScaledImageFragment* scaledImage = m_generator->decodeAndScale(scaledSize());
     EXPECT_NE(fullImage, scaledImage);
     EXPECT_EQ(scaledSize(), scaledImage->scaledSize());
+    EXPECT_TRUE(m_generator->hasAlpha());
     ImageDecodingStore::instance()->unlockCache(m_generator.get(), scaledImage);
 
     // Cache hit.
     const ScaledImageFragment* tempImage = m_generator->decodeAndScale(scaledSize());
     EXPECT_EQ(scaledImage, tempImage);
     EXPECT_EQ(scaledSize(), tempImage->scaledSize());
+    EXPECT_TRUE(m_generator->hasAlpha());
     ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
     EXPECT_EQ(0, m_frameBufferRequestCount);
 }
@@ -170,6 +174,7 @@
     const ScaledImageFragment* scaledImage = m_generator->decodeAndScale(scaledSize());
     EXPECT_EQ(1, m_frameBufferRequestCount);
     EXPECT_EQ(scaledSize(), scaledImage->scaledSize());
+    EXPECT_FALSE(m_generator->hasAlpha());
     ImageDecodingStore::instance()->unlockCache(m_generator.get(), scaledImage);
     EXPECT_EQ(1, m_decodersDestroyed);
 
@@ -177,12 +182,14 @@
     const ScaledImageFragment* fullImage = m_generator->decodeAndScale(fullSize());
     EXPECT_NE(scaledImage, fullImage);
     EXPECT_EQ(fullSize(), fullImage->scaledSize());
+    EXPECT_FALSE(m_generator->hasAlpha());
     ImageDecodingStore::instance()->unlockCache(m_generator.get(), fullImage);
 
     // Cache hit.
     const ScaledImageFragment* tempImage = m_generator->decodeAndScale(scaledSize());
     EXPECT_EQ(scaledImage, tempImage);
     EXPECT_EQ(scaledSize(), tempImage->scaledSize());
+    EXPECT_FALSE(m_generator->hasAlpha());
     ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
     EXPECT_EQ(1, m_frameBufferRequestCount);
 }

Modified: trunk/Source/WebKit/chromium/tests/MockImageDecoder.h (142890 => 142891)


--- trunk/Source/WebKit/chromium/tests/MockImageDecoder.h	2013-02-14 18:17:54 UTC (rev 142890)
+++ trunk/Source/WebKit/chromium/tests/MockImageDecoder.h	2013-02-14 18:49:27 UTC (rev 142891)
@@ -59,6 +59,8 @@
         return true;
     }
 
+    virtual void setFrameHasAlpha(bool hasAlpha) { m_frameBufferCache[0].setHasAlpha(hasAlpha); }
+
     virtual String filenameExtension() const
     {
         return "mock";
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to