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 */
     25 class SkPDFStream : public SkPDFDict {
     26     SK_DECLARE_INST_COUNT(SkPDFStream)
     27 public:
     28     /** Create a PDF stream. A Length entry is automatically added to the
     29      *  stream dictionary.
     30      *  @param data   The data part of the stream.  Will be ref()ed.
     31      */
     32     explicit SkPDFStream(SkData* data);
     33 
     34     /** Create a PDF stream. A Length entry is automatically added to the
     35      *  stream dictionary.
     36      *  @param stream The data part of the stream.  Will be duplicate()d.
     37      */
     38     explicit SkPDFStream(SkStream* stream);
     39 
     40     virtual ~SkPDFStream();
     41 
     42     // The SkPDFObject interface.  These two methods use a mutex to
     43     // allow multiple threads to call at the same time.
     44     virtual void emitObject(SkWStream* stream, SkPDFCatalog* catalog,
     45                             bool indirect);
     46     virtual size_t getOutputSize(SkPDFCatalog* catalog, bool indirect);
     47 
     48 protected:
     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 the same content and dictionary entries
     57      *  as the passed one.
     58      */
     59     explicit SkPDFStream(const SkPDFStream& pdfStream);
     60 
     61     /* Create a PDF stream with no data.  The setData method must be called to
     62      * set the data.
     63      */
     64     SkPDFStream();
     65 
     66     // Populate the stream dictionary.  This method returns false if
     67     // fSubstitute should be used.
     68     virtual bool populate(SkPDFCatalog* catalog);
     69 
     70     void setSubstitute(SkPDFStream* stream) {
     71         fSubstitute.reset(stream);
     72     }
     73 
     74     SkPDFStream* getSubstitute() const {
     75         return fSubstitute.get();
     76     }
     77 
     78     void setData(SkData* data);
     79     void setData(SkStream* stream);
     80 
     81     size_t dataSize() const;
     82 
     83     void setState(State state) {
     84         fState = state;
     85     }
     86 
     87     State getState() const {
     88         return fState;
     89     }
     90 
     91 private:
     92     // Indicates what form (or if) the stream has been requested.
     93     State fState;
     94 
     95     // Mutex guards fState, fDataStream, and fSubstitute in public interface.
     96     SkMutex fMutex;
     97 
     98     SkMemoryStream fMemoryStream;  // Used by fDataStream when
     99                                    // fDataStream needs to be backed
    100                                    // by SkData.
    101     SkAutoTUnref<SkStreamRewindable> fDataStream;
    102     SkAutoTUnref<SkPDFStream> fSubstitute;
    103 
    104     typedef SkPDFDict INHERITED;
    105 };
    106 
    107 #endif
    108