Title: [135196] trunk/Source
Revision
135196
Author
[email protected]
Date
2012-11-19 14:20:08 -0800 (Mon, 19 Nov 2012)

Log Message

[chromium] Lazy image decoding without cache
https://bugs.webkit.org/show_bug.cgi?id=102021

Reviewed by Stephen White.

Source/WebCore:

Goal of this change is to make image decoding in ImageFrameGenerator
completely lazy without caching. Image decoding logic is then removed
from ImageDecodingStore.

These methods are removed.
- ImageDecodingStore::lockPixels
- ImageDecodingStore::unlockPixels

Instead image decoding and scaling is done in
ImageFrameGenerator::decodeAndScale().

Unit tests are updated:
DeferredImageDecoderTest::drawIntoSkPicture
DeferredImageDecoderTest::drawScaledIntoSkPicture

Also covered by layout tests:
platform/chromium/virtual/deferred

* platform/graphics/chromium/DeferredImageDecoder.cpp:
(WebCore::DeferredImageDecoder::createLazyDecodingBitmap):
* platform/graphics/chromium/ImageDecodingStore.h:
(ImageDecodingStore):
* platform/graphics/chromium/ImageFrameGenerator.cpp:
(WebCore::ImageFrameGenerator::ImageFrameGenerator):
(WebCore::ImageFrameGenerator::~ImageFrameGenerator):
(WebCore::ImageFrameGenerator::setData):
(WebCore::ImageFrameGenerator::decodeAndScale):
* platform/graphics/chromium/ImageFrameGenerator.h:
(WebCore::ImageFrameGenerator::create):
(ImageFrameGenerator):
* platform/graphics/chromium/LazyDecodingPixelRef.cpp:
(WebCore::LazyDecodingPixelRef::onLockPixels):
(WebCore::LazyDecodingPixelRef::onUnlockPixels):
* platform/graphics/chromium/LazyDecodingPixelRef.h:
(LazyDecodingPixelRef):

Source/WebKit/chromium:

Updated two test cases using real image data.

The tests demonstrates that original image decoder is not used and
image is decoded lazily with correct pixel results.

* tests/DeferredImageDecoderTest.cpp:
(WebCore):
(WebCore::DeferredImageDecoderTest::SetUp):
(WebCore::DeferredImageDecoderTest::decoderBeingDestroyed):
(DeferredImageDecoderTest):
(WebCore::TEST_F):
* tests/MockImageDecoder.h:
(MockImageDecoderClient):
(WebCore):
(WebCore::MockImageDecoder::MockImageDecoder):
(WebCore::MockImageDecoder::~MockImageDecoder):
(MockImageDecoder):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (135195 => 135196)


--- trunk/Source/WebCore/ChangeLog	2012-11-19 22:09:38 UTC (rev 135195)
+++ trunk/Source/WebCore/ChangeLog	2012-11-19 22:20:08 UTC (rev 135196)
@@ -1,3 +1,46 @@
+2012-11-19  Alpha Lam  <[email protected]>
+
+        [chromium] Lazy image decoding without cache
+        https://bugs.webkit.org/show_bug.cgi?id=102021
+
+        Reviewed by Stephen White.
+
+        Goal of this change is to make image decoding in ImageFrameGenerator
+        completely lazy without caching. Image decoding logic is then removed
+        from ImageDecodingStore.
+
+        These methods are removed.
+        - ImageDecodingStore::lockPixels
+        - ImageDecodingStore::unlockPixels
+
+        Instead image decoding and scaling is done in
+        ImageFrameGenerator::decodeAndScale().
+
+        Unit tests are updated:
+        DeferredImageDecoderTest::drawIntoSkPicture
+        DeferredImageDecoderTest::drawScaledIntoSkPicture
+
+        Also covered by layout tests:
+        platform/chromium/virtual/deferred
+
+        * platform/graphics/chromium/DeferredImageDecoder.cpp:
+        (WebCore::DeferredImageDecoder::createLazyDecodingBitmap):
+        * platform/graphics/chromium/ImageDecodingStore.h:
+        (ImageDecodingStore):
+        * platform/graphics/chromium/ImageFrameGenerator.cpp:
+        (WebCore::ImageFrameGenerator::ImageFrameGenerator):
+        (WebCore::ImageFrameGenerator::~ImageFrameGenerator):
+        (WebCore::ImageFrameGenerator::setData):
+        (WebCore::ImageFrameGenerator::decodeAndScale):
+        * platform/graphics/chromium/ImageFrameGenerator.h:
+        (WebCore::ImageFrameGenerator::create):
+        (ImageFrameGenerator):
+        * platform/graphics/chromium/LazyDecodingPixelRef.cpp:
+        (WebCore::LazyDecodingPixelRef::onLockPixels):
+        (WebCore::LazyDecodingPixelRef::onUnlockPixels):
+        * platform/graphics/chromium/LazyDecodingPixelRef.h:
+        (LazyDecodingPixelRef):
+
 2012-11-19  Abhishek Arya  <[email protected]>
 
         Crash in ApplyStyleCommand::cleanupUnstyledAppleStyleSpans.

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


