SLA SVG export: Using string_view literals to avoid unnecessary
std::string allocations and faster string additions (length of a string_view literal is known without having to iterate to the trailing NULL).
This commit is contained in:
parent
41e31c31b6
commit
0508754033
@ -6,6 +6,8 @@
|
|||||||
#include <limits>
|
#include <limits>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
#include <string_view>
|
||||||
|
using namespace std::literals;
|
||||||
|
|
||||||
namespace Slic3r {
|
namespace Slic3r {
|
||||||
|
|
||||||
@ -77,20 +79,23 @@ void append_svg(std::string &buf, const Polygon &poly)
|
|||||||
|
|
||||||
char intbuf[coord_t_bufsize];
|
char intbuf[coord_t_bufsize];
|
||||||
|
|
||||||
buf += std::string("<path d=\"M ") + decimal_from(c.x(), intbuf);
|
buf += "<path d=\"M "sv;
|
||||||
buf += std::string(" ") + decimal_from(c.y(), intbuf) + " m";
|
buf += decimal_from(c.x(), intbuf);
|
||||||
|
buf += " "sv;
|
||||||
|
buf += decimal_from(c.y(), intbuf);
|
||||||
|
buf += " m"sv;
|
||||||
|
|
||||||
for (auto &p : poly) {
|
for (auto &p : poly) {
|
||||||
auto d = p - c;
|
auto d = p - c;
|
||||||
if (d.squaredNorm() == 0) continue;
|
if (d.squaredNorm() == 0) continue;
|
||||||
buf += " ";
|
buf += " "sv;
|
||||||
buf += decimal_from(p.x() - c.x(), intbuf);
|
buf += decimal_from(p.x() - c.x(), intbuf);
|
||||||
buf += " ";
|
buf += " "sv;
|
||||||
buf += decimal_from(p.y() - c.y(), intbuf);
|
buf += decimal_from(p.y() - c.y(), intbuf);
|
||||||
c = p;
|
c = p;
|
||||||
}
|
}
|
||||||
buf += " z\""; // mark path as closed
|
buf += " z\""sv; // mark path as closed
|
||||||
buf += " />\n";
|
buf += " />\n"sv;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
@ -167,12 +172,12 @@ public:
|
|||||||
sla::EncodedRaster encode(sla::RasterEncoder /*encoder*/) const override
|
sla::EncodedRaster encode(sla::RasterEncoder /*encoder*/) const override
|
||||||
{
|
{
|
||||||
std::vector<uint8_t> data;
|
std::vector<uint8_t> data;
|
||||||
constexpr const char finish[] = "</svg>\n";
|
constexpr auto finish = "</svg>\n"sv;
|
||||||
|
|
||||||
data.reserve(m_svg.size() + std::size(finish));
|
data.reserve(m_svg.size() + std::size(finish));
|
||||||
|
|
||||||
std::copy(m_svg.begin(), m_svg.end(), std::back_inserter(data));
|
std::copy(m_svg.begin(), m_svg.end(), std::back_inserter(data));
|
||||||
std::copy(finish, finish + std::size(finish) - 1, std::back_inserter(data));
|
std::copy(finish.begin(), finish.end() - 1, std::back_inserter(data));
|
||||||
|
|
||||||
return sla::EncodedRaster{std::move(data), "svg"};
|
return sla::EncodedRaster{std::move(data), "svg"};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user