/*
 * Copyright (C) 2010 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "SkFlate.h"
#include "SkPDFCatalog.h"
#include "SkPDFStream.h"
#include "SkStream.h"

SkPDFStream::SkPDFStream(SkStream* stream) {
    if (SkFlate::HaveFlate())
        SkAssertResult(SkFlate::Deflate(stream, &fCompressedData));

    if (SkFlate::HaveFlate() &&
            fCompressedData.getOffset() < stream->getLength()) {
        fLength = fCompressedData.getOffset();
        insert("Filter", new SkPDFName("FlateDecode"))->unref();
    } else {
        fCompressedData.reset();
        fPlainData = stream;
        fLength = fPlainData->getLength();
    }
    insert("Length", new SkPDFInt(fLength))->unref();
}

SkPDFStream::~SkPDFStream() {
}

void SkPDFStream::emitObject(SkWStream* stream, SkPDFCatalog* catalog,
                             bool indirect) {
    if (indirect)
        return emitIndirectObject(stream, catalog);

    this->INHERITED::emitObject(stream, catalog, false);
    stream->writeText(" stream\n");
    if (fPlainData.get())
        stream->write(fPlainData->getMemoryBase(), fLength);
    else
        stream->write(fCompressedData.getStream(), fLength);
    stream->writeText("\nendstream");
}

size_t SkPDFStream::getOutputSize(SkPDFCatalog* catalog, bool indirect) {
    if (indirect)
        return getIndirectOutputSize(catalog);

    return this->INHERITED::getOutputSize(catalog, false) +
        strlen(" stream\n\nendstream") + fLength;
}
