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