blob: 6371bc187d14d9c90ed463d7734cfa67776f4d2e [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * Copyright 2010 Google Inc.
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +00004 *
epoger@google.comec3ed6a2011-07-28 14:26:00 +00005 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file.
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +00007 */
8
epoger@google.comec3ed6a2011-07-28 14:26:00 +00009
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +000010#ifndef SkPDFStream_DEFINED
11#define SkPDFStream_DEFINED
12
13#include "SkPDFTypes.h"
14#include "SkRefCnt.h"
vandebo@chromium.orga09ef972010-12-01 22:17:20 +000015#include "SkStream.h"
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +000016#include "SkTemplates.h"
17
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +000018class SkPDFCatalog;
19
20/** \class SkPDFStream
21
vandebo@chromium.orgda912d62011-03-08 18:31:02 +000022 A stream object in a PDF. Note, all streams must be indirect objects (via
23 SkObjRef).
vandebo@chromium.org26e14492013-08-26 22:52:09 +000024 TODO(vandebo): SkStream should be replaced by SkStreamRewindable when that
25 is feasible.
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +000026*/
vandebo@chromium.orgd90c1412011-02-24 21:50:04 +000027class SkPDFStream : public SkPDFDict {
commit-bot@chromium.orgab1c1382013-12-05 12:08:12 +000028 SK_DECLARE_INST_COUNT(SkPDFStream)
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +000029public:
30 /** Create a PDF stream. A Length entry is automatically added to the
reed@google.com6ed82492011-06-24 21:01:17 +000031 * stream dictionary. The stream may be retained (stream->ref() may be
32 * called) so its contents must not be changed after calling this.
vandebo@chromium.org421d6442011-07-20 17:39:01 +000033 * @param data The data part of the stream.
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +000034 */
vandebo@chromium.org421d6442011-07-20 17:39:01 +000035 explicit SkPDFStream(SkData* data);
36 /** Deprecated constructor. */
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +000037 explicit SkPDFStream(SkStream* stream);
vandebo@chromium.org421d6442011-07-20 17:39:01 +000038 /** Create a PDF stream with the same content and dictionary entries
39 * as the passed one.
40 */
41 explicit SkPDFStream(const SkPDFStream& pdfStream);
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +000042 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
vandebo@chromium.org421d6442011-07-20 17:39:01 +000049protected:
vandebo@chromium.org421d6442011-07-20 17:39:01 +000050 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 };
edisonn@google.comd9dfa182013-04-24 13:01:01 +000056
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
commit-bot@chromium.orgd8d976e2013-07-08 23:17:57 +000074 void setData(SkData* data);
edisonn@google.comd9dfa182013-04-24 13:01:01 +000075 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
89private:
vandebo@chromium.org421d6442011-07-20 17:39:01 +000090 // Indicates what form (or if) the stream has been requested.
91 State fState;
skia.committer@gmail.com83f0d302013-04-25 07:01:04 +000092
ctguil@chromium.org769fa6a2011-08-20 00:36:18 +000093 // TODO(vandebo): Use SkData (after removing deprecated constructor).
vandebo@chromium.orgd96d17b2013-01-04 19:31:24 +000094 SkAutoTUnref<SkStream> fData;
95 SkAutoTUnref<SkPDFStream> fSubstitute;
vandebo@chromium.orgd90c1412011-02-24 21:50:04 +000096
97 typedef SkPDFDict INHERITED;
vandebo@chromium.org8459d4e2010-09-24 22:25:30 +000098};
99
100#endif