| 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
|
|
|