Changeset 142891 in webkit


Ignore:
Timestamp:
Feb 14, 2013, 10:49:27 AM (12 years ago)
Author:
commit-queue@webkit.org
Message:

Passing alpha to DeferredImageDecoder once decoding completes
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):

Location:
trunk/Source
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r142890 r142891  
     12013-02-14  Min Qin  <qinmin@chromium.org>
     2
     3        Passing alpha to DeferredImageDecoder once decoding completes
     4        https://bugs.webkit.org/show_bug.cgi?id=108892
     5
     6        Reviewed by Stephen White.
     7
     8        We should pass hasAlpha value back to the DeferredImageDecoder once decoding is completed
     9        Added unit tests in ImageFrameGeneratorTest.
     10
     11        * platform/graphics/chromium/DeferredImageDecoder.cpp:
     12        (WebCore::DeferredImageDecoder::frameHasAlphaAtIndex):
     13        * platform/graphics/chromium/ImageFrameGenerator.cpp:
     14        (WebCore::ImageFrameGenerator::tryToScale):
     15        (WebCore::ImageFrameGenerator::decode):
     16        * platform/graphics/chromium/LazyDecodingPixelRef.cpp:
     17        (WebCore::LazyDecodingPixelRef::LazyDecodingPixelRef):
     18        (WebCore::LazyDecodingPixelRef::onUnlockPixels):
     19        * platform/graphics/chromium/LazyDecodingPixelRef.h:
     20        (WebCore::LazyDecodingPixelRef::hasAlpha):
     21        (LazyDecodingPixelRef):
     22        * platform/graphics/chromium/ScaledImageFragment.cpp:
     23        (WebCore::ScaledImageFragment::ScaledImageFragment):
     24        * platform/graphics/chromium/ScaledImageFragment.h:
     25        (WebCore::ScaledImageFragment::create):
     26        (ScaledImageFragment):
     27        (WebCore::ScaledImageFragment::hasAlpha):
     28
    1292013-02-14  David Grogan  <dgrogan@chromium.org>
    230
  • trunk/Source/WebCore/platform/graphics/chromium/DeferredImageDecoder.cpp

    r141135 r142891  
    182182bool DeferredImageDecoder::frameHasAlphaAtIndex(size_t index) const
    183183{
    184     // FIXME: Synchronize this state with ImageDecodingStore when image is
    185     // actually decoded. Return true here is correct in terms of rendering but
    186     // may not go through some optimized rendering code path.
    187     return m_actualDecoder ? m_actualDecoder->frameHasAlphaAtIndex(index) : true;
     184    return m_actualDecoder ? m_actualDecoder->frameHasAlphaAtIndex(index) : m_frameGenerator->hasAlpha();
    188185}
    189186
  • trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.cpp

    r141020 r142891  
    4949    : m_fullSize(fullSize)
    5050    , m_decodeFailedAndEmpty(false)
     51    , m_hasAlpha(true)
    5152{
    5253    setData(data.get(), allDataReceived);
     
    212213    bool isComplete = frame->status() == ImageFrame::FrameComplete;
    213214    SkBitmap fullSizeBitmap = frame->getSkBitmap();
     215    {
     216        MutexLocker lock(m_alphaMutex);
     217        m_hasAlpha = !fullSizeBitmap.isOpaque();
     218    }
    214219    ASSERT(fullSizeBitmap.width() == m_fullSize.width() && fullSizeBitmap.height() == m_fullSize.height());
    215220
     
    217222}
    218223
     224bool ImageFrameGenerator::hasAlpha()
     225{
     226    MutexLocker lock(m_alphaMutex);
     227    return m_hasAlpha;
     228}
     229
    219230} // namespace WebCore
  • trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.h

    r141020 r142891  
    6868    void setImageDecoderFactoryForTesting(PassOwnPtr<ImageDecoderFactory> factory) { m_imageDecoderFactory = factory; }
    6969
     70    bool hasAlpha();
     71
    7072private:
    7173    // These methods are called while m_decodeMutex is locked.
     
    8183    ThreadSafeDataTransport m_data;
    8284    bool m_decodeFailedAndEmpty;
     85    bool m_hasAlpha;
    8386    DiscardablePixelRefAllocator m_allocator;
    8487
     
    8790    // Prevents multiple decode operations on the same data.
    8891    Mutex m_decodeMutex;
     92
     93    // Protect concurrent access to m_hasAlpha.
     94    Mutex m_alphaMutex;
    8995};
    9096
  • trunk/Source/WebKit/chromium/ChangeLog

    r142879 r142891  
     12013-02-14  Min Qin  <qinmin@chromium.org>
     2
     3        Passing alpha to DeferredImageDecoder once decoding completes
     4        https://bugs.webkit.org/show_bug.cgi?id=108892
     5
     6        Reviewed by Stephen White.
     7
     8        Add test to check that alpha value is passed from the decoder to ImageFrameGenerator.
     9
     10        * tests/ImageFrameGeneratorTest.cpp:
     11        (WebCore::MockImageDecoderFactory::create):
     12        (WebCore::TEST_F):
     13        * tests/MockImageDecoder.h:
     14        (WebCore::MockImageDecoder::MockImageDecoder):
     15        (WebCore::MockImageDecoder::setFrameHasAlpha):
     16        (MockImageDecoder):
     17        (WebCore::MockImageDecoder::frameHasAlphaAtIndex):
     18
    1192013-02-08  Andrey Kosyakov  <caseq@chromium.org>
    220
  • trunk/Source/WebKit/chromium/tests/ImageFrameGeneratorTest.cpp

    r137508 r142891  
    125125    OwnPtr<MockImageDecoder> decoder = MockImageDecoder::create(m_test);
    126126    decoder->setSize(fullSize().width(), fullSize().height());
     127    decoder->setFrameHasAlpha(false);
    127128    return decoder.release();
    128129}
     
    138139    EXPECT_EQ(fullImage, tempImage);
    139140    EXPECT_EQ(fullSize(), tempImage->scaledSize());
     141    EXPECT_TRUE(m_generator->hasAlpha());
    140142    ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
    141143    EXPECT_EQ(0, m_frameBufferRequestCount);
     
    153155    EXPECT_NE(fullImage, scaledImage);
    154156    EXPECT_EQ(scaledSize(), scaledImage->scaledSize());
     157    EXPECT_TRUE(m_generator->hasAlpha());
    155158    ImageDecodingStore::instance()->unlockCache(m_generator.get(), scaledImage);
    156159
     
    159162    EXPECT_EQ(scaledImage, tempImage);
    160163    EXPECT_EQ(scaledSize(), tempImage->scaledSize());
     164    EXPECT_TRUE(m_generator->hasAlpha());
    161165    ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
    162166    EXPECT_EQ(0, m_frameBufferRequestCount);
     
    171175    EXPECT_EQ(1, m_frameBufferRequestCount);
    172176    EXPECT_EQ(scaledSize(), scaledImage->scaledSize());
     177    EXPECT_FALSE(m_generator->hasAlpha());
    173178    ImageDecodingStore::instance()->unlockCache(m_generator.get(), scaledImage);
    174179    EXPECT_EQ(1, m_decodersDestroyed);
     
    178183    EXPECT_NE(scaledImage, fullImage);
    179184    EXPECT_EQ(fullSize(), fullImage->scaledSize());
     185    EXPECT_FALSE(m_generator->hasAlpha());
    180186    ImageDecodingStore::instance()->unlockCache(m_generator.get(), fullImage);
    181187
     
    184190    EXPECT_EQ(scaledImage, tempImage);
    185191    EXPECT_EQ(scaledSize(), tempImage->scaledSize());
     192    EXPECT_FALSE(m_generator->hasAlpha());
    186193    ImageDecodingStore::instance()->unlockCache(m_generator.get(), tempImage);
    187194    EXPECT_EQ(1, m_frameBufferRequestCount);
  • trunk/Source/WebKit/chromium/tests/MockImageDecoder.h

    r137008 r142891  
    6060    }
    6161
     62    virtual void setFrameHasAlpha(bool hasAlpha) { m_frameBufferCache[0].setHasAlpha(hasAlpha); }
     63
    6264    virtual String filenameExtension() const
    6365    {
Note: See TracChangeset for help on using the changeset viewer.