|
4 | 4 | #include <cairo.h> |
5 | 5 | #undef CAIRO_WIN32_STATIC_BUILD |
6 | 6 | #include <pango.h> |
| 7 | +#include <librsvg/rsvg.h> |
| 8 | + |
| 9 | +// if not #ifdef protected, you get a deprecated warning, which is |
| 10 | +// made fatal by -Werror |
| 11 | +#ifndef RSVG_CAIRO_H |
| 12 | +#include <librsvg/rsvg-cairo.h> |
| 13 | +#endif |
7 | 14 |
|
8 | 15 | using namespace std; |
9 | 16 |
|
@@ -137,4 +144,27 @@ namespace minsky |
137 | 144 | m_pango.reset(new ecolab::Pango(cairo)); |
138 | 145 | return *m_pango; |
139 | 146 | } |
| 147 | + |
| 148 | + // SVG rendering support |
| 149 | + void CairoShimCairo::renderSVG(void* svgHandle, double width, double height) const |
| 150 | + { |
| 151 | + if (!svgHandle) return; |
| 152 | + |
| 153 | + RsvgHandle* svg = static_cast<RsvgHandle*>(svgHandle); |
| 154 | +#ifdef MXE // MXE doesn't currently have a Rust compiler, so librsvg can be no later than 2.40.21 |
| 155 | + RsvgDimensionData dims; |
| 156 | + rsvg_handle_get_dimensions(svg, &dims); |
| 157 | + cairo_scale(cairo, width/dims.width, height/dims.height); |
| 158 | + rsvg_handle_render_cairo(svg, cairo); |
| 159 | +#else |
| 160 | + GError* err=nullptr; |
| 161 | + const RsvgRectangle rect{0,0,width,height}; |
| 162 | + rsvg_handle_render_document(svg, cairo, &rect, &err); |
| 163 | + if (err) |
| 164 | + { |
| 165 | + g_error_free(err); |
| 166 | + // Silently ignore errors for now to avoid breaking rendering |
| 167 | + } |
| 168 | +#endif |
| 169 | + } |
140 | 170 | } |
0 commit comments