Title: [134822] trunk/Source/WebCore
Revision
134822
Author
[email protected]
Date
2012-11-15 12:57:32 -0800 (Thu, 15 Nov 2012)

Log Message

[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):

Modified Paths

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)) {
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to