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