|
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 TODO(vandebo): SkStream should be replaced by SkStreamRewindable when that |
|
25 is feasible. |
|
26 */ |
|
27 class SkPDFStream : public SkPDFDict { |
|
28 SK_DECLARE_INST_COUNT(SkPDFStream) |
|
29 public: |
|
30 /** Create a PDF stream. A Length entry is automatically added to the |
|
31 * stream dictionary. The stream may be retained (stream->ref() may be |
|
32 * called) so its contents must not be changed after calling this. |
|
33 * @param data The data part of the stream. |
|
34 */ |
|
35 explicit SkPDFStream(SkData* data); |
|
36 /** Deprecated constructor. */ |
|
37 explicit SkPDFStream(SkStream* stream); |
|
38 /** Create a PDF stream with the same content and dictionary entries |
|
39 * as the passed one. |
|
40 */ |
|
41 explicit SkPDFStream(const SkPDFStream& pdfStream); |
|
42 virtual ~SkPDFStream(); |
|
43 |
|
44 // The SkPDFObject interface. |
|
45 virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, |
|
46 bool indirect); |
|
47 virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); |
|
48 |
|
49 protected: |
|
50 enum State { |
|
51 kUnused_State, //!< The stream hasn't been requested yet. |
|
52 kNoCompression_State, //!< The stream's been requested in an |
|
53 // uncompressed form. |
|
54 kCompressed_State, //!< The stream's already been compressed. |
|
55 }; |
|
56 |
|
57 /* Create a PDF stream with no data. The setData method must be called to |
|
58 * set the data. |
|
59 */ |
|
60 SkPDFStream(); |
|
61 |
|
62 // Populate the stream dictionary. This method returns false if |
|
63 // fSubstitute should be used. |
|
64 virtual bool populate(SkPDFCatalog* catalog); |
|
65 |
|
66 void setSubstitute(SkPDFStream* stream) { |
|
67 fSubstitute.reset(stream); |
|
68 } |
|
69 |
|
70 SkPDFStream* getSubstitute() { |
|
71 return fSubstitute.get(); |
|
72 } |
|
73 |
|
74 void setData(SkData* data); |
|
75 void setData(SkStream* stream); |
|
76 |
|
77 SkStream* getData() { |
|
78 return fData.get(); |
|
79 } |
|
80 |
|
81 void setState(State state) { |
|
82 fState = state; |
|
83 } |
|
84 |
|
85 State getState() { |
|
86 return fState; |
|
87 } |
|
88 |
|
89 private: |
|
90 // Indicates what form (or if) the stream has been requested. |
|
91 State fState; |
|
92 |
|
93 // TODO(vandebo): Use SkData (after removing deprecated constructor). |
|
94 SkAutoTUnref<SkStream> fData; |
|
95 SkAutoTUnref<SkPDFStream> fSubstitute; |
|
96 |
|
97 typedef SkPDFDict INHERITED; |
|
98 }; |
|
99 |
|
100 #endif |