michael@0: michael@0: /* michael@0: * Copyright 2010 Google Inc. michael@0: * michael@0: * Use of this source code is governed by a BSD-style license that can be michael@0: * found in the LICENSE file. michael@0: */ michael@0: michael@0: michael@0: #ifndef SkPDFStream_DEFINED michael@0: #define SkPDFStream_DEFINED michael@0: michael@0: #include "SkPDFTypes.h" michael@0: #include "SkRefCnt.h" michael@0: #include "SkStream.h" michael@0: #include "SkTemplates.h" michael@0: michael@0: class SkPDFCatalog; michael@0: michael@0: /** \class SkPDFStream michael@0: michael@0: A stream object in a PDF. Note, all streams must be indirect objects (via michael@0: SkObjRef). michael@0: TODO(vandebo): SkStream should be replaced by SkStreamRewindable when that michael@0: is feasible. michael@0: */ michael@0: class SkPDFStream : public SkPDFDict { michael@0: SK_DECLARE_INST_COUNT(SkPDFStream) michael@0: public: michael@0: /** Create a PDF stream. A Length entry is automatically added to the michael@0: * stream dictionary. The stream may be retained (stream->ref() may be michael@0: * called) so its contents must not be changed after calling this. michael@0: * @param data The data part of the stream. michael@0: */ michael@0: explicit SkPDFStream(SkData* data); michael@0: /** Deprecated constructor. */ michael@0: explicit SkPDFStream(SkStream* stream); michael@0: /** Create a PDF stream with the same content and dictionary entries michael@0: * as the passed one. michael@0: */ michael@0: explicit SkPDFStream(const SkPDFStream& pdfStream); michael@0: virtual ~SkPDFStream(); michael@0: michael@0: // The SkPDFObject interface. michael@0: virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog, michael@0: bool indirect); michael@0: virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect); michael@0: michael@0: protected: michael@0: enum State { michael@0: kUnused_State, //!< The stream hasn't been requested yet. michael@0: kNoCompression_State, //!< The stream's been requested in an michael@0: // uncompressed form. michael@0: kCompressed_State, //!< The stream's already been compressed. michael@0: }; michael@0: michael@0: /* Create a PDF stream with no data. The setData method must be called to michael@0: * set the data. michael@0: */ michael@0: SkPDFStream(); michael@0: michael@0: // Populate the stream dictionary. This method returns false if michael@0: // fSubstitute should be used. michael@0: virtual bool populate(SkPDFCatalog* catalog); michael@0: michael@0: void setSubstitute(SkPDFStream* stream) { michael@0: fSubstitute.reset(stream); michael@0: } michael@0: michael@0: SkPDFStream* getSubstitute() { michael@0: return fSubstitute.get(); michael@0: } michael@0: michael@0: void setData(SkData* data); michael@0: void setData(SkStream* stream); michael@0: michael@0: SkStream* getData() { michael@0: return fData.get(); michael@0: } michael@0: michael@0: void setState(State state) { michael@0: fState = state; michael@0: } michael@0: michael@0: State getState() { michael@0: return fState; michael@0: } michael@0: michael@0: private: michael@0: // Indicates what form (or if) the stream has been requested. michael@0: State fState; michael@0: michael@0: // TODO(vandebo): Use SkData (after removing deprecated constructor). michael@0: SkAutoTUnref fData; michael@0: SkAutoTUnref fSubstitute; michael@0: michael@0: typedef SkPDFDict INHERITED; michael@0: }; michael@0: michael@0: #endif