#include "DMRecordTask.h"
#include "DMUtil.h"
#include "DMWriteTask.h"
#include "SkCommandLineFlags.h"
#include "SkRecord.h"
#include "SkRecordDraw.h"
#include "SkRecordOpts.h"
#include "SkRecorder.h"

DEFINE_bool(skr, true, "If true, run SKR tests.");

namespace DM {

RecordTask::RecordTask(const Task& parent, skiagm::GM* gm, SkBitmap reference, Mode mode)
    : CpuTask(parent)
    , fOptimize(mode == kOptimize_Mode)
    , fName(UnderJoin(parent.name().c_str(), fOptimize ? "skr" : "skr-noopt"))
    , fGM(gm)
    , fReference(reference)
    {}

RecordTask::RecordTask(const Task& parent, SkPicture* pic, SkBitmap reference, Mode mode)
    : CpuTask(parent)
    , fOptimize(mode == kOptimize_Mode)
    , fName(UnderJoin(parent.name().c_str(), fOptimize ? "skr" : "skr-noopt"))
    , fPicture(SkRef(pic))
    , fReference(reference)
    {}

void RecordTask::draw() {
    // Record into an SkRecord.
    SkRecord record;
    SkRecorder recorder(SkRecorder::kWriteOnly_Mode, &record,
                        fReference.width(), fReference.height());

    if (fGM.get()) {
        recorder.concat(fGM->getInitialTransform());
        fGM->draw(&recorder);
    } else {
        fPicture->draw(&recorder);
    }


    if (fOptimize) {
        SkRecordOptimize(&record);
    }

    // Draw the SkRecord back into a bitmap.
    SkBitmap bitmap;
    AllocatePixels(fReference, &bitmap);
    SkCanvas target(bitmap);
    SkRecordDraw(record, &target);

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

bool RecordTask::shouldSkip() const {
    return !FLAGS_skr;
}

}  // namespace DM
