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

Unified Diff: include/codec/SkCodec.h

Issue 1220733013: SkCodec no longer inherits from SkImageGenerator. (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Manually handle the lifetime of fScanlineDecoder. Created 5 years, 5 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 | « dm/DMSrcSink.cpp ('k') | include/codec/SkScanlineDecoder.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: include/codec/SkCodec.h
diff --git a/include/codec/SkCodec.h b/include/codec/SkCodec.h
index e462be2e7d64c494de89cc03241da7c5de4c08d9..54bd6ff5d617ebba99b1e8717a7c01e9bba804cf 100644
--- a/include/codec/SkCodec.h
+++ b/include/codec/SkCodec.h
@@ -8,21 +8,21 @@
#ifndef SkCodec_DEFINED
#define SkCodec_DEFINED
+#include "SkColor.h"
#include "SkEncodedFormat.h"
-#include "SkImageGenerator.h"
#include "SkImageInfo.h"
-#include "SkScanlineDecoder.h"
#include "SkSize.h"
#include "SkStream.h"
#include "SkTemplates.h"
#include "SkTypes.h"
class SkData;
+class SkScanlineDecoder;
/**
* Abstraction layer directly on top of an image codec.
*/
-class SkCodec : public SkImageGenerator {
+class SkCodec : SkNoncopyable {
public:
/**
* If this stream represents an encoded image that we know how to decode,
@@ -41,12 +41,17 @@ public:
*/
static SkCodec* NewFromData(SkData*);
+ virtual ~SkCodec();
+
+ /**
+ * Return the ImageInfo associated with this codec.
+ */
+ const SkImageInfo& getInfo() const { return fInfo; }
+
/**
* Return a size that approximately supports the desired scale factor.
* The codec may not be able to scale efficiently to the exact scale
* factor requested, so return a size that approximates that scale.
- *
- * FIXME: Move to SkImageGenerator?
*/
SkISize getScaledDimensions(float desiredScale) const {
return this->onGetScaledDimensions(desiredScale);
@@ -58,6 +63,115 @@ public:
SkEncodedFormat getEncodedFormat() const { return this->onGetEncodedFormat(); }
/**
+ * Used to describe the result of a call to getPixels().
+ *
+ * Result is the union of possible results from subclasses.
+ */
+ enum Result {
+ /**
+ * General return value for success.
+ */
+ kSuccess,
+ /**
+ * The input is incomplete. A partial image was generated.
+ */
+ kIncompleteInput,
+ /**
+ * The generator cannot convert to match the request, ignoring
+ * dimensions.
+ */
+ kInvalidConversion,
+ /**
+ * The generator cannot scale to requested size.
+ */
+ kInvalidScale,
+ /**
+ * Parameters (besides info) are invalid. e.g. NULL pixels, rowBytes
+ * too small, etc.
+ */
+ kInvalidParameters,
+ /**
+ * The input did not contain a valid image.
+ */
+ kInvalidInput,
+ /**
+ * Fulfilling this request requires rewinding the input, which is not
+ * supported for this input.
+ */
+ kCouldNotRewind,
+ /**
+ * This method is not implemented by this generator.
+ */
+ kUnimplemented,
+ };
+
+ /**
+ * Whether or not the memory passed to getPixels is zero initialized.
+ */
+ enum ZeroInitialized {
+ /**
+ * The memory passed to getPixels is zero initialized. The SkCodec
+ * may take advantage of this by skipping writing zeroes.
+ */
+ kYes_ZeroInitialized,
+ /**
+ * The memory passed to getPixels has not been initialized to zero,
+ * so the SkCodec must write all zeroes to memory.
+ *
+ * This is the default. It will be used if no Options struct is used.
+ */
+ kNo_ZeroInitialized,
+ };
+
+ /**
+ * Additional options to pass to getPixels.
+ */
+ struct Options {
+ Options()
+ : fZeroInitialized(kNo_ZeroInitialized) {}
+
+ ZeroInitialized fZeroInitialized;
+ };
+
+ /**
+ * Decode into the given pixels, a block of memory of size at
+ * least (info.fHeight - 1) * rowBytes + (info.fWidth *
+ * bytesPerPixel)
+ *
+ * Repeated calls to this function should give the same results,
+ * allowing the PixelRef to be immutable.
+ *
+ * @param info A description of the format (config, size)
+ * expected by the caller. This can simply be identical
+ * to the info returned by getInfo().
+ *
+ * This contract also allows the caller to specify
+ * different output-configs, which the implementation can
+ * decide to support or not.
+ *
+ * A size that does not match getInfo() implies a request
+ * to scale. If the generator cannot perform this scale,
+ * it will return kInvalidScale.
+ *
+ * If info is kIndex8_SkColorType, then the caller must provide storage for up to 256
+ * SkPMColor values in ctable. On success the generator must copy N colors into that storage,
+ * (where N is the logical number of table entries) and set ctableCount to N.
+ *
+ * If info is not kIndex8_SkColorType, then the last two parameters may be NULL. If ctableCount
+ * is not null, it will be set to 0.
+ *
+ * @return Result kSuccess, or another value explaining the type of failure.
+ */
+ Result getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, const Options*,
+ SkPMColor ctable[], int* ctableCount);
+
+ /**
+ * Simplified version of getPixels() that asserts that info is NOT kIndex8_SkColorType and
+ * uses the default Options.
+ */
+ Result getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes);
+
+ /**
* Return an object which can be used to decode individual scanlines.
*
* This object is owned by the SkCodec, which will handle its lifetime. The
@@ -118,6 +232,10 @@ protected:
virtual SkEncodedFormat onGetEncodedFormat() const = 0;
+ virtual Result onGetPixels(const SkImageInfo& info,
+ void* pixels, size_t rowBytes, const Options&,
+ SkPMColor ctable[], int* ctableCount) = 0;
+
/**
* Override if your codec supports scanline decoding.
*
@@ -182,7 +300,7 @@ protected:
* created a new scanline decoder.
*/
SkScanlineDecoder* scanlineDecoder() {
- return fScanlineDecoder.get();
+ return fScanlineDecoder;
}
/**
@@ -191,14 +309,15 @@ protected:
* in the destructor of the subclass.
*/
SkScanlineDecoder* detachScanlineDecoder() {
- return fScanlineDecoder.detach();
+ SkScanlineDecoder* scanlineDecoder = fScanlineDecoder;
+ fScanlineDecoder = NULL;
+ return scanlineDecoder;
}
private:
- SkAutoTDelete<SkStream> fStream;
- bool fNeedsRewind;
- SkAutoTDelete<SkScanlineDecoder> fScanlineDecoder;
-
- typedef SkImageGenerator INHERITED;
+ const SkImageInfo fInfo;
+ SkAutoTDelete<SkStream> fStream;
+ bool fNeedsRewind;
+ SkScanlineDecoder* fScanlineDecoder;
};
#endif // SkCodec_DEFINED
« no previous file with comments | « dm/DMSrcSink.cpp ('k') | include/codec/SkScanlineDecoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698