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
15class SkBitmap;
16class SkStreamRewindable;
17
18/**
19 * Calls into SkImageDecoder::DecodeMemoryToTarget to implement a
20 * SkImageGenerator
21 */
22class SkDecodingImageGenerator : public SkImageGenerator {
23public:
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
113private:
114    SkData*             fData;
115    SkStreamRewindable* fStream;
116    SkImageInfo         fInfo;
117    bool                fHasInfo;
118    bool                fDoCopyTo;
119};
120#endif  // SkDecodingImageGenerator_DEFINED
121