1#include "DMRecordTask.h"
2#include "DMUtil.h"
3#include "DMWriteTask.h"
4#include "SkCommandLineFlags.h"
5#include "SkRecord.h"
6#include "SkRecordDraw.h"
7#include "SkRecordOpts.h"
8#include "SkRecorder.h"
9
10DEFINE_bool(skr, true, "If true, run SKR tests.");
11
12namespace DM {
13
14RecordTask::RecordTask(const Task& parent, skiagm::GM* gm, SkBitmap reference, Mode mode)
15    : CpuTask(parent)
16    , fOptimize(mode == kOptimize_Mode)
17    , fName(UnderJoin(parent.name().c_str(), fOptimize ? "skr" : "skr-noopt"))
18    , fGM(gm)
19    , fReference(reference)
20    {}
21
22RecordTask::RecordTask(const Task& parent, SkPicture* pic, SkBitmap reference, Mode mode)
23    : CpuTask(parent)
24    , fOptimize(mode == kOptimize_Mode)
25    , fName(UnderJoin(parent.name().c_str(), fOptimize ? "skr" : "skr-noopt"))
26    , fPicture(SkRef(pic))
27    , fReference(reference)
28    {}
29
30void RecordTask::draw() {
31    // Record into an SkRecord.
32    SkRecord record;
33    SkRecorder recorder(&record, fReference.width(), fReference.height());
34
35    if (fGM.get()) {
36        recorder.concat(fGM->getInitialTransform());
37        fGM->draw(&recorder);
38    } else {
39        fPicture->draw(&recorder);
40    }
41
42
43    if (fOptimize) {
44        SkRecordOptimize(&record);
45    }
46
47    // Draw the SkRecord back into a bitmap.
48    SkBitmap bitmap;
49    AllocatePixels(fReference, &bitmap);
50    SkCanvas target(bitmap);
51    SkRecordDraw(record, &target);
52
53    if (!BitmapsEqual(bitmap, fReference)) {
54        this->fail();
55        this->spawnChild(SkNEW_ARGS(WriteTask, (*this, bitmap)));
56    }
57}
58
59bool RecordTask::shouldSkip() const {
60    return !FLAGS_skr;
61}
62
63}  // namespace DM
64