blob: c5300c6396a1fe47a24ced9a9f40a9085005145d [file] [log] [blame]
Chris Dalton2d18f412018-02-20 13:23:32 -07001/*
2 * Copyright 2018 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#ifndef BisectSlide_DEFINED
9#define BisectSlide_DEFINED
10
11#include "SkCanvas.h"
12#include "SkPath.h"
13#include "Slide.h"
14#include <stack>
15
16/**
17 * This is a simple utility designed to extract the paths from an SKP file and then isolate a single
18 * one of them via bisect. Use the 'x' and 'X' keys to guide a binary search:
19 *
20 * 'x': Throw out half the paths.
21 * 'X': Toggle which half gets tossed and which half is kept.
22 * 'Z': Back up one level.
23 * 'D': Dump the path.
24 */
25class BisectSlide : public Slide, public SkCanvas {
26public:
27 static sk_sp<BisectSlide> Create(const char filepath[]);
28
29 // Slide overrides.
30 SkISize getDimensions() const override { return fDrawBounds.size(); }
31 bool onChar(SkUnichar c) override;
32 void draw(SkCanvas* canvas) override;
33
34private:
35 BisectSlide(const char filepath[]);
36
37 // SkCanvas override called only during creation.
38 void onDrawPath(const SkPath& path, const SkPaint& paint) override;
39
40 struct FoundPath {
41 SkPath fPath;
42 SkPaint fPaint;
43 SkMatrix fViewMatrix;
44 };
45
46 SkString fFilePath;
47 SkIRect fDrawBounds = SkIRect::MakeEmpty();
48 SkTArray<FoundPath> fFoundPaths;
49 SkTArray<FoundPath> fTossedPaths;
50 SkTArray<char> fTrail;
51 std::stack<std::pair<SkTArray<FoundPath>, SkTArray<FoundPath>>> fPathHistory;
52};
53
54#endif