@@ -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; | |||