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
- trunk/Source/WebCore/ChangeLog
- trunk/Source/WebCore/platform/graphics/chromium/DeferredImageDecoder.cpp
- trunk/Source/WebCore/platform/graphics/chromium/ImageDecodingStore.cpp
- trunk/Source/WebCore/platform/graphics/chromium/ImageDecodingStore.h
- trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.cpp
- trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.h
- trunk/Source/WebCore/platform/graphics/chromium/LazyDecodingPixelRef.cpp
- trunk/Source/WebCore/platform/graphics/chromium/LazyDecodingPixelRef.h
- trunk/Source/WebKit/chromium/ChangeLog
- trunk/Source/WebKit/chromium/tests/DeferredImageDecoderTest.cpp
- trunk/Source/WebKit/chromium/tests/MockImageDecoder.h
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
