
/*
 * Copyright 2010 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */


#ifndef SkPDFStream_DEFINED
#define SkPDFStream_DEFINED

#include "SkPDFTypes.h"
#include "SkRefCnt.h"
#include "SkStream.h"
#include "SkTemplates.h"

class SkPDFObjNumMap;

/** \class SkPDFStream

    A stream object in a PDF.  Note, all streams must be indirect objects (via
    SkObjRef).
*/
class SkPDFStream : public SkPDFDict {
    
public:
    /** Create a PDF stream. A Length entry is automatically added to the
     *  stream dictionary.
     *  @param data   The data part of the stream.  Will not take ownership.
     */
    explicit SkPDFStream(SkData* data) { this->setData(data); }

    /** Create a PDF stream. A Length entry is automatically added to the
     *  stream dictionary.
     *  @param stream The data part of the stream.  Will not take ownership.
     */
    explicit SkPDFStream(SkStream* stream) { this->setData(stream); }

    virtual ~SkPDFStream();

    // The SkPDFObject interface.
    void emitObject(SkWStream* stream,
                    const SkPDFObjNumMap& objNumMap,
                    const SkPDFSubstituteMap& substitutes) const override;

protected:
    /* Create a PDF stream with no data.  The setData method must be called to
     * set the data.
     */
    SkPDFStream() {}

    /** Only call this function once. */
    void setData(SkStream* stream);
    void setData(SkData* data) {
        SkMemoryStream memoryStream(data);
        this->setData(&memoryStream);
    }

private:
    SkAutoTDelete<SkStreamRewindable> fCompressedData;

    typedef SkPDFDict INHERITED;
};

#endif
