/* * Copyright 2013 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkDecodingImageGenerator_DEFINED #define SkDecodingImageGenerator_DEFINED #include "SkDiscardableMemory.h" #include "SkImageGenerator.h" #include "SkImageInfo.h" class SkBitmap; class SkStreamRewindable; /** * Calls into SkImageDecoder::DecodeMemoryToTarget to implement a * SkImageGenerator */ 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; 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. * * @param destination Upon success, this bitmap will be * configured and have a pixelref installed. * * @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. * * @return true iff successful. */ static bool Install(SkData* data, SkBitmap* destination, SkDiscardableMemory::Factory* factory = NULL); /** * Install the stream into the destination bitmap, using a new * SkDiscardablePixelRef and a new SkDecodingImageGenerator. * * 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()). * * @param destination Upon success, this bitmap will be * configured and have a pixelref installed. * * @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. * * @return true iff successful. */ static bool Install(SkStreamRewindable* stream, SkBitmap* destination, SkDiscardableMemory::Factory* factory = NULL); private: SkData* fData; SkStreamRewindable* fStream; SkImageInfo fInfo; bool fHasInfo; bool fDoCopyTo; }; #endif // SkDecodingImageGenerator_DEFINED