Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / skia / src / pdf / SkPDFStream.h
1
2 /*
3  * Copyright 2010 Google Inc.
4  *
5  * Use of this source code is governed by a BSD-style license that can be
6  * found in the LICENSE file.
7  */
8
9
10 #ifndef SkPDFStream_DEFINED
11 #define SkPDFStream_DEFINED
12
13 #include "SkPDFTypes.h"
14 #include "SkRefCnt.h"
15 #include "SkStream.h"
16 #include "SkTemplates.h"
17
18 class SkPDFCatalog;
19
20 /** \class SkPDFStream
21
22     A stream object in a PDF.  Note, all streams must be indirect objects (via
23     SkObjRef).
24 */
25 class SkPDFStream : public SkPDFDict {
26     SK_DECLARE_INST_COUNT(SkPDFStream)
27 public:
28     /** Create a PDF stream. A Length entry is automatically added to the
29      *  stream dictionary.
30      *  @param data   The data part of the stream.  Will be ref()ed.
31      */
32     explicit SkPDFStream(SkData* data);
33
34     /** Create a PDF stream. A Length entry is automatically added to the
35      *  stream dictionary.
36      *  @param stream The data part of the stream.  Will be duplicate()d.
37      */
38     explicit SkPDFStream(SkStream* stream);
39
40     virtual ~SkPDFStream();
41
42     // The SkPDFObject interface.  These two methods use a mutex to
43     // allow multiple threads to call at the same time.
44     virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
45                             bool indirect);
46     virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
47
48 protected:
49     enum State {
50         kUnused_State,         //!< The stream hasn't been requested yet.
51         kNoCompression_State,  //!< The stream's been requested in an
52                                //   uncompressed form.
53         kCompressed_State,     //!< The stream's already been compressed.
54     };
55
56     /** Create a PDF stream with the same content and dictionary entries
57      *  as the passed one.
58      */
59     explicit SkPDFStream(const SkPDFStream& pdfStream);
60
61     /* Create a PDF stream with no data.  The setData method must be called to
62      * set the data.
63      */
64     SkPDFStream();
65
66     // Populate the stream dictionary.  This method returns false if
67     // fSubstitute should be used.
68     virtual bool populate(SkPDFCatalog* catalog);
69
70     void setSubstitute(SkPDFStream* stream) {
71         fSubstitute.reset(stream);
72     }
73
74     SkPDFStream* getSubstitute() const {
75         return fSubstitute.get();
76     }
77
78     void setData(SkData* data);
79     void setData(SkStream* stream);
80
81     size_t dataSize() const;
82
83     void setState(State state) {
84         fState = state;
85     }
86
87     State getState() const {
88         return fState;
89     }
90
91 private:
92     // Indicates what form (or if) the stream has been requested.
93     State fState;
94
95     // Mutex guards fState, fDataStream, and fSubstitute in public interface.
96     SkMutex fMutex;
97
98     SkMemoryStream fMemoryStream;  // Used by fDataStream when
99                                    // fDataStream needs to be backed
100                                    // by SkData.
101     SkAutoTUnref<SkStreamRewindable> fDataStream;
102     SkAutoTUnref<SkPDFStream> fSubstitute;
103
104     typedef SkPDFDict INHERITED;
105 };
106
107 #endif