#include "DMSKPTask.h"
#include "DMUtil.h"
#include "DMWriteTask.h"

#include "SkCommandLineFlags.h"
#include "SkPictureRecorder.h"

DECLARE_bool(skr);  // in DMReplayTask.cpp

namespace DM {

// Test that an SkPicture plays back the same when re-recorded into an
// SkPicture backed by SkRecord.
class SkrComparisonTask : public CpuTask {
public:
    SkrComparisonTask(const Task& parent, const SkPicture* picture, SkBitmap reference)
        : CpuTask(parent)
        , fPicture(picture)
        , fReference(reference)
        , fName(UnderJoin(parent.name().c_str(), "skr")) {}

    virtual bool shouldSkip() const SK_OVERRIDE { return !FLAGS_skr; }
    virtual SkString name() const SK_OVERRIDE { return fName; }

    virtual void draw() SK_OVERRIDE {
        SkPictureRecorder recorder;
        fPicture->draw(recorder.EXPERIMENTAL_beginRecording(fPicture->width(), fPicture->height()));
        SkAutoTDelete<const SkPicture> skrPicture(recorder.endRecording());

        SkBitmap bitmap;
        AllocatePixels(kN32_SkColorType, fPicture->width(), fPicture->height(), &bitmap);
        DrawPicture(*skrPicture, &bitmap);

        if (!BitmapsEqual(fReference, bitmap)) {
            this->fail();
            this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap)));
        }
    }

private:
    SkAutoTUnref<const SkPicture> fPicture;
    const SkBitmap fReference;
    const SkString fName;
};


SKPTask::SKPTask(Reporter* r, TaskRunner* tr, const SkPicture* pic, SkString filename)
    : CpuTask(r, tr), fPicture(SkRef(pic)), fName(FileToTaskName(filename)) {}

void SKPTask::draw() {
    SkBitmap bitmap;
    AllocatePixels(kN32_SkColorType, fPicture->width(), fPicture->height(), &bitmap);
    DrawPicture(*fPicture, &bitmap);

    this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap)));
    this->spawnChild(SkNEW_ARGS(SkrComparisonTask, (*this, fPicture.get(), bitmap)));
}

}  // namespace DM
