Diff
Modified: trunk/Source/WebCore/ChangeLog (134821 => 134822)
--- trunk/Source/WebCore/ChangeLog 2012-11-15 20:57:27 UTC (rev 134821)
+++ trunk/Source/WebCore/ChangeLog 2012-11-15 20:57:32 UTC (rev 134822)
@@ -1,3 +1,46 @@
+2012-11-15 Alpha Lam <[email protected]>
+
+ [chromium] Refactoring to move logic of creating lazy decoded SkBitmap into DeferredImageDecoder
+ https://bugs.webkit.org/show_bug.cgi?id=102019
+
+ Reviewed by Stephen White.
+
+ Goal of this change is to keep ImageDecodingStore clean and only do
+ image caching. Logic of creating lazily decoded SkBitmaps is moved into
+ DeferredImageDecoder.
+
+ In particular these two methods are moved:
+ - ImageDecodingStore::createLazyDecodedSkBitmap
+ - ImageDecodingStore::resizeLazyDecodedSkBitmap
+
+ No new tests. There is no new code (really). It is just moved from
+ ImageDecodingStore to DeferredImageDecoder.
+
+ No change in behavior. Code is tested with:
+ Unit tests: webkit_unit_tests
+ Layout test: platform/chromium/virtual/deferred
+
+ * platform/graphics/chromium/DeferredImageDecoder.cpp:
+ (WebCore::DeferredImageDecoder::isLazyDecoded):
+ (WebCore):
+ (WebCore::DeferredImageDecoder::resizeLazyDecodedSkBitmap):
+ (WebCore::DeferredImageDecoder::frameBufferAtIndex):
+ (WebCore::DeferredImageDecoder::setData):
+ (WebCore::DeferredImageDecoder::createLazyDecodedSkBitmap):
+ * platform/graphics/chromium/DeferredImageDecoder.h:
+ (WebCore):
+ (DeferredImageDecoder):
+ * platform/graphics/chromium/ImageDecodingStore.cpp:
+ * platform/graphics/chromium/ImageDecodingStore.h:
+ (ImageDecodingStore):
+ * platform/graphics/chromium/ImageFrameGenerator.cpp:
+ (WebCore::ImageFrameGenerator::ImageFrameGenerator):
+ * platform/graphics/chromium/ImageFrameGenerator.h:
+ (WebCore::ImageFrameGenerator::create):
+ (ImageFrameGenerator):
+ * platform/graphics/skia/NativeImageSkia.cpp:
+ (WebCore::NativeImageSkia::resizedBitmap):
+
2012-11-15 Roger Fong <[email protected]>
Unreviewed. Build fix for Windows after r134767.
Modified: trunk/Source/WebCore/platform/graphics/chromium/DeferredImageDecoder.cpp (134821 => 134822)
--- trunk/Source/WebCore/platform/graphics/chromium/DeferredImageDecoder.cpp 2012-11-15 20:57:27 UTC (rev 134821)
+++ trunk/Source/WebCore/platform/graphics/chromium/DeferredImageDecoder.cpp 2012-11-15 20:57:32 UTC (rev 134822)
@@ -27,10 +27,19 @@
#include "DeferredImageDecoder.h"
#include "ImageDecodingStore.h"
+#include "ImageFrameGenerator.h"
+#include "LazyDecodingPixelRef.h"
#include <wtf/PassOwnPtr.h>
namespace WebCore {
+namespace {
+
+// URI label for a lazily decoded SkPixelRef.
+const char labelLazyDecoded[] = "lazy";
+
+} // namespace
+
DeferredImageDecoder::DeferredImageDecoder(ImageDecoder* actualDecoder)
: m_allDataReceived(false)
, m_actualDecoder(adoptPtr(actualDecoder))
@@ -55,6 +64,30 @@
return adoptPtr(new DeferredImageDecoder(decoder.leakPtr()));
}
+bool DeferredImageDecoder::isLazyDecoded(const SkBitmap& bitmap)
+{
+ return bitmap.pixelRef()
+ && bitmap.pixelRef()->getURI()
+ && !memcmp(bitmap.pixelRef()->getURI(), labelLazyDecoded, sizeof(labelLazyDecoded));
+}
+
+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());
+
+ SkBitmap resizedBitmap;
+ resizedBitmap.setConfig(SkBitmap::kARGB_8888_Config, scaledSubset.width(), scaledSubset.height(), rowBytes);
+ resizedBitmap.setPixelRef(new LazyDecodingPixelRef(pixelRef->frameGenerator(), scaledSize, scaledSubset))->unref();
+
+ // See comments in createLazyDecodingBitmap().
+ resizedBitmap.setImmutable();
+ return resizedBitmap;
+}
+
String DeferredImageDecoder::filenameExtension() const
{
return m_actualDecoder ? m_actualDecoder->filenameExtension() : m_filenameExtension;
@@ -75,9 +108,8 @@
m_filenameExtension = m_actualDecoder->filenameExtension();
m_orientation = m_actualDecoder->orientation();
- SkBitmap lazyDecodedSkBitmap = ImageDecodingStore::instanceOnMainThread()->createLazyDecodedSkBitmap(m_actualDecoder.release());
+ SkBitmap lazyDecodedSkBitmap = createLazyDecodingBitmap();
m_lazyDecodedFrame.setSkBitmap(lazyDecodedSkBitmap);
- ImageDecodingStore::instanceOnMainThread()->setData(m_lazyDecodedFrame.getSkBitmap(), m_data.release(), m_allDataReceived);
// Don't mark the frame as completely decoded until the underlying
// decoder has really decoded it. Until then, our data and metadata may
@@ -99,7 +131,7 @@
m_actualDecoder->setData(data, allDataReceived);
} else {
ASSERT(!m_data);
- ImageDecodingStore::instanceOnMainThread()->setData(m_lazyDecodedFrame.getSkBitmap(), data, allDataReceived);
+ m_frameGenerator->setData(data, allDataReceived);
}
}
@@ -158,4 +190,33 @@
return m_actualDecoder ? m_actualDecoder->orientation() : m_orientation;
}
+SkBitmap DeferredImageDecoder::createLazyDecodingBitmap()
+{
+ SkISize fullSize = SkISize::Make(m_actualDecoder->size().width(), m_actualDecoder->size().height());
+ ASSERT(!fullSize.isEmpty());
+
+ SkIRect fullRect = SkIRect::MakeSize(fullSize);
+
+ // Creates a lazily decoded SkPixelRef that references the entire image without scaling.
+ SkBitmap bitmap;
+ bitmap.setConfig(SkBitmap::kARGB_8888_Config, fullSize.width(), fullSize.height());
+
+ m_frameGenerator = ImageFrameGenerator::create(m_actualDecoder.release(), m_data.release(), m_allDataReceived);
+ bitmap.setPixelRef(new LazyDecodingPixelRef(m_frameGenerator, fullSize, fullRect))->unref();
+
+ // Use the URI to identify this as a lazily decoded SkPixelRef of type LazyDecodingPixelRef.
+ // FIXME: It would be more useful to give the actual image URI.
+ bitmap.pixelRef()->setURI(labelLazyDecoded);
+
+ // Inform the bitmap that we will never change the pixels. This is a performance hint
+ // subsystems that may try to cache this bitmap (e.g. pictures, pipes, gpu, pdf, etc.)
+ bitmap.setImmutable();
+
+ // FIXME: Setting bitmap.setIsOpaque() is big performance gain if possible. We can
+ // do so safely if the image is fully loaded and it is a JPEG image, or if the image was
+ // decoded before.
+
+ return bitmap;
+}
+
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/graphics/chromium/DeferredImageDecoder.h (134821 => 134822)
--- trunk/Source/WebCore/platform/graphics/chromium/DeferredImageDecoder.h 2012-11-15 20:57:27 UTC (rev 134821)
+++ trunk/Source/WebCore/platform/graphics/chromium/DeferredImageDecoder.h 2012-11-15 20:57:32 UTC (rev 134822)
@@ -33,6 +33,7 @@
namespace WebCore {
+class ImageFrameGenerator;
class SharedBuffer;
class DeferredImageDecoder {
@@ -42,6 +43,10 @@
static PassOwnPtr<DeferredImageDecoder> createForTesting(PassOwnPtr<ImageDecoder>);
+ static bool isLazyDecoded(const SkBitmap&);
+
+ static SkBitmap createResizedLazyDecodingBitmap(const SkBitmap&, const SkISize& scaledSize, const SkIRect& scaledSubset);
+
String filenameExtension() const;
ImageFrame* frameBufferAtIndex(size_t index);
@@ -60,6 +65,8 @@
private:
explicit DeferredImageDecoder(ImageDecoder* actualDecoder);
+ SkBitmap createLazyDecodingBitmap();
+ void setData(PassRefPtr<SharedBuffer>, bool allDataReceived);
RefPtr<SharedBuffer> m_data;
bool m_allDataReceived;
@@ -70,6 +77,7 @@
ImageOrientation m_orientation;
ImageFrame m_lazyDecodedFrame;
+ RefPtr<ImageFrameGenerator> m_frameGenerator;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/platform/graphics/chromium/ImageDecodingStore.cpp (134821 => 134822)
--- trunk/Source/WebCore/platform/graphics/chromium/ImageDecodingStore.cpp 2012-11-15 20:57:27 UTC (rev 134821)
+++ trunk/Source/WebCore/platform/graphics/chromium/ImageDecodingStore.cpp 2012-11-15 20:57:32 UTC (rev 134822)
@@ -28,7 +28,6 @@
#include "ImageDecoder.h"
#include "ImageFrameGenerator.h"
-#include "LazyDecodingPixelRef.h"
#include "ScaledImageFragment.h"
#include "SkRect.h"
#include "SkSize.h"
@@ -36,15 +35,11 @@
#include "skia/ext/image_operations.h"
#include <wtf/MainThread.h>
-#include <wtf/PassOwnPtr.h>
namespace WebCore {
namespace {
-// URI label for a lazily decoded SkPixelRef.
-const char labelLazyDecoded[] = "lazy";
-
ImageDecodingStore* s_instanceOnMainThread = 0;
static void setInstanceOnMainThread(ImageDecodingStore* imageDecodingStore)
@@ -80,68 +75,6 @@
setInstanceOnMainThread(0);
}
-bool ImageDecodingStore::isLazyDecoded(const SkBitmap& bitmap)
-{
- return bitmap.pixelRef()
- && bitmap.pixelRef()->getURI()
- && !memcmp(bitmap.pixelRef()->getURI(), labelLazyDecoded, sizeof(labelLazyDecoded));
-}
-
-SkBitmap ImageDecodingStore::createLazyDecodedSkBitmap(PassOwnPtr<ImageDecoder> decoder)
-{
- ASSERT(calledOnValidThread());
-
- SkISize fullSize = SkISize::Make(decoder->size().width(), decoder->size().height());
- ASSERT(!fullSize.isEmpty());
-
- SkIRect fullRect = SkIRect::MakeSize(fullSize);
-
- // Creates a lazily decoded SkPixelRef that references the entire image without scaling.
- SkBitmap bitmap;
- bitmap.setConfig(SkBitmap::kARGB_8888_Config, fullSize.width(), fullSize.height());
- bitmap.setPixelRef(new LazyDecodingPixelRef(ImageFrameGenerator::create(decoder), fullSize, fullRect))->unref();
-
- // Use URI to identify this is a lazily decoded SkPixelRef of type LazyDecodingPixelRef.
- // FIXME: Give the actual URI is more useful.
- bitmap.pixelRef()->setURI(labelLazyDecoded);
-
- // Inform the bitmap that we will never change the pixels. This is a performance hint
- // subsystems that may try to cache this bitmap (e.g. pictures, pipes, gpu, pdf, etc.)
- bitmap.setImmutable();
-
- // FIXME: Setting bitmap.setIsOpaque() is big performance gain if possible. We can
- // do so safely if the image is fully loaded and it is a JPEG image, or image was
- // decoded before.
-
- return bitmap;
-}
-
-SkBitmap ImageDecodingStore::resizeLazyDecodedSkBitmap(const SkBitmap& bitmap, const SkISize& scaledSize, const SkIRect& scaledSubset)
-{
- ASSERT(calledOnValidThread());
-
- 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());
-
- SkBitmap resizedBitmap;
- resizedBitmap.setConfig(SkBitmap::kARGB_8888_Config, scaledSubset.width(), scaledSubset.height(), rowBytes);
- resizedBitmap.setPixelRef(new LazyDecodingPixelRef(pixelRef->frameGenerator(), scaledSize, scaledSubset))->unref();
-
- // See comments in createLazyDecodedSkBitmap().
- resizedBitmap.setImmutable();
- return resizedBitmap;
-}
-
-void ImageDecodingStore::setData(const SkBitmap& bitmap, PassRefPtr<SharedBuffer> data, bool allDataReceived)
-{
- ASSERT(calledOnValidThread());
- if (isLazyDecoded(bitmap))
- static_cast<LazyDecodingPixelRef*>(bitmap.pixelRef())->frameGenerator()->setData(data, allDataReceived);
-}
-
void* ImageDecodingStore::lockPixels(PassRefPtr<ImageFrameGenerator> frameGenerator, const SkISize& scaledSize, const SkIRect& scaledSubset)
{
ASSERT(calledOnValidThread());
Modified: trunk/Source/WebCore/platform/graphics/chromium/ImageDecodingStore.h (134821 => 134822)
--- trunk/Source/WebCore/platform/graphics/chromium/ImageDecodingStore.h 2012-11-15 20:57:27 UTC (rev 134821)
+++ trunk/Source/WebCore/platform/graphics/chromium/ImageDecodingStore.h 2012-11-15 20:57:32 UTC (rev 134822)
@@ -56,13 +56,7 @@
static ImageDecodingStore* instanceOnMainThread();
static void initializeOnMainThread();
static void shutdown();
- static bool isLazyDecoded(const SkBitmap&);
- SkBitmap createLazyDecodedSkBitmap(PassOwnPtr<ImageDecoder>);
- SkBitmap resizeLazyDecodedSkBitmap(const SkBitmap&, const SkISize& scaledSize, const SkIRect& scaledSubset);
-
- void setData(const SkBitmap&, PassRefPtr<SharedBuffer>, bool allDataReceived);
-
// 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();
Modified: trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.cpp (134821 => 134822)
--- trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.cpp 2012-11-15 20:57:27 UTC (rev 134821)
+++ trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.cpp 2012-11-15 20:57:32 UTC (rev 134822)
@@ -40,11 +40,13 @@
namespace WebCore {
-ImageFrameGenerator::ImageFrameGenerator(PassOwnPtr<ImageDecoder> decoder)
+ImageFrameGenerator::ImageFrameGenerator(PassOwnPtr<ImageDecoder> decoder, PassRefPtr<SharedBuffer> data, bool allDataReceived)
: m_decoder(decoder)
{
m_fullSize = SkISize::Make(m_decoder->size().width(), m_decoder->size().height());
m_imageId = s_nextImageId++;
+
+ setData(data, allDataReceived);
}
ImageFrameGenerator::~ImageFrameGenerator()
Modified: trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.h (134821 => 134822)
--- trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.h 2012-11-15 20:57:27 UTC (rev 134821)
+++ trunk/Source/WebCore/platform/graphics/chromium/ImageFrameGenerator.h 2012-11-15 20:57:32 UTC (rev 134822)
@@ -30,6 +30,7 @@
#include "SkSize.h"
#include <wtf/OwnPtr.h>
#include <wtf/PassOwnPtr.h>
+#include <wtf/PassRefPtr.h>
#include <wtf/RefCounted.h>
#include <wtf/RefPtr.h>
@@ -40,12 +41,12 @@
class ImageFrameGenerator : public RefCounted<ImageFrameGenerator> {
public:
- static PassRefPtr<ImageFrameGenerator> create(PassOwnPtr<ImageDecoder> decoder)
+ static PassRefPtr<ImageFrameGenerator> create(PassOwnPtr<ImageDecoder> decoder, PassRefPtr<SharedBuffer> data, bool allDataReceived)
{
- return adoptRef(new ImageFrameGenerator(decoder));
+ return adoptRef(new ImageFrameGenerator(decoder, data, allDataReceived));
}
- explicit ImageFrameGenerator(PassOwnPtr<ImageDecoder>);
+ ImageFrameGenerator(PassOwnPtr<ImageDecoder>, PassRefPtr<SharedBuffer>, bool allDataReceived);
~ImageFrameGenerator();
// Creates the image decoder if needed.
Modified: trunk/Source/WebCore/platform/graphics/skia/NativeImageSkia.cpp (134821 => 134822)
--- trunk/Source/WebCore/platform/graphics/skia/NativeImageSkia.cpp 2012-11-15 20:57:27 UTC (rev 134821)
+++ trunk/Source/WebCore/platform/graphics/skia/NativeImageSkia.cpp 2012-11-15 20:57:32 UTC (rev 134822)
@@ -41,7 +41,7 @@
#include "SkiaUtils.h"
#if PLATFORM(CHROMIUM)
-#include "ImageDecodingStore.h"
+#include "DeferredImageDecoder.h"
#include "TraceEvent.h"
#endif
@@ -79,8 +79,8 @@
SkBitmap NativeImageSkia::resizedBitmap(const SkISize& scaledImageSize, const SkIRect& scaledImageSubset) const
{
#if PLATFORM(CHROMIUM)
- if (ImageDecodingStore::isLazyDecoded(m_image))
- return ImageDecodingStore::instanceOnMainThread()->resizeLazyDecodedSkBitmap(m_image, scaledImageSize, scaledImageSubset);
+ if (DeferredImageDecoder::isLazyDecoded(m_image))
+ return DeferredImageDecoder::createResizedLazyDecodingBitmap(m_image, scaledImageSize, scaledImageSubset);
#endif
if (!hasResizedBitmap(scaledImageSize, scaledImageSubset)) {