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

#include "SkData.h"
#include "SkForceLinking.h"
#include "SkImageGenerator.h"
#include "SkPicture.h"
#include "SkPictureRecorder.h"
#include "SkStream.h"

#include <stdlib.h>
#include <stdio.h>

__SK_FORCE_IMAGE_DECODER_LINKING;

#define ASSERTF(cond, fmt, ...) if (!(cond)) { fprintf(stderr, fmt"\n", __VA_ARGS__); exit(1); }

static bool lazy_decode_bitmap(const void* src, size_t size, SkBitmap* dst) {
    SkAutoTUnref<SkData> encoded(SkData::NewWithCopy(src, size));
    return encoded && SkDEPRECATED_InstallDiscardablePixelRef(encoded, dst);
}

int main(int argc, char** argv) {
    ASSERTF(argc == 3, "usage: %s nested.skp flat.skp", argv[0]);
    const char *nestedPath = argv[1],
               *flatPath   = argv[2];

    // Read nested.skp.
    SkFILEStream stream(nestedPath);
    ASSERTF(stream.isValid(), "Couldn't read %s.", nestedPath);
    SkAutoTUnref<const SkPicture> nested(SkPicture::CreateFromStream(&stream, &lazy_decode_bitmap));
    ASSERTF(nested, "Couldn't parse %s as a picture.", nestedPath);

    // Play it back into a new picture using kPlaybackDrawPicture_RecordFlag.
    SkPictureRecorder recorder;
    uint32_t flags = SkPictureRecorder::kPlaybackDrawPicture_RecordFlag;
    nested->playback(recorder.beginRecording(nested->cullRect(), nullptr, flags));
    SkAutoTUnref<const SkPicture> flat(recorder.endRecordingAsPicture());

    // Write out that flat.skp
    SkFILEWStream wstream(flatPath);
    ASSERTF(wstream.isValid(), "Could not open %s.", flatPath);
    flat->serialize(&wstream);
    wstream.flush();

    return 0;
}
