Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(568)

Unified Diff: src/images/SkDecodingImageGenerator.h

Issue 93703004: Change SkDecodingImageGenerator API (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: rebased Created 6 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/image/SkImagePriv.cpp ('k') | src/images/SkDecodingImageGenerator.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/images/SkDecodingImageGenerator.h
diff --git a/src/images/SkDecodingImageGenerator.h b/src/images/SkDecodingImageGenerator.h
index dba234bcf19c400d5a005c5c5ac4efe057733267..12a49d59c47e6c6b89c248a7bd88341d35633da3 100644
--- a/src/images/SkDecodingImageGenerator.h
+++ b/src/images/SkDecodingImageGenerator.h
@@ -8,113 +8,134 @@
#ifndef SkDecodingImageGenerator_DEFINED
#define SkDecodingImageGenerator_DEFINED
-#include "SkDiscardableMemory.h"
+#include "SkBitmap.h"
#include "SkImageGenerator.h"
-#include "SkImageInfo.h"
-class SkBitmap;
+class SkData;
class SkStreamRewindable;
/**
- * Calls into SkImageDecoder::DecodeMemoryToTarget to implement a
- * SkImageGenerator
+ * An implementation of SkImageGenerator that calls into
+ * SkImageDecoder.
*/
class SkDecodingImageGenerator : public SkImageGenerator {
public:
- /*
- * The constructor will take a reference to the SkData. The
- * destructor will unref() it.
- */
- explicit SkDecodingImageGenerator(SkData* data);
-
- /*
- * The SkData version of this constructor is preferred. If the
- * stream has an underlying SkData (such as a SkMemoryStream)
- * pass that in.
- *
- * This object will unref the stream when done. Since streams
- * have internal state (position), the caller should not pass a
- * shared stream in. Pass either a new duplicated stream in or
- * transfer ownership of the stream. In the latter case, be sure
- * that there are no other consumers of the stream who will
- * modify the stream's position. This constructor asserts
- * stream->unique().
- *
- * For example:
- * SkStreamRewindable* stream;
- * ...
- * SkImageGenerator* gen
- * = SkNEW_ARGS(SkDecodingImageGenerator,
- * (stream->duplicate()));
- * ...
- * SkDELETE(gen);
- */
- explicit SkDecodingImageGenerator(SkStreamRewindable* stream);
-
virtual ~SkDecodingImageGenerator();
-
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;
-
/**
- * Install the SkData into the destination bitmap, using a new
- * SkDiscardablePixelRef and a new SkDecodingImageGenerator.
- *
- * @param data Contains the encoded image data that will be used
- * by the SkDecodingImageGenerator. Will be ref()ed.
+ * These options will be passed on to the image decoder. The
+ * defaults are sensible.
*
- * @param destination Upon success, this bitmap will be
- * configured and have a pixelref installed.
+ * @param fSampleSize If set to > 1, tells the decoder to return a
+ * smaller than original bitmap, sampling 1 pixel for
+ * every size pixels. e.g. if sample size is set to 3,
+ * then the returned bitmap will be 1/3 as wide and high,
+ * and will contain 1/9 as many pixels as the original.
+ * Note: this is a hint, and the codec may choose to
+ * ignore this, or only approximate the sample size.
*
- * @param factory If not NULL, this object will be used as a
- * source of discardable memory when decoding. If NULL, then
- * SkDiscardableMemory::Create() will be called.
+ * @param fDitherImage Set to true if the the decoder should try to
+ * dither the resulting image when decoding to a smaller
+ * color-space. The default is true.
*
- * @return true iff successful.
+ * @param fRequestedColorType If not given, then use whichever
+ * config the decoder wants. Else try to use this color
+ * type. If the decoder won't support this color type,
+ * SkDecodingImageGenerator::Create will return
+ * NULL. kIndex_8_SkColorType is not supported.
*/
- static bool Install(SkData* data, SkBitmap* destination,
- SkDiscardableMemory::Factory* factory = NULL);
+ struct Options {
+ Options()
+ : fSampleSize(1)
+ , fDitherImage(true)
+ , fUseRequestedColorType(false)
+ , fRequestedColorType() { }
+ Options(int sampleSize, bool dither)
+ : fSampleSize(sampleSize)
+ , fDitherImage(dither)
+ , fUseRequestedColorType(false)
+ , fRequestedColorType() { }
+ Options(int sampleSize, bool dither, SkColorType colorType)
+ : fSampleSize(sampleSize)
+ , fDitherImage(dither)
+ , fUseRequestedColorType(true)
+ , fRequestedColorType(colorType) { }
+ const int fSampleSize;
+ const bool fDitherImage;
+ const bool fUseRequestedColorType;
+ const SkColorType fRequestedColorType;
+ };
+
/**
- * Install the stream into the destination bitmap, using a new
- * SkDiscardablePixelRef and a new SkDecodingImageGenerator.
+ * These two functions return a SkImageGenerator that calls into
+ * SkImageDecoder. They return NULL on failure.
*
- * The SkData version of this function is preferred. If the
- * stream has an underlying SkData (such as a SkMemoryStream)
- * pass that in.
+ * The SkData version of this function is preferred. If the stream
+ * has an underlying SkData (such as a SkMemoryStream) pass that in.
*
- * @param stream The source of encoded data that will be passed
- * to the decoder. The installed SkDecodingImageGenerator will
- * unref the stream when done. If false is returned, this
- * function will perform the unref. Since streams have internal
- * state (position), the caller should not pass a shared stream
- * in. Pass either a new duplicated stream in or transfer
- * ownership of the stream. In the latter case, be sure that
- * there are no other consumers of the stream who will modify the
- * stream's position. This function will fail if
- * (!stream->unique()).
+ * This object will unref the stream when done or on failure. Since
+ * streams have internal state (position), the caller should not pass
+ * a shared stream in. Pass either a new duplicated stream in or
+ * transfer ownership of the stream. This factory asserts
+ * stream->unique().
*
- * @param destination Upon success, this bitmap will be
- * configured and have a pixelref installed.
+ * For example:
+ * SkStreamRewindable* stream;
+ * ...
+ * SkImageGenerator* gen
+ * = SkDecodingImageGenerator::Create(
+ * stream->duplicate(), SkDecodingImageGenerator::Options());
+ * ...
+ * SkDELETE(gen);
*
- * @param factory If not NULL, this object will be used as a
- * source of discardable memory when decoding. If NULL, then
- * SkDiscardableMemory::Create() will be called.
+ * @param Options (see above)
*
- * @return true iff successful.
+ * @return NULL on failure, a new SkImageGenerator on success.
*/
- static bool Install(SkStreamRewindable* stream, SkBitmap* destination,
- SkDiscardableMemory::Factory* factory = NULL);
+ static SkImageGenerator* Create(SkStreamRewindable* stream,
+ const Options& opt);
+
+ /**
+ * @param data Contains the encoded image data that will be used by
+ * the SkDecodingImageGenerator. Will be ref()ed by the
+ * SkImageGenerator constructor and and unref()ed on deletion.
+ */
+ static SkImageGenerator* Create(SkData* data, const Options& opt);
private:
- SkData* fData;
- SkStreamRewindable* fStream;
- SkImageInfo fInfo;
- bool fHasInfo;
- bool fDoCopyTo;
+ SkData* fData;
+ SkStreamRewindable* fStream;
+ const SkImageInfo fInfo;
+ const int fSampleSize;
+ const bool fDitherImage;
+ const SkBitmap::Config fRequestedConfig;
+ SkDecodingImageGenerator(SkData* data,
+ SkStreamRewindable* stream,
+ const SkImageInfo& info,
+ int sampleSize,
+ bool ditherImage,
+ SkBitmap::Config requestedConfig);
+ static SkImageGenerator* Create(SkData*, SkStreamRewindable*,
+ const Options&);
+ typedef SkImageGenerator INHERITED;
};
+
+// // Example of most basic use case:
+//
+// bool install_data(SkData* data, SkBitmap* dst) {
+// return SkInstallDiscardablePixelRef(
+// SkDecodingImageGenerator::Create(
+// data, SkDecodingImageGenerator::Options()), dst, NULL);
+// }
+// bool install_stream(SkStreamRewindable* stream, SkBitmap* dst) {
+// return SkInstallDiscardablePixelRef(
+// SkDecodingImageGenerator::Create(
+// stream, SkDecodingImageGenerator::Options()), dst, NULL);
+// }
+
#endif // SkDecodingImageGenerator_DEFINED
« no previous file with comments | « src/image/SkImagePriv.cpp ('k') | src/images/SkDecodingImageGenerator.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698