Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / images / SkDecodingImageGenerator.cpp
index 2d93eb5..b3924a7 100644 (file)
 #include "SkStream.h"
 #include "SkUtils.h"
 
-static bool equal_modulo_alpha(const SkImageInfo& a, const SkImageInfo& b) {
+namespace {
+bool equal_modulo_alpha(const SkImageInfo& a, const SkImageInfo& b) {
     return a.width() == b.width() && a.height() == b.height() &&
            a.colorType() == b.colorType();
 }
 
-namespace {
+class DecodingImageGenerator : public SkImageGenerator {
+public:
+    virtual ~DecodingImageGenerator();
+    virtual SkData* refEncodedData() SK_OVERRIDE;
+    // This implementaion of getInfo() always returns true.
+    virtual bool getInfo(SkImageInfo* info) SK_OVERRIDE;
+    virtual bool getPixels(const SkImageInfo& info,
+                           void* pixels,
+                           size_t rowBytes) SK_OVERRIDE;
+
+    SkData*                fData;
+    SkStreamRewindable*    fStream;
+    const SkImageInfo      fInfo;
+    const int              fSampleSize;
+    const bool             fDitherImage;
+
+    DecodingImageGenerator(SkData* data,
+                           SkStreamRewindable* stream,
+                           const SkImageInfo& info,
+                           int sampleSize,
+                           bool ditherImage);
+    typedef SkImageGenerator INHERITED;
+};
+
 /**
  *  Special allocator used by getPixels(). Uses preallocated memory
  *  provided if possible, else fall-back on the default allocator
@@ -76,10 +100,9 @@ inline bool check_alpha(SkAlphaType reported, SkAlphaType actual) {
 }
 #endif  // SK_DEBUG
 
-}  // namespace
 ////////////////////////////////////////////////////////////////////////////////
 
-SkDecodingImageGenerator::SkDecodingImageGenerator(
+DecodingImageGenerator::DecodingImageGenerator(
         SkData* data,
         SkStreamRewindable* stream,
         const SkImageInfo& info,
@@ -95,19 +118,19 @@ SkDecodingImageGenerator::SkDecodingImageGenerator(
     SkSafeRef(fData);  // may be NULL.
 }
 
-SkDecodingImageGenerator::~SkDecodingImageGenerator() {
+DecodingImageGenerator::~DecodingImageGenerator() {
     SkSafeUnref(fData);
     fStream->unref();
 }
 
-bool SkDecodingImageGenerator::getInfo(SkImageInfo* info) {
+bool DecodingImageGenerator::getInfo(SkImageInfo* info) {
     if (info != NULL) {
         *info = fInfo;
     }
     return true;
 }
 
-SkData* SkDecodingImageGenerator::refEncodedData() {
+SkData* DecodingImageGenerator::refEncodedData() {
     // This functionality is used in `gm --serialize`
     // Does not encode options.
     if (fData != NULL) {
@@ -128,7 +151,7 @@ SkData* SkDecodingImageGenerator::refEncodedData() {
     return SkSafeRef(fData);
 }
 
-bool SkDecodingImageGenerator::getPixels(const SkImageInfo& info,
+bool DecodingImageGenerator::getPixels(const SkImageInfo& info,
                                          void* pixels,
                                          size_t rowBytes) {
     if (NULL == pixels) {
@@ -152,6 +175,8 @@ bool SkDecodingImageGenerator::getPixels(const SkImageInfo& info,
     }
     decoder->setDitherImage(fDitherImage);
     decoder->setSampleSize(fSampleSize);
+    decoder->setRequireUnpremultipliedColors(
+            info.fAlphaType == kUnpremul_SkAlphaType);
 
     SkBitmap bitmap;
     TargetAllocator allocator(fInfo, pixels, rowBytes);
@@ -180,35 +205,10 @@ bool SkDecodingImageGenerator::getPixels(const SkImageInfo& info,
     return true;
 }
 
-SkImageGenerator* SkDecodingImageGenerator::Create(
-        SkData* data,
-        const SkDecodingImageGenerator::Options& opts) {
-    SkASSERT(data != NULL);
-    if (NULL == data) {
-        return NULL;
-    }
-    SkStreamRewindable* stream = SkNEW_ARGS(SkMemoryStream, (data));
-    SkASSERT(stream != NULL);
-    SkASSERT(stream->unique());
-    return SkDecodingImageGenerator::Create(data, stream, opts);
-}
-
-SkImageGenerator* SkDecodingImageGenerator::Create(
-        SkStreamRewindable* stream,
-        const SkDecodingImageGenerator::Options& opts) {
-    SkASSERT(stream != NULL);
-    SkASSERT(stream->unique());
-    if ((stream == NULL) || !stream->unique()) {
-        SkSafeUnref(stream);
-        return NULL;
-    }
-    return SkDecodingImageGenerator::Create(NULL, stream, opts);
-}
-
 // A contructor-type function that returns NULL on failure.  This
 // prevents the returned SkImageGenerator from ever being in a bad
 // state.  Called by both Create() functions
-SkImageGenerator* SkDecodingImageGenerator::Create(
+SkImageGenerator* CreateDecodingImageGenerator(
         SkData* data,
         SkStreamRewindable* stream,
         const SkDecodingImageGenerator::Options& opts) {
@@ -226,6 +226,7 @@ SkImageGenerator* SkDecodingImageGenerator::Create(
     }
     SkBitmap bitmap;
     decoder->setSampleSize(opts.fSampleSize);
+    decoder->setRequireUnpremultipliedColors(opts.fRequireUnpremul);
     if (!decoder->decode(stream, &bitmap,
                          SkImageDecoder::kDecodeBounds_Mode)) {
         return NULL;
@@ -241,7 +242,7 @@ SkImageGenerator* SkDecodingImageGenerator::Create(
         if (kIndex_8_SkColorType == bitmap.colorType()) {
             // We don't support kIndex8 because we don't support
             // colortables in this workflow.
-            info.fColorType = kPMColor_SkColorType;
+            info.fColorType = kN32_SkColorType;
         }
     } else {
         if (!bitmap.canCopyTo(opts.fRequestedColorType)) {
@@ -250,7 +251,40 @@ SkImageGenerator* SkDecodingImageGenerator::Create(
         }
         info.fColorType = opts.fRequestedColorType;
     }
-    return SkNEW_ARGS(SkDecodingImageGenerator,
+
+    if (opts.fRequireUnpremul && info.fAlphaType != kOpaque_SkAlphaType) {
+        info.fAlphaType = kUnpremul_SkAlphaType;
+    }
+    return SkNEW_ARGS(DecodingImageGenerator,
                       (data, autoStream.detach(), info,
                        opts.fSampleSize, opts.fDitherImage));
 }
+
+}  // namespace
+
+////////////////////////////////////////////////////////////////////////////////
+
+SkImageGenerator* SkDecodingImageGenerator::Create(
+        SkData* data,
+        const SkDecodingImageGenerator::Options& opts) {
+    SkASSERT(data != NULL);
+    if (NULL == data) {
+        return NULL;
+    }
+    SkStreamRewindable* stream = SkNEW_ARGS(SkMemoryStream, (data));
+    SkASSERT(stream != NULL);
+    SkASSERT(stream->unique());
+    return CreateDecodingImageGenerator(data, stream, opts);
+}
+
+SkImageGenerator* SkDecodingImageGenerator::Create(
+        SkStreamRewindable* stream,
+        const SkDecodingImageGenerator::Options& opts) {
+    SkASSERT(stream != NULL);
+    SkASSERT(stream->unique());
+    if ((stream == NULL) || !stream->unique()) {
+        SkSafeUnref(stream);
+        return NULL;
+    }
+    return CreateDecodingImageGenerator(NULL, stream, opts);
+}