diff options
Diffstat (limited to 'src/sp-metrics.cpp')
| -rw-r--r-- | src/sp-metrics.cpp | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/src/sp-metrics.cpp b/src/sp-metrics.cpp new file mode 100644 index 000000000..27d65422f --- /dev/null +++ b/src/sp-metrics.cpp @@ -0,0 +1,108 @@ +#include "sp-metrics.h" +#include "unit-constants.h" + +/* + * SPMetric handling and stuff + * I hope this will be usefull :-) + */ + +gdouble +sp_absolute_metric_to_metric (gdouble length_src, const SPMetric metric_src, const SPMetric metric_dst) +{ + gdouble src = 1; + gdouble dst = 1; + + switch (metric_src) { + case SP_M: + src = M_PER_IN; + break; + case SP_MM: + src = MM_PER_IN; + break; + case SP_CM: + src = CM_PER_IN; + break; + case SP_IN: + src = IN_PER_IN; + break; + case SP_PT: + src = PT_PER_IN; + break; + case SP_PX: + src = PX_PER_IN; + break; + case NONE: + src = 1; + break; + } + + switch (metric_dst) { + case SP_M: + dst = M_PER_IN; + break; + case SP_MM: + dst = MM_PER_IN; + break; + case SP_CM: + dst = CM_PER_IN; + break; + case SP_IN: + dst = IN_PER_IN; + break; + case SP_PT: + dst = PT_PER_IN; + break; + case SP_PX: + dst = PX_PER_IN; + break; + case NONE: + dst = 1; + break; + } + + return length_src * (dst/src); +} + +/** + * Create a human-readable string suitable for status-bar display. + */ +GString * +sp_metric_to_metric_string(gdouble const length, + SPMetric const metric_src, SPMetric const metric_dst, + gboolean const m) +{ + gdouble const len = sp_absolute_metric_to_metric(length, metric_src, metric_dst); + GString *str = g_string_new(""); + g_string_printf(str, "%0.02f", len); + /* We need a fixed number of fractional digits, because otherwise the live statusbar display of + * lengths will be too jerky */ + + if (m) { + char const *unit_str; + switch (metric_dst) { + case SP_M: unit_str = " m"; break; + case SP_MM: unit_str = " mm"; break; + case SP_CM: unit_str = " cm"; break; + case SP_IN: unit_str = "\""; break; + case SP_PT: unit_str = " pt"; break; + case SP_PX: unit_str = " px"; break; + default: unit_str = NULL; break; + } + if (unit_str) { + g_string_append(str, unit_str); + } + } + return str; +} + + +/* + 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 : |