--- trunk/Source/WebCore/platform/graphics/chromium/DeferredImageDecoder.cpp	2012-11-19 22:09:38 UTC (rev 135195)
+++ trunk/Source/WebCore/platform/graphics/chromium/DeferredImageDecoder.cpp	2012-11-19 22:20:08 UTC (rev 135196)
@@ -74,7 +74,6 @@
 SkBitmap DeferredImageDecoder::createResizedLazyDecodingBitmap(const SkBitmap& bitmap, const SkISize& scaledSize, const SkIRect& scaledSubset)
 {
     LazyDecodingPixelRef* pixelRef = static_cast<LazyDecodingPixelRef*>(bitmap.pixelRef());
-    ASSERT(!pixelRef->isScaled(pixelRef->frameGenerator()->fullSize()) && !pixelRef->isClipped());
 
     int rowBytes = 0;
     rowBytes = SkBitmap::ComputeRowBytes(SkBitmap::kARGB_8888_Config, scaledSize.width());
@@ -201,7 +200,9 @@
     SkBitmap bitmap;
     bitmap.setConfig(SkBitmap::kARGB_8888_Config, fullSize.width(), fullSize.height());
 
-    m_frameGenerator = ImageFrameGenerator::create(m_actualDecoder.release(), m_data.release(), m_allDataReceived);
+    m_frameGenerator = ImageFrameGenerator::create(m_data.release(), m_allDataReceived);
+    m_actualDecoder.clear();
+
     bitmap.setPixelRef(new LazyDecodingPixelRef(m_frameGenerator, fullSize, fullRect))->unref();
 
     // Use the URI to identify this as a lazily decoded SkPixelRef of type LazyDecodingPixelRef.

Modified: trunk/Source/WebCore/platform/graphics/chromium/ImageDecodingStore.cpp (135195 => 135196)


--- trunk/Source/WebCore/platform/graphics/chromium/ImageDecodingStore.cpp	2012-11-19 22:09:38 UTC (rev 135195)
+++ trunk/Source/WebCore/platform/graphics/chromium/ImageDecodingStore.cpp	2012-11-19 22:20:08 UTC (rev 135196)
@@ -26,14 +26,8 @@
 #include "config.h"
 #include "ImageDecodingStore.h"
 
-#include "ImageDecoder.h"
-#include "ImageFrameGenerator.h"
 #include "ScaledImageFragment.h"
-#include "SkRect.h"
-#include "SkSize.h"
 
-#include "skia/ext/image_operations.h"
-
 #include <wtf/MainThread.h>
 
 namespace WebCore {
@@ -75,62 +69,6 @@
     setInstanceOnMainThread(0);
 }
 
-void* ImageDecodingStore::lockPixels(PassRefPtr<ImageFrameGenerator> frameGenerator, const SkISize& scaledSize, const SkIRect& scaledSubset)
-{
-    ASSERT(calledOnValidThread());
-    ASSERT(m_lockedSkBitmap.isNull());
-
-    SkISize fullSize = frameGenerator->fullSize();
-
-    // The cache only saves the full size image at the moment.
-    ScaledImageFragment* frameCache = lookupFrameCache(frameGenerator->imageId(), fullSize);
-    SkBitmap bitmap;
-
-    if (!frameCache) {
-        // FIXME: Pixels are owned by the ImageDecoder in the generator. Find
-        // a way to transfer ownership to our cache.
-        ImageFrame* frame = frameGenerator->decoder()->frameBufferAtIndex(0);
-
-        // Saves the frame in cache if this is complete.
-        if (frame->status() == ImageFrame::FrameComplete) {
-            m_frameCache.append(ScaledImageFragment::create(frameGenerator->imageId(), fullSize, frame->getSkBitmap(), true));
-        } else if (frame->status() == ImageFrame::FrameEmpty) {
-            // FIXME: If this is a decoding error. Report this to BitmapImage.
-            return 0;
-        }
-
-        bitmap = frame->getSkBitmap();
-    } else {
-        ASSERT(frameCache->isComplete());
-        bitmap = frameCache->bitmap();
-    }
-
-    if (fullSize != scaledSize) {
-        // Image scaling is done on-the-fly and scaled image is destroyed
-        // after use.
-        // FIXME: Resize just the requested fragment.
-        m_lockedSkBitmap = skia::ImageOperations::Resize(bitmap, skia::ImageOperations::RESIZE_LANCZOS3, scaledSize.width(), scaledSize.height());
-    } else
-        m_lockedSkBitmap = bitmap;
-    m_lockedSkBitmap.lockPixels();
-    return m_lockedSkBitmap.getAddr(scaledSubset.x(), scaledSubset.y());
-}
-
-void ImageDecodingStore::unlockPixels()
-{
-    ASSERT(calledOnValidThread());
-
-    m_lockedSkBitmap.unlockPixels();
-    m_lockedSkBitmap.reset();
-}
-
-void ImageDecodingStore::frameGeneratorBeingDestroyed(ImageFrameGenerator* frameGenerator)
-{
-    ASSERT(calledOnValidThread());
-
-    deleteFrameCache(frameGenerator->imageId());
-}
-
 bool ImageDecodingStore::calledOnValidThread() const
 {
     return this == instanceOnMainThread() && isMainThread();

Modified: trunk/Source/WebCore/platform/graphics/chromium/ImageDecodingStore.h (135195 => 135196)


--- trunk/Source/WebCore/platform/graphics/chromium/ImageDecodingStore.h	2012-11-19 22:09:38 UTC (rev 135195)
+++ trunk/Source/WebCore/platform/graphics/chromium/ImageDecodingStore.h	2012-11-19 22:20:08 UTC (rev 135196)
@@ -26,15 +26,10 @@
 #ifndef ImageDecodingStore_h
 #define ImageDecodingStore_h
 
-#include "SkBitmap.h"
-#include "SkRect.h"
 #include "SkSize.h"
 
-#include <wtf/HashMap.h>
-#include <wtf/HashSet.h>
 #include <wtf/OwnPtr.h>
 #include <wtf/PassOwnPtr.h>
-#include <wtf/RefPtr.h>
 #include <wtf/Vector.h>
 
 namespace WebCore {
@@ -57,22 +52,13 @@
     static void initializeOnMainThread();
     static void shutdown();
 
-    // You may only lock one set of pixels at a time; overlapping lock calls are not allowed.
-    void* lockPixels(PassRefPtr<ImageFrameGenerator>, const SkISize& scaledSize, const SkIRect& scaledSubset);
-    void unlockPixels();
-
-    void frameGeneratorBeingDestroyed(ImageFrameGenerator*);
-
 private:
     ImageDecodingStore();
     bool calledOnValidThread() const;
-    void createFrameGenerator(PassOwnPtr<ImageDecoder>);
     ScaledImageFragment* lookupFrameCache(int imageId, const SkISize& scaledSize) const;
     void deleteFrameCache(int imageId);
 
     Vector<OwnPtr<ScaledImageFragment> > m_frameCache;
-
-    SkBitmap m_lockedSkBitmap;
 };
 
 } // namespace WebCore

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


--- trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.cpp	2012-11-19 22:09:38 UTC (rev 135195)
+++ trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.cpp	2012-11-19 22:20:08 UTC (rev 135196)
@@ -28,43 +28,47 @@
 #include "ImageFrameGenerator.h"
 
 #include "ImageDecoder.h"
-#include "ImageDecodingStore.h"
 #include "SharedBuffer.h"
 
-namespace {
+#include "skia/ext/image_operations.h"
 
-// An unique ID for an image file.
-int s_nextImageId = 0;
-
-} // namespace
-
 namespace WebCore {
 
-ImageFrameGenerator::ImageFrameGenerator(PassOwnPtr<ImageDecoder> decoder, PassRefPtr<SharedBuffer> data, bool allDataReceived)
-    : m_decoder(decoder)
+ImageFrameGenerator::ImageFrameGenerator(PassRefPtr<SharedBuffer> data, bool allDataReceived)
+    : m_allDataReceived(false)
 {
-    m_fullSize = SkISize::Make(m_decoder->size().width(), m_decoder->size().height());
-    m_imageId = s_nextImageId++;
-
     setData(data, allDataReceived);
 }
 
 ImageFrameGenerator::~ImageFrameGenerator()
 {
-    if (ImageDecodingStore::instanceOnMainThread())
-        ImageDecodingStore::instanceOnMainThread()->frameGeneratorBeingDestroyed(this);
 }
 
-ImageDecoder* ImageFrameGenerator::decoder()
+void ImageFrameGenerator::setData(PassRefPtr<SharedBuffer> data, bool allDataReceived)
 {
-    return m_decoder.get();
+    m_data = data;
+    m_allDataReceived = allDataReceived;
 }
 
-void ImageFrameGenerator::setData(PassRefPtr<SharedBuffer> data, bool allDataReceived)
+SkBitmap ImageFrameGenerator::decodeAndScale(const SkISize& scaledSize, const SkIRect& scaledSubset)
 {
-    m_data = data;
-    if (m_decoder)
-        m_decoder->setData(m_data.get(), allDataReceived);
+    OwnPtr<ImageDecoder> decoder(adoptPtr(ImageDecoder::create(*m_data.get(), ImageSource::AlphaPremultiplied, ImageSource::GammaAndColorProfileApplied)));
+    if (!decoder)
+        return SkBitmap();
+
+    decoder->setData(m_data.get(), m_allDataReceived);
+    ImageFrame* frame = decoder->frameBufferAtIndex(0);
+    if (!frame)
+        return SkBitmap();
+
+    SkBitmap bitmap = frame->getSkBitmap();
+    SkISize bitmapSize = SkISize::Make(bitmap.width(), bitmap.height());
+    if (bitmapSize != scaledSize)
+        bitmap = skia::ImageOperations::Resize(bitmap, skia::ImageOperations::RESIZE_LANCZOS3, scaledSize.width(), scaledSize.height());
+
+    SkBitmap bitmapSubset;
+    bitmap.extractSubset(&bitmapSubset, scaledSubset);
+    return bitmapSubset;
 }
 
 } // namespace WebCore

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


--- trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.h	2012-11-19 22:09:38 UTC (rev 135195)
+++ trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.h	2012-11-19 22:20:08 UTC (rev 135196)
@@ -26,9 +26,8 @@
 #ifndef ImageFrameGenerator_h
 #define ImageFrameGenerator_h
 
-#include "SkTypes.h"
+#include "SkBitmap.h"
 #include "SkSize.h"
-#include <wtf/OwnPtr.h>
 #include <wtf/PassOwnPtr.h>
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
@@ -36,31 +35,25 @@
 
 namespace WebCore {
 
-class ImageDecoder;
 class SharedBuffer;
 
 class ImageFrameGenerator : public RefCounted<ImageFrameGenerator> {
 public:
-    static PassRefPtr<ImageFrameGenerator> create(PassOwnPtr<ImageDecoder> decoder, PassRefPtr<SharedBuffer> data, bool allDataReceived)
+    static PassRefPtr<ImageFrameGenerator> create(PassRefPtr<SharedBuffer> data, bool allDataReceived)
     {
-        return adoptRef(new ImageFrameGenerator(decoder, data, allDataReceived));
+        return adoptRef(new ImageFrameGenerator(data, allDataReceived));
     }
 
-    ImageFrameGenerator(PassOwnPtr<ImageDecoder>, PassRefPtr<SharedBuffer>, bool allDataReceived);
+    ImageFrameGenerator(PassRefPtr<SharedBuffer>, bool allDataReceived);
     ~ImageFrameGenerator();
 
-    // Creates the image decoder if needed.
-    ImageDecoder* decoder();
+    SkBitmap decodeAndScale(const SkISize& scaledSize, const SkIRect& scaledSubset);
+
     void setData(PassRefPtr<SharedBuffer>, bool allDataReceived);
 
-    const SkISize& fullSize() const { return m_fullSize; }
-    int imageId() const { return m_imageId; }
-
 private:
-    OwnPtr<ImageDecoder> m_decoder;
     RefPtr<SharedBuffer> m_data;
-    SkISize m_fullSize;
-    int m_imageId;
+    bool m_allDataReceived;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/graphics/chromium/LazyDecodingPixelRef.cpp (135195 => 135196)


--- trunk/Source/WebCore/platform/graphics/chromium/LazyDecodingPixelRef.cpp	2012-11-19 22:09:38 UTC (rev 135195)
+++ trunk/Source/WebCore/platform/graphics/chromium/LazyDecodingPixelRef.cpp	2012-11-19 22:20:08 UTC (rev 135196)
@@ -58,13 +58,19 @@
 void* LazyDecodingPixelRef::onLockPixels(SkColorTable**)
 {
     ASSERT(isMainThread());
-    return ImageDecodingStore::instanceOnMainThread()->lockPixels(m_frameGenerator, m_scaledSize, m_scaledSubset);
+    ASSERT(m_lockedBitmap.isNull());
+    m_lockedBitmap = m_frameGenerator->decodeAndScale(m_scaledSize, m_scaledSubset);
+    if (m_lockedBitmap.isNull())
+        return 0;
+    m_lockedBitmap.lockPixels();
+    return m_lockedBitmap.getAddr(0, 0);
 }
 
 void LazyDecodingPixelRef::onUnlockPixels()
 {
     ASSERT(isMainThread());
-    ImageDecodingStore::instanceOnMainThread()->unlockPixels();
+    m_lockedBitmap.unlockPixels();
+    m_lockedBitmap.reset();
 }
 
 bool LazyDecodingPixelRef::onLockPixelsAreWritable() const

Modified: trunk/Source/WebCore/platform/graphics/chromium/LazyDecodingPixelRef.h (135195 => 135196)


--- trunk/Source/WebCore/platform/graphics/chromium/LazyDecodingPixelRef.h	2012-11-19 22:09:38 UTC (rev 135195)
+++ trunk/Source/WebCore/platform/graphics/chromium/LazyDecodingPixelRef.h	2012-11-19 22:20:08 UTC (rev 135196)
@@ -58,6 +58,8 @@
     RefPtr<ImageFrameGenerator> m_frameGenerator;
     SkISize m_scaledSize;
     SkIRect m_scaledSubset;
+
+    SkBitmap m_lockedBitmap;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebKit/chromium/ChangeLog (135195 => 135196)


--- trunk/Source/WebKit/chromium/ChangeLog	2012-11-19 22:09:38 UTC (rev 135195)
+++ trunk/Source/WebKit/chromium/ChangeLog	2012-11-19 22:20:08 UTC (rev 135196)
@@ -1,3 +1,28 @@
+2012-11-19  Alpha Lam  <[email protected]>
+
+        [chromium] Lazy image decoding without cache
+        https://bugs.webkit.org/show_bug.cgi?id=102021
+
+        Reviewed by Stephen White.
+
+        Updated two test cases using real image data.
+
+        The tests demonstrates that original image decoder is not used and
+        image is decoded lazily with correct pixel results.
+
+        * tests/DeferredImageDecoderTest.cpp:
+        (WebCore):
+        (WebCore::DeferredImageDecoderTest::SetUp):
+        (WebCore::DeferredImageDecoderTest::decoderBeingDestroyed):
+        (DeferredImageDecoderTest):
+        (WebCore::TEST_F):
+        * tests/MockImageDecoder.h:
+        (MockImageDecoderClient):
+        (WebCore):
+        (WebCore::MockImageDecoder::MockImageDecoder):
+        (WebCore::MockImageDecoder::~MockImageDecoder):
+        (MockImageDecoder):
+
 2012-11-19  Sheriff Bot  <[email protected]>
 
         Unreviewed, rolling out r135180.

Modified: trunk/Source/WebKit/chromium/tests/DeferredImageDecoderTest.cpp (135195 => 135196)


--- trunk/Source/WebKit/chromium/tests/DeferredImageDecoderTest.cpp	2012-11-19 22:09:38 UTC (rev 135195)
+++ trunk/Source/WebKit/chromium/tests/DeferredImageDecoderTest.cpp	2012-11-19 22:20:08 UTC (rev 135196)
@@ -30,30 +30,51 @@
 #include "ImageDecodingStore.h"
 #include "MockImageDecoder.h"
 #include "NativeImageSkia.h"
+#include "SharedBuffer.h"
 #include "SkCanvas.h"
 #include "SkDevice.h"
 #include "SkPicture.h"
 #include <gtest/gtest.h>
+#include <wtf/PassRefPtr.h>
+#include <wtf/RefPtr.h>
 
 using namespace WebCore;
 
 namespace {
 
+// Raw data for a PNG file with 1x1 white pixels.
+const char whitePNG[] = {
+    0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00,
+    0x00, 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01,
+    0x00, 0x00, 0x00, 0x01, 0x08, 0x02, 0x00, 0x00, 0x00, 0x90,
+    0x77, 0x53, 0xde, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52, 0x47,
+    0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x09,
+    0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00,
+    0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00,
+    0x0c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0xf8, 0xff,
+    0xff, 0x3f, 0x00, 0x05, 0xfe, 0x02, 0xfe, 0xdc, 0xcc, 0x59,
+    0xe7, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
+    0x42, 0x60, 0x82,
+};
+
 static SkCanvas* createRasterCanvas(int width, int height)
 {
     SkAutoTUnref<SkDevice> device(new SkDevice(SkBitmap::kARGB_8888_Config, width, height));
     return new SkCanvas(device);
 }
 
-class DeferredImageDecoderTest : public ::testing::Test {
+class DeferredImageDecoderTest : public ::testing::Test, public MockImageDecoderClient {
 public:
     virtual void SetUp()
     {
         ImageDecodingStore::initializeOnMainThread();
-        m_actualDecoder = new MockImageDecoder();
-        m_actualDecoder->setSize(600, 613);
+        m_data = SharedBuffer::create(whitePNG, sizeof(whitePNG));
+        m_actualDecoder = new MockImageDecoder(this);
+        m_actualDecoder->setSize(1, 1);
         m_lazyDecoder = DeferredImageDecoder::createForTesting(adoptPtr(m_actualDecoder));
+        m_lazyDecoder->setData(m_data.get(), true);
         m_canvas.reset(createRasterCanvas(100, 100));
+        m_frameBufferRequestCount = 0;
     }
 
     virtual void TearDown()
@@ -61,29 +82,43 @@
         ImageDecodingStore::shutdown();
     }
 
+    virtual void decoderBeingDestroyed()
+    {
+        m_frameBufferRequestCount = m_actualDecoder->frameBufferRequestCount();
+        m_actualDecoder = 0;
+    }
+
 protected:
     // Don't own this but saves the pointer to query states.
     MockImageDecoder* m_actualDecoder;
     OwnPtr<DeferredImageDecoder> m_lazyDecoder;
     SkPicture m_picture;
     SkAutoTUnref<SkCanvas> m_canvas;
+    int m_frameBufferRequestCount;
+    RefPtr<SharedBuffer> m_data;
 };
 
 TEST_F(DeferredImageDecoderTest, drawIntoSkPicture)
 {
     OwnPtr<NativeImageSkia> image(adoptPtr(m_lazyDecoder->frameBufferAtIndex(0)->asNewNativeImage()));
-    EXPECT_EQ(m_actualDecoder->size().width(), image->bitmap().width());
-    EXPECT_EQ(m_actualDecoder->size().height(), image->bitmap().height());
+    EXPECT_EQ(1, image->bitmap().width());
+    EXPECT_EQ(1, image->bitmap().height());
     EXPECT_FALSE(image->bitmap().isNull());
     EXPECT_TRUE(image->bitmap().isImmutable());
 
     SkCanvas* tempCanvas = m_picture.beginRecording(100, 100);
     tempCanvas->drawBitmap(image->bitmap(), 0, 0);
     m_picture.endRecording();
-    EXPECT_EQ(0, m_actualDecoder->frameBufferRequestCount());
+    EXPECT_EQ(0, m_frameBufferRequestCount);
 
     m_canvas->drawPicture(m_picture);
-    EXPECT_EQ(1, m_actualDecoder->frameBufferRequestCount());
+    EXPECT_EQ(0, m_frameBufferRequestCount);
+
+    SkBitmap canvasBitmap;
+    canvasBitmap.setConfig(SkBitmap::kARGB_8888_Config, 100, 100);
+    ASSERT_TRUE(m_canvas->readPixels(&canvasBitmap, 0, 0));
+    SkAutoLockPixels autoLock(canvasBitmap);
+    EXPECT_EQ(SkColorSetARGB(255, 255, 255, 255), canvasBitmap.getColor(0, 0));
 }
 
 TEST_F(DeferredImageDecoderTest, drawScaledIntoSkPicture)
@@ -94,15 +129,22 @@
     EXPECT_TRUE(scaledBitmap.isImmutable());
     EXPECT_EQ(50, scaledBitmap.width());
     EXPECT_EQ(51, scaledBitmap.height());
-    EXPECT_EQ(0, m_actualDecoder->frameBufferRequestCount());
+    EXPECT_EQ(0, m_frameBufferRequestCount);
 
     SkCanvas* tempCanvas = m_picture.beginRecording(100, 100);
     tempCanvas->drawBitmap(scaledBitmap, 0, 0);
     m_picture.endRecording();
-    EXPECT_EQ(0, m_actualDecoder->frameBufferRequestCount());
+    EXPECT_EQ(0, m_frameBufferRequestCount);
 
     m_canvas->drawPicture(m_picture);
-    EXPECT_EQ(1, m_actualDecoder->frameBufferRequestCount());
+    EXPECT_EQ(0, m_frameBufferRequestCount);
+
+    SkBitmap canvasBitmap;
+    canvasBitmap.setConfig(SkBitmap::kARGB_8888_Config, 100, 100);
+    ASSERT_TRUE(m_canvas->readPixels(&canvasBitmap, 0, 0));
+    SkAutoLockPixels autoLock(canvasBitmap);
+    EXPECT_EQ(SkColorSetARGB(255, 255, 255, 255), canvasBitmap.getColor(0, 0));
+    EXPECT_EQ(SkColorSetARGB(255, 255, 255, 255), canvasBitmap.getColor(49, 50));
 }
 
 } // namespace

Modified: trunk/Source/WebKit/chromium/tests/MockImageDecoder.h (135195 => 135196)


--- trunk/Source/WebKit/chromium/tests/MockImageDecoder.h	2012-11-19 22:09:38 UTC (rev 135195)
+++ trunk/Source/WebKit/chromium/tests/MockImageDecoder.h	2012-11-19 22:20:08 UTC (rev 135196)
@@ -29,13 +29,24 @@
 
 namespace WebCore {
 
+class MockImageDecoderClient {
+public:
+    virtual void decoderBeingDestroyed() = 0;
+};
+
 class MockImageDecoder : public ImageDecoder {
 public:
-    MockImageDecoder()
+    MockImageDecoder(MockImageDecoderClient* client)
         : ImageDecoder(ImageSource::AlphaPremultiplied, ImageSource::GammaAndColorProfileApplied)
         , m_frameBufferRequestCount(0)
+        , m_client(client)
     { }
 
+    ~MockImageDecoder()
+    {
+        m_client->decoderBeingDestroyed();
+    }
+
     virtual String filenameExtension() const
     {
         return "mock";
@@ -54,6 +65,7 @@
 
 private:
     int m_frameBufferRequestCount;
+    MockImageDecoderClient* m_client;
 };
 
 } // namespace WebCore
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to