Home | History | Annotate | Download | only in pdf
      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
    101