aboutsummaryrefslogtreecommitdiffhomepage
path: root/dm/DMWriteTask.cpp
blob: 011b3395407fb69f7d193c8cba23f5152abbd0f1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "DMWriteTask.h"

#include "DMUtil.h"
#include "SkCommandLineFlags.h"
#include "SkImageEncoder.h"

#include <string.h>

DEFINE_string2(writePath, w, "", "If set, write GMs here as .pngs.");

namespace DM {

WriteTask::WriteTask(const Task& parent, SkBitmap bitmap)
    : Task(parent)
    , fBitmap(bitmap) {
    // Split parent's name <gmName>_<config> into gmName and config.
    const char* parentName = parent.name().c_str();
    const char* fromLastUnderscore = strrchr(parentName, '_');
    const ptrdiff_t gmNameLength = fromLastUnderscore - parentName;

    fConfig.set(fromLastUnderscore+1);
    fGmName.set(parentName, gmNameLength);
}

void WriteTask::draw() {
    const char* root = FLAGS_writePath[0];
    const SkString dir = SkOSPath::SkPathJoin(root, fConfig.c_str());
    if (!sk_mkdir(root) ||
        !sk_mkdir(dir.c_str())  ||
        !SkImageEncoder::EncodeFile(Png(SkOSPath::SkPathJoin(dir.c_str(), fGmName.c_str())).c_str(),
                                    fBitmap,
                                    SkImageEncoder::kPNG_Type,
                                    100/*quality*/))
    {
        this->fail();
    }
}

SkString WriteTask::name() const {
    return SkStringPrintf("writing %s/%s.png", fConfig.c_str(), fGmName.c_str());
}

bool WriteTask::shouldSkip() const {
    return FLAGS_writePath.isEmpty();
}

}  // namespace DM