Home | History | Annotate | Download | only in images
      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