C++程序  |  64行  |  1.58 KB

#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(&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