| @@ -58,7 +58,7 @@ TWidget* createWidgetCentered(math::Vec pos) { | |||
| inline app::SvgPanel* createPanel(std::string svgPath) { | |||
| app::SvgPanel* panel = new app::SvgPanel; | |||
| std::shared_ptr<Svg> svg = APP->window->loadSvg(svgPath); | |||
| std::shared_ptr<Svg> svg = Svg::load(svgPath); | |||
| panel->setBackground(svg); | |||
| return panel; | |||
| } | |||
| @@ -1,4 +1,6 @@ | |||
| #pragma once | |||
| #include <memory> | |||
| #include <nanovg.h> | |||
| #include <nanosvg.h> | |||
| @@ -8,6 +10,19 @@ | |||
| namespace rack { | |||
| struct Svg { | |||
| NSVGimage* handle = NULL; | |||
| /** Don't call this directly. Use `Svg::load()` for caching. */ | |||
| void loadFile(const std::string& filename); | |||
| ~Svg(); | |||
| /** Loads Svg from a cache. */ | |||
| static std::shared_ptr<Svg> load(const std::string& filename); | |||
| }; | |||
| DEPRECATED typedef Svg SVG; | |||
| void svgDraw(NVGcontext* vg, NSVGimage* svg); | |||
| @@ -12,6 +12,7 @@ | |||
| #include <nanovg_gl.h> | |||
| #include <nanovg_gl_utils.h> | |||
| #include <nanosvg.h> | |||
| #include <svg.hpp> | |||
| #include <common.hpp> | |||
| #include <math.hpp> | |||
| @@ -42,17 +43,6 @@ struct Image { | |||
| DEPRECATED static std::shared_ptr<Image> load(const std::string& filename); | |||
| }; | |||
| struct Svg { | |||
| NSVGimage* handle = NULL; | |||
| /** Don't call this directly but instead use `APP->window->loadSvg()` */ | |||
| void loadFile(const std::string& filename); | |||
| ~Svg(); | |||
| /** Use `APP->window->loadSvg()` instead. */ | |||
| DEPRECATED static std::shared_ptr<Svg> load(const std::string& filename); | |||
| }; | |||
| DEPRECATED typedef Svg SVG; | |||
| struct Window { | |||
| struct Internal; | |||
| @@ -71,7 +61,6 @@ struct Window { | |||
| /** Use load*() instead of modifying these directly. */ | |||
| std::map<std::string, std::weak_ptr<Font>> fontCache; | |||
| std::map<std::string, std::weak_ptr<Image>> imageCache; | |||
| std::map<std::string, std::weak_ptr<Svg>> svgCache; | |||
| Window(); | |||
| ~Window(); | |||
| @@ -100,7 +89,11 @@ struct Window { | |||
| std::shared_ptr<Font> loadFont(const std::string& filename); | |||
| std::shared_ptr<Image> loadImage(const std::string& filename); | |||
| std::shared_ptr<Svg> loadSvg(const std::string& filename); | |||
| /** Use `Svg::load(filename)` in new code. */ | |||
| DEPRECATED std::shared_ptr<Svg> loadSvg(const std::string& filename) { | |||
| return Svg::load(filename); | |||
| } | |||
| }; | |||
| @@ -1,5 +1,7 @@ | |||
| #include <svg.hpp> | |||
| #include <map> | |||
| #include <math.hpp> | |||
| #include <app/common.hpp> | |||
| // #define DEBUG_ONLY(x) x | |||
| @@ -8,6 +10,37 @@ | |||
| namespace rack { | |||
| void Svg::loadFile(const std::string& filename) { | |||
| handle = nsvgParseFromFile(filename.c_str(), "px", app::SVG_DPI); | |||
| if (handle) { | |||
| INFO("Loaded SVG %s", filename.c_str()); | |||
| } | |||
| else { | |||
| WARN("Failed to load SVG %s", filename.c_str()); | |||
| } | |||
| } | |||
| Svg::~Svg() { | |||
| if (handle) | |||
| nsvgDelete(handle); | |||
| } | |||
| static std::map<std::string, std::weak_ptr<Svg>> svgCache; | |||
| std::shared_ptr<Svg> Svg::load(const std::string& filename) { | |||
| auto sp = svgCache[filename].lock(); | |||
| if (!sp) { | |||
| svgCache[filename] = sp = std::make_shared<Svg>(); | |||
| sp->load(filename); | |||
| } | |||
| return sp; | |||
| } | |||
| static NVGcolor getNVGColor(uint32_t color) { | |||
| return nvgRGBA( | |||
| (color >> 0) & 0xff, | |||
| @@ -72,28 +72,6 @@ std::shared_ptr<Image> Image::load(const std::string& filename) { | |||
| } | |||
| void Svg::loadFile(const std::string& filename) { | |||
| handle = nsvgParseFromFile(filename.c_str(), "px", app::SVG_DPI); | |||
| if (handle) { | |||
| INFO("Loaded SVG %s", filename.c_str()); | |||
| } | |||
| else { | |||
| WARN("Failed to load SVG %s", filename.c_str()); | |||
| } | |||
| } | |||
| Svg::~Svg() { | |||
| if (handle) | |||
| nsvgDelete(handle); | |||
| } | |||
| std::shared_ptr<Svg> Svg::load(const std::string& filename) { | |||
| return APP->window->loadSvg(filename); | |||
| } | |||
| struct Window::Internal { | |||
| std::string lastWindowTitle; | |||
| @@ -652,16 +630,6 @@ std::shared_ptr<Image> Window::loadImage(const std::string& filename) { | |||
| } | |||
| std::shared_ptr<Svg> Window::loadSvg(const std::string& filename) { | |||
| auto sp = svgCache[filename].lock(); | |||
| if (!sp) { | |||
| svgCache[filename] = sp = std::make_shared<Svg>(); | |||
| sp->loadFile(filename); | |||
| } | |||
| return sp; | |||
| } | |||
| void windowInit() { | |||
| int err; | |||