| /* | |
| * 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 |