Code

Mnemonics in "Input devices", and LPE dialogs (Bug 170765)
[inkscape.git] / src / libnrtype / nr-type-pos-def.cpp
1 #include "nr-type-pos-def.h"
2 #include <glib.h>
3 #include <string.h>
5 /**
6  * Given a font name or style name, returns a constant describing its
7  * apparent style (normal/italic/oblique).
8 */
9 int
10 parse_name_for_style (char const *cc)
11 {
12         g_assert ( cc != NULL );
13         gchar *c = g_ascii_strdown (cc, -1);
15         gint style;
16         // first dab at i18n... french and german 
17         if (strstr (c, "italic") || strstr (c, "italique") || strstr (c, "kursiv")) { 
18                 style = NR_POS_STYLE_ITALIC;
19         } else if (strstr (c, "oblique")) { 
20                 style = NR_POS_STYLE_OBLIQUE;
21         } else {
22                 style = NR_POS_STYLE_NORMAL;
23         }
25         g_free (c);
26         return style;
27 }
30 /**
31  * Given a font name or style name, returns a constant describing its
32  * apparent weight.
33 */
34 int
35 parse_name_for_weight (char const *cc)
36 {
37         g_assert ( cc != NULL );
38         gchar *c = g_ascii_strdown (cc, -1);
40         gint weight;
41         if (strstr (c, "thin")) {
42                 weight = NR_POS_WEIGHT_THIN;
43         } else if (strstr (c, "extra light")) {
44                 weight = NR_POS_WEIGHT_EXTRA_LIGHT;
45         } else if (strstr (c, "ultra light")) {
46                 weight = NR_POS_WEIGHT_ULTRA_LIGHT;
47         } else if (strstr (c, "light")) {
48                 weight = NR_POS_WEIGHT_LIGHT;
49         } else if (strstr (c, "book")) {
50                 weight = NR_POS_WEIGHT_BOOK;
51         } else if (strstr (c, "medium")) {
52                 weight = NR_POS_WEIGHT_MEDIUM;
53         } else if (strstr (c, "semi bold")) {
54                 weight = NR_POS_WEIGHT_SEMIBOLD;
55         } else if (strstr (c, "semibold")) {
56                 weight = NR_POS_WEIGHT_SEMIBOLD;
57         } else if (strstr (c, "demi bold")) {
58                 weight = NR_POS_WEIGHT_DEMIBOLD;
59         } else if (strstr (c, "demibold") || strstr (c, "demi")) {
60                 weight = NR_POS_WEIGHT_DEMIBOLD;
61         } else if (strstr (c, "ultra bold")) {
62                 weight = NR_POS_WEIGHT_ULTRA_BOLD;
63         } else if (strstr (c, "extra bold") || strstr (c, "xbold") || strstr (c, "xtrabold")) {
64                 weight = NR_POS_WEIGHT_EXTRA_BOLD;
65         } else if (strstr (c, "black") || strstr (c, "heavy")) {
66                 weight = NR_POS_WEIGHT_BLACK;
67         } else if (strstr (c, "bold")) {
68                 /* Must come after the checks for `blah bold'. */
69                 weight = NR_POS_WEIGHT_BOLD;
70         } else {
71                 weight = NR_POS_WEIGHT_NORMAL;
72         }
74         g_free (c);
75         return weight;
76 }
78 /**
79  * Given a font name or style name, returns a constant describing its
80  * apparent stretch.
81 */
82 int
83 parse_name_for_stretch (char const *cc)
84 {
85         g_assert ( cc != NULL );
86         gchar *c = g_ascii_strdown (cc, -1);
88         gint stretch;
89         if (strstr (c, "ultra narrow") || strstr (c, "ultra condensed") || strstr (c, "extra condensed")) {
90                 stretch = NR_POS_STRETCH_EXTRA_CONDENSED;
91         } else if (strstr (c, "ultra wide") || strstr (c, "ultra expanded") || strstr (c, "ultra extended")  || strstr (c, "extra expanded")) {
92                 stretch = NR_POS_STRETCH_EXTRA_EXPANDED;
93         } else if (strstr (c, "semi condensed") || strstr (c, "semicondensed")) {
94                 stretch = NR_POS_STRETCH_SEMI_CONDENSED;
95         } else if (strstr (c, "semi extended") || strstr (c, "semiextended")) {
96                 stretch = NR_POS_STRETCH_SEMI_EXPANDED;
97         } else if (strstr (c, "narrow") || strstr (c, "condensed")) {
98                 stretch = NR_POS_STRETCH_CONDENSED;
99         } else if (strstr (c, "wide") || strstr (c, "expanded") || strstr (c, "extended")) {
100                 stretch = NR_POS_STRETCH_EXPANDED;
101         } else {
102                 stretch = NR_POS_STRETCH_NORMAL;
103         }
105         g_free (c);
106         return stretch;
109 /**
110  * Given a font name or style name, returns a constant describing its
111  * apparent variant (normal/smallcaps).
112 */
113 int
114 parse_name_for_variant (char const *cc)
116         g_assert ( cc != NULL );
117         gchar *c = g_ascii_strdown (cc, -1);
119         gint variant;
120         if (strstr (c, "small caps") || strstr (c, "smallcaps") || strstr (c, "caps")) {
121                 variant = NR_POS_VARIANT_SMALLCAPS;
122         } else {
123                 variant = NR_POS_VARIANT_NORMAL;
124         }
126         g_free (c);
127         return variant;
130 /**
131  * Given a style constant, returns the CSS value for font-style.
132 */
133 const char *
134 style_to_css (int style)
136         switch (style) {
137         case NR_POS_STYLE_NORMAL:
138                 return "normal";
139                 break;
140   case NR_POS_STYLE_ITALIC:
141                 return "italic";
142                 break;
143   case NR_POS_STYLE_OBLIQUE:
144                 return "oblique";
145                 break;
146         default:
147                 break;
148         }
149         return NULL;
153 /**
154  * Given a weight constant, returns the CSS value for font-weight.
155 */
156 const char *
157 weight_to_css (int weight)
159         switch (weight) {
160         case NR_POS_WEIGHT_THIN:
161                 return "100";
162                 break;
163   case NR_POS_WEIGHT_EXTRA_LIGHT:
164                 return "200";
165                 break;
166   case NR_POS_WEIGHT_LIGHT:
167                 return "300";
168                 break;
169   case NR_POS_WEIGHT_BOOK:
170                 return "normal";
171                 break;
172   case NR_POS_WEIGHT_MEDIUM:
173                 return "500";
174                 break;
175   case NR_POS_WEIGHT_SEMIBOLD:
176                 return "600";
177                 break;
178   case NR_POS_WEIGHT_BOLD:
179                 return "bold";
180                 break;
181   case NR_POS_WEIGHT_EXTRA_BOLD:
182                 return "800";
183                 break;
184         case NR_POS_WEIGHT_BLACK:
185                 return "900";
186                 break;
187         default:
188                 break;
189         }
190         return NULL;
193 /**
194  * Given a stretch constant, returns the CSS value for font-stretch.
195 */
196 const char *
197 stretch_to_css (int stretch)
199         switch (stretch) {
200         case NR_POS_STRETCH_EXTRA_CONDENSED:
201                 return "extra-condensed";
202                 break;
203         case NR_POS_STRETCH_CONDENSED:
204                 return "condensed";
205                 break;
206         case NR_POS_STRETCH_SEMI_CONDENSED:
207                 return "semi-condensed";
208                 break;
209         case NR_POS_STRETCH_NORMAL:
210                 return "normal";
211                 break;
212         case NR_POS_STRETCH_SEMI_EXPANDED:
213                 return "semi-expanded";
214                 break;
215         case NR_POS_STRETCH_EXPANDED:
216                 return "expanded";
217                 break;
218         case NR_POS_STRETCH_EXTRA_EXPANDED:
219                 return "extra-expanded";
220                 break;
221         default:
222                 break;
223         }
224         return NULL;
227 /**
228  * Given a variant constant, returns the CSS value for font-variant.
229 */
230 const char *
231 variant_to_css (int stretch)
233         switch (stretch) {
234         case NR_POS_VARIANT_SMALLCAPS:
235                 return "small-caps";
236                 break;
237         case NR_POS_VARIANT_NORMAL:
238                 return "normal";
239                 break;
240         default:
241                 break;
242         }
243         return NULL;
247 /**
248  * Constructor for NRTypePostDef.  Sets the italic, oblique, weight,
249  * stretch, and variant.
250  */
251 NRTypePosDef::NRTypePosDef(char const *description) {
252         // we cannot use strcasestr, it's linux only... so we must lowercase the string first
253         g_assert ( description != NULL );
254         gchar *c = g_ascii_strdown (description, -1);
256         /* copied from nr-type-directory.cpp:nr_type_calculate_position. */
258         italic = (strstr (c, "italic") != NULL);
259         oblique = (strstr (c, "oblique") != NULL);
261         weight = parse_name_for_weight (c);
263         stretch = parse_name_for_stretch (c);
265         variant = parse_name_for_variant (c);
267         g_free (c);