initial commit, 4.5 stable
Some checks failed
🔗 GHA / 📊 Static checks (push) Has been cancelled
🔗 GHA / 🤖 Android (push) Has been cancelled
🔗 GHA / 🍏 iOS (push) Has been cancelled
🔗 GHA / 🐧 Linux (push) Has been cancelled
🔗 GHA / 🍎 macOS (push) Has been cancelled
🔗 GHA / 🏁 Windows (push) Has been cancelled
🔗 GHA / 🌐 Web (push) Has been cancelled
Some checks failed
🔗 GHA / 📊 Static checks (push) Has been cancelled
🔗 GHA / 🤖 Android (push) Has been cancelled
🔗 GHA / 🍏 iOS (push) Has been cancelled
🔗 GHA / 🐧 Linux (push) Has been cancelled
🔗 GHA / 🍎 macOS (push) Has been cancelled
🔗 GHA / 🏁 Windows (push) Has been cancelled
🔗 GHA / 🌐 Web (push) Has been cancelled
This commit is contained in:
79
thirdparty/msdfgen/core/export-svg.cpp
vendored
Normal file
79
thirdparty/msdfgen/core/export-svg.cpp
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
|
||||
#include "export-svg.h"
|
||||
|
||||
#include <cstdio>
|
||||
#include "edge-segments.h"
|
||||
|
||||
namespace msdfgen {
|
||||
|
||||
static void writeSvgCoord(FILE *f, Point2 coord) {
|
||||
fprintf(f, "%.17g %.17g", coord.x, coord.y);
|
||||
}
|
||||
|
||||
static void writeSvgPathDef(FILE *f, const Shape &shape) {
|
||||
bool beginning = true;
|
||||
for (const Contour &c : shape.contours) {
|
||||
if (c.edges.empty())
|
||||
continue;
|
||||
if (beginning)
|
||||
beginning = false;
|
||||
else
|
||||
fputc(' ', f);
|
||||
fputs("M ", f);
|
||||
writeSvgCoord(f, c.edges[0]->controlPoints()[0]);
|
||||
for (const EdgeHolder &e : c.edges) {
|
||||
const Point2 *cp = e->controlPoints();
|
||||
switch (e->type()) {
|
||||
case (int) LinearSegment::EDGE_TYPE:
|
||||
fputs(" L ", f);
|
||||
writeSvgCoord(f, cp[1]);
|
||||
break;
|
||||
case (int) QuadraticSegment::EDGE_TYPE:
|
||||
fputs(" Q ", f);
|
||||
writeSvgCoord(f, cp[1]);
|
||||
fputc(' ', f);
|
||||
writeSvgCoord(f, cp[2]);
|
||||
break;
|
||||
case (int) CubicSegment::EDGE_TYPE:
|
||||
fputs(" C ", f);
|
||||
writeSvgCoord(f, cp[1]);
|
||||
fputc(' ', f);
|
||||
writeSvgCoord(f, cp[2]);
|
||||
fputc(' ', f);
|
||||
writeSvgCoord(f, cp[3]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
fputs(" Z", f);
|
||||
}
|
||||
}
|
||||
|
||||
bool saveSvgShape(const Shape &shape, const char *filename) {
|
||||
if (FILE *f = fopen(filename, "w")) {
|
||||
fputs("<svg xmlns=\"http://www.w3.org/2000/svg\"><path", f);
|
||||
if (!shape.inverseYAxis)
|
||||
fputs(" transform=\"scale(1 -1)\"", f);
|
||||
fputs(" d=\"", f);
|
||||
writeSvgPathDef(f, shape);
|
||||
fputs("\"/></svg>\n", f);
|
||||
fclose(f);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool saveSvgShape(const Shape &shape, const Shape::Bounds &bounds, const char *filename) {
|
||||
if (FILE *f = fopen(filename, "w")) {
|
||||
fprintf(f, "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"%.17g %.17g %.17g %.17g\"><path", bounds.l, bounds.b, bounds.r-bounds.l, bounds.t-bounds.b);
|
||||
if (!shape.inverseYAxis)
|
||||
fprintf(f, " transform=\"translate(0 %.17g) scale(1 -1)\"", bounds.b+bounds.t);
|
||||
fputs(" d=\"", f);
|
||||
writeSvgPathDef(f, shape);
|
||||
fputs("\"/></svg>\n", f);
|
||||
fclose(f);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
Reference in New Issue
Block a user