/*
 * 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;
    void drop() 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:
    std::unique_ptr<SkStreamRewindable> fCompressedData;

    typedef SkPDFDict INHERITED;
};

#endif
