/*
 * Copyright 2018 Google LLC
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#ifndef BisectSlide_DEFINED
#define BisectSlide_DEFINED

#include "include/core/SkMatrix.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPath.h"
#include "include/core/SkRect.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkSize.h"
#include "include/core/SkString.h"
#include "include/core/SkTypes.h"
#include "include/private/SkTArray.h"
#include "tools/viewer/Slide.h"

#include <stack>
#include <utility>

class SkCanvas;

/**
 * This is a simple utility designed to extract the paths from an SKP file and then isolate a single
 * one of them via bisect. Use the 'x' and 'X' keys to guide a binary search:
 *
 *   'x': Throw out half the paths.
 *   'X': Toggle which half gets tossed and which half is kept.
 *   'Z': Back up one level.
 *   'D': Dump the path.
 */
class BisectSlide : public Slide {
public:
    static sk_sp<BisectSlide> Create(const char filepath[]);

    // Slide overrides.
    SkISize getDimensions() const override { return fDrawBounds.size(); }
    bool onChar(SkUnichar c) override;
    void draw(SkCanvas* canvas) override;

private:
    explicit BisectSlide(const char filepath[]);

    struct FoundPath {
        SkPath fPath;
        SkPaint fPaint;
        SkMatrix fViewMatrix;
    };

    SkString fFilePath;
    SkIRect fDrawBounds = SkIRect::MakeEmpty();
    skia_private::TArray<FoundPath> fFoundPaths;
    skia_private::TArray<FoundPath> fTossedPaths;
    skia_private::TArray<char> fTrail;
    std::stack<std::pair<skia_private::TArray<FoundPath>, skia_private::TArray<FoundPath>>>
        fPathHistory;
};

#endif
