diff options
Diffstat (limited to 'src/svg/stringstream.cpp')
| -rw-r--r-- | src/svg/stringstream.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/src/svg/stringstream.cpp b/src/svg/stringstream.cpp new file mode 100644 index 000000000..3cbfcd86b --- /dev/null +++ b/src/svg/stringstream.cpp @@ -0,0 +1,69 @@ +#include "svg/stringstream.h" +#include "svg/strip-trailing-zeros.h" + +Inkscape::SVGOStringStream::SVGOStringStream() +{ + /* These two are probably unnecessary now that we provide our own operator<< for float and + * double. */ + ostr.imbue(std::locale::classic()); + ostr.setf(std::ios::showpoint); + + /* This one is (currently) needed though, as we currently use ostr.precision as a sort of + variable for storing the desired precision: see our two precision methods and our operator<< + methods for float and double. */ + ostr.precision(8); +} + +Inkscape::SVGOStringStream & +operator<<(Inkscape::SVGOStringStream &os, float d) +{ + /* Try as integer first. */ + { + long const n = long(d); + if (d == n) { + os << n; + return os; + } + } + + std::ostringstream s; + s.imbue(std::locale::classic()); + s.setf(std::ios::showpoint); + s.precision(os.precision()); + s << d; + os << strip_trailing_zeros(s.str()); + return os; +} + +Inkscape::SVGOStringStream & +operator<<(Inkscape::SVGOStringStream &os, double d) +{ + /* Try as integer first. */ + { + long const n = long(d); + if (d == n) { + os << n; + return os; + } + } + + std::ostringstream s; + s.imbue(std::locale::classic()); + s.setf(std::ios::showpoint); + s.precision(os.precision()); + s << d; + os << strip_trailing_zeros(s.str()); + return os; +} + + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : |
