1e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#include "DMRecordTask.h"
2e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#include "DMUtil.h"
3e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#include "DMWriteTask.h"
4e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#include "SkCommandLineFlags.h"
593043bc252929d38a38096bba12f4612a8626c9bcommit-bot@chromium.org#include "SkRecord.h"
693043bc252929d38a38096bba12f4612a8626c9bcommit-bot@chromium.org#include "SkRecordDraw.h"
793043bc252929d38a38096bba12f4612a8626c9bcommit-bot@chromium.org#include "SkRecordOpts.h"
893043bc252929d38a38096bba12f4612a8626c9bcommit-bot@chromium.org#include "SkRecorder.h"
9e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
105aacfe9ffcf1849727dca6761b4a221bd4315f26commit-bot@chromium.orgDEFINE_bool(skr, true, "If true, run SKR tests.");
11e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
12e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgnamespace DM {
13e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
1490b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.orgRecordTask::RecordTask(const Task& parent, skiagm::GM* gm, SkBitmap reference, Mode mode)
15e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    : CpuTask(parent)
1690b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    , fOptimize(mode == kOptimize_Mode)
1790b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    , fName(UnderJoin(parent.name().c_str(), fOptimize ? "skr" : "skr-noopt"))
18e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    , fGM(gm)
19e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    , fReference(reference)
2090b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    {}
2190b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org
2290b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.orgRecordTask::RecordTask(const Task& parent, SkPicture* pic, SkBitmap reference, Mode mode)
2390b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    : CpuTask(parent)
2490b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    , fOptimize(mode == kOptimize_Mode)
2590b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    , fName(UnderJoin(parent.name().c_str(), fOptimize ? "skr" : "skr-noopt"))
2690b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    , fPicture(SkRef(pic))
2790b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    , fReference(reference)
28e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    {}
29e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
30e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid RecordTask::draw() {
3190b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    // Record into an SkRecord.
3293043bc252929d38a38096bba12f4612a8626c9bcommit-bot@chromium.org    SkRecord record;
33a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org    SkRecorder recorder(&record, fReference.width(), fReference.height());
3490b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org
3590b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    if (fGM.get()) {
3690b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org        recorder.concat(fGM->getInitialTransform());
3790b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org        fGM->draw(&recorder);
3890b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    } else {
3990b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org        fPicture->draw(&recorder);
4090b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org    }
4190b5a2a653b312ff9bcd7102412da2dbeb52368ccommit-bot@chromium.org
4293043bc252929d38a38096bba12f4612a8626c9bcommit-bot@chromium.org
4393043bc252929d38a38096bba12f4612a8626c9bcommit-bot@chromium.org    if (fOptimize) {
4493043bc252929d38a38096bba12f4612a8626c9bcommit-bot@chromium.org        SkRecordOptimize(&record);
4593043bc252929d38a38096bba12f4612a8626c9bcommit-bot@chromium.org    }
46e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
47e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    // Draw the SkRecord back into a bitmap.
48e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    SkBitmap bitmap;
49266420722e18dcc8b6d4a7379a42b8591ccd2b6dcommit-bot@chromium.org    AllocatePixels(fReference, &bitmap);
50e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    SkCanvas target(bitmap);
5193043bc252929d38a38096bba12f4612a8626c9bcommit-bot@chromium.org    SkRecordDraw(record, &target);
52e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
53e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    if (!BitmapsEqual(bitmap, fReference)) {
54e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org        this->fail();
55e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org        this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap)));
56e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    }
57e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
58e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
59e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgbool RecordTask::shouldSkip() const {
60e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    return !FLAGS_skr;
61e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
62e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
63e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}  // namespace DM
64