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

#include "tools/SvgPathExtractor.h"

#include "include/core/SkCanvas.h"
#include "include/core/SkPicture.h"
#include "include/core/SkRefCnt.h"
#include "include/core/SkStream.h"
#include "include/private/SkDebug.h"
#include "modules/svg/include/SkSVGDOM.h"
#include "modules/svg/include/SkSVGNode.h"
#include "src/xml/SkDOM.h"

#include <cstring>

class SkPaint;
class SkPath;

namespace ToolUtils {

void ExtractPaths(const char filepath[], std::function<PathSniffCallback> callback) {
    SkFILEStream stream(filepath);
    if (!stream.isValid()) {
        SkDebugf("ExtractPaths: invalid input file at \"%s\"\n", filepath);
        return;
    }

    class PathSniffer : public SkCanvas {
    public:
        PathSniffer(std::function<PathSniffCallback> callback)
                : SkCanvas(4096, 4096, nullptr)
                , fPathSniffCallback(callback) {}
    private:
        void onDrawPath(const SkPath& path, const SkPaint& paint) override {
            fPathSniffCallback(this->getTotalMatrix(), path, paint);
        }
        std::function<PathSniffCallback> fPathSniffCallback;
    };

    sk_sp<SkSVGDOM> svg = SkSVGDOM::MakeFromStream(stream);
    if (!svg) {
        SkDebugf("ExtractPaths: couldn't load svg at \"%s\"\n", filepath);
        return;
    }
    PathSniffer pathSniffer(callback);
    svg->setContainerSize(SkSize::Make(pathSniffer.getBaseLayerSize()));
    svg->render(&pathSniffer);
}

}  // namespace ToolUtils
