blob: ce3e653d928b346ae531c773f6bd9bcb4d45013a [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"
10#include "SkOSFile.h"
11#include "SkPicture.h"
12#include <vector>
13
14struct GMStream : Stream {
15 const skiagm::GMRegistry* registry = skiagm::GMRegistry::Head();
16
17 static std::unique_ptr<Stream> Create(Options) {
18 GMStream stream;
19 return move_unique(stream);
20 }
21
22 struct GMSrc : Src {
23 skiagm::GM* (*factory)(void*);
24 std::unique_ptr<skiagm::GM> gm;
25
26 std::string name() override {
27 gm.reset(factory(nullptr));
28 return gm->getName();
29 }
30
31 SkISize size() override {
32 return gm->getISize();
33 }
34
35 void draw(SkCanvas* canvas) override {
36 canvas->clear(0xffffffff);
37 canvas->concat(gm->getInitialTransform());
38 gm->draw(canvas);
39 }
40 };
41
42 std::unique_ptr<Src> next() override {
43 if (!registry) {
44 return nullptr;
45 }
46 GMSrc src;
47 src.factory = registry->factory();
48 registry = registry->next();
49 return move_unique(src);
50 }
51};
52static Register gm{"gm", GMStream::Create};
53
54struct SKPStream : Stream {
55 std::string dir;
56 std::vector<std::string> skps;
57
58 static std::unique_ptr<Stream> Create(Options options) {
59 SKPStream stream;
60 stream.dir = options("dir", "skps");
61 SkOSFile::Iter it{stream.dir.c_str(), ".skp"};
62 for (SkString path; it.next(&path); ) {
63 stream.skps.push_back(path.c_str());
64 }
65 return move_unique(stream);
66 }
67
68 struct SKPSrc : Src {
69 std::string dir, path;
70 sk_sp<SkPicture> pic;
71
72 std::string name() override {
73 return path;
74 }
75
76 SkISize size() override {
77 auto skp = SkData::MakeFromFileName((dir+"/"+path).c_str());
78 pic = SkPicture::MakeFromData(skp.get());
79 return pic->cullRect().roundOut().size();
80 }
81
82 void draw(SkCanvas* canvas) override {
83 canvas->clear(0xffffffff);
84 pic->playback(canvas);
85 }
86 };
87
88 std::unique_ptr<Src> next() override {
89 if (skps.empty()) {
90 return nullptr;
91 }
92 SKPSrc src;
93 src.dir = dir;
94 src.path = skps.back();
95 skps.pop_back();
96 return move_unique(src);
97 }
98};
99static Register skp{"skp", SKPStream::Create};