/* * 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 SkImageGenerator_DEFINED #define SkImageGenerator_DEFINED #include "SkDiscardableMemory.h" #include "SkImageInfo.h" class SkBitmap; class SkData; class SkImageGenerator; /** * Takes ownership of SkImageGenerator. If this method fails for * whatever reason, it will return false and immediatetely delete * the generator. If it succeeds, it will modify destination * bitmap. * * If generator is NULL, will safely return false. * * If this fails or when the SkDiscardablePixelRef that is * installed into destination is destroyed, it will call * SkDELETE() on the generator. Therefore, generator should be * allocated with SkNEW() or SkNEW_ARGS(). * * @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. */ SK_API bool SkInstallDiscardablePixelRef(SkImageGenerator* generator, SkBitmap* destination, SkDiscardableMemory::Factory* factory = NULL); /** * An interface that allows a purgeable PixelRef (such as a * SkDiscardablePixelRef) to decode and re-decode an image as needed. */ class SK_API SkImageGenerator { public: /** * The PixelRef which takes ownership of this SkImageGenerator * will call the image generator's destructor. */ virtual ~SkImageGenerator() { } /** * Return a ref to the encoded (i.e. compressed) representation, * of this data. * * If non-NULL is returned, the caller is responsible for calling * unref() on the data when it is finished. */ virtual SkData* refEncodedData() { return NULL; } /** * Return some information about the image, allowing the owner of * this object to allocate pixels. * * Repeated calls to this function should give the same results, * allowing the PixelRef to be immutable. * * @return false if anything goes wrong. */ virtual bool getInfo(SkImageInfo* info) = 0; /** * 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. * * @return false if anything goes wrong or if the image info is * unsupported. */ virtual bool getPixels(const SkImageInfo& info, void* pixels, size_t rowBytes) = 0; }; #endif // SkImageGenerator_DEFINED