blob: 5630a345951125f5d333303c22c97af220a81520 [file] [log] [blame]
Mike Klein7ac04832017-03-25 11:29:41 -04001/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "ok.h"
9#include "gm.h"
Florin Malitaab244f02017-05-03 19:16:58 +000010#include "SkData.h"
Mike Klein7ac04832017-03-25 11:29:41 -040011#include "SkOSFile.h"
12#include "SkPicture.h"
13#include <vector>
14
15struct GMStream : Stream {
16 const skiagm::GMRegistry* registry = skiagm::GMRegistry::Head();
17
18 static std::unique_ptr<Stream> Create(Options) {
19 GMStream stream;
20 return move_unique(stream);
21 }
22
23 struct GMSrc : Src {
24 skiagm::GM* (*factory)(void*);
25 std::unique_ptr<skiagm::GM> gm;
26
Mike Klein0222e702017-03-25 15:53:14 -040027 void init() {
28 if (gm) { return; }
Mike Klein7ac04832017-03-25 11:29:41 -040029 gm.reset(factory(nullptr));
Mike Klein0222e702017-03-25 15:53:14 -040030 }
31
32 std::string name() override {
33 this->init();
Mike Klein7ac04832017-03-25 11:29:41 -040034 return gm->getName();
35 }
36
37 SkISize size() override {
Mike Klein0222e702017-03-25 15:53:14 -040038 this->init();
Mike Klein7ac04832017-03-25 11:29:41 -040039 return gm->getISize();
40 }
41
Mike Kleine15a7b52017-03-29 12:41:13 -040042 Status draw(SkCanvas* canvas) override {
Mike Klein0222e702017-03-25 15:53:14 -040043 this->init();
Mike Klein7ac04832017-03-25 11:29:41 -040044 canvas->clear(0xffffffff);
45 canvas->concat(gm->getInitialTransform());
46 gm->draw(canvas);
Mike Kleine15a7b52017-03-29 12:41:13 -040047 return Status::OK;
Mike Klein7ac04832017-03-25 11:29:41 -040048 }
49 };
50
51 std::unique_ptr<Src> next() override {
52 if (!registry) {
53 return nullptr;
54 }
55 GMSrc src;
56 src.factory = registry->factory();
57 registry = registry->next();
58 return move_unique(src);
59 }
60};
Mike Kleine15a7b52017-03-29 12:41:13 -040061static Register gm{"gm", "draw GMs linked into this binary", GMStream::Create};
Mike Klein7ac04832017-03-25 11:29:41 -040062
63struct SKPStream : Stream {
64 std::string dir;
65 std::vector<std::string> skps;
66
67 static std::unique_ptr<Stream> Create(Options options) {
68 SKPStream stream;
69 stream.dir = options("dir", "skps");
70 SkOSFile::Iter it{stream.dir.c_str(), ".skp"};
71 for (SkString path; it.next(&path); ) {
72 stream.skps.push_back(path.c_str());
73 }
74 return move_unique(stream);
75 }
76
77 struct SKPSrc : Src {
78 std::string dir, path;
79 sk_sp<SkPicture> pic;
80
Mike Klein0222e702017-03-25 15:53:14 -040081 void init() {
82 if (pic) { return; }
83 auto skp = SkData::MakeFromFileName((dir+"/"+path).c_str());
84 pic = SkPicture::MakeFromData(skp.get());
85 }
86
Mike Klein7ac04832017-03-25 11:29:41 -040087 std::string name() override {
88 return path;
89 }
90
91 SkISize size() override {
Mike Klein0222e702017-03-25 15:53:14 -040092 this->init();
Mike Klein7ac04832017-03-25 11:29:41 -040093 return pic->cullRect().roundOut().size();
94 }
95
Mike Kleine15a7b52017-03-29 12:41:13 -040096 Status draw(SkCanvas* canvas) override {
Mike Klein0222e702017-03-25 15:53:14 -040097 this->init();
Mike Klein7ac04832017-03-25 11:29:41 -040098 canvas->clear(0xffffffff);
99 pic->playback(canvas);
Mike Kleine15a7b52017-03-29 12:41:13 -0400100 return Status::OK;
Mike Klein7ac04832017-03-25 11:29:41 -0400101 }
102 };
103
104 std::unique_ptr<Src> next() override {
105 if (skps.empty()) {
106 return nullptr;
107 }
108 SKPSrc src;
109 src.dir = dir;
110 src.path = skps.back();
111 skps.pop_back();
112 return move_unique(src);
113 }
114};
Mike Kleine15a7b52017-03-29 12:41:13 -0400115static Register skp{"skp", "draw SKPs from dir=skps", SKPStream::Create};