~inkscape.dev/inkscape/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#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_FT:
    src = FT_PER_IN;
    break;
  case SP_PT:
    src = PT_PER_IN;
    break;
  case SP_PC:
    src = PC_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_FT:
    dst = FT_PER_IN;
    break;
  case SP_PT:
    dst = PT_PER_IN;
    break;
  case SP_PC:
    dst = PC_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:fileencoding=utf-8:textwidth=99 :