1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkDecodingImageGenerator_DEFINED 9 #define SkDecodingImageGenerator_DEFINED 10 11 #include "SkDiscardableMemory.h" 12 #include "SkImageGenerator.h" 13 #include "SkImageInfo.h" 14 15 class SkBitmap; 16 class SkStreamRewindable; 17 18 /** 19 * Calls into SkImageDecoder::DecodeMemoryToTarget to implement a 20 * SkImageGenerator 21 */ 22 class SkDecodingImageGenerator : public SkImageGenerator { 23 public: 24 /* 25 * The constructor will take a reference to the SkData. The 26 * destructor will unref() it. 27 */ 28 explicit SkDecodingImageGenerator(SkData* data); 29 30 /* 31 * The SkData version of this constructor is preferred. If the 32 * stream has an underlying SkData (such as a SkMemoryStream) 33 * pass that in. 34 * 35 * This object will unref the stream when done. Since streams 36 * have internal state (position), the caller should not pass a 37 * shared stream in. Pass either a new duplicated stream in or 38 * transfer ownership of the stream. In the latter case, be sure 39 * that there are no other consumers of the stream who will 40 * modify the stream's position. This constructor asserts 41 * stream->unique(). 42 * 43 * For example: 44 * SkStreamRewindable* stream; 45 * ... 46 * SkImageGenerator* gen 47 * = SkNEW_ARGS(SkDecodingImageGenerator, 48 * (stream->duplicate())); 49 * ... 50 * SkDELETE(gen); 51 */ 52 explicit SkDecodingImageGenerator(SkStreamRewindable* stream); 53 54 virtual ~SkDecodingImageGenerator(); 55 56 virtual SkData* refEncodedData() SK_OVERRIDE; 57 58 virtual bool getInfo(SkImageInfo* info) SK_OVERRIDE; 59 60 virtual bool getPixels(const SkImageInfo& info, 61 void* pixels, 62 size_t rowBytes) SK_OVERRIDE; 63 64 /** 65 * Install the SkData into the destination bitmap, using a new 66 * SkDiscardablePixelRef and a new SkDecodingImageGenerator. 67 * 68 * @param data Contains the encoded image data that will be used 69 * by the SkDecodingImageGenerator. Will be ref()ed. 70 * 71 * @param destination Upon success, this bitmap will be 72 * configured and have a pixelref installed. 73 * 74 * @param factory If not NULL, this object will be used as a 75 * source of discardable memory when decoding. If NULL, then 76 * SkDiscardableMemory::Create() will be called. 77 * 78 * @return true iff successful. 79 */ 80 static bool Install(SkData* data, SkBitmap* destination, 81 SkDiscardableMemory::Factory* factory = NULL); 82 /** 83 * Install the stream into the destination bitmap, using a new 84 * SkDiscardablePixelRef and a new SkDecodingImageGenerator. 85 * 86 * The SkData version of this function is preferred. If the 87 * stream has an underlying SkData (such as a SkMemoryStream) 88 * pass that in. 89 * 90 * @param stream The source of encoded data that will be passed 91 * to the decoder. The installed SkDecodingImageGenerator will 92 * unref the stream when done. If false is returned, this 93 * function will perform the unref. Since streams have internal 94 * state (position), the caller should not pass a shared stream 95 * in. Pass either a new duplicated stream in or transfer 96 * ownership of the stream. In the latter case, be sure that 97 * there are no other consumers of the stream who will modify the 98 * stream's position. This function will fail if 99 * (!stream->unique()). 100 * 101 * @param destination Upon success, this bitmap will be 102 * configured and have a pixelref installed. 103 * 104 * @param factory If not NULL, this object will be used as a 105 * source of discardable memory when decoding. If NULL, then 106 * SkDiscardableMemory::Create() will be called. 107 * 108 * @return true iff successful. 109 */ 110 static bool Install(SkStreamRewindable* stream, SkBitmap* destination, 111 SkDiscardableMemory::Factory* factory = NULL); 112 113 private: 114 SkData* fData; 115 SkStreamRewindable* fStream; 116 SkImageInfo fInfo; 117 bool fHasInfo; 118 bool fDoCopyTo; 119 }; 120 #endif // SkDecodingImageGenerator_DEFINED 121