https://bugs.webkit.org/show_bug.cgi?id=108892
Patch by Min Qin <qinmin@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):
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@142891
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2013-02-14 Min Qin <qinmin@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 <dgrogan@chromium.org>
IndexedDB: Add a few more histogram calls
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
ImageFrameGenerator::ImageFrameGenerator(const SkISize& fullSize, PassRefPtr<SharedBuffer> data, bool allDataReceived)
: m_fullSize(fullSize)
, m_decodeFailedAndEmpty(false)
+ , m_hasAlpha(true)
{
setData(data.get(), allDataReceived);
}
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
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);
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
+2013-02-14 Min Qin <qinmin@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 <caseq@chromium.org>
Web Inspector: expose did{Begin,Cancel}Frame() and {will,did}Composite() on WebDebToolsAgent
{
OwnPtr<MockImageDecoder> decoder = MockImageDecoder::create(m_test);
decoder->setSize(fullSize().width(), fullSize().height());
+ decoder->setFrameHasAlpha(false);
return decoder.release();
}
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);
}
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);
}
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);
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);
}
return true;
}
+ virtual void setFrameHasAlpha(bool hasAlpha) { m_frameBufferCache[0].setHasAlpha(hasAlpha); }
+
virtual String filenameExtension() const
{
return "mock";