blob: 96052e9d4eb7bc659eb618fbaea319d38bc0c0b9 [file] [log] [blame]
/*
* 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/base/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