1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /*
3  * This file is part of the libmspub project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  */
9 
10 #include "PolygonUtils.h"
11 
12 #include <algorithm>
13 #include <math.h>
14 
15 #include <librevenge/librevenge.h>
16 
17 #include "ColorReference.h"
18 #include "Line.h"
19 #include "MSPUBCollector.h"
20 #include "ShapeType.h"
21 #include "VectorTransformation2D.h"
22 #include "libmspub_utils.h"
23 
24 #define CALCULATED_VALUE(val) (int(unsigned(val) | 0x80000000))
25 
26 namespace libmspub
27 {
28 
29 const Vertex LINE_VERTICES[] =
30 {
31   {0, 0}, {21600, 21600}
32 };
33 
34 const CustomShape CS_LINE(
35   LINE_VERTICES, sizeof(LINE_VERTICES) / sizeof(Vertex),
36   nullptr, 0,
37   nullptr, 0,
38   nullptr, 0,
39   nullptr, 0,
40   21600, 21600,
41   nullptr, 0);
42 
43 const Vertex WAVE_VERTICES[] =
44 {
45   {CALCULATED_VALUE(7), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(15), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(16), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(24), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(25), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(27), CALCULATED_VALUE(28)}, {CALCULATED_VALUE(29), CALCULATED_VALUE(1)}
46 };
47 
48 const unsigned short WAVE_SEGMENTS[] =
49 {
50   0x4000, 0x2001, 0x0001, 0x2001, 0x6000, 0x8000
51 };
52 
53 const Calculation WAVE_CALC[] =
54 {
55   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, 0x400}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, 0x402, 0, 10800}, {0x2001, 0x403, 2, 1}, {0x2003, 0x404, 0, 0}, {0x8000, 4320, 0, 0x405}, {0xa006, 0x403, 0, 0x405}, {0x4001, 15800, 0x400, 4460}, {0xa000, 0x400, 0, 0x408}, {0x6000, 0x400, 0x408, 0}, {0x8000, 21600, 0, 0x404}, {0x6006, 0x403, 0x40b, 21600}, {0xa000, 0x40c, 0, 0x407}, {0x2001, 0x405, 1, 2}, {0xa000, 0x407, 7200, 0x40e}, {0x6000, 0x40c, 0x40e, 7200}, {0x2001, 0x40d, 1, 2}, {0x6000, 0x407, 0x411, 0}, {0x8000, 21600, 0, 0x412}, {0x2001, 0x405, 1, 2}, {0x8000, 21600, 0, 0x414}, {0x2001, 0x400, 2, 1}, {0x8000, 21600, 0, 0x416}, {0x8000, 21600, 0, 0x407}, {0x8000, 21600, 0, 0x40f}, {0x6000, 0x401, 0x408, 0}, {0x8000, 21600, 0, 0x410}, {0xa000, 0x401, 0, 0x408}, {0x8000, 21600, 0, 0x40c}
56 };
57 
58 const TextRectangle WAVE_TRS[] =
59 {
60   { {CALCULATED_VALUE(5), CALCULATED_VALUE(22)}, {CALCULATED_VALUE(11), CALCULATED_VALUE(23)} }
61 };
62 
63 const int WAVE_DEFAULT_ADJUST[] =
64 {
65   1400, 10800
66 };
67 
68 const Vertex WAVE_GLUE_POINTS[] =
69 {
70   {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(0x14), 10800}, {CALCULATED_VALUE(0x13), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0x15), 10800}
71 };
72 
73 const CustomShape CS_WAVE(
74   WAVE_VERTICES, sizeof(WAVE_VERTICES) / sizeof(Vertex),
75   WAVE_SEGMENTS, sizeof(WAVE_SEGMENTS) / sizeof(unsigned short),
76   WAVE_CALC, sizeof(WAVE_CALC) / sizeof(Calculation),
77   WAVE_DEFAULT_ADJUST, sizeof(WAVE_DEFAULT_ADJUST) / sizeof(int),
78   WAVE_TRS, sizeof(WAVE_TRS) / sizeof(TextRectangle),
79   21600, 21600,
80   WAVE_GLUE_POINTS, sizeof(WAVE_GLUE_POINTS) / sizeof(Vertex));
81 
82 const Vertex FOLDED_CORNER_VERTICES[] =
83 {
84   {0, 0}, {21600, 0}, {21600, CALCULATED_VALUE(0)}, {CALCULATED_VALUE(0), 21600}, {0, 21600}, {CALCULATED_VALUE(0), 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(8), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(10), CALCULATED_VALUE(11)}, {21600, CALCULATED_VALUE(0)}
85 };
86 
87 const unsigned short FOLDED_CORNER_SEGMENTS[] =
88 {
89   0x4000, 0x0004, 0x6001, 0x8000, 0x4000, 0x0001, 0x2001, 0x6001, 0x8000
90 };
91 
92 const Calculation FOLDED_CORNER_CALC[] =
93 {
94   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, 0x400}, {0x2001, 0x0401, 8000, 10800}, {0x8000, 21600, 0, 0x0402}, {0x2001, 0x0401, 1, 2}, {0x2001, 0x0401, 1, 4}, {0x2001, 0x0401, 1, 7}, {0x2001, 0x0401, 1, 16}, {0x6000, 0x0403, 0x405, 0}, {0x6000, 0x0400, 0x406, 0}, {0x8000, 21600, 0, 0x404}, {0x6000, 0x400, 0x407, 0}
95 };
96 
97 const TextRectangle FOLDED_CORNER_TRS[] =
98 {
99   { {0, 0}, {21600, CALCULATED_VALUE(11)} }
100 };
101 
102 const int FOLDED_CORNER_DEFAULT_ADJUST[] =
103 {
104   18900
105 };
106 
107 const Vertex FOLDED_CORNER_GLUE_POINTS[] =
108 {
109   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
110 };
111 
112 const CustomShape CS_FOLDED_CORNER(
113   FOLDED_CORNER_VERTICES, sizeof(FOLDED_CORNER_VERTICES) / sizeof(Vertex),
114   FOLDED_CORNER_SEGMENTS, sizeof(FOLDED_CORNER_SEGMENTS) / sizeof(unsigned short),
115   FOLDED_CORNER_CALC, sizeof(FOLDED_CORNER_CALC) / sizeof(Calculation),
116   FOLDED_CORNER_DEFAULT_ADJUST, sizeof(FOLDED_CORNER_DEFAULT_ADJUST) / sizeof(int),
117   FOLDED_CORNER_TRS, sizeof(FOLDED_CORNER_TRS) / sizeof(TextRectangle),
118   21600, 21600,
119   FOLDED_CORNER_GLUE_POINTS, sizeof(FOLDED_CORNER_GLUE_POINTS) / sizeof(Vertex));
120 
121 
122 const Vertex LEFT_ARROW_VERTICES[] =
123 {
124   {21600, CALCULATED_VALUE(0)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(1), 0}, {0, 10800}, {CALCULATED_VALUE(1), 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {21600, CALCULATED_VALUE(2)}
125 };
126 
127 const unsigned short LEFT_ARROW_SEGMENTS[] =
128 {
129   0x4000, 0x0006, 0x6001, 0x8000
130 };
131 
132 const Calculation LEFT_ARROW_CALC[] =
133 {
134   {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x8000, 21600, 0, 0x401}, {0x6001, 0x403, 0x400, 10800}, {0x6000, 0x401, 0x404, 0}, {0x6001, 0x401, 0x400, 10800}, {0xa000, 0x401, 0, 0x406}
135 };
136 
137 const TextRectangle LEFT_ARROW_TRS[] =
138 {
139   { {CALCULATED_VALUE(7), CALCULATED_VALUE(0)}, {21600, CALCULATED_VALUE(2)} }
140 };
141 
142 const int LEFT_ARROW_DEFAULT_ADJUST[] =
143 {
144   5400, 5400
145 };
146 
147 const CustomShape CS_LEFT_ARROW(
148   LEFT_ARROW_VERTICES, sizeof(LEFT_ARROW_VERTICES) / sizeof(Vertex),
149   LEFT_ARROW_SEGMENTS, sizeof(LEFT_ARROW_SEGMENTS) / sizeof(unsigned short),
150   LEFT_ARROW_CALC, sizeof(LEFT_ARROW_CALC) / sizeof(Calculation),
151   LEFT_ARROW_DEFAULT_ADJUST, sizeof(LEFT_ARROW_DEFAULT_ADJUST) / sizeof(int),
152   LEFT_ARROW_TRS, sizeof(LEFT_ARROW_TRS) / sizeof(TextRectangle),
153   21600, 21600,
154   nullptr, 0);
155 
156 const Vertex UP_DOWN_ARROW_VERTICES[] =
157 {
158   {0, CALCULATED_VALUE(1)}, {10800, 0}, {21600, CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}, {21600, CALCULATED_VALUE(3)}, {10800, 21600}, {0, CALCULATED_VALUE(3)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(1)}
159 };
160 
161 const unsigned short UP_DOWN_ARROW_SEGMENTS[] =
162 {
163   0x4000, 0x0009, 0x6001, 0x8000
164 };
165 
166 const Calculation UP_DOWN_ARROW_CALC[] =
167 {
168   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x6001, PROP_ADJUST_VAL_FIRST, 0x404, 10800}, {0x8000, 21600, 0, 0x405}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x6001, PROP_ADJUST_VAL_FIRST + 1, 0x407, 10800}, {0x8000, 21600, 0, 0x408}
169 };
170 
171 const TextRectangle UP_DOWN_ARROW_TRS[] =
172 {
173   { {CALCULATED_VALUE(0), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(9)} }
174 };
175 
176 const int UP_DOWN_ARROW_DEFAULT_ADJUST[] =
177 {
178   5400, 4300
179 };
180 
181 const CustomShape CS_UP_DOWN_ARROW(
182   UP_DOWN_ARROW_VERTICES, sizeof(UP_DOWN_ARROW_VERTICES) / sizeof(Vertex),
183   UP_DOWN_ARROW_SEGMENTS, sizeof(UP_DOWN_ARROW_SEGMENTS) / sizeof(unsigned short),
184   UP_DOWN_ARROW_CALC, sizeof(UP_DOWN_ARROW_CALC) / sizeof(Calculation),
185   UP_DOWN_ARROW_DEFAULT_ADJUST, sizeof(UP_DOWN_ARROW_DEFAULT_ADJUST) / sizeof(int),
186   UP_DOWN_ARROW_TRS, sizeof(UP_DOWN_ARROW_TRS) / sizeof(TextRectangle),
187   21600, 21600,
188   nullptr, 0);
189 
190 const Vertex IRREGULAR_SEAL_1_VERTICES[] =
191 {
192   {10901, 5905}, {8458, 2399}, {7417, 6425}, {476, 2399}, {4732, 7722}, {106, 8718}, {3828, 11880}, {243, 14689}, {5772, 14041}, {4868, 17719}, {7819, 15730}, {8590, 21600}, {10637, 15038}, {13349, 19840}, {14125, 14561}, {18248, 18195}, {16938, 13044}, {21600, 13393}, {17710, 10579}, {21198, 8242}, {16806, 7417}, {18482, 4560}, {14257, 5429}, {14623, 106}, {10901, 5905}
193 };
194 
195 const TextRectangle IRREGULAR_SEAL_1_TRS[] =
196 {
197   { {5400, 6570}, {14160, 15290} }
198 };
199 
200 const Vertex IRREGULAR_SEAL_1_GLUE_POINTS[] =
201 {
202   {9722, 1887}, {0, 12875}, {11614, 18844}, {21600, 6646}
203 };
204 
205 const CustomShape CS_IRREGULAR_SEAL_1(
206   IRREGULAR_SEAL_1_VERTICES, sizeof(IRREGULAR_SEAL_1_VERTICES) / sizeof(Vertex),
207   nullptr, 0,
208   nullptr, 0,
209   nullptr, 0,
210   IRREGULAR_SEAL_1_TRS, sizeof(IRREGULAR_SEAL_1_TRS) / sizeof(TextRectangle),
211   21600, 21600,
212   IRREGULAR_SEAL_1_GLUE_POINTS, sizeof(IRREGULAR_SEAL_1_GLUE_POINTS) / sizeof(Vertex));
213 
214 const Vertex LIGHTNING_BOLT_VERTICES[] =
215 {
216   {8458, 0}, {0, 3923}, {7564, 8416}, {4993, 9720}, {12197, 13904}, {9987, 14934}, {21600, 21600}, {14768, 12911}, {16558, 12016}, {11030, 6840}, {12831, 6120}, {8458, 0}
217 };
218 
219 const TextRectangle LIGHTNING_BOLT_TRS[] =
220 {
221   { {8680, 7410}, {13970, 14190} }
222 };
223 
224 const Vertex LIGHTNING_BOLT_GLUE_POINTS[] =
225 {
226   {8458, 0}, {0, 3923}, {4993, 9720}, {9987, 14934}, {21600, 21600}, {16558, 12016}, {12831, 6120}
227 };
228 
229 const CustomShape CS_LIGHTNING_BOLT(
230   LIGHTNING_BOLT_VERTICES, sizeof(LIGHTNING_BOLT_VERTICES) / sizeof(Vertex),
231   nullptr, 0,
232   nullptr, 0,
233   nullptr, 0,
234   LIGHTNING_BOLT_TRS, sizeof(LIGHTNING_BOLT_TRS) / sizeof(TextRectangle),
235   21600, 21600,
236   LIGHTNING_BOLT_GLUE_POINTS, sizeof(LIGHTNING_BOLT_GLUE_POINTS) / sizeof(Vertex));
237 
238 const Vertex IRREGULAR_SEAL_2_VERTICES[] =
239 {
240   {11464, 4340}, {9722, 1887}, {8548, 6383}, {4503, 3626}, {5373, 7816}, {1174, 8270}, {3934, 11592}, {0, 12875}, {3329, 15372}, {1283, 17824}, {4804, 18239}, {4918, 21600}, {7525, 18125}, {8698, 19712}, {9871, 17371}, {11614, 18844}, {12178, 15937}, {14943, 17371}, {14640, 14348}, {18878, 15632}, {16382, 12311}, {18270, 11292}, {16986, 9404}, {21600, 6646}, {16382, 6533}, {18005, 3172}, {14524, 5778}, {14789, 0}, {11464, 4340}
241 };
242 
243 const TextRectangle IRREGULAR_SEAL_2_TRS[] =
244 {
245   { {5400, 6570}, {14160, 15290} }
246 };
247 
248 const Vertex IRREGULAR_SEAL_2_GLUE_POINTS[] =
249 {
250   {9722, 1887}, {0, 12875}, {11614, 18844}, {21600, 6646}
251 };
252 
253 const CustomShape CS_IRREGULAR_SEAL_2(
254   IRREGULAR_SEAL_2_VERTICES, sizeof(IRREGULAR_SEAL_2_VERTICES) / sizeof(Vertex),
255   nullptr, 0,
256   nullptr, 0,
257   nullptr, 0,
258   IRREGULAR_SEAL_2_TRS, sizeof(IRREGULAR_SEAL_2_TRS) / sizeof(TextRectangle),
259   21600, 21600,
260   IRREGULAR_SEAL_2_GLUE_POINTS, sizeof(IRREGULAR_SEAL_2_GLUE_POINTS) / sizeof(Vertex));
261 
262 
263 const Vertex HEART_VERTICES[] =
264 {
265   {10800, 21599}, {321, 6886}, {70, 6036}, {-9, 5766}, {-1, 5474}, {2, 5192}, {6, 4918}, {43, 4641}, {101, 4370}, {159, 4103}, {245, 3837}, {353, 3582}, {460, 3326}, {591, 3077}, {741, 2839}, {892, 2598}, {1066, 2369}, {1253, 2155}, {1443, 1938}, {1651, 1732}, {1874, 1543}, {2097, 1351}, {2337, 1174}, {2587, 1014}, {2839, 854}, {3106, 708}, {3380, 584}, {3656, 459}, {3945, 350}, {4237, 264}, {4533, 176}, {4838, 108}, {5144, 66}, {5454, 22}, {5771, 1}, {6086, 3}, {6407, 7}, {6731, 35}, {7048, 89}, {7374, 144}, {7700, 226}, {8015, 335}, {8344, 447}, {8667, 590}, {8972, 756}, {9297, 932}, {9613, 1135}, {9907, 1363}, {10224, 1609}, {10504, 1900}, {10802, 2169}, {11697, 1363}, {11971, 1116}, {12304, 934}, {12630, 756}, {12935, 590}, {13528, 450}, {13589, 335}, {13901, 226}, {14227, 144}, {14556, 89}, {14872, 35}, {15195, 7}, {15517, 3}, {15830, 0}, {16147, 22}, {16458, 66}, {16764, 109}, {17068, 177}, {17365, 264}, {17658, 349}, {17946, 458}, {18222, 584}, {18496, 708}, {18762, 854}, {19015, 1014}, {19264, 1172}, {19504, 1349}, {19730, 1543}, {19950, 1731}, {20158, 1937}, {20350, 2155}, {20536, 2369}, {20710, 2598}, {20861, 2839}, {21010, 3074}, {21143, 3323}, {21251, 3582}, {21357, 3835}, {21443, 4099}, {21502, 4370}, {21561, 4639}, {21595, 4916}, {21600, 5192}, {21606, 5474}, {21584, 5760}, {21532, 6036}, {21478, 6326}, {21366, 6603}, {21282, 6887}, {10802, 21602}
266 };
267 
268 const unsigned short HEART_SEGMENTS[] =
269 {
270   0x4000, 0x0002, 0x2010, 0x0001, 0x2010, 0x0001, 0x6001, 0x8000
271 };
272 
273 const TextRectangle HEART_TRS[] =
274 {
275   { {5080, 2540}, {16520, 13550} }
276 };
277 
278 const Vertex HEART_GLUE_POINTS[] =
279 {
280   {10800, 2180}, {3090, 10800}, {10800, 21600}, {18490, 10800}
281 };
282 
283 const CustomShape CS_HEART(
284   HEART_VERTICES, sizeof(HEART_VERTICES) / sizeof(Vertex),
285   HEART_SEGMENTS, sizeof(HEART_SEGMENTS) / sizeof(unsigned short),
286   nullptr, 0,
287   nullptr, 0,
288   HEART_TRS, sizeof(HEART_TRS) / sizeof(TextRectangle),
289   21600, 21600,
290   HEART_GLUE_POINTS, sizeof(HEART_GLUE_POINTS) / sizeof(Vertex));
291 
292 const Vertex QUAD_ARROW_VERTICES[] =
293 {
294   {0, 10800}, {CALCULATED_VALUE(0), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(0)}, {10800, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(1)}, {21600, 10800}, {CALCULATED_VALUE(5), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(5)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(5)}, {10800, 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(5)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(5)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(3)}
295 };
296 
297 const unsigned short QUAD_ARROW_SEGMENTS[] =
298 {
299   0x4000, 0x0017, 0x6001, 0x8000
300 };
301 
302 const Calculation QUAD_ARROW_CALC[] =
303 {
304   {0x2000, PROP_ADJUST_VAL_FIRST + 2, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 2}
305 };
306 
307 const TextRectangle QUAD_ARROW_TRS[] =
308 {
309   { {0, 0}, {21600, 21600} }
310 };
311 
312 const int QUAD_ARROW_DEFAULT_ADJUST[] =
313 {
314   6500, 8600, 4300
315 };
316 
317 const CustomShape CS_QUAD_ARROW(
318   QUAD_ARROW_VERTICES, sizeof(QUAD_ARROW_VERTICES) / sizeof(Vertex),
319   QUAD_ARROW_SEGMENTS, sizeof(QUAD_ARROW_SEGMENTS) / sizeof(unsigned short),
320   QUAD_ARROW_CALC, sizeof(QUAD_ARROW_CALC) / sizeof(Calculation),
321   QUAD_ARROW_DEFAULT_ADJUST, sizeof(QUAD_ARROW_DEFAULT_ADJUST) / sizeof(int),
322   QUAD_ARROW_TRS, sizeof(QUAD_ARROW_TRS) / sizeof(TextRectangle),
323   21600, 21600,
324   nullptr, 0);
325 
326 const Vertex BEVEL_VERTICES[] =
327 {
328   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}, {21600, 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(0)}, {21600, 0}, {21600, 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(0)}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(0), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {0, 21600}, {0, 0}, {CALCULATED_VALUE(0), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(2)}
329 };
330 
331 const unsigned short BEVEL_SEGMENTS[] =
332 {
333   0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000
334 };
335 
336 const Calculation BEVEL_CALC[] =
337 {
338   {0x2001, PROP_ADJUST_VAL_FIRST, 21599, 21600}, {0xa000, PROP_GEO_RIGHT, 0, 0x400}, {0xa000, PROP_GEO_BOTTOM, 0, 0x400}
339 };
340 
341 const TextRectangle BEVEL_TRS[] =
342 {
343   { {CALCULATED_VALUE(0), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)} }
344 };
345 
346 const int BEVEL_DEFAULT_ADJUST[] =
347 {
348   2700
349 };
350 
351 const CustomShape CS_BEVEL(
352   BEVEL_VERTICES, sizeof(BEVEL_VERTICES) / sizeof(Vertex),
353   BEVEL_SEGMENTS, sizeof(BEVEL_SEGMENTS) / sizeof(unsigned short),
354   BEVEL_CALC, sizeof(BEVEL_CALC) / sizeof(Calculation),
355   BEVEL_DEFAULT_ADJUST, sizeof(BEVEL_DEFAULT_ADJUST) / sizeof(int),
356   BEVEL_TRS, sizeof(BEVEL_TRS) / sizeof(TextRectangle),
357   21600, 21600,
358   nullptr, 0);
359 
360 const Vertex LEFT_BRACKET_VERTICES[] =
361 {
362   {21600, 0}, {10800, 0}, {0, CALCULATED_VALUE(3)}, {0, CALCULATED_VALUE(1)}, {0, CALCULATED_VALUE(2)}, {0, CALCULATED_VALUE(4)}, {10800, 21600}, {21600, 21600}
363 };
364 
365 const unsigned short LEFT_BRACKET_SEGMENTS[] =
366 {
367   0x4000, 0x2001, 0x0001, 0x2001, 0x8000
368 };
369 
370 const Calculation LEFT_BRACKET_CALC[] =
371 {
372   {0x2001, PROP_ADJUST_VAL_FIRST, 1, 2}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0x6000, PROP_GEO_TOP, 0x400, 0}, {0xa000, PROP_GEO_BOTTOM, 0, 0x400}
373 };
374 
375 const TextRectangle LEFT_BRACKET_TRS[] =
376 {
377   { {6350, CALCULATED_VALUE(3)}, {21600, CALCULATED_VALUE(4)} }
378 };
379 
380 const int LEFT_BRACKET_DEFAULT_ADJUST[] =
381 {
382   1800
383 };
384 
385 const Vertex LEFT_BRACKET_GLUE_POINTS[] =
386 {
387   {21600, 0}, {0, 10800}, {21600, 21600}
388 };
389 
390 const CustomShape CS_LEFT_BRACKET(
391   LEFT_BRACKET_VERTICES, sizeof(LEFT_BRACKET_VERTICES) / sizeof(Vertex),
392   LEFT_BRACKET_SEGMENTS, sizeof(LEFT_BRACKET_SEGMENTS) / sizeof(unsigned short),
393   LEFT_BRACKET_CALC, sizeof(LEFT_BRACKET_CALC) / sizeof(Calculation),
394   LEFT_BRACKET_DEFAULT_ADJUST, sizeof(LEFT_BRACKET_DEFAULT_ADJUST) / sizeof(int),
395   LEFT_BRACKET_TRS, sizeof(LEFT_BRACKET_TRS) / sizeof(TextRectangle),
396   21600, 21600,
397   LEFT_BRACKET_GLUE_POINTS, sizeof(LEFT_BRACKET_GLUE_POINTS) / sizeof(Vertex));
398 
399 const Vertex RIGHT_BRACKET_VERTICES[] =
400 {
401   {0, 0}, {10800, 0}, {21600, CALCULATED_VALUE(3)}, {21600, CALCULATED_VALUE(1)}, {21600, CALCULATED_VALUE(2)}, {21600, CALCULATED_VALUE(4)}, {10800, 21600}, {0, 21600}
402 };
403 
404 const unsigned short RIGHT_BRACKET_SEGMENTS[] =
405 {
406   0x4000, 0x2001, 0x0001, 0x2001, 0x8000
407 };
408 
409 const Calculation RIGHT_BRACKET_CALC[] =
410 {
411   {0x2001, PROP_ADJUST_VAL_FIRST, 1, 2}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0x6000, PROP_GEO_TOP, 0x400, 0}, {0xa000, PROP_GEO_BOTTOM, 0, 0x400}
412 };
413 
414 const TextRectangle RIGHT_BRACKET_TRS[] =
415 {
416   { {0, CALCULATED_VALUE(3)}, {15150, CALCULATED_VALUE(4)} }
417 };
418 
419 const int RIGHT_BRACKET_DEFAULT_ADJUST[] =
420 {
421   1800
422 };
423 
424 const Vertex RIGHT_BRACKET_GLUE_POINTS[] =
425 {
426   {0, 0}, {0, 21600}, {21600, 10800}
427 };
428 
429 const CustomShape CS_RIGHT_BRACKET(
430   RIGHT_BRACKET_VERTICES, sizeof(RIGHT_BRACKET_VERTICES) / sizeof(Vertex),
431   RIGHT_BRACKET_SEGMENTS, sizeof(RIGHT_BRACKET_SEGMENTS) / sizeof(unsigned short),
432   RIGHT_BRACKET_CALC, sizeof(RIGHT_BRACKET_CALC) / sizeof(Calculation),
433   RIGHT_BRACKET_DEFAULT_ADJUST, sizeof(RIGHT_BRACKET_DEFAULT_ADJUST) / sizeof(int),
434   RIGHT_BRACKET_TRS, sizeof(RIGHT_BRACKET_TRS) / sizeof(TextRectangle),
435   21600, 21600,
436   RIGHT_BRACKET_GLUE_POINTS, sizeof(RIGHT_BRACKET_GLUE_POINTS) / sizeof(Vertex));
437 
438 const Vertex LEFT_BRACE_VERTICES[] =
439 {
440   {21600, 0}, {16200, 0}, {10800, CALCULATED_VALUE(0)}, {10800, CALCULATED_VALUE(1)}, {10800, CALCULATED_VALUE(2)}, {10800, CALCULATED_VALUE(3)}, {5400, CALCULATED_VALUE(4)}, {0, CALCULATED_VALUE(4)}, {5400, CALCULATED_VALUE(4)}, {10800, CALCULATED_VALUE(5)}, {10800, CALCULATED_VALUE(6)}, {10800, CALCULATED_VALUE(7)}, {10800, CALCULATED_VALUE(8)}, {16200, 21600}, {21600, 21600}
441 };
442 
443 const unsigned short LEFT_BRACE_SEGMENTS[] =
444 {
445   0x4000, 0x2001, 0x0001, 0x2002, 0x0001, 0x2001, 0x8000
446 };
447 
448 const Calculation LEFT_BRACE_CALC[] =
449 {
450   {0x2001, PROP_ADJUST_VAL_FIRST, 1, 2}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0xa000, 0x404, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, 0x404, 0, 0x400}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x6000, 0x404, 0x400, 0}, {0x6000, 0x404, PROP_ADJUST_VAL_FIRST, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 21600, 0, 0x400}, {0x2001, PROP_ADJUST_VAL_FIRST, 10000, 31953}, {0x8000, 21600, 0, 0x409}
451 };
452 
453 const TextRectangle LEFT_BRACE_TRS[] =
454 {
455   { {13800, CALCULATED_VALUE(9)}, {21600, CALCULATED_VALUE(10)} }
456 };
457 
458 const int LEFT_BRACE_DEFAULT_ADJUST[] =
459 {
460   1800, 10800
461 };
462 
463 const Vertex LEFT_BRACE_GLUE_POINTS[] =
464 {
465   {21600, 0}, {0, 10800}, {21600, 21600}
466 };
467 
468 const CustomShape CS_LEFT_BRACE(
469   LEFT_BRACE_VERTICES, sizeof(LEFT_BRACE_VERTICES) / sizeof(Vertex),
470   LEFT_BRACE_SEGMENTS, sizeof(LEFT_BRACE_SEGMENTS) / sizeof(unsigned short),
471   LEFT_BRACE_CALC, sizeof(LEFT_BRACE_CALC) / sizeof(Calculation),
472   LEFT_BRACE_DEFAULT_ADJUST, sizeof(LEFT_BRACE_DEFAULT_ADJUST) / sizeof(int),
473   LEFT_BRACE_TRS, sizeof(LEFT_BRACE_TRS) / sizeof(TextRectangle),
474   21600, 21600,
475   LEFT_BRACE_GLUE_POINTS, sizeof(LEFT_BRACE_GLUE_POINTS) / sizeof(Vertex));
476 
477 const Vertex RIGHT_BRACE_VERTICES[] =
478 {
479   {0, 0}, {5400, 0}, {10800, CALCULATED_VALUE(0)}, {10800, CALCULATED_VALUE(1)}, {10800, CALCULATED_VALUE(2)}, {10800, CALCULATED_VALUE(3)}, {16200, CALCULATED_VALUE(4)}, {21600, CALCULATED_VALUE(4)}, {16200, CALCULATED_VALUE(4)}, {10800, CALCULATED_VALUE(5)}, {10800, CALCULATED_VALUE(6)}, {10800, CALCULATED_VALUE(7)}, {10800, CALCULATED_VALUE(8)}, {5400, 21600}, {0, 21600}
480 };
481 
482 const unsigned short RIGHT_BRACE_SEGMENTS[] =
483 {
484   0x4000, 0x2001, 0x0001, 0x2002, 0x0001, 0x2001, 0x8000
485 };
486 
487 const Calculation RIGHT_BRACE_CALC[] =
488 {
489   {0x2001, PROP_ADJUST_VAL_FIRST, 1, 2}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0xa000, 0x404, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, 0x404, 0, 0x400}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x6000, 0x404, 0x400, 0}, {0x6000, 0x404, PROP_ADJUST_VAL_FIRST, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 21600, 0, 0x400}, {0x2001, PROP_ADJUST_VAL_FIRST, 10000, 31953}, {0x8000, 21600, 0, 0x409}
490 };
491 
492 const TextRectangle RIGHT_BRACE_TRS[] =
493 {
494   { {0, CALCULATED_VALUE(9)}, {7800, CALCULATED_VALUE(10)} }
495 };
496 
497 const int RIGHT_BRACE_DEFAULT_ADJUST[] =
498 {
499   1800, 10800
500 };
501 
502 const Vertex RIGHT_BRACE_GLUE_POINTS[] =
503 {
504   {0, 0}, {0, 21600}, {21600, 10800}
505 };
506 
507 const CustomShape CS_RIGHT_BRACE(
508   RIGHT_BRACE_VERTICES, sizeof(RIGHT_BRACE_VERTICES) / sizeof(Vertex),
509   RIGHT_BRACE_SEGMENTS, sizeof(RIGHT_BRACE_SEGMENTS) / sizeof(unsigned short),
510   RIGHT_BRACE_CALC, sizeof(RIGHT_BRACE_CALC) / sizeof(Calculation),
511   RIGHT_BRACE_DEFAULT_ADJUST, sizeof(RIGHT_BRACE_DEFAULT_ADJUST) / sizeof(int),
512   RIGHT_BRACE_TRS, sizeof(RIGHT_BRACE_TRS) / sizeof(TextRectangle),
513   21600, 21600,
514   RIGHT_BRACE_GLUE_POINTS, sizeof(RIGHT_BRACE_GLUE_POINTS) / sizeof(Vertex));
515 
516 const Vertex LEFT_UP_ARROW_VERTICES[] =
517 {
518   {0, CALCULATED_VALUE(5)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(7)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(7)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(5), 0}, {21600, CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), 21600}
519 };
520 
521 const unsigned short LEFT_UP_ARROW_SEGMENTS[] =
522 {
523   0x4000, 0x000b, 0x6001, 0x8000
524 };
525 
526 const Calculation LEFT_UP_ARROW_CALC[] =
527 {
528   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 2, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x0403, 1, 2}, {0x6000, PROP_ADJUST_VAL_FIRST, 0x0404, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x6000, PROP_ADJUST_VAL_FIRST, 0x0406, 0}, {0x8000, 21600, 0, 0x406}, {0xa000, 0x408, 0, 0x406}
529 };
530 
531 const TextRectangle LEFT_UP_ARROW_TRS[] =
532 {
533   { {CALCULATED_VALUE(2), CALCULATED_VALUE(7)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(1)} }, { {CALCULATED_VALUE(7), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(1)} }
534 };
535 
536 const int LEFT_UP_ARROW_DEFAULT_ADJUST[] =
537 {
538   9340, 18500, 6200
539 };
540 
541 const CustomShape CS_LEFT_UP_ARROW(
542   LEFT_UP_ARROW_VERTICES, sizeof(LEFT_UP_ARROW_VERTICES) / sizeof(Vertex),
543   LEFT_UP_ARROW_SEGMENTS, sizeof(LEFT_UP_ARROW_SEGMENTS) / sizeof(unsigned short),
544   LEFT_UP_ARROW_CALC, sizeof(LEFT_UP_ARROW_CALC) / sizeof(Calculation),
545   LEFT_UP_ARROW_DEFAULT_ADJUST, sizeof(LEFT_UP_ARROW_DEFAULT_ADJUST) / sizeof(int),
546   LEFT_UP_ARROW_TRS, sizeof(LEFT_UP_ARROW_TRS) / sizeof(TextRectangle),
547   21600, 21600,
548   nullptr, 0);
549 
550 const Vertex SMILEY_FACE_VERTICES[] =
551 {
552   {10800, 10800}, {10800, 10800}, {0, 360}, {7305, 7515}, {1165, 1165}, {0, 360}, {14295, 7515}, {1165, 1165}, {0, 360}, {4870, CALCULATED_VALUE(1)}, {8680, CALCULATED_VALUE(2)}, {12920, CALCULATED_VALUE(2)}, {16730, CALCULATED_VALUE(1)}
553 };
554 
555 const unsigned short SMILEY_FACE_SEGMENTS[] =
556 {
557   0xa203, 0x6000, 0x8000, 0xa203, 0x6000, 0x8000, 0xa203, 0x6000, 0x8000, 0x4000, 0x2001, 0xaa00, 0x8000
558 };
559 
560 const Calculation SMILEY_FACE_CALC[] =
561 {
562   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 15510}, {0x8000, 17520, 0, 0x400}, {0x4000, 15510, 0x400, 0}
563 };
564 
565 const TextRectangle SMILEY_FACE_TRS[] =
566 {
567   { {3163, 3163}, {18437, 18437} }
568 };
569 
570 const int SMILEY_FACE_DEFAULT_ADJUST[] =
571 {
572   17520
573 };
574 
575 const Vertex SMILEY_FACE_GLUE_POINTS[] =
576 {
577   {10800, 0}, {3163, 3163}, {0, 10800}, {3163, 18437}, {10800, 21600}, {18437, 18437}, {21600, 10800}, {18437, 3163}
578 };
579 
580 const Vertex VERTICAL_SCROLL_VERTICES[] =
581 {
582   {CALCULATED_VALUE(1), 21600}, {0, CALCULATED_VALUE(11)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(4), 0}, {CALCULATED_VALUE(2), 0}, {21600, CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(5), 21600}, {CALCULATED_VALUE(6), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(8), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(1), 21600}, {0, CALCULATED_VALUE(11)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(9), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(4), 0}, {CALCULATED_VALUE(6), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(0)}
583 };
584 
585 const unsigned short VERTICAL_SCROLL_SEGMENTS[] =
586 {
587   0x4000, 0xa702, 0x0002, 0xa801, 0x0001, 0xa702, 0x0002, 0xa801, 0x6001, 0x8000, 0x4000, 0xa801, 0xa702, 0x6000, 0x8000, 0x4000, 0xa803, 0xa702, 0x6001, 0x8000, 0x4000, 0xa701, 0x8000, 0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
588 };
589 
590 const Calculation VERTICAL_SCROLL_CALC[] =
591 {
592   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2001, 0x400, 1, 2}, {0xa000, PROP_GEO_RIGHT, 0, 0x401}, {0xa000, PROP_GEO_RIGHT, 0, 0x400}, {0x6000, 0x400, 0x401, 0}, {0xa000, PROP_GEO_RIGHT, 0, 0x404}, {0x2001, 0x400, 2, 1}, {0x2001, 0x401, 1, 2}, {0x6000, 0x400, 0x407, 0}, {0x6000, 0x401, 0x407, 0}, {0xa000, PROP_GEO_BOTTOM, 0, 0x409}, {0xa000, PROP_GEO_BOTTOM, 0, 0x401}, {0xa000, PROP_GEO_BOTTOM, 0, 0x400}, {0xa000, PROP_GEO_BOTTOM, 0, 0x404}
593 };
594 
595 const TextRectangle VERTICAL_SCROLL_TRS[] =
596 {
597   { {CALCULATED_VALUE(0), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(12)} }
598 };
599 
600 const int VERTICAL_SCROLL_DEFAULT_ADJUST[] =
601 {
602   2700
603 };
604 
605 const Vertex HORIZONTAL_SCROLL_VERTICES[] =
606 {
607   {0, CALCULATED_VALUE(4)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), 0}, {21600, CALCULATED_VALUE(1)}, {21600, CALCULATED_VALUE(13)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(1), 21600}, {0, CALCULATED_VALUE(11)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(9), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(6)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), 0}, {21600, CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(6)}, {0, CALCULATED_VALUE(4)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(11)}
608 };
609 
610 const unsigned short HORIZONTAL_SCROLL_SEGMENTS[] =
611 {
612   0x4000, 0xa801, 0x0002, 0xa802, 0x0001, 0xa801, 0x0002, 0xa802, 0x6001, 0x8000, 0x4000, 0xa803, 0x6000, 0x8000, 0x4000, 0xa803, 0xa702, 0x6000, 0x8000, 0x4000, 0xa701, 0x8000, 0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
613 };
614 
615 const Calculation HORIZONTAL_SCROLL_CALC[] =
616 {
617   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2001, 0x400, 1, 2}, {0xa000, PROP_GEO_RIGHT, 0, 0x401}, {0xa000, PROP_GEO_RIGHT, 0, 0x400}, {0x6000, 0x400, 0x401, 0}, {0xa000, PROP_GEO_RIGHT, 0, 0x404}, {0x2001, 0x400, 2, 1}, {0x2001, 0x401, 1, 2}, {0x6000, 0x400, 0x407, 0}, {0x6000, 0x401, 0x407, 0}, {0xa000, PROP_GEO_BOTTOM, 0, 0x409}, {0xa000, PROP_GEO_BOTTOM, 0, 0x401}, {0xa000, PROP_GEO_BOTTOM, 0, 0x400}, {0xa000, PROP_GEO_BOTTOM, 0, 0x404}
618 };
619 
620 const TextRectangle HORIZONTAL_SCROLL_TRS[] =
621 {
622   { {CALCULATED_VALUE(0), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(12)} }
623 };
624 
625 const int HORIZONTAL_SCROLL_DEFAULT_ADJUST[] =
626 {
627   2700
628 };
629 
630 const Vertex CIRCULAR_ARROW_VERTICES[] =
631 {
632   {CALCULATED_VALUE(0x03), CALCULATED_VALUE(0x03)}, {CALCULATED_VALUE(0x14), CALCULATED_VALUE(0x14)}, {CALCULATED_VALUE(0x13), CALCULATED_VALUE(0x12)}, {CALCULATED_VALUE(0x11), CALCULATED_VALUE(0x10)}, {0, 0}, {21600, 21600}, {CALCULATED_VALUE(0x09), CALCULATED_VALUE(0x08)}, {CALCULATED_VALUE(0x0B), CALCULATED_VALUE(0x0A)}, {CALCULATED_VALUE(0x18), CALCULATED_VALUE(0x17)}, {CALCULATED_VALUE(0x2F), CALCULATED_VALUE(0x2E)}, {CALCULATED_VALUE(0x1D), CALCULATED_VALUE(0x1C)}
633 };
634 
635 const unsigned short CIRCULAR_ARROW_SEGMENTS[] =
636 {
637   0xa404, 0xa504, 0x0003, 0x6001, 0x8000
638 };
639 
640 const Calculation CIRCULAR_ARROW_CALC[] =
641 {
642   {0x2000, 0x0147, 0x0000, 0x0000}, {0x2000, 0x0148, 0x0000, 0x0000}, {0x2000, 0x0149, 0x0000, 0x0000}, {0x4000, 0x2A30, 0x0149, 0x0000}, {0x4009, 0x2A30, 0x0147, 0x0000}, {0x400A, 0x2A30, 0x0147, 0x0000}, {0x4009, 0x2A30, 0x0148, 0x0000}, {0x400A, 0x2A30, 0x0148, 0x0000}, {0x2000, 0x0404, 0x2A30, 0x0000}, {0x2000, 0x0405, 0x2A30, 0x0000}, {0x2000, 0x0406, 0x2A30, 0x0000}, {0x2000, 0x0407, 0x2A30, 0x0000}, {0x6009, 0x0403, 0x0147, 0x0000}, {0x600A, 0x0403, 0x0147, 0x0000}, {0x6009, 0x0403, 0x0148, 0x0000}, {0x600A, 0x0403, 0x0148, 0x0000}, {0x2000, 0x040C, 0x2A30, 0x0000}, {0x2000, 0x040D, 0x2A30, 0x0000}, {0x2000, 0x040E, 0x2A30, 0x0000}, {0x2000, 0x040F, 0x2A30, 0x0000}, {0x8000, 0x5460, 0x0000, 0x0403}, {0x4009, 0x34BC, 0x0148, 0x0000}, {0x400A, 0x34BC, 0x0148, 0x0000}, {0x2000, 0x0415, 0x2A30, 0x0000}, {0x2000, 0x0416, 0x2A30, 0x0000}, {0x2000, 0x0149, 0x0000, 0x0A8C}, {0x6009, 0x0419, 0x0148, 0x0000}, {0x600A, 0x0419, 0x0148, 0x0000}, {0x2000, 0x041A, 0x2A30, 0x0000}, {0x2000, 0x041B, 0x2A30, 0x0000}, {0xA000, 0x041D, 0x0000, 0x0418}, {0xA000, 0x041D, 0x0000, 0x0418}, {0x6001, 0x041E, 0x041F, 0x0001}, {0xA000, 0x041C, 0x0000, 0x0417}, {0xA000, 0x041C, 0x0000, 0x0417}, {0x6001, 0x0421, 0x0422, 0x0001}, {0x6000, 0x0420, 0x0423, 0x0000}, {0x200D, 0x0424, 0x0000, 0x0000}, {0x200E, 0x0148, 0x002D, 0x0000}, {0x6009, 0x0425, 0x0426, 0x0000}, {0x200E, 0x0148, 0x002D, 0x0000}, {0x600A, 0x0425, 0x0428, 0x0000}, {0x000E, 0x0000, 0x002D, 0x0000}, {0x6009, 0x0427, 0x042A, 0x0000}, {0x000E, 0x0000, 0x002D, 0x0000}, {0x6009, 0x0429, 0x042C, 0x0000}, {0x6000, 0x041C, 0x042B, 0x0000}, {0x6000, 0x041D, 0x042D, 0x0000}
643 };
644 
645 const TextRectangle CIRCULAR_ARROW_TRS[] =
646 {
647   { {0, 0}, {21600, 21600} }
648 };
649 
650 const int CIRCULAR_ARROW_DEFAULT_ADJUST[] =
651 {
652   180 << 16, 0, 5550
653 };
654 
655 const CustomShape CS_CIRCULAR_ARROW(
656   CIRCULAR_ARROW_VERTICES, sizeof(CIRCULAR_ARROW_VERTICES) / sizeof(Vertex),
657   CIRCULAR_ARROW_SEGMENTS, sizeof(CIRCULAR_ARROW_SEGMENTS) / sizeof(unsigned short),
658   CIRCULAR_ARROW_CALC, sizeof(CIRCULAR_ARROW_CALC) / sizeof(Calculation),
659   CIRCULAR_ARROW_DEFAULT_ADJUST, sizeof(CIRCULAR_ARROW_DEFAULT_ADJUST) / sizeof(int),
660   CIRCULAR_ARROW_TRS, sizeof(CIRCULAR_ARROW_TRS) / sizeof(TextRectangle),
661   21600, 21600,
662   nullptr, 0, 1 | 2);
663 
664 const Vertex U_TURN_ARROW_VERTICES[] =
665 {
666   {0, 21600}, {0, 8550}, {0, 3540}, {4370, 0}, {9270, 0}, {13890, 0}, {18570, 3230}, {18600, 8300}, {21600, 8300}, {15680, 14260}, {9700, 8300}, {12500, 8300}, {12320, 6380}, {10870, 5850}, {9320, 5850}, {7770, 5850}, {6040, 6410}, {6110, 8520}, {6110, 21600}
667 };
668 
669 const unsigned short U_TURN_ARROW_SEGMENTS[] =
670 {
671   0x4000, 0x0001, 0x2002, 0x0004, 0x2002, 0x0001, 0x6000, 0x8000
672 };
673 
674 const TextRectangle U_TURN_ARROW_TRS[] =
675 {
676   { {0, 8280}, {6110, 21600} }
677 };
678 
679 const CustomShape CS_U_TURN_ARROW(
680   U_TURN_ARROW_VERTICES, sizeof(U_TURN_ARROW_VERTICES) / sizeof(Vertex),
681   U_TURN_ARROW_SEGMENTS, sizeof(U_TURN_ARROW_SEGMENTS) / sizeof(unsigned short),
682   nullptr, 0,
683   nullptr, 0,
684   U_TURN_ARROW_TRS, sizeof(U_TURN_ARROW_TRS) / sizeof(TextRectangle),
685   21600, 21600,
686   nullptr, 0);
687 
688 const Vertex CURVED_RIGHT_ARROW_VERTICES[] =
689 {
690   {0, 0}, {CALCULATED_VALUE(23), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(22), 0}, {0, CALCULATED_VALUE(4)}, {0, CALCULATED_VALUE(15)}, {CALCULATED_VALUE(23), CALCULATED_VALUE(1)}, {0, CALCULATED_VALUE(7)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(13)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(14)}, {CALCULATED_VALUE(22), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(12)}, {0, 0}, {CALCULATED_VALUE(23), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(26), CALCULATED_VALUE(17)}, {0, CALCULATED_VALUE(15)}, {CALCULATED_VALUE(23), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(26), CALCULATED_VALUE(17)}, {CALCULATED_VALUE(22), CALCULATED_VALUE(15)}, {0, 0}, {CALCULATED_VALUE(23), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(22), 0}, {0, CALCULATED_VALUE(4)}, {0, 0}, {CALCULATED_VALUE(23), CALCULATED_VALUE(3)}, {0, CALCULATED_VALUE(4)}, {CALCULATED_VALUE(26), CALCULATED_VALUE(17)}, {0, CALCULATED_VALUE(15)}, {CALCULATED_VALUE(23), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(26), CALCULATED_VALUE(17)}, {CALCULATED_VALUE(22), CALCULATED_VALUE(15)}
691 };
692 
693 const unsigned short CURVED_RIGHT_ARROW_SEGMENTS[] =
694 {
695   0xa404, 0xA304, 0x0003, 0xa508, 0x6000, 0x8000, 0xa404, 0xa304, 0xa504, 0x6000, 0x8000
696 };
697 
698 const Calculation CURVED_RIGHT_ARROW_CALC[] =
699 {
700   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 2, 0, 0}, {0xa000, PROP_ADJUST_VAL_FIRST, 21600, PROP_ADJUST_VAL_FIRST + 1}, {0x2001, 0x403, 1, 2}, {0x6000, PROP_ADJUST_VAL_FIRST + 1, PROP_ADJUST_VAL_FIRST + 1, 21600}, {0xe000, 0x405, PROP_ADJUST_VAL_FIRST + 1, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x406, 1, 2}, {0x4002, 21600, PROP_ADJUST_VAL_FIRST, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 2}, {0xa00f, 0x409, 21600, 0x404}, {0x6000, 0x404, 0x40a, 0}, {0x6000, 0x40b, PROP_ADJUST_VAL_FIRST + 1, 21600}, {0x6000, 0x407, 0x40a, 0}, {0xa000, 0x40c, 21600, PROP_ADJUST_VAL_FIRST}, {0xa000, 0x405, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x40f, 1, 2}, {0x6002, 0x404, 0x407, 0}, {0x6000, PROP_ADJUST_VAL_FIRST, PROP_ADJUST_VAL_FIRST + 1, 21600}, {0x2001, 0x412, 1, 2}, {0xa000, 0x411, 0, 0x413}, {0x0000, 21600, 0, 0}, {0x0000, 21600, 0, 0}, {0x0001, 21600, 2, 1}, {0xa000, 0x411, 0, 0x404}, {0x600f, 0x418, 0x404, 21600}, {0x8000, 21600, 0, 0x419}, {0x2000, 0x408, 128, 0}, {0x2001, 0x405, 1, 2}, {0x2000, 0x405, 0, 128}, {0xe000, PROP_ADJUST_VAL_FIRST, 0x411, 0x40c}, {0x600f, 0x414, 0x404, 21600}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x420, 1, 2}, {0x0001, 21600, 21600, 1}, {0x6001, 0x409, 0x409, 1}, {0xa000, 0x422, 0, 0x423}, {0x200d, 0x424, 0, 0}, {0x2000, 0x425, 21600, 0}, {0x8001, 21600, 21600, 0x426}, {0x2000, 0x427, 64, 0}, {0x2001, PROP_ADJUST_VAL_FIRST, 1, 2}, {0x600f, 0x421, 0x429, 21600}, {0x8000, 21600, 0, 0x42a}, {0x2000, 0x42b, 64, 0}, {0x2001, 0x404, 1, 2}, {0xa000, PROP_ADJUST_VAL_FIRST + 1, 0, 0x42d}, {0x0001, 21600, 2195, 16384}, {0x0001, 21600, 14189, 16384}
701 };
702 
703 const TextRectangle CURVED_RIGHT_ARROW_TRS[] =
704 {
705   { {CALCULATED_VALUE(47), CALCULATED_VALUE(45)}, {CALCULATED_VALUE(48), CALCULATED_VALUE(46)} }
706 };
707 
708 const int CURVED_RIGHT_ARROW_DEFAULT_ADJUST[] =
709 {
710   12960, 19440, 14400
711 };
712 
713 const Vertex CURVED_RIGHT_ARROW_GLUE_POINTS[] =
714 {
715   {0, CALCULATED_VALUE(17)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(14)}, {CALCULATED_VALUE(22), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(22), CALCULATED_VALUE(16)}
716 };
717 
718 const CustomShape CS_CURVED_RIGHT_ARROW(
719   CURVED_RIGHT_ARROW_VERTICES, sizeof(CURVED_RIGHT_ARROW_VERTICES) / sizeof(Vertex),
720   CURVED_RIGHT_ARROW_SEGMENTS, sizeof(CURVED_RIGHT_ARROW_SEGMENTS) / sizeof(unsigned short),
721   CURVED_RIGHT_ARROW_CALC, sizeof(CURVED_RIGHT_ARROW_CALC) / sizeof(Calculation),
722   CURVED_RIGHT_ARROW_DEFAULT_ADJUST, sizeof(CURVED_RIGHT_ARROW_DEFAULT_ADJUST) / sizeof(int),
723   CURVED_RIGHT_ARROW_TRS, sizeof(CURVED_RIGHT_ARROW_TRS) / sizeof(TextRectangle),
724   21600, 21600,
725   CURVED_RIGHT_ARROW_GLUE_POINTS, sizeof(CURVED_RIGHT_ARROW_GLUE_POINTS) / sizeof(Vertex));
726 
727 const Vertex CURVED_LEFT_ARROW_VERTICES[] =
728 {
729   {CALCULATED_VALUE(22), 0}, {CALCULATED_VALUE(21), CALCULATED_VALUE(3)}, {0, 0}, {CALCULATED_VALUE(21), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(22), CALCULATED_VALUE(14)}, {CALCULATED_VALUE(21), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(21), CALCULATED_VALUE(7)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(13)}, {0, CALCULATED_VALUE(8)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(22), 0}, {CALCULATED_VALUE(21), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(24), CALCULATED_VALUE(16)}, {CALCULATED_VALUE(22), CALCULATED_VALUE(14)}, {CALCULATED_VALUE(21), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(24), CALCULATED_VALUE(16)}, {0, CALCULATED_VALUE(14)}, {CALCULATED_VALUE(22), 0}, {CALCULATED_VALUE(21), CALCULATED_VALUE(3)}, {0, 0}, {CALCULATED_VALUE(21), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(22), CALCULATED_VALUE(14)}, {CALCULATED_VALUE(21), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(21), CALCULATED_VALUE(7)}, {CALCULATED_VALUE(24), CALCULATED_VALUE(16)}, {CALCULATED_VALUE(22), CALCULATED_VALUE(14)}, {CALCULATED_VALUE(21), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(24), CALCULATED_VALUE(16)}, {0, CALCULATED_VALUE(14)}
730 };
731 
732 const unsigned short CURVED_LEFT_ARROW_SEGMENTS[] =
733 {
734   0xa608, 0x0003, 0xa308, 0x6000, 0x8000, 0xa604, 0xa308, 0x6000, 0x8000
735 };
736 
737 const Calculation CURVED_LEFT_ARROW_CALC[] =
738 {
739   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 2, 0, 0}, {0xa000, PROP_ADJUST_VAL_FIRST, 21600, PROP_ADJUST_VAL_FIRST + 1}, {0x2001, 0x403, 1, 2}, {0x6000, PROP_ADJUST_VAL_FIRST + 1, PROP_ADJUST_VAL_FIRST + 1, 21600}, {0xe000, 0x405, PROP_ADJUST_VAL_FIRST + 1, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x406, 1, 2}, {0x4002, 21600, PROP_ADJUST_VAL_FIRST, 0}, {0xa00f, PROP_ADJUST_VAL_FIRST + 2, 21600, 0x404}, {0x6000, 0x404, 0x409, 0}, {0x6000, 0x40a, PROP_ADJUST_VAL_FIRST + 1, 21600}, {0x6000, 0x407, 0x409, 0}, {0xa000, 0x40b, 21600, PROP_ADJUST_VAL_FIRST}, {0xa000, 0x405, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x40e, 1, 2}, {0x6002, 0x404, 0x407, 0}, {0x6000, PROP_ADJUST_VAL_FIRST, PROP_ADJUST_VAL_FIRST + 1, 21600}, {0x2001, 0x411, 1, 2}, {0xa000, 0x410, 0, 0x412}, {0x0000, 21600, 0, 0}, {0x0000, 21600, 0, 0}, {0x0000, 0, 0, 21600}, {0xa000, 0x410, 0, 0x404}, {0x600f, 0x417, 0x404, 21600}, {0x2000, 0x408, 128, 0}, {0x2001, 0x405, 1, 2}, {0x2000, 0x405, 0, 128}, {0xe000, PROP_ADJUST_VAL_FIRST, 0x410, 0x40b}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x41d, 1, 2}, {0x0001, 21600, 21600, 1}, {0x6001, PROP_ADJUST_VAL_FIRST + 2, PROP_ADJUST_VAL_FIRST + 2, 1}, {0xa000, 0x41f, 0, 0x420}, {0x200d, 0x421, 0, 0}, {0x2000, 0x422, 21600, 0}, {0x8001, 21600, 21600, 0x423}, {0x2000, 0x424, 64, 0}, {0x2001, PROP_ADJUST_VAL_FIRST, 1, 2}, {0x600f, 0x41e, 0x426, 21600}, {0x2000, 0x427, 0, 64}, {0x2001, 0x404, 1, 2}, {0xa000, PROP_ADJUST_VAL_FIRST + 1, 0, 0x429}, {0x0001, 21600, 2195, 16384}, {0x0001, 21600, 14189, 16384}
740 };
741 
742 const TextRectangle CURVED_LEFT_ARROW_TRS[] =
743 {
744   { {CALCULATED_VALUE(43), CALCULATED_VALUE(41)}, {CALCULATED_VALUE(44), CALCULATED_VALUE(42)} }
745 };
746 
747 const int CURVED_LEFT_ARROW_DEFAULT_ADJUST[] =
748 {
749   12960, 19440, 7200
750 };
751 
752 const Vertex CURVED_LEFT_ARROW_GLUE_POINTS[] =
753 {
754   {0, CALCULATED_VALUE(15)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(11)}, {0, CALCULATED_VALUE(8)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(13)}, {CALCULATED_VALUE(21), CALCULATED_VALUE(16)}
755 };
756 
757 
758 const Vertex CURVED_DOWN_ARROW_VERTICES[] =
759 {
760   {0, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(23)}, {0, CALCULATED_VALUE(22)}, {CALCULATED_VALUE(4), 0}, {CALCULATED_VALUE(15), 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(23)}, {CALCULATED_VALUE(7), 0}, {CALCULATED_VALUE(13), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(14), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(8), CALCULATED_VALUE(22)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(2)}, {0, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(23)}, {CALCULATED_VALUE(11), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(17), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(15), 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(23)}, {CALCULATED_VALUE(17), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(15), CALCULATED_VALUE(22)}, {0, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(23)}, {0, CALCULATED_VALUE(22)}, {CALCULATED_VALUE(4), 0}, {0, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(23)}, {CALCULATED_VALUE(4), 0}, {CALCULATED_VALUE(17), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(15), 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(23)}, {CALCULATED_VALUE(17), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(15), CALCULATED_VALUE(22)}
761 };
762 
763 const unsigned short CURVED_DOWN_ARROW_SEGMENTS[] =
764 {
765   0xa604, 0xa504, 0x0003, 0xa308, 0x6000, 0x8000, 0xa604, 0xa504, 0xa304, 0x6000, 0x8000
766 };
767 
768 const Calculation CURVED_DOWN_ARROW_CALC[] =
769 {
770   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 2, 0, 0}, {0xa000, PROP_ADJUST_VAL_FIRST, 21600, PROP_ADJUST_VAL_FIRST + 1}, {0x2001, 0x403, 1, 2}, {0x6000, PROP_ADJUST_VAL_FIRST + 1, PROP_ADJUST_VAL_FIRST + 1, 21600}, {0xe000, 0x405, PROP_ADJUST_VAL_FIRST + 1, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x406, 1, 2}, {0x4002, 21600, PROP_ADJUST_VAL_FIRST, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 2}, {0xa00f, 0x409, 21600, 0x404}, {0x6000, 0x404, 0x40a, 0}, {0x6000, 0x40b, PROP_ADJUST_VAL_FIRST + 1, 21600}, {0x6000, 0x407, 0x40a, 0}, {0xa000, 0x40c, 21600, PROP_ADJUST_VAL_FIRST}, {0xa000, 0x405, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x40f, 1, 2}, {0x6002, 0x404, 0x407, 0}, {0x6000, PROP_ADJUST_VAL_FIRST, PROP_ADJUST_VAL_FIRST + 1, 21600}, {0x2001, 0x412, 1, 2}, {0xa000, 0x411, 0, 0x413}, {0x0000, 21600, 0, 0}, {0x0000, 21600, 0, 0}, {0x0001, 21600, 2, 1}, {0xa000, 0x411, 0, 0x404}, {0x600f, 0x418, 0x404, 21600}, {0x8000, 21600, 0, 0x419}, {0x2000, 0x408, 128, 0}, {0x2001, 0x405, 1, 2}, {0x2000, 0x405, 0, 128}, {0xe000, PROP_ADJUST_VAL_FIRST, 0x411, 0x40c}, {0x600f, 0x414, 0x404, 21600}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x420, 1, 2}, {0x0001, 21600, 21600, 1}, {0x6001, 0x409, 0x409, 1}, {0xa000, 0x422, 0, 0x423}, {0x200d, 0x424, 0, 0}, {0x2000, 0x425, 21600, 0}, {0x8001, 21600, 21600, 0x426}, {0x2000, 0x427, 64, 0}, {0x2001, PROP_ADJUST_VAL_FIRST, 1, 2}, {0x600f, 0x421, 0x429, 21600}, {0x8000, 21600, 0, 0x42a}, {0x2000, 0x42b, 64, 0}, {0x2001, 0x404, 1, 2}, {0xa000, PROP_ADJUST_VAL_FIRST + 1, 0, 0x42d}, {0x0001, 21600, 2195, 16384}, {0x0001, 21600, 14189, 16384}
771 };
772 
773 const TextRectangle CURVED_DOWN_ARROW_TRS[] =
774 {
775   { {CALCULATED_VALUE(45), CALCULATED_VALUE(47)}, {CALCULATED_VALUE(46), CALCULATED_VALUE(48)} }
776 };
777 
778 const int CURVED_DOWN_ARROW_DEFAULT_ADJUST[] =
779 {
780   12960, 19440, 14400
781 };
782 
783 const Vertex CURVED_DOWN_ARROW_GLUE_POINTS[] =
784 {
785   {CALCULATED_VALUE(17), 0}, {CALCULATED_VALUE(16), CALCULATED_VALUE(22)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(8), CALCULATED_VALUE(22)}, {CALCULATED_VALUE(14), CALCULATED_VALUE(2)}
786 };
787 
788 const CustomShape CS_CURVED_DOWN_ARROW(
789   CURVED_DOWN_ARROW_VERTICES, sizeof(CURVED_DOWN_ARROW_VERTICES) / sizeof(Vertex),
790   CURVED_DOWN_ARROW_SEGMENTS, sizeof(CURVED_DOWN_ARROW_SEGMENTS) / sizeof(unsigned short),
791   CURVED_DOWN_ARROW_CALC, sizeof(CURVED_DOWN_ARROW_CALC) / sizeof(Calculation),
792   CURVED_DOWN_ARROW_DEFAULT_ADJUST, sizeof(CURVED_DOWN_ARROW_DEFAULT_ADJUST) / sizeof(int),
793   CURVED_DOWN_ARROW_TRS, sizeof(CURVED_DOWN_ARROW_TRS) / sizeof(TextRectangle),
794   21600, 21600,
795   CURVED_DOWN_ARROW_GLUE_POINTS, sizeof(CURVED_DOWN_ARROW_GLUE_POINTS) / sizeof(Vertex));
796 
797 const Vertex FLOW_CHART_PREDEFINED_PROCESS_VERTICES[] =
798 {
799   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {2540, 0}, {2540, 21600}, {21600 - 2540, 0}, {21600 - 2540, 21600}
800 };
801 
802 const unsigned short FLOW_CHART_PREDEFINED_PROCESS_SEGMENTS[] =
803 {
804   0x4000, 0x0003, 0x6000, 0x8000, 0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
805 };
806 
807 const TextRectangle FLOW_CHART_PREDEFINED_PROCESS_TRS[] =
808 {
809   { {2540, 0}, {21600 - 2540, 21600} }
810 };
811 
812 const Vertex FLOW_CHART_INTERNAL_STORAGE_VERTICES[] =
813 {
814   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {4230, 0}, {4230, 21600}, {0, 4230}, {21600, 4230}
815 };
816 
817 const unsigned short FLOW_CHART_INTERNAL_STORAGE_SEGMENTS[] =
818 {
819   0x4000, 0x0003, 0x6000, 0x8000, 0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
820 };
821 
822 const TextRectangle FLOW_CHART_INTERNAL_STORAGE_TRS[] =
823 {
824   { {4230, 4230}, {21600, 21600} }
825 };
826 
827 const CustomShape CS_FLOW_CHART_INTERNAL_STORAGE(
828   FLOW_CHART_INTERNAL_STORAGE_VERTICES, sizeof(FLOW_CHART_INTERNAL_STORAGE_VERTICES) / sizeof(Vertex),
829   FLOW_CHART_INTERNAL_STORAGE_SEGMENTS, sizeof(FLOW_CHART_INTERNAL_STORAGE_SEGMENTS) / sizeof(unsigned short),
830   nullptr, 0,
831   nullptr, 0,
832   FLOW_CHART_INTERNAL_STORAGE_TRS, sizeof(FLOW_CHART_INTERNAL_STORAGE_TRS) / sizeof(TextRectangle),
833   21600, 21600,
834   nullptr, 0);
835 
836 const Vertex FLOW_CHART_DOCUMENT_VERTICES[] =
837 {
838   {0, 0}, {21600, 0}, {21600, 17360}, {13050, 17220}, {13340, 20770}, {5620, 21600}, {2860, 21100}, {1850, 20700}, {0, 20120}
839 };
840 
841 const unsigned short FLOW_CHART_DOCUMENT_SEGMENTS[] =
842 {
843   0x4000, 0x0002, 0x2002, 0x6000, 0x8000
844 };
845 
846 const TextRectangle FLOW_CHART_DOCUMENT_TRS[] =
847 {
848   { {0, 0}, {21600, 17360} }
849 };
850 
851 const Vertex FLOW_CHART_DOCUMENT_GLUE_POINTS[] =
852 {
853   {10800, 0}, {0, 10800}, {10800, 20320}, {21600, 10800}
854 };
855 
856 const CustomShape CS_FLOW_CHART_DOCUMENT(
857   FLOW_CHART_DOCUMENT_VERTICES, sizeof(FLOW_CHART_DOCUMENT_VERTICES) / sizeof(Vertex),
858   FLOW_CHART_DOCUMENT_SEGMENTS, sizeof(FLOW_CHART_DOCUMENT_SEGMENTS) / sizeof(unsigned short),
859   nullptr, 0,
860   nullptr, 0,
861   FLOW_CHART_DOCUMENT_TRS, sizeof(FLOW_CHART_DOCUMENT_TRS) / sizeof(TextRectangle),
862   21600, 21600,
863   FLOW_CHART_DOCUMENT_GLUE_POINTS, sizeof(FLOW_CHART_DOCUMENT_GLUE_POINTS) / sizeof(Vertex));
864 
865 const Vertex FLOW_CHART_MULTI_DOCUMENT_VERTICES[] =
866 {
867   {0, 3600}, {1500, 3600}, {1500, 1800}, {3000, 1800}, {3000, 0}, {21600, 0}, {21600, 14409}, {21600 - 1500, 14409}, {21600 - 1500, 14409 + 1800}, {21600 - 3000, 14409 + 1800}, {21600 - 3000, 14409 + 3600}, {11610, 14293 + 3600}, {11472, 17239 + 3600}, {4833, 17928 + 3600}, {2450, 17513 + 3600}, {1591, 17181 + 3600}, {0, 16700 + 3600}, {1500, 3600}, {21600 - 3000, 3600}, {21600 - 3000, 14409 + 1800}, {3000, 1800}, {21600 - 1500, 1800}, {21600 - 1500, 14409}
868 };
869 
870 const unsigned short FLOW_CHART_MULTI_DOCUMENT_SEGMENTS[] =
871 {
872   0x4000, 0x000a, 0x2002, 0x6000, 0x8000, 0x4000, 0xaa00, 0x0002, 0x8000, 0x4000, 0xaa00, 0x0002, 0x8000
873 };
874 
875 const TextRectangle FLOW_CHART_MULTI_DOCUMENT_TRS[] =
876 {
877   { {0, 3600}, {21600 - 3600, 14409 + 3600} }
878 };
879 
880 const Vertex FLOW_CHART_MULTI_DOCUMENT_GLUE_POINTS[] =
881 {
882   {10800, 0}, {0, 10800}, {10800, 19890}, {21600, 10800}
883 };
884 
885 const CustomShape CS_FLOW_CHART_MULTI_DOCUMENT(
886   FLOW_CHART_MULTI_DOCUMENT_VERTICES, sizeof(FLOW_CHART_MULTI_DOCUMENT_VERTICES) / sizeof(Vertex),
887   FLOW_CHART_MULTI_DOCUMENT_SEGMENTS, sizeof(FLOW_CHART_MULTI_DOCUMENT_SEGMENTS) / sizeof(unsigned short),
888   nullptr, 0,
889   nullptr, 0,
890   FLOW_CHART_MULTI_DOCUMENT_TRS, sizeof(FLOW_CHART_MULTI_DOCUMENT_TRS) / sizeof(TextRectangle),
891   21600, 21600,
892   FLOW_CHART_MULTI_DOCUMENT_GLUE_POINTS, sizeof(FLOW_CHART_MULTI_DOCUMENT_GLUE_POINTS) / sizeof(Vertex));
893 
894 const Vertex FLOW_CHART_TERMINATOR_VERTICES[] =
895 {
896   {3470, 21600}, {0, 10800}, {3470, 0}, {18130, 0}, {21600, 10800}, {18130, 21600}
897 };
898 
899 const unsigned short FLOW_CHART_TERMINATOR_SEGMENTS[] =
900 {
901   0x4000, 0xa702, 0x0001, 0xa702, 0x6000, 0x8000
902 };
903 
904 const TextRectangle FLOW_CHART_TERMINATOR_TRS[] =
905 {
906   { {1060, 3180}, {20540, 18420} }
907 };
908 
909 const Vertex FLOW_CHART_TERMINATOR_GLUE_POINTS[] =
910 {
911   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
912 };
913 
914 const CustomShape CS_FLOW_CHART_TERMINATOR(
915   FLOW_CHART_TERMINATOR_VERTICES, sizeof(FLOW_CHART_TERMINATOR_VERTICES) / sizeof(Vertex),
916   FLOW_CHART_TERMINATOR_SEGMENTS, sizeof(FLOW_CHART_TERMINATOR_SEGMENTS) / sizeof(unsigned short),
917   nullptr, 0,
918   nullptr, 0,
919   FLOW_CHART_TERMINATOR_TRS, sizeof(FLOW_CHART_TERMINATOR_TRS) / sizeof(TextRectangle),
920   21600, 21600,
921   FLOW_CHART_TERMINATOR_GLUE_POINTS, sizeof(FLOW_CHART_TERMINATOR_GLUE_POINTS) / sizeof(Vertex));
922 
923 const CustomShape CS_FLOW_CHART_PREDEFINED_PROCESS(
924   FLOW_CHART_PREDEFINED_PROCESS_VERTICES, sizeof(FLOW_CHART_PREDEFINED_PROCESS_VERTICES) / sizeof(Vertex),
925   FLOW_CHART_PREDEFINED_PROCESS_SEGMENTS, sizeof(FLOW_CHART_PREDEFINED_PROCESS_SEGMENTS) / sizeof(unsigned short),
926   nullptr, 0,
927   nullptr, 0,
928   FLOW_CHART_PREDEFINED_PROCESS_TRS, sizeof(FLOW_CHART_PREDEFINED_PROCESS_TRS) / sizeof(TextRectangle),
929   21600, 21600,
930   nullptr, 0);
931 
932 const Vertex FLOW_CHART_IO_VERTICES[] =
933 {
934   {4230, 0}, {21600, 0}, {17370, 21600}, {0, 21600}, {4230, 0}
935 };
936 
937 const TextRectangle FLOW_CHART_IO_TRS[] =
938 {
939   { {4230, 0}, {17370, 21600} }
940 };
941 
942 const Vertex FLOW_CHART_IO_GLUE_POINTS[] =
943 {
944   {12960, 0}, {10800, 0}, {2160, 10800}, {8600, 21600}, {10800, 21600}, {19400, 10800}
945 };
946 
947 const CustomShape CS_FLOW_CHART_IO(
948   FLOW_CHART_IO_VERTICES, sizeof(FLOW_CHART_IO_VERTICES) / sizeof(Vertex),
949   nullptr, 0,
950   nullptr, 0,
951   nullptr, 0,
952   FLOW_CHART_IO_TRS, sizeof(FLOW_CHART_IO_TRS) / sizeof(TextRectangle),
953   21600, 21600,
954   FLOW_CHART_IO_GLUE_POINTS, sizeof(FLOW_CHART_IO_GLUE_POINTS) / sizeof(Vertex));
955 
956 const Vertex FLOW_CHART_PROCESS_VERTICES[] =
957 {
958   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}
959 };
960 
961 const Vertex FLOW_CHART_PROCESS_GLUE_POINTS[] =
962 {
963   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
964 };
965 
966 const Vertex FLOW_CHART_DECISION_VERTICES[] =
967 {
968   {0, 10800}, {10800, 0}, {21600, 10800}, {10800, 21600}, {0, 10800}
969 };
970 
971 const TextRectangle FLOW_CHART_DECISION_TRS[] =
972 {
973   { {5400, 5400}, {16200, 16200} }
974 };
975 
976 const Vertex FLOW_CHART_DECISION_GLUE_POINTS[] =
977 {
978   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
979 };
980 
981 const CustomShape CS_FLOW_CHART_DECISION(
982   FLOW_CHART_DECISION_VERTICES, sizeof(FLOW_CHART_DECISION_VERTICES) / sizeof(Vertex),
983   nullptr, 0,
984   nullptr, 0,
985   nullptr, 0,
986   FLOW_CHART_DECISION_TRS, sizeof(FLOW_CHART_DECISION_TRS) / sizeof(TextRectangle),
987   21600, 21600,
988   FLOW_CHART_DECISION_GLUE_POINTS, sizeof(FLOW_CHART_DECISION_GLUE_POINTS) / sizeof(Vertex));
989 
990 const CustomShape CS_FLOW_CHART_PROCESS(
991   FLOW_CHART_PROCESS_VERTICES, sizeof(FLOW_CHART_PROCESS_VERTICES) / sizeof(Vertex),
992   nullptr, 0,
993   nullptr, 0,
994   nullptr, 0,
995   nullptr, 0,
996   21600, 21600,
997   FLOW_CHART_PROCESS_GLUE_POINTS, sizeof(FLOW_CHART_PROCESS_GLUE_POINTS) / sizeof(Vertex));
998 
999 const Vertex CURVED_UP_ARROW_VERTICES[] =
1000 {
1001   {0, CALCULATED_VALUE(22)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(21)}, {0, 0}, {CALCULATED_VALUE(4), CALCULATED_VALUE(21)}, {CALCULATED_VALUE(14), CALCULATED_VALUE(22)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(21)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(21)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(13), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(8), 0}, {CALCULATED_VALUE(11), CALCULATED_VALUE(2)}, {0, CALCULATED_VALUE(22)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(21)}, {CALCULATED_VALUE(10), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(16), CALCULATED_VALUE(24)}, {CALCULATED_VALUE(14), CALCULATED_VALUE(22)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(21)}, {CALCULATED_VALUE(16), CALCULATED_VALUE(24)}, {CALCULATED_VALUE(14), 0}, {0, CALCULATED_VALUE(22)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(21)}, {0, 0}, {CALCULATED_VALUE(4), CALCULATED_VALUE(21)}, {CALCULATED_VALUE(14), CALCULATED_VALUE(22)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(21)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(21)}, {CALCULATED_VALUE(16), CALCULATED_VALUE(24)}, {CALCULATED_VALUE(14), CALCULATED_VALUE(22)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(21)}, {CALCULATED_VALUE(16), CALCULATED_VALUE(24)}, {CALCULATED_VALUE(14), 0}
1002 };
1003 
1004 const unsigned short CURVED_UP_ARROW_SEGMENTS[] =
1005 {
1006   0xa408, 0x0003, 0xa508, 0x6000, 0x8000, 0xa404, 0xa508, 0xa504, 0x6000, 0x8000
1007 };
1008 
1009 const Calculation CURVED_UP_ARROW_CALC[] =
1010 {
1011   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 2, 0, 0}, {0xa000, PROP_ADJUST_VAL_FIRST, 21600, PROP_ADJUST_VAL_FIRST + 1}, {0x2001, 0x403, 1, 2}, {0x6000, PROP_ADJUST_VAL_FIRST + 1, PROP_ADJUST_VAL_FIRST + 1, 21600}, {0xe000, 0x405, PROP_ADJUST_VAL_FIRST + 1, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x406, 1, 2}, {0x4002, 21600, PROP_ADJUST_VAL_FIRST, 0}, {0xa00f, PROP_ADJUST_VAL_FIRST + 2, 21600, 0x404}, {0x6000, 0x404, 0x409, 0}, {0x6000, 0x40a, PROP_ADJUST_VAL_FIRST + 1, 21600}, {0x6000, 0x407, 0x409, 0}, {0xa000, 0x40b, 21600, PROP_ADJUST_VAL_FIRST}, {0xa000, 0x405, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x40e, 1, 2}, {0x6002, 0x404, 0x407, 0}, {0x6000, PROP_ADJUST_VAL_FIRST, PROP_ADJUST_VAL_FIRST + 1, 21600}, {0x2001, 0x411, 1, 2}, {0xa000, 0x410, 0, 0x412}, {0x0000, 21600, 0, 0}, {0x0000, 21600, 0, 0}, {0x0000, 0, 0, 21600}, {0xa000, 0x410, 0, 0x404}, {0x600f, 0x417, 0x404, 21600}, {0x2000, 0x408, 128, 0}, {0x2001, 0x405, 1, 2}, {0x2000, 0x405, 0, 128}, {0xe000, PROP_ADJUST_VAL_FIRST, 0x410, 0x40b}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x41d, 1, 2}, {0x0001, 21600, 21600, 1}, {0x6001, PROP_ADJUST_VAL_FIRST + 2, PROP_ADJUST_VAL_FIRST + 2, 1}, {0xa000, 0x41f, 0, 0x420}, {0x200d, 0x421, 0, 0}, {0x2000, 0x422, 21600, 0}, {0x8001, 21600, 21600, 0x423}, {0x2000, 0x424, 64, 0}, {0x2001, PROP_ADJUST_VAL_FIRST, 1, 2}, {0x600f, 0x41e, 0x426, 21600}, {0x2000, 0x427, 0, 64}, {0x2001, 0x404, 1, 2}, {0xa000, PROP_ADJUST_VAL_FIRST + 1, 0, 0x429}, {0x0001, 21600, 2195, 16384}, {0x0001, 21600, 14189, 16384}
1012 };
1013 
1014 const TextRectangle CURVED_UP_ARROW_TRS[] =
1015 {
1016   { {CALCULATED_VALUE(41), CALCULATED_VALUE(43)}, {CALCULATED_VALUE(42), CALCULATED_VALUE(44)} }
1017 };
1018 
1019 const int CURVED_UP_ARROW_DEFAULT_ADJUST[] =
1020 {
1021   12960, 19440, 7200
1022 };
1023 
1024 const Vertex CURVED_UP_ARROW_GLUE_POINTS[] =
1025 {
1026   {CALCULATED_VALUE(8), 0}, {CALCULATED_VALUE(11), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(15), 0}, {CALCULATED_VALUE(16), CALCULATED_VALUE(21)}, {CALCULATED_VALUE(13), CALCULATED_VALUE(2)}
1027 };
1028 
1029 const CustomShape CS_CURVED_UP_ARROW(
1030   CURVED_UP_ARROW_VERTICES, sizeof(CURVED_UP_ARROW_VERTICES) / sizeof(Vertex),
1031   CURVED_UP_ARROW_SEGMENTS, sizeof(CURVED_UP_ARROW_SEGMENTS) / sizeof(unsigned short),
1032   CURVED_UP_ARROW_CALC, sizeof(CURVED_UP_ARROW_CALC) / sizeof(Calculation),
1033   CURVED_UP_ARROW_DEFAULT_ADJUST, sizeof(CURVED_UP_ARROW_DEFAULT_ADJUST) / sizeof(int),
1034   CURVED_UP_ARROW_TRS, sizeof(CURVED_UP_ARROW_TRS) / sizeof(TextRectangle),
1035   21600, 21600,
1036   CURVED_UP_ARROW_GLUE_POINTS, sizeof(CURVED_UP_ARROW_GLUE_POINTS) / sizeof(Vertex));
1037 
1038 const CustomShape CS_CURVED_LEFT_ARROW(
1039   CURVED_LEFT_ARROW_VERTICES, sizeof(CURVED_LEFT_ARROW_VERTICES) / sizeof(Vertex),
1040   CURVED_LEFT_ARROW_SEGMENTS, sizeof(CURVED_LEFT_ARROW_SEGMENTS) / sizeof(unsigned short),
1041   CURVED_LEFT_ARROW_CALC, sizeof(CURVED_LEFT_ARROW_CALC) / sizeof(Calculation),
1042   CURVED_LEFT_ARROW_DEFAULT_ADJUST, sizeof(CURVED_LEFT_ARROW_DEFAULT_ADJUST) / sizeof(int),
1043   CURVED_LEFT_ARROW_TRS, sizeof(CURVED_LEFT_ARROW_TRS) / sizeof(TextRectangle),
1044   21600, 21600,
1045   CURVED_LEFT_ARROW_GLUE_POINTS, sizeof(CURVED_LEFT_ARROW_GLUE_POINTS) / sizeof(Vertex));
1046 
1047 const CustomShape CS_HORIZONTAL_SCROLL(
1048   HORIZONTAL_SCROLL_VERTICES, sizeof(HORIZONTAL_SCROLL_VERTICES) / sizeof(Vertex),
1049   HORIZONTAL_SCROLL_SEGMENTS, sizeof(HORIZONTAL_SCROLL_SEGMENTS) / sizeof(unsigned short),
1050   HORIZONTAL_SCROLL_CALC, sizeof(HORIZONTAL_SCROLL_CALC) / sizeof(Calculation),
1051   HORIZONTAL_SCROLL_DEFAULT_ADJUST, sizeof(HORIZONTAL_SCROLL_DEFAULT_ADJUST) / sizeof(int),
1052   HORIZONTAL_SCROLL_TRS, sizeof(HORIZONTAL_SCROLL_TRS) / sizeof(TextRectangle),
1053   21600, 21600,
1054   nullptr, 0);
1055 
1056 const CustomShape CS_VERTICAL_SCROLL(
1057   VERTICAL_SCROLL_VERTICES, sizeof(VERTICAL_SCROLL_VERTICES) / sizeof(Vertex),
1058   VERTICAL_SCROLL_SEGMENTS, sizeof(VERTICAL_SCROLL_SEGMENTS) / sizeof(unsigned short),
1059   VERTICAL_SCROLL_CALC, sizeof(VERTICAL_SCROLL_CALC) / sizeof(Calculation),
1060   VERTICAL_SCROLL_DEFAULT_ADJUST, sizeof(VERTICAL_SCROLL_DEFAULT_ADJUST) / sizeof(int),
1061   VERTICAL_SCROLL_TRS, sizeof(VERTICAL_SCROLL_TRS) / sizeof(TextRectangle),
1062   21600, 21600,
1063   nullptr, 0);
1064 
1065 const CustomShape CS_SMILEY_FACE(
1066   SMILEY_FACE_VERTICES, sizeof(SMILEY_FACE_VERTICES) / sizeof(Vertex),
1067   SMILEY_FACE_SEGMENTS, sizeof(SMILEY_FACE_SEGMENTS) / sizeof(unsigned short),
1068   SMILEY_FACE_CALC, sizeof(SMILEY_FACE_CALC) / sizeof(Calculation),
1069   SMILEY_FACE_DEFAULT_ADJUST, sizeof(SMILEY_FACE_DEFAULT_ADJUST) / sizeof(int),
1070   SMILEY_FACE_TRS, sizeof(SMILEY_FACE_TRS) / sizeof(TextRectangle),
1071   21600, 21600,
1072   SMILEY_FACE_GLUE_POINTS, sizeof(SMILEY_FACE_GLUE_POINTS) / sizeof(Vertex));
1073 
1074 const Vertex BLOCK_ARC_VERTICES[] =
1075 {
1076   {0, 0}, {21600, 21600}, {CALCULATED_VALUE(4), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(5)}, {CALCULATED_VALUE(6), CALCULATED_VALUE(6)}, {CALCULATED_VALUE(9), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(11), CALCULATED_VALUE(10)}
1077 };
1078 
1079 const unsigned short BLOCK_ARC_SEGMENTS[] =
1080 {
1081   0xA404, 0xa504, 0x6001, 0x8000
1082 };
1083 
1084 const Calculation BLOCK_ARC_CALC[] =
1085 {
1086   {0x400a, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x4009, 10800, PROP_ADJUST_VAL_FIRST, 0},
1087   {0x2000, 0x400, 10800, 0},
1088   {0x2000, 0x401, 10800, 0}, {0x8000, 21600, 0, 0x402},
1089   {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST + 1},
1090   {0x4000, 10800, PROP_ADJUST_VAL_FIRST + 1, 0},
1091   {0x600a, PROP_ADJUST_VAL_FIRST + 1, PROP_ADJUST_VAL_FIRST, 0},
1092   {0x6009, PROP_ADJUST_VAL_FIRST + 1, PROP_ADJUST_VAL_FIRST, 0},
1093   {0x4000, 10800, 0x407, 0}, {0x4000, 10800, 0x408, 0}, {0x8000, 10800,0, 0x407}
1094 };
1095 
1096 const int BLOCK_ARC_DEFAULT_ADJUST[] =
1097 {
1098   180 << 16, 5400
1099 };
1100 
1101 const CustomShape CS_BLOCK_ARC(
1102   BLOCK_ARC_VERTICES, sizeof(BLOCK_ARC_VERTICES) / sizeof(Vertex),
1103   BLOCK_ARC_SEGMENTS, sizeof(BLOCK_ARC_SEGMENTS) / sizeof(unsigned short),
1104   BLOCK_ARC_CALC, sizeof(BLOCK_ARC_CALC) / sizeof(Calculation),
1105   BLOCK_ARC_DEFAULT_ADJUST, sizeof(BLOCK_ARC_DEFAULT_ADJUST) / sizeof(int),
1106   nullptr, 0,
1107   21600, 21600,
1108   nullptr, 0, 0x1);
1109 
1110 const Vertex NOTCHED_RIGHT_ARROW_VERTICES[] =
1111 {
1112   {0, CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0), 0}, {21600, 10800}, {CALCULATED_VALUE(0), 21600}, {CALCULATED_VALUE(0), CALCULATED_VALUE(2)}, {0, CALCULATED_VALUE(2)}, {CALCULATED_VALUE(5), 10800}, {0, CALCULATED_VALUE(1)}
1113 };
1114 
1115 const Calculation NOTCHED_RIGHT_ARROW_CALC[] =
1116 {
1117   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x6001, 0x403, 0x404, 10800}
1118 };
1119 
1120 const TextRectangle NOTCHED_RIGHT_ARROW_TRS[] =
1121 {
1122   { {0, 0}, {21600, 21600} }
1123 };
1124 
1125 const int NOTCHED_RIGHT_ARROW_DEFAULT_ADJUST[] =
1126 {
1127   16200, 5400
1128 };
1129 
1130 const CustomShape CS_NOTCHED_RIGHT_ARROW(
1131   NOTCHED_RIGHT_ARROW_VERTICES, sizeof(NOTCHED_RIGHT_ARROW_VERTICES) / sizeof(Vertex),
1132   nullptr, 0,
1133   NOTCHED_RIGHT_ARROW_CALC, sizeof(NOTCHED_RIGHT_ARROW_CALC) / sizeof(Calculation),
1134   NOTCHED_RIGHT_ARROW_DEFAULT_ADJUST, sizeof(NOTCHED_RIGHT_ARROW_DEFAULT_ADJUST) / sizeof(int),
1135   NOTCHED_RIGHT_ARROW_TRS, sizeof(NOTCHED_RIGHT_ARROW_TRS) / sizeof(TextRectangle),
1136   21600, 21600,
1137   nullptr, 0);
1138 
1139 const Vertex STRIPED_RIGHT_ARROW_VERTICES[] =
1140 {
1141   {3375, CALCULATED_VALUE(0)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(1), 0}, {21600, 10800}, {CALCULATED_VALUE(1), 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {3375, CALCULATED_VALUE(2)}, {0, CALCULATED_VALUE(0)}, {675, CALCULATED_VALUE(0)}, {675, CALCULATED_VALUE(2)}, {0, CALCULATED_VALUE(2)}, {1350, CALCULATED_VALUE(0)}, {2700, CALCULATED_VALUE(0)}, {2700, CALCULATED_VALUE(2)}, {1350, CALCULATED_VALUE(2)}
1142 };
1143 
1144 const unsigned short STRIPED_RIGHT_ARROW_SEGMENTS[] =
1145 {
1146   0x4000, 0x0006, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000
1147 };
1148 
1149 const Calculation STRIPED_RIGHT_ARROW_CALC[] =
1150 {
1151   {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x8000, 21600, 0, 0x401}, {0x6001, 0x403, 0x400, 10800}, {0x6000, 0x401, 0x404, 0}
1152 };
1153 
1154 const TextRectangle STRIPED_RIGHT_ARROW_TRS[] =
1155 {
1156   { {3375, CALCULATED_VALUE(0)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(2)} }
1157 };
1158 
1159 const int STRIPED_RIGHT_ARROW_DEFAULT_ADJUST[] =
1160 {
1161   16200, 5400
1162 };
1163 
1164 const CustomShape CS_STRIPED_RIGHT_ARROW(
1165   STRIPED_RIGHT_ARROW_VERTICES, sizeof(STRIPED_RIGHT_ARROW_VERTICES) / sizeof(Vertex),
1166   STRIPED_RIGHT_ARROW_SEGMENTS, sizeof(STRIPED_RIGHT_ARROW_SEGMENTS) / sizeof(unsigned short),
1167   STRIPED_RIGHT_ARROW_CALC, sizeof(STRIPED_RIGHT_ARROW_CALC) / sizeof(Calculation),
1168   STRIPED_RIGHT_ARROW_DEFAULT_ADJUST, sizeof(STRIPED_RIGHT_ARROW_DEFAULT_ADJUST) / sizeof(int),
1169   STRIPED_RIGHT_ARROW_TRS, sizeof(STRIPED_RIGHT_ARROW_TRS) / sizeof(TextRectangle),
1170   21600, 21600,
1171   nullptr, 0);
1172 
1173 const Vertex SEAL_24_VERTICES[] =
1174 {
1175   {CALCULATED_VALUE(0x05), CALCULATED_VALUE(0x06)}, {CALCULATED_VALUE(0x07), CALCULATED_VALUE(0x08)}, {CALCULATED_VALUE(0x09), CALCULATED_VALUE(0x0a)}, {CALCULATED_VALUE(0x0b), CALCULATED_VALUE(0x0c)}, {CALCULATED_VALUE(0x0d), CALCULATED_VALUE(0x0e)}, {CALCULATED_VALUE(0x0f), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0x11), CALCULATED_VALUE(0x12)}, {CALCULATED_VALUE(0x13), CALCULATED_VALUE(0x14)}, {CALCULATED_VALUE(0x15), CALCULATED_VALUE(0x16)}, {CALCULATED_VALUE(0x17), CALCULATED_VALUE(0x18)}, {CALCULATED_VALUE(0x19), CALCULATED_VALUE(0x1a)}, {CALCULATED_VALUE(0x1b), CALCULATED_VALUE(0x1c)}, {CALCULATED_VALUE(0x1d), CALCULATED_VALUE(0x1e)}, {CALCULATED_VALUE(0x1f), CALCULATED_VALUE(0x20)}, {CALCULATED_VALUE(0x21), CALCULATED_VALUE(0x22)}, {CALCULATED_VALUE(0x23), CALCULATED_VALUE(0x24)}, {CALCULATED_VALUE(0x25), CALCULATED_VALUE(0x26)}, {CALCULATED_VALUE(0x27), CALCULATED_VALUE(0x28)}, {CALCULATED_VALUE(0x29), CALCULATED_VALUE(0x2a)}, {CALCULATED_VALUE(0x2b), CALCULATED_VALUE(0x2c)}, {CALCULATED_VALUE(0x2d), CALCULATED_VALUE(0x2e)}, {CALCULATED_VALUE(0x2f), CALCULATED_VALUE(0x30)}, {CALCULATED_VALUE(0x31), CALCULATED_VALUE(0x32)}, {CALCULATED_VALUE(0x33), CALCULATED_VALUE(0x34)}, {CALCULATED_VALUE(0x35), CALCULATED_VALUE(0x36)}, {CALCULATED_VALUE(0x37), CALCULATED_VALUE(0x38)}, {CALCULATED_VALUE(0x39), CALCULATED_VALUE(0x3a)}, {CALCULATED_VALUE(0x3b), CALCULATED_VALUE(0x3c)}, {CALCULATED_VALUE(0x3d), CALCULATED_VALUE(0x3e)}, {CALCULATED_VALUE(0x3f), CALCULATED_VALUE(0x40)}, {CALCULATED_VALUE(0x41), CALCULATED_VALUE(0x42)}, {CALCULATED_VALUE(0x43), CALCULATED_VALUE(0x44)}, {CALCULATED_VALUE(0x45), CALCULATED_VALUE(0x46)}, {CALCULATED_VALUE(0x47), CALCULATED_VALUE(0x48)}, {CALCULATED_VALUE(0x49), CALCULATED_VALUE(0x4a)}, {CALCULATED_VALUE(0x4b), CALCULATED_VALUE(0x4c)}, {CALCULATED_VALUE(0x4d), CALCULATED_VALUE(0x4e)}, {CALCULATED_VALUE(0x4f), CALCULATED_VALUE(0x50)}, {CALCULATED_VALUE(0x51), CALCULATED_VALUE(0x52)}, {CALCULATED_VALUE(0x53), CALCULATED_VALUE(0x54)}, {CALCULATED_VALUE(0x55), CALCULATED_VALUE(0x56)}, {CALCULATED_VALUE(0x57), CALCULATED_VALUE(0x58)}, {CALCULATED_VALUE(0x59), CALCULATED_VALUE(0x5a)}, {CALCULATED_VALUE(0x5b), CALCULATED_VALUE(0x5c)}, {CALCULATED_VALUE(0x5d), CALCULATED_VALUE(0x5e)}, {CALCULATED_VALUE(0x5f), CALCULATED_VALUE(0x60)}, {CALCULATED_VALUE(0x61), CALCULATED_VALUE(0x62)}, {CALCULATED_VALUE(0x63), CALCULATED_VALUE(0x64)}, {CALCULATED_VALUE(0x05), CALCULATED_VALUE(0x06)}
1176 };
1177 
1178 const Calculation SEAL_24_CALC[] =
1179 {
1180   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2081, 0x400, 10800, 315}, {0x2082, 0x400, 10800, 315}, {0x2081, 0x400, 10800, 135}, {0x2082, 0x400, 10800, 135}, {0x0081, 0, 10800, 0}, {0x0082, 0, 10800, 0}, {0x2081, 0x400, 10800, 7}, {0x2082, 0x400, 10800, 7}, {0x0081, 0, 10800, 15}, {0x0082, 0, 10800, 15}, {0x2081, 0x400, 10800, 22}, {0x2082, 0x400, 10800, 22}, {0x0081, 0, 10800, 30}, {0x0082, 0, 10800, 30}, {0x2081, 0x400, 10800, 37}, {0x2082, 0x400, 10800, 37}, {0x0081, 0, 10800, 45}, {0x0082, 0, 10800, 45}, {0x2081, 0x400, 10800, 52}, {0x2082, 0x400, 10800, 52}, {0x0081, 0, 10800, 60}, {0x0082, 0, 10800, 60}, {0x2081, 0x400, 10800, 67}, {0x2082, 0x400, 10800, 67}, {0x0081, 0, 10800, 75}, {0x0082, 0, 10800, 75}, {0x2081, 0x400, 10800, 82}, {0x2082, 0x400, 10800, 82}, {0x0081, 0, 10800, 90}, {0x0082, 0, 10800, 90}, {0x2081, 0x400, 10800, 97}, {0x2082, 0x400, 10800, 97}, {0x0081, 0, 10800, 105}, {0x0082, 0, 10800, 105}, {0x2081, 0x400, 10800, 112}, {0x2082, 0x400, 10800, 112}, {0x0081, 0, 10800, 120}, {0x0082, 0, 10800, 120}, {0x2081, 0x400, 10800, 127}, {0x2082, 0x400, 10800, 127}, {0x0081, 0, 10800, 135}, {0x0082, 0, 10800, 135}, {0x2081, 0x400, 10800, 142}, {0x2082, 0x400, 10800, 142}, {0x0081, 0, 10800, 150}, {0x0082, 0, 10800, 150}, {0x2081, 0x400, 10800, 157}, {0x2082, 0x400, 10800, 157}, {0x0081, 0, 10800, 165}, {0x0082, 0, 10800, 165}, {0x2081, 0x400, 10800, 172}, {0x2082, 0x400, 10800, 172}, {0x0081, 0, 10800, 180}, {0x0082, 0, 10800, 180}, {0x2081, 0x400, 10800, 187}, {0x2082, 0x400, 10800, 187}, {0x0081, 0, 10800, 195}, {0x0082, 0, 10800, 195}, {0x2081, 0x400, 10800, 202}, {0x2082, 0x400, 10800, 202}, {0x0081, 0, 10800, 210}, {0x0082, 0, 10800, 210}, {0x2081, 0x400, 10800, 217}, {0x2082, 0x400, 10800, 217}, {0x0081, 0, 10800, 225}, {0x0082, 0, 10800, 225}, {0x2081, 0x400, 10800, 232}, {0x2082, 0x400, 10800, 232}, {0x0081, 0, 10800, 240}, {0x0082, 0, 10800, 240}, {0x2081, 0x400, 10800, 247}, {0x2082, 0x400, 10800, 247}, {0x0081, 0, 10800, 255}, {0x0082, 0, 10800, 255}, {0x2081, 0x400, 10800, 262}, {0x2082, 0x400, 10800, 262}, {0x0081, 0, 10800, 270}, {0x0082, 0, 10800, 270}, {0x2081, 0x400, 10800, 277}, {0x2082, 0x400, 10800, 277}, {0x0081, 0, 10800, 285}, {0x0082, 0, 10800, 285}, {0x2081, 0x400, 10800, 292}, {0x2082, 0x400, 10800, 292}, {0x0081, 0, 10800, 300}, {0x0082, 0, 10800, 300}, {0x2081, 0x400, 10800, 307}, {0x2082, 0x400, 10800, 307}, {0x0081, 0, 10800, 315}, {0x0082, 0, 10800, 315}, {0x2081, 0x400, 10800, 322}, {0x2082, 0x400, 10800, 322}, {0x0081, 0, 10800, 330}, {0x0082, 0, 10800, 330}, {0x2081, 0x400, 10800, 337}, {0x2082, 0x400, 10800, 337}, {0x0081, 0, 10800, 345}, {0x0082, 0, 10800, 345}, {0x2081, 0x400, 10800, 352}, {0x2082, 0x400, 10800, 352}
1181 };
1182 
1183 const TextRectangle SEAL_24_TRS[] =
1184 {
1185   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
1186 };
1187 
1188 const int SEAL_24_DEFAULT_ADJUST[] =
1189 {
1190   2500
1191 };
1192 
1193 const CustomShape CS_SEAL_24(
1194   SEAL_24_VERTICES, sizeof(SEAL_24_VERTICES) / sizeof(Vertex),
1195   nullptr, 0,
1196   SEAL_24_CALC, sizeof(SEAL_24_CALC) / sizeof(Calculation),
1197   SEAL_24_DEFAULT_ADJUST, sizeof(SEAL_24_DEFAULT_ADJUST) / sizeof(int),
1198   SEAL_24_TRS, sizeof(SEAL_24_TRS) / sizeof(TextRectangle),
1199   21600, 21600,
1200   nullptr, 0);
1201 
1202 const Vertex BENT_ARROW_VERTICES[] =
1203 {
1204   {0, 21600}, {0, 12160}, {12427, CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0), 0}, {21600, 6079}, {CALCULATED_VALUE(0), 12158}, {CALCULATED_VALUE(0), CALCULATED_VALUE(2)}, {12427, CALCULATED_VALUE(2)}, {CALCULATED_VALUE(4), 12160}, {CALCULATED_VALUE(4), 21600}
1205 };
1206 
1207 const unsigned short BENT_ARROW_SEGMENTS[] =
1208 {
1209   0x4000, 0x0001, 0xa801, 0x0006, 0xa701, 0x0001, 0x6001, 0x8000
1210 };
1211 
1212 const Calculation BENT_ARROW_CALC[] =
1213 {
1214   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x8000, 12158, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x8000, 6079, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x2001, 0x0403, 2, 1}
1215 };
1216 
1217 const TextRectangle BENT_ARROW_TRS[] =
1218 {
1219   { {0, 0}, {21600, 21600} }
1220 };
1221 
1222 const int BENT_ARROW_DEFAULT_ADJUST[] =
1223 {
1224   15100, 2900
1225 };
1226 
1227 const CustomShape CS_BENT_ARROW(
1228   BENT_ARROW_VERTICES, sizeof(BENT_ARROW_VERTICES) / sizeof(Vertex),
1229   BENT_ARROW_SEGMENTS, sizeof(BENT_ARROW_SEGMENTS) / sizeof(unsigned short),
1230   BENT_ARROW_CALC, sizeof(BENT_ARROW_CALC) / sizeof(Calculation),
1231   BENT_ARROW_DEFAULT_ADJUST, sizeof(BENT_ARROW_DEFAULT_ADJUST) / sizeof(int),
1232   BENT_ARROW_TRS, sizeof(BENT_ARROW_TRS) / sizeof(TextRectangle),
1233   21600, 21600,
1234   nullptr, 0);
1235 
1236 const Vertex BENT_UP_ARROW_VERTICES[] =
1237 {
1238   {0, CALCULATED_VALUE(8)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(5), 0}, {21600, CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), 21600}, {0, 21600}
1239 };
1240 
1241 const unsigned short BENT_UP_ARROW_SEGMENTS[] =
1242 {
1243   0x4000, 0x0008, 0x6001, 0x8000
1244 };
1245 
1246 const Calculation BENT_UP_ARROW_CALC[] =
1247 {
1248   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 2, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x0403, 1, 2}, {0x6000, PROP_ADJUST_VAL_FIRST, 0x0404, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x6000, PROP_ADJUST_VAL_FIRST, 0x0406, 0}, {0x6000, 0x0407, 0x0406, 0}, {0x8000, 21600, 0, 0x406}, {0xa000, 0x409, 0, 0x406}
1249 };
1250 
1251 const TextRectangle BENT_UP_ARROW_TRS[] =
1252 {
1253   { {CALCULATED_VALUE(2), CALCULATED_VALUE(7)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(1)} }, { {CALCULATED_VALUE(7), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(1)} }
1254 };
1255 
1256 const int BENT_UP_ARROW_DEFAULT_ADJUST[] =
1257 {
1258   9340, 18500, 7200
1259 };
1260 
1261 const CustomShape CS_BENT_UP_ARROW(
1262   BENT_UP_ARROW_VERTICES, sizeof(BENT_UP_ARROW_VERTICES) / sizeof(Vertex),
1263   BENT_UP_ARROW_SEGMENTS, sizeof(BENT_UP_ARROW_SEGMENTS) / sizeof(unsigned short),
1264   BENT_UP_ARROW_CALC, sizeof(BENT_UP_ARROW_CALC) / sizeof(Calculation),
1265   BENT_UP_ARROW_DEFAULT_ADJUST, sizeof(BENT_UP_ARROW_DEFAULT_ADJUST) / sizeof(int),
1266   BENT_UP_ARROW_TRS, sizeof(BENT_UP_ARROW_TRS) / sizeof(TextRectangle),
1267   21600, 21600,
1268   nullptr, 0);
1269 
1270 const Vertex DOWN_ARROW_VERTICES[] =
1271 {
1272   {CALCULATED_VALUE(0), 0}, {CALCULATED_VALUE(0), CALCULATED_VALUE(1)}, {0, CALCULATED_VALUE(1)}, {10800, 21600}, {21600, CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), 0}
1273 };
1274 
1275 const unsigned short DOWN_ARROW_SEGMENTS[] =
1276 {
1277   0x4000, 0x0006, 0x6001, 0x8000
1278 };
1279 
1280 const Calculation DOWN_ARROW_CALC[] =
1281 {
1282   {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x8000, 21600, 0, 0x401}, {0x6001, 0x403, 0x400, 10800}, {0x6000, 0x401, 0x404, 0}, {0x6001, 0x401, 0x400, 10800}, {0xa000, 0x401, 0, 0x406}
1283 };
1284 
1285 const TextRectangle DOWN_ARROW_TRS[] =
1286 {
1287   { {CALCULATED_VALUE(0), 0}, {CALCULATED_VALUE(2), CALCULATED_VALUE(5)} }
1288 };
1289 
1290 const int DOWN_ARROW_DEFAULT_ADJUST[] =
1291 {
1292   16200, 5400
1293 };
1294 
1295 const CustomShape CS_DOWN_ARROW(
1296   DOWN_ARROW_VERTICES, sizeof(DOWN_ARROW_VERTICES) / sizeof(Vertex),
1297   DOWN_ARROW_SEGMENTS, sizeof(DOWN_ARROW_SEGMENTS) / sizeof(unsigned short),
1298   DOWN_ARROW_CALC, sizeof(DOWN_ARROW_CALC) / sizeof(Calculation),
1299   DOWN_ARROW_DEFAULT_ADJUST, sizeof(DOWN_ARROW_DEFAULT_ADJUST) / sizeof(int),
1300   DOWN_ARROW_TRS, sizeof(DOWN_ARROW_TRS) / sizeof(TextRectangle),
1301   21600, 21600,
1302   nullptr, 0);
1303 
1304 const Vertex UP_ARROW_VERTICES[] =
1305 {
1306   {CALCULATED_VALUE(0), 21600}, {CALCULATED_VALUE(0), CALCULATED_VALUE(1)}, {0, CALCULATED_VALUE(1)}, {10800, 0}, {21600, CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), 21600}
1307 };
1308 
1309 const unsigned short UP_ARROW_SEGMENTS[] =
1310 {
1311   0x4000, 0x0006, 0x6001, 0x8000
1312 };
1313 
1314 const Calculation UP_ARROW_CALC[] =
1315 {
1316   {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x8000, 21600, 0, 0x401}, {0x6001, 0x403, 0x400, 10800}, {0x6000, 0x401, 0x404, 0}, {0x6001, 0x401, 0x400, 10800}, {0xa000, 0x401, 0, 0x406}
1317 };
1318 
1319 const TextRectangle UP_ARROW_TRS[] =
1320 {
1321   { {CALCULATED_VALUE(0), CALCULATED_VALUE(7)}, {CALCULATED_VALUE(2), 21600} }
1322 };
1323 
1324 const int UP_ARROW_DEFAULT_ADJUST[] =
1325 {
1326   5400, 5400
1327 };
1328 
1329 const CustomShape CS_UP_ARROW(
1330   UP_ARROW_VERTICES, sizeof(UP_ARROW_VERTICES) / sizeof(Vertex),
1331   UP_ARROW_SEGMENTS, sizeof(UP_ARROW_SEGMENTS) / sizeof(unsigned short),
1332   UP_ARROW_CALC, sizeof(UP_ARROW_CALC) / sizeof(Calculation),
1333   UP_ARROW_DEFAULT_ADJUST, sizeof(UP_ARROW_DEFAULT_ADJUST) / sizeof(int),
1334   UP_ARROW_TRS, sizeof(UP_ARROW_TRS) / sizeof(TextRectangle),
1335   21600, 21600,
1336   nullptr, 0);
1337 
1338 const Vertex LEFT_RIGHT_ARROW_VERTICES[] =
1339 {
1340   {0, 10800}, {CALCULATED_VALUE(0), 0}, {CALCULATED_VALUE(0), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), 0}, {21600, 10800}, {CALCULATED_VALUE(2), 21600}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(0), 21600}
1341 };
1342 
1343 const unsigned short LEFT_RIGHT_ARROW_SEGMENTS[] =
1344 {
1345   0x4000, 0x0009, 0x6001, 0x8000
1346 };
1347 
1348 const Calculation LEFT_RIGHT_ARROW_CALC[] =
1349 {
1350   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x6001, PROP_ADJUST_VAL_FIRST, 0x404, 10800}, {0x8000, 21600, 0, 0x405}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x6001, PROP_ADJUST_VAL_FIRST + 1, 0x407, 10800}, {0x8000, 21600, 0, 0x408}
1351 };
1352 
1353 const TextRectangle LEFT_RIGHT_ARROW_TRS[] =
1354 {
1355   { {CALCULATED_VALUE(5), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(6), CALCULATED_VALUE(3)} }
1356 };
1357 
1358 const int LEFT_RIGHT_ARROW_DEFAULT_ADJUST[] =
1359 {
1360   4300, 5400
1361 };
1362 
1363 const CustomShape CS_LEFT_RIGHT_ARROW(
1364   LEFT_RIGHT_ARROW_VERTICES, sizeof(LEFT_RIGHT_ARROW_VERTICES) / sizeof(Vertex),
1365   LEFT_RIGHT_ARROW_SEGMENTS, sizeof(LEFT_RIGHT_ARROW_SEGMENTS) / sizeof(unsigned short),
1366   LEFT_RIGHT_ARROW_CALC, sizeof(LEFT_RIGHT_ARROW_CALC) / sizeof(Calculation),
1367   LEFT_RIGHT_ARROW_DEFAULT_ADJUST, sizeof(LEFT_RIGHT_ARROW_DEFAULT_ADJUST) / sizeof(int),
1368   LEFT_RIGHT_ARROW_TRS, sizeof(LEFT_RIGHT_ARROW_TRS) / sizeof(TextRectangle),
1369   21600, 21600,
1370   nullptr, 0);
1371 
1372 const Vertex SEAL_32_VERTICES[] =
1373 {
1374   {CALCULATED_VALUE(0x05), CALCULATED_VALUE(0x06)}, {CALCULATED_VALUE(0x07), CALCULATED_VALUE(0x08)}, {CALCULATED_VALUE(0x09), CALCULATED_VALUE(0x0a)}, {CALCULATED_VALUE(0x0b), CALCULATED_VALUE(0x0c)}, {CALCULATED_VALUE(0x0d), CALCULATED_VALUE(0x0e)}, {CALCULATED_VALUE(0x0f), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0x11), CALCULATED_VALUE(0x12)}, {CALCULATED_VALUE(0x13), CALCULATED_VALUE(0x14)}, {CALCULATED_VALUE(0x15), CALCULATED_VALUE(0x16)}, {CALCULATED_VALUE(0x17), CALCULATED_VALUE(0x18)}, {CALCULATED_VALUE(0x19), CALCULATED_VALUE(0x1a)}, {CALCULATED_VALUE(0x1b), CALCULATED_VALUE(0x1c)}, {CALCULATED_VALUE(0x1d), CALCULATED_VALUE(0x1e)}, {CALCULATED_VALUE(0x1f), CALCULATED_VALUE(0x20)}, {CALCULATED_VALUE(0x21), CALCULATED_VALUE(0x22)}, {CALCULATED_VALUE(0x23), CALCULATED_VALUE(0x24)}, {CALCULATED_VALUE(0x25), CALCULATED_VALUE(0x26)}, {CALCULATED_VALUE(0x27), CALCULATED_VALUE(0x28)}, {CALCULATED_VALUE(0x29), CALCULATED_VALUE(0x2a)}, {CALCULATED_VALUE(0x2b), CALCULATED_VALUE(0x2c)}, {CALCULATED_VALUE(0x2d), CALCULATED_VALUE(0x2e)}, {CALCULATED_VALUE(0x2f), CALCULATED_VALUE(0x30)}, {CALCULATED_VALUE(0x31), CALCULATED_VALUE(0x32)}, {CALCULATED_VALUE(0x33), CALCULATED_VALUE(0x34)}, {CALCULATED_VALUE(0x35), CALCULATED_VALUE(0x36)}, {CALCULATED_VALUE(0x37), CALCULATED_VALUE(0x38)}, {CALCULATED_VALUE(0x39), CALCULATED_VALUE(0x3a)}, {CALCULATED_VALUE(0x3b), CALCULATED_VALUE(0x3c)}, {CALCULATED_VALUE(0x3d), CALCULATED_VALUE(0x3e)}, {CALCULATED_VALUE(0x3f), CALCULATED_VALUE(0x40)}, {CALCULATED_VALUE(0x41), CALCULATED_VALUE(0x42)}, {CALCULATED_VALUE(0x43), CALCULATED_VALUE(0x44)}, {CALCULATED_VALUE(0x45), CALCULATED_VALUE(0x46)}, {CALCULATED_VALUE(0x47), CALCULATED_VALUE(0x48)}, {CALCULATED_VALUE(0x49), CALCULATED_VALUE(0x4a)}, {CALCULATED_VALUE(0x4b), CALCULATED_VALUE(0x4c)}, {CALCULATED_VALUE(0x4d), CALCULATED_VALUE(0x4e)}, {CALCULATED_VALUE(0x4f), CALCULATED_VALUE(0x50)}, {CALCULATED_VALUE(0x51), CALCULATED_VALUE(0x52)}, {CALCULATED_VALUE(0x53), CALCULATED_VALUE(0x54)}, {CALCULATED_VALUE(0x55), CALCULATED_VALUE(0x56)}, {CALCULATED_VALUE(0x57), CALCULATED_VALUE(0x58)}, {CALCULATED_VALUE(0x59), CALCULATED_VALUE(0x5a)}, {CALCULATED_VALUE(0x5b), CALCULATED_VALUE(0x5c)}, {CALCULATED_VALUE(0x5d), CALCULATED_VALUE(0x5e)}, {CALCULATED_VALUE(0x5f), CALCULATED_VALUE(0x60)}, {CALCULATED_VALUE(0x61), CALCULATED_VALUE(0x62)}, {CALCULATED_VALUE(0x63), CALCULATED_VALUE(0x64)}, {CALCULATED_VALUE(0x65), CALCULATED_VALUE(0x66)}, {CALCULATED_VALUE(0x67), CALCULATED_VALUE(0x68)}, {CALCULATED_VALUE(0x69), CALCULATED_VALUE(0x6a)}, {CALCULATED_VALUE(0x6b), CALCULATED_VALUE(0x6c)}, {CALCULATED_VALUE(0x6d), CALCULATED_VALUE(0x6e)}, {CALCULATED_VALUE(0x6f), CALCULATED_VALUE(0x70)}, {CALCULATED_VALUE(0x71), CALCULATED_VALUE(0x72)}, {CALCULATED_VALUE(0x73), CALCULATED_VALUE(0x74)}, {CALCULATED_VALUE(0x75), CALCULATED_VALUE(0x76)}, {CALCULATED_VALUE(0x77), CALCULATED_VALUE(0x78)}, {CALCULATED_VALUE(0x79), CALCULATED_VALUE(0x7a)}, {CALCULATED_VALUE(0x7b), CALCULATED_VALUE(0x7c)}, {CALCULATED_VALUE(0x7d), CALCULATED_VALUE(0x7e)}, {CALCULATED_VALUE(0x7f), CALCULATED_VALUE(0x80)}, {CALCULATED_VALUE(0x81), CALCULATED_VALUE(0x82)}, {CALCULATED_VALUE(0x83), CALCULATED_VALUE(0x84)}, {CALCULATED_VALUE(0x05), CALCULATED_VALUE(0x06)}
1375 };
1376 
1377 const Calculation SEAL_32_CALC[] =
1378 {
1379   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2081, 0x400, 10800, 315}, {0x2082, 0x400, 10800, 315}, {0x2081, 0x400, 10800, 135}, {0x2082, 0x400, 10800, 135}, {0x0081, 0, 10800, 0}, {0x0082, 0, 10800, 0}, {0x2081, 0x400, 10800, 5}, {0x2082, 0x400, 10800, 5}, {0x0081, 0, 10800, 11}, {0x0082, 0, 10800, 11}, {0x2081, 0x400, 10800, 16}, {0x2082, 0x400, 10800, 16}, {0x0081, 0, 10800, 22}, {0x0082, 0, 10800, 22}, {0x2081, 0x400, 10800, 28}, {0x2082, 0x400, 10800, 28}, {0x0081, 0, 10800, 33}, {0x0082, 0, 10800, 33}, {0x2081, 0x400, 10800, 39}, {0x2082, 0x400, 10800, 39}, {0x0081, 0, 10800, 45}, {0x0082, 0, 10800, 45}, {0x2081, 0x400, 10800, 50}, {0x2082, 0x400, 10800, 50}, {0x0081, 0, 10800, 56}, {0x0082, 0, 10800, 56}, {0x2081, 0x400, 10800, 61}, {0x2082, 0x400, 10800, 61}, {0x0081, 0, 10800, 67}, {0x0082, 0, 10800, 67}, {0x2081, 0x400, 10800, 73}, {0x2082, 0x400, 10800, 73}, {0x0081, 0, 10800, 78}, {0x0082, 0, 10800, 78}, {0x2081, 0x400, 10800, 84}, {0x2082, 0x400, 10800, 84}, {0x0081, 0, 10800, 90}, {0x0082, 0, 10800, 90}, {0x2081, 0x400, 10800, 95}, {0x2082, 0x400, 10800, 95}, {0x0081, 0, 10800, 101}, {0x0082, 0, 10800, 101}, {0x2081, 0x400, 10800, 106}, {0x2082, 0x400, 10800, 106}, {0x0081, 0, 10800, 112}, {0x0082, 0, 10800, 112}, {0x2081, 0x400, 10800, 118}, {0x2082, 0x400, 10800, 118}, {0x0081, 0, 10800, 123}, {0x0082, 0, 10800, 123}, {0x2081, 0x400, 10800, 129}, {0x2082, 0x400, 10800, 129}, {0x0081, 0, 10800, 135}, {0x0082, 0, 10800, 135}, {0x2081, 0x400, 10800, 140}, {0x2082, 0x400, 10800, 140}, {0x0081, 0, 10800, 146}, {0x0082, 0, 10800, 146}, {0x2081, 0x400, 10800, 151}, {0x2082, 0x400, 10800, 151}, {0x0081, 0, 10800, 157}, {0x0082, 0, 10800, 157}, {0x2081, 0x400, 10800, 163}, {0x2082, 0x400, 10800, 163}, {0x0081, 0, 10800, 168}, {0x0082, 0, 10800, 168}, {0x2081, 0x400, 10800, 174}, {0x2082, 0x400, 10800, 174}, {0x0081, 0, 10800, 180}, {0x0082, 0, 10800, 180}, {0x2081, 0x400, 10800, 185}, {0x2082, 0x400, 10800, 185}, {0x0081, 0, 10800, 191}, {0x0082, 0, 10800, 191}, {0x2081, 0x400, 10800, 196}, {0x2082, 0x400, 10800, 196}, {0x0081, 0, 10800, 202}, {0x0082, 0, 10800, 202}, {0x2081, 0x400, 10800, 208}, {0x2082, 0x400, 10800, 208}, {0x0081, 0, 10800, 213}, {0x0082, 0, 10800, 213}, {0x2081, 0x400, 10800, 219}, {0x2082, 0x400, 10800, 219}, {0x0081, 0, 10800, 225}, {0x0082, 0, 10800, 225}, {0x2081, 0x400, 10800, 230}, {0x2082, 0x400, 10800, 230}, {0x0081, 0, 10800, 236}, {0x0082, 0, 10800, 236}, {0x2081, 0x400, 10800, 241}, {0x2082, 0x400, 10800, 241}, {0x0081, 0, 10800, 247}, {0x0082, 0, 10800, 247}, {0x2081, 0x400, 10800, 253}, {0x2082, 0x400, 10800, 253}, {0x0081, 0, 10800, 258}, {0x0082, 0, 10800, 258}, {0x2081, 0x400, 10800, 264}, {0x2082, 0x400, 10800, 264}, {0x0081, 0, 10800, 270}, {0x0082, 0, 10800, 270}, {0x2081, 0x400, 10800, 275}, {0x2082, 0x400, 10800, 275}, {0x0081, 0, 10800, 281}, {0x0082, 0, 10800, 281}, {0x2081, 0x400, 10800, 286}, {0x2082, 0x400, 10800, 286}, {0x0081, 0, 10800, 292}, {0x0082, 0, 10800, 292}, {0x2081, 0x400, 10800, 298}, {0x2082, 0x400, 10800, 298}, {0x0081, 0, 10800, 303}, {0x0082, 0, 10800, 303}, {0x2081, 0x400, 10800, 309}, {0x2082, 0x400, 10800, 309}, {0x0081, 0, 10800, 315}, {0x0082, 0, 10800, 315}, {0x2081, 0x400, 10800, 320}, {0x2082, 0x400, 10800, 320}, {0x0081, 0, 10800, 326}, {0x0082, 0, 10800, 326}, {0x2081, 0x400, 10800, 331}, {0x2082, 0x400, 10800, 331}, {0x0081, 0, 10800, 337}, {0x0082, 0, 10800, 337}, {0x2081, 0x400, 10800, 343}, {0x2082, 0x400, 10800, 343}, {0x0081, 0, 10800, 348}, {0x0082, 0, 10800, 348}, {0x2081, 0x400, 10800, 354}, {0x2082, 0x400, 10800, 354}
1380 };
1381 
1382 const TextRectangle SEAL_32_TRS[] =
1383 {
1384   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
1385 };
1386 
1387 const int SEAL_32_DEFAULT_ADJUST[] =
1388 {
1389   2500
1390 };
1391 
1392 const CustomShape CS_SEAL_32(
1393   SEAL_32_VERTICES, sizeof(SEAL_32_VERTICES) / sizeof(Vertex),
1394   nullptr, 0,
1395   SEAL_32_CALC, sizeof(SEAL_32_CALC) / sizeof(Calculation),
1396   SEAL_32_DEFAULT_ADJUST, sizeof(SEAL_32_DEFAULT_ADJUST) / sizeof(int),
1397   SEAL_32_TRS, sizeof(SEAL_32_TRS) / sizeof(TextRectangle),
1398   21600, 21600,
1399   nullptr, 0);
1400 
1401 const Vertex SEAL_16_VERTICES[] =
1402 {
1403   {CALCULATED_VALUE(0x05), CALCULATED_VALUE(0x06)}, {CALCULATED_VALUE(0x07), CALCULATED_VALUE(0x08)}, {CALCULATED_VALUE(0x09), CALCULATED_VALUE(0x0a)}, {CALCULATED_VALUE(0x0b), CALCULATED_VALUE(0x0c)}, {CALCULATED_VALUE(0x0d), CALCULATED_VALUE(0x0e)}, {CALCULATED_VALUE(0x0f), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0x11), CALCULATED_VALUE(0x12)}, {CALCULATED_VALUE(0x13), CALCULATED_VALUE(0x14)}, {CALCULATED_VALUE(0x15), CALCULATED_VALUE(0x16)}, {CALCULATED_VALUE(0x17), CALCULATED_VALUE(0x18)}, {CALCULATED_VALUE(0x19), CALCULATED_VALUE(0x1a)}, {CALCULATED_VALUE(0x1b), CALCULATED_VALUE(0x1c)}, {CALCULATED_VALUE(0x1d), CALCULATED_VALUE(0x1e)}, {CALCULATED_VALUE(0x1f), CALCULATED_VALUE(0x20)}, {CALCULATED_VALUE(0x21), CALCULATED_VALUE(0x22)}, {CALCULATED_VALUE(0x23), CALCULATED_VALUE(0x24)}, {CALCULATED_VALUE(0x25), CALCULATED_VALUE(0x26)}, {CALCULATED_VALUE(0x27), CALCULATED_VALUE(0x28)}, {CALCULATED_VALUE(0x29), CALCULATED_VALUE(0x2a)}, {CALCULATED_VALUE(0x2b), CALCULATED_VALUE(0x2c)}, {CALCULATED_VALUE(0x2d), CALCULATED_VALUE(0x2e)}, {CALCULATED_VALUE(0x2f), CALCULATED_VALUE(0x30)}, {CALCULATED_VALUE(0x31), CALCULATED_VALUE(0x32)}, {CALCULATED_VALUE(0x33), CALCULATED_VALUE(0x34)}, {CALCULATED_VALUE(0x35), CALCULATED_VALUE(0x36)}, {CALCULATED_VALUE(0x37), CALCULATED_VALUE(0x38)}, {CALCULATED_VALUE(0x39), CALCULATED_VALUE(0x3a)}, {CALCULATED_VALUE(0x3b), CALCULATED_VALUE(0x3c)}, {CALCULATED_VALUE(0x3d), CALCULATED_VALUE(0x3e)}, {CALCULATED_VALUE(0x3f), CALCULATED_VALUE(0x40)}, {CALCULATED_VALUE(0x41), CALCULATED_VALUE(0x42)}, {CALCULATED_VALUE(0x43), CALCULATED_VALUE(0x44)}, {CALCULATED_VALUE(0x05), CALCULATED_VALUE(0x06)}
1404 };
1405 
1406 const Calculation SEAL_16_CALC[] =
1407 {
1408   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2081, 0x400, 10800, 315}, {0x2082, 0x400, 10800, 315}, {0x2081, 0x400, 10800, 135}, {0x2082, 0x400, 10800, 135}, {0x0081, 0, 10800, 0}, {0x0082, 0, 10800, 0}, {0x2081, 0x400, 10800, 11}, {0x2082, 0x400, 10800, 11}, {0x0081, 0, 10800, 22}, {0x0082, 0, 10800, 22}, {0x2081, 0x400, 10800, 33}, {0x2082, 0x400, 10800, 33}, {0x0081, 0, 10800, 45}, {0x0082, 0, 10800, 45}, {0x2081, 0x400, 10800, 56}, {0x2082, 0x400, 10800, 56}, {0x0081, 0, 10800, 67}, {0x0082, 0, 10800, 67}, {0x2081, 0x400, 10800, 78}, {0x2082, 0x400, 10800, 78}, {0x0081, 0, 10800, 90}, {0x0082, 0, 10800, 90}, {0x2081, 0x400, 10800, 101}, {0x2082, 0x400, 10800, 101}, {0x0081, 0, 10800, 112}, {0x0082, 0, 10800, 112}, {0x2081, 0x400, 10800, 123}, {0x2082, 0x400, 10800, 123}, {0x0081, 0, 10800, 135}, {0x0082, 0, 10800, 135}, {0x2081, 0x400, 10800, 146}, {0x2082, 0x400, 10800, 146}, {0x0081, 0, 10800, 157}, {0x0082, 0, 10800, 157}, {0x2081, 0x400, 10800, 168}, {0x2082, 0x400, 10800, 168}, {0x0081, 0, 10800, 180}, {0x0082, 0, 10800, 180}, {0x2081, 0x400, 10800, 191}, {0x2082, 0x400, 10800, 191}, {0x0081, 0, 10800, 202}, {0x0082, 0, 10800, 202}, {0x2081, 0x400, 10800, 213}, {0x2082, 0x400, 10800, 213}, {0x0081, 0, 10800, 225}, {0x0082, 0, 10800, 225}, {0x2081, 0x400, 10800, 236}, {0x2082, 0x400, 10800, 236}, {0x0081, 0, 10800, 247}, {0x0082, 0, 10800, 247}, {0x2081, 0x400, 10800, 258}, {0x2082, 0x400, 10800, 258}, {0x0081, 0, 10800, 270}, {0x0082, 0, 10800, 270}, {0x2081, 0x400, 10800, 281}, {0x2082, 0x400, 10800, 281}, {0x0081, 0, 10800, 292}, {0x0082, 0, 10800, 292}, {0x2081, 0x400, 10800, 303}, {0x2082, 0x400, 10800, 303}, {0x0081, 0, 10800, 315}, {0x0082, 0, 10800, 315}, {0x2081, 0x400, 10800, 326}, {0x2082, 0x400, 10800, 326}, {0x0081, 0, 10800, 337}, {0x0082, 0, 10800, 337}, {0x2081, 0x400, 10800, 348}, {0x2082, 0x400, 10800, 348}
1409 };
1410 
1411 const TextRectangle SEAL_16_TRS[] =
1412 {
1413   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
1414 };
1415 
1416 const int SEAL_16_DEFAULT_ADJUST[] =
1417 {
1418   2500
1419 };
1420 
1421 const CustomShape CS_SEAL_16(
1422   SEAL_16_VERTICES, sizeof(SEAL_16_VERTICES) / sizeof(Vertex),
1423   nullptr, 0,
1424   SEAL_16_CALC, sizeof(SEAL_16_CALC) / sizeof(Calculation),
1425   SEAL_16_DEFAULT_ADJUST, sizeof(SEAL_16_DEFAULT_ADJUST) / sizeof(int),
1426   SEAL_16_TRS, sizeof(SEAL_16_TRS) / sizeof(TextRectangle),
1427   21600, 21600,
1428   nullptr, 0);
1429 
1430 const Vertex NO_SMOKING_VERTICES[] =
1431 {
1432   {10800, 10800}, {10800, 10800}, {0, 360}, {CALCULATED_VALUE(0), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(9), CALCULATED_VALUE(0xa)}, {CALCULATED_VALUE(0xb), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0xd), CALCULATED_VALUE(0xe)}, {CALCULATED_VALUE(0xf), CALCULATED_VALUE(0x10)}
1433 };
1434 
1435 const unsigned short NO_SMOKING_SEGMENTS[] =
1436 {
1437   0xa203, 0x6000, 0xa404, 0x6000, 0xa404, 0x6000, 0x8000
1438 };
1439 
1440 const Calculation NO_SMOKING_CALC[] =
1441 {
1442   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, PROP_ADJUST_VAL_FIRST, 1, 2}, {0xa080, 0x403, 0, 0x402}, {0x8000, 10800, 0, 0x403}, {0x4000, 10800, 0x403, 0}, {0x8000, 10800, 0, 0x404}, {0x4000, 10800, 0x404, 0}, {0x6081, 0x405, 0x407, 45}, {0x6082, 0x405, 0x407, 45}, {0x6081, 0x405, 0x408, 45}, {0x6082, 0x405, 0x408, 45}, {0x6081, 0x406, 0x408, 45}, {0x6082, 0x406, 0x408, 45}, {0x6081, 0x406, 0x407, 45}, {0x6082, 0x406, 0x407, 45}
1443 };
1444 
1445 const TextRectangle NO_SMOKING_TRS[] =
1446 {
1447   { {3163, 3163}, {18437, 18437} }
1448 };
1449 
1450 const int NO_SMOKING_DEFAULT_ADJUST[] =
1451 {
1452   2700
1453 };
1454 
1455 const Vertex NO_SMOKING_GLUE_POINTS[] =
1456 {
1457   {10800, 0}, {3163, 3163}, {0, 10800}, {3163, 18437}, {10800, 21600}, {18437, 18437}, {21600, 10800}, {18437, 3163}
1458 };
1459 
1460 const CustomShape CS_NO_SMOKING(
1461   NO_SMOKING_VERTICES, sizeof(NO_SMOKING_VERTICES) / sizeof(Vertex),
1462   NO_SMOKING_SEGMENTS, sizeof(NO_SMOKING_SEGMENTS) / sizeof(unsigned short),
1463   NO_SMOKING_CALC, sizeof(NO_SMOKING_CALC) / sizeof(Calculation),
1464   NO_SMOKING_DEFAULT_ADJUST, sizeof(NO_SMOKING_DEFAULT_ADJUST) / sizeof(int),
1465   NO_SMOKING_TRS, sizeof(NO_SMOKING_TRS) / sizeof(TextRectangle),
1466   21600, 21600,
1467   NO_SMOKING_GLUE_POINTS, sizeof(NO_SMOKING_GLUE_POINTS) / sizeof(Vertex));
1468 
1469 const Vertex SEAL_8_VERTICES[] =
1470 {
1471   {CALCULATED_VALUE(5), CALCULATED_VALUE(6)}, {CALCULATED_VALUE(11), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(17), CALCULATED_VALUE(18)}, {CALCULATED_VALUE(23), CALCULATED_VALUE(24)}, {CALCULATED_VALUE(29), CALCULATED_VALUE(30)}, {CALCULATED_VALUE(35), CALCULATED_VALUE(36)}, {CALCULATED_VALUE(41), CALCULATED_VALUE(42)}, {CALCULATED_VALUE(47), CALCULATED_VALUE(48)}, {CALCULATED_VALUE(53), CALCULATED_VALUE(54)}, {CALCULATED_VALUE(59), CALCULATED_VALUE(60)}, {CALCULATED_VALUE(65), CALCULATED_VALUE(66)}, {CALCULATED_VALUE(71), CALCULATED_VALUE(72)}, {CALCULATED_VALUE(77), CALCULATED_VALUE(78)}, {CALCULATED_VALUE(83), CALCULATED_VALUE(84)}, {CALCULATED_VALUE(89), CALCULATED_VALUE(90)}, {CALCULATED_VALUE(95), CALCULATED_VALUE(96)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(6)}
1472 };
1473 
1474 const Calculation SEAL_8_CALC[] =
1475 {
1476   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2081, 0x400, 10800, 315}, {0x2082, 0x400, 10800, 315}, {0x2081, 0x400, 10800, 135}, {0x2082, 0x400, 10800, 135}, {0x0081, 0, 10800, 0}, {0x0082, 0, 10800, 0}, {0x2081, 0x400, 10800, 7}, {0x2082, 0x400, 10800, 7}, {0x0081, 0, 10800, 15}, {0x0082, 0, 10800, 15}, {0x2081, 0x400, 10800, 22}, {0x2082, 0x400, 10800, 22}, {0x0081, 0, 10800, 30}, {0x0082, 0, 10800, 30}, {0x2081, 0x400, 10800, 37}, {0x2082, 0x400, 10800, 37}, {0x0081, 0, 10800, 45}, {0x0082, 0, 10800, 45}, {0x2081, 0x400, 10800, 52}, {0x2082, 0x400, 10800, 52}, {0x0081, 0, 10800, 60}, {0x0082, 0, 10800, 60}, {0x2081, 0x400, 10800, 67}, {0x2082, 0x400, 10800, 67}, {0x0081, 0, 10800, 75}, {0x0082, 0, 10800, 75}, {0x2081, 0x400, 10800, 82}, {0x2082, 0x400, 10800, 82}, {0x0081, 0, 10800, 90}, {0x0082, 0, 10800, 90}, {0x2081, 0x400, 10800, 97}, {0x2082, 0x400, 10800, 97}, {0x0081, 0, 10800, 105}, {0x0082, 0, 10800, 105}, {0x2081, 0x400, 10800, 112}, {0x2082, 0x400, 10800, 112}, {0x0081, 0, 10800, 120}, {0x0082, 0, 10800, 120}, {0x2081, 0x400, 10800, 127}, {0x2082, 0x400, 10800, 127}, {0x0081, 0, 10800, 135}, {0x0082, 0, 10800, 135}, {0x2081, 0x400, 10800, 142}, {0x2082, 0x400, 10800, 142}, {0x0081, 0, 10800, 150}, {0x0082, 0, 10800, 150}, {0x2081, 0x400, 10800, 157}, {0x2082, 0x400, 10800, 157}, {0x0081, 0, 10800, 165}, {0x0082, 0, 10800, 165}, {0x2081, 0x400, 10800, 172}, {0x2082, 0x400, 10800, 172}, {0x0081, 0, 10800, 180}, {0x0082, 0, 10800, 180}, {0x2081, 0x400, 10800, 187}, {0x2082, 0x400, 10800, 187}, {0x0081, 0, 10800, 195}, {0x0082, 0, 10800, 195}, {0x2081, 0x400, 10800, 202}, {0x2082, 0x400, 10800, 202}, {0x0081, 0, 10800, 210}, {0x0082, 0, 10800, 210}, {0x2081, 0x400, 10800, 217}, {0x2082, 0x400, 10800, 217}, {0x0081, 0, 10800, 225}, {0x0082, 0, 10800, 225}, {0x2081, 0x400, 10800, 232}, {0x2082, 0x400, 10800, 232}, {0x0081, 0, 10800, 240}, {0x0082, 0, 10800, 240}, {0x2081, 0x400, 10800, 247}, {0x2082, 0x400, 10800, 247}, {0x0081, 0, 10800, 255}, {0x0082, 0, 10800, 255}, {0x2081, 0x400, 10800, 262}, {0x2082, 0x400, 10800, 262}, {0x0081, 0, 10800, 270}, {0x0082, 0, 10800, 270}, {0x2081, 0x400, 10800, 277}, {0x2082, 0x400, 10800, 277}, {0x0081, 0, 10800, 285}, {0x0082, 0, 10800, 285}, {0x2081, 0x400, 10800, 292}, {0x2082, 0x400, 10800, 292}, {0x0081, 0, 10800, 300}, {0x0082, 0, 10800, 300}, {0x2081, 0x400, 10800, 307}, {0x2082, 0x400, 10800, 307}, {0x0081, 0, 10800, 315}, {0x0082, 0, 10800, 315}, {0x2081, 0x400, 10800, 322}, {0x2082, 0x400, 10800, 322}, {0x0081, 0, 10800, 330}, {0x0082, 0, 10800, 330}, {0x2081, 0x400, 10800, 337}, {0x2082, 0x400, 10800, 337}, {0x0081, 0, 10800, 345}, {0x0082, 0, 10800, 345}, {0x2081, 0x400, 10800, 352}, {0x2082, 0x400, 10800, 352}
1477 };
1478 
1479 const TextRectangle SEAL_8_TRS[] =
1480 {
1481   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
1482 };
1483 
1484 const int SEAL_8_DEFAULT_ADJUST[] =
1485 {
1486   2500
1487 };
1488 
1489 const CustomShape CS_SEAL_8(
1490   SEAL_8_VERTICES, sizeof(SEAL_8_VERTICES) / sizeof(Vertex),
1491   nullptr, 0,
1492   SEAL_8_CALC, sizeof(SEAL_8_CALC) / sizeof(Calculation),
1493   SEAL_8_DEFAULT_ADJUST, sizeof(SEAL_8_DEFAULT_ADJUST) / sizeof(int),
1494   SEAL_8_TRS, sizeof(SEAL_8_TRS) / sizeof(TextRectangle),
1495   21600, 21600,
1496   nullptr, 0);
1497 
1498 const Vertex RIBBON_2_VERTICES[] =
1499 {
1500   {CALCULATED_VALUE(12), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(13)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(14)}, {CALCULATED_VALUE(15), 21600}, {CALCULATED_VALUE(16), 21600}, {0, 21600}, {2750, CALCULATED_VALUE(7)}, {0, CALCULATED_VALUE(2)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(5)}, {CALCULATED_VALUE(10), 0}, {CALCULATED_VALUE(11), 0}, {CALCULATED_VALUE(17), 0}, {CALCULATED_VALUE(18), 0}, {CALCULATED_VALUE(19), CALCULATED_VALUE(5)}, {CALCULATED_VALUE(19), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(19), CALCULATED_VALUE(2)}, {21600, CALCULATED_VALUE(2)}, {18850, CALCULATED_VALUE(7)}, {21600, 21600}, {CALCULATED_VALUE(20), 21600}, {CALCULATED_VALUE(21), 21600}, {CALCULATED_VALUE(22), CALCULATED_VALUE(14)}, {CALCULATED_VALUE(22), CALCULATED_VALUE(13)}, {CALCULATED_VALUE(22), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(13)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(23)}, {CALCULATED_VALUE(15), CALCULATED_VALUE(24)}, {CALCULATED_VALUE(16), CALCULATED_VALUE(24)}, {CALCULATED_VALUE(11), CALCULATED_VALUE(24)}, {CALCULATED_VALUE(10), CALCULATED_VALUE(24)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(25)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(27)}, {CALCULATED_VALUE(10), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(11), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(22), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(22), CALCULATED_VALUE(13)}, {CALCULATED_VALUE(22), CALCULATED_VALUE(23)}, {CALCULATED_VALUE(21), CALCULATED_VALUE(24)}, {CALCULATED_VALUE(20), CALCULATED_VALUE(24)}, {CALCULATED_VALUE(17), CALCULATED_VALUE(24)}, {CALCULATED_VALUE(18), CALCULATED_VALUE(24)}, {CALCULATED_VALUE(19), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(19), CALCULATED_VALUE(25)}, {CALCULATED_VALUE(19), CALCULATED_VALUE(27)}, {CALCULATED_VALUE(18), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(17), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(25)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(19), CALCULATED_VALUE(25)}, {CALCULATED_VALUE(19), CALCULATED_VALUE(2)}
1501 };
1502 
1503 const unsigned short RIBBON_2_SEGMENTS[] =
1504 {
1505   0x4000, 0x0001, 0x2001, 0x0005, 0x2001, 0x0001, 0x2001, 0x0005, 0x2001, 0x0001, 0x6001, 0x8000, 0x4000, 0x0001, 0x2001, 0x0001, 0x2002, 0x6001, 0x8000, 0x4000, 0x0001, 0x2001, 0x0001, 0x2002, 0x6001, 0x8000, 0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
1506 };
1507 
1508 const Calculation RIBBON_2_CALC[] =
1509 {
1510   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x8000, 21600, 0, 0x401}, {0x2001, 0x402, 1, 2}, {0x2001, 0x403, 1, 2}, {0x2001, 0x404, 1, 2}, {0x2001, 0x401, 1, 2}, {0x8000, 21600, 0, 0x406}, {0x0000, 420, 0, 0}, {0x2001, 0x408, 2, 1}, {0x6000, 0x400, 0x408, 0}, {0x6000, 0x400, 0x409, 0}, {0x2000, 0x400, 2700, 0}, {0x8000, 21600, 0, 0x404}, {0x8000, 21600, 0, 0x405}, {0xa000, 0x40c, 0, 0x408}, {0xa000, 0x40c, 0, 0x409}, {0x8000, 21600, 0, 0x40b}, {0x8000, 21600, 0, 0x40a}, {0x8000, 21600, 0, 0x400}, {0x8000, 21600, 0, 0x410}, {0x8000, 21600, 0, 0x40f}, {0x8000, 21600, 0, 0x40c}, {0xa000, 0x40d, 0, 0x405}, {0x6000, 0x401, 0x403, 0}, {0x6000, 0x401, 0x404, 0}, {0x6000, 0x419, 0x405, 0}, {0xa000, 0x419, 0, 0x405}
1511 };
1512 
1513 const TextRectangle RIBBON_2_TRS[] =
1514 {
1515   { {CALCULATED_VALUE(0), 0}, {CALCULATED_VALUE(19), CALCULATED_VALUE(1)} }
1516 };
1517 
1518 const int RIBBON_2_DEFAULT_ADJUST[] =
1519 {
1520   5400, 18900
1521 };
1522 
1523 const CustomShape CS_RIBBON_2(
1524   RIBBON_2_VERTICES, sizeof(RIBBON_2_VERTICES) / sizeof(Vertex),
1525   RIBBON_2_SEGMENTS, sizeof(RIBBON_2_SEGMENTS) / sizeof(unsigned short),
1526   RIBBON_2_CALC, sizeof(RIBBON_2_CALC) / sizeof(Calculation),
1527   RIBBON_2_DEFAULT_ADJUST, sizeof(RIBBON_2_DEFAULT_ADJUST) / sizeof(int),
1528   RIBBON_2_TRS, sizeof(RIBBON_2_TRS) / sizeof(TextRectangle),
1529   21600, 21600,
1530   nullptr, 0);
1531 
1532 const Vertex CHEVRON_VERTICES[] =
1533 {
1534   {0, 0}, {CALCULATED_VALUE(0), 0}, {21600, 10800}, {CALCULATED_VALUE(0), 21600}, {0, 21600}, {CALCULATED_VALUE(1), 10800}
1535 };
1536 
1537 const unsigned short CHEVRON_SEGMENTS[] =
1538 {
1539   0x4000, 0x0005, 0x6001, 0x8000
1540 };
1541 
1542 const Calculation CHEVRON_CALC[] =
1543 {
1544   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, 0x0400}
1545 };
1546 
1547 const TextRectangle CHEVRON_TRS[] =
1548 {
1549   { {0, 0}, {21600, 21600} }
1550 };
1551 
1552 const int CHEVRON_DEFAULT_ADJUST[] =
1553 {
1554   16200
1555 };
1556 
1557 const CustomShape CS_CHEVRON(
1558   CHEVRON_VERTICES, sizeof(CHEVRON_VERTICES) / sizeof(Vertex),
1559   CHEVRON_SEGMENTS, sizeof(CHEVRON_SEGMENTS) / sizeof(unsigned short),
1560   CHEVRON_CALC, sizeof(CHEVRON_CALC) / sizeof(Calculation),
1561   CHEVRON_DEFAULT_ADJUST, sizeof(CHEVRON_DEFAULT_ADJUST) / sizeof(int),
1562   CHEVRON_TRS, sizeof(CHEVRON_TRS) / sizeof(TextRectangle),
1563   21600, 21600,
1564   nullptr, 0);
1565 
1566 const Vertex PENTAGON_VERTICES[] =
1567 {
1568   {10800, 0}, {0, 8260}, {4230, 21600}, {17370, 21600}, {21600, 8260}, {10800, 0}
1569 };
1570 
1571 const TextRectangle PENTAGON_TRS[] =
1572 {
1573   { {4230, 5080}, {17370, 21600} }
1574 };
1575 
1576 const Vertex PENTAGON_GLUE_POINTS[] =
1577 {
1578   {10800, 0}, {0, 8260}, {4230, 21600}, {10800, 21600}, {17370, 21600}, {21600, 8260}
1579 };
1580 
1581 const CustomShape CS_PENTAGON(
1582   PENTAGON_VERTICES, sizeof(PENTAGON_VERTICES) / sizeof(Vertex),
1583   nullptr, 0,
1584   nullptr, 0,
1585   nullptr, 0,
1586   PENTAGON_TRS, sizeof(PENTAGON_TRS) / sizeof(TextRectangle),
1587   21600, 21600,
1588   PENTAGON_GLUE_POINTS, sizeof(PENTAGON_GLUE_POINTS) / sizeof(Vertex));
1589 
1590 const Vertex RIBBON_VERTICES[] =
1591 {
1592   {0, 0}, {CALCULATED_VALUE(3), 0}, {CALCULATED_VALUE(4), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(6), 0}, {21600, 0}, {CALCULATED_VALUE(18), CALCULATED_VALUE(14)}, {21600, CALCULATED_VALUE(15)}, {CALCULATED_VALUE(9), CALCULATED_VALUE(15)}, {CALCULATED_VALUE(9), CALCULATED_VALUE(16)}, {CALCULATED_VALUE(8), 21600}, {CALCULATED_VALUE(1), 21600}, {CALCULATED_VALUE(0), CALCULATED_VALUE(16)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(15)}, {0, CALCULATED_VALUE(15)}, {2700, CALCULATED_VALUE(14)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(13)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(6), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(8), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(9), CALCULATED_VALUE(13)}, {CALCULATED_VALUE(8), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(13)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(15)}, {CALCULATED_VALUE(9), CALCULATED_VALUE(13)}, {CALCULATED_VALUE(9), CALCULATED_VALUE(15)}
1593 };
1594 
1595 const unsigned short RIBBON_SEGMENTS[] =
1596 {
1597   0x4000, 0x0001, 0xa701, 0x0003, 0xa801, 0x0005, 0xa801, 0x0001, 0xa701, 0x0003, 0x6000, 0x8000, 0x4000, 0xaa00, 0xa801, 0x0001, 0xa702, 0x0001, 0x8000, 0x4000, 0xaa00, 0xa801, 0x0001, 0xa702, 0x0001, 0x8000, 0x4000, 0xaa00, 0x0001, 0x8000, 0x4000, 0xaa00, 0x0001, 0x8000
1598 };
1599 
1600 const Calculation RIBBON_CALC[] =
1601 {
1602   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, 0x400, 675, 0}, {0x2000, 0x401, 675, 0}, {0x2000, 0x402, 675, 0}, {0x2000, 0x403, 675, 0}, {0x8000, 21600, 0, 0x404}, {0x8000, 21600, 0, 0x403}, {0x8000, 21600, 0, 0x402}, {0x8000, 21600, 0, 0x401}, {0x8000, 21600, 0, 0x400}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2001, 0x40a, 1, 4}, {0x2001, 0x40b, 2, 1}, {0x2001, 0x40b, 3, 1}, {0x8000, 10800, 0, 0x40c}, {0x8000, 21600, 0, 0x40a}, {0x8000, 21600, 0, 0x40b}, {0x0001, 21600, 1, 2}, {0x0000, 21600, 0, 2700}, {0x2000, 0x411, 0, 2700}
1603 };
1604 
1605 const TextRectangle RIBBON_TRS[] =
1606 {
1607   { {CALCULATED_VALUE(0), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(9), 21600} }
1608 };
1609 
1610 const int RIBBON_DEFAULT_ADJUST[] =
1611 {
1612   5400, 2700
1613 };
1614 
1615 const Vertex RIBBON_GLUE_POINTS[] =
1616 {
1617   {CALCULATED_VALUE(17), CALCULATED_VALUE(10)}, {2700, CALCULATED_VALUE(14)}, {CALCULATED_VALUE(17), 21600}, {CALCULATED_VALUE(18), CALCULATED_VALUE(14)}
1618 };
1619 
1620 const CustomShape CS_RIBBON(
1621   RIBBON_VERTICES, sizeof(RIBBON_VERTICES) / sizeof(Vertex),
1622   RIBBON_SEGMENTS, sizeof(RIBBON_SEGMENTS) / sizeof(unsigned short),
1623   RIBBON_CALC, sizeof(RIBBON_CALC) / sizeof(Calculation),
1624   RIBBON_DEFAULT_ADJUST, sizeof(RIBBON_DEFAULT_ADJUST) / sizeof(int),
1625   RIBBON_TRS, sizeof(RIBBON_TRS) / sizeof(TextRectangle),
1626   21600, 21600,
1627   RIBBON_GLUE_POINTS, sizeof(RIBBON_GLUE_POINTS) / sizeof(Vertex));
1628 
1629 const Vertex CALLOUT_2_VERTICES[] =
1630 {
1631   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(0), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(5)}
1632 };
1633 
1634 const unsigned short CALLOUT_2_SEGMENTS[] =
1635 {
1636   0x4000, 0xab00, 0x0003, 0x6000, 0x8000, // NO STROKE
1637   0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
1638 };
1639 
1640 const Calculation CALLOUT_2_CALC[] =
1641 {
1642   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 2, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 3, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 4, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 5, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 6, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 7, 0, 0}
1643 };
1644 
1645 const int CALLOUT_2_DEFAULT_ADJUST[] =
1646 {
1647   -10000, 24500, -3600, 4000, -1800, 4000
1648 };
1649 
1650 const CustomShape CS_CALLOUT_2(
1651   CALLOUT_2_VERTICES, sizeof(CALLOUT_2_VERTICES) / sizeof(Vertex),
1652   CALLOUT_2_SEGMENTS, sizeof(CALLOUT_2_SEGMENTS) / sizeof(unsigned short),
1653   CALLOUT_2_CALC, sizeof(CALLOUT_2_CALC) / sizeof(Calculation),
1654   CALLOUT_2_DEFAULT_ADJUST, sizeof(CALLOUT_2_DEFAULT_ADJUST) / sizeof(int),
1655   nullptr, 0,
1656   21600, 21600,
1657   nullptr, 0);
1658 
1659 const Vertex CALLOUT_3_VERTICES[] =
1660 {
1661   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(6), CALCULATED_VALUE(7)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(5)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(1)}
1662 };
1663 
1664 const unsigned short CALLOUT_3_SEGMENTS[] =
1665 {
1666   0x4000, 0xab00, 0x0003, 0x6000, 0x8000, // NO STROKE
1667   0x4000, 0xaa00, 0x0003, 0x8000 // NO FILL
1668 };
1669 
1670 const Calculation CALLOUT_3_CALC[] =
1671 {
1672   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 2, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 3, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 4, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 5, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 6, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 7, 0, 0}
1673 };
1674 
1675 const int CALLOUT_3_DEFAULT_ADJUST[] =
1676 {
1677   23400, 24500, 25200, 21600, 25200, 4000, 23400, 4000
1678 };
1679 
1680 const CustomShape CS_CALLOUT_3(
1681   CALLOUT_3_VERTICES, sizeof(CALLOUT_3_VERTICES) / sizeof(Vertex),
1682   CALLOUT_3_SEGMENTS, sizeof(CALLOUT_3_SEGMENTS) / sizeof(unsigned short),
1683   CALLOUT_3_CALC, sizeof(CALLOUT_3_CALC) / sizeof(Calculation),
1684   CALLOUT_3_DEFAULT_ADJUST, sizeof(CALLOUT_3_DEFAULT_ADJUST) / sizeof(int),
1685   nullptr, 0,
1686   21600, 21600,
1687   nullptr, 0);
1688 
1689 const Vertex CALLOUT_1_VERTICES[] =
1690 {
1691   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(0), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}
1692 };
1693 
1694 const unsigned short CALLOUT_1_SEGMENTS[] =
1695 {
1696   0x4000, 0xab00, 0x0003, 0x6000, 0x8000, // NO STROKE
1697   0x4000, 0x0001, 0x8000
1698 };
1699 
1700 const Calculation CALLOUT_1_CALC[] =
1701 {
1702   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 2, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 3, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 4, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 5, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 6, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 7, 0, 0}
1703 };
1704 
1705 const int CALLOUT_1_DEFAULT_ADJUST[] =
1706 {
1707   -8300, 24500, -1800, 4000
1708 };
1709 
1710 const CustomShape CS_CALLOUT_1(
1711   CALLOUT_1_VERTICES, sizeof(CALLOUT_1_VERTICES) / sizeof(Vertex),
1712   CALLOUT_1_SEGMENTS, sizeof(CALLOUT_1_SEGMENTS) / sizeof(unsigned short),
1713   CALLOUT_1_CALC, sizeof(CALLOUT_1_CALC) / sizeof(Calculation),
1714   CALLOUT_1_DEFAULT_ADJUST, sizeof(CALLOUT_1_DEFAULT_ADJUST) / sizeof(int),
1715   nullptr, 0,
1716   21600, 21600,
1717   nullptr, 0);
1718 
1719 const Vertex CURVED_CONNECTOR_5_VERTICES[] =
1720 {
1721   {0, 0}, {CALCULATED_VALUE(21), 0}, {CALCULATED_VALUE(0), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(14)}, {CALCULATED_VALUE(6), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(8), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(18)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(16)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(20)}, {CALCULATED_VALUE(10), 21600}, {21600, 21600}
1722 };
1723 
1724 const unsigned short CURVED_CONNECTOR_5_SEGMENTS[] =
1725 {
1726   0x4000, 0x2004, 0x8000
1727 };
1728 
1729 const Calculation CURVED_CONNECTOR_5_CALC[] =
1730 {
1731   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 2, 0, 0}, {0x6000, 0x400, 0x401, 0}, {0x2001, 0x402, 1, 2}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x6000, 0x400, 0x403, 0}, {0x2001, 0x405, 1, 2}, {0x6000, 0x401, 0x403, 0}, {0x2001, 0x407, 1, 2}, {0x2000, 0x401, 21600, 0}, {0x2001, 0x409, 1, 2}, {0x2001, 0x404, 1, 2}, {0x2001, 0x40b, 1, 2}, {0x6000, 0x404, 0x40b, 0}, {0x2001, 0x40d, 1, 2}, {0x2000, 0x404, 21600, 0}, {0x2001, 0x40f, 1, 2}, {0x6000, 0x404, 0x410, 0}, {0x2001, 0x411, 1, 2}, {0x2000, 0x410, 21600, 0}, {0x2001, 0x413, 1, 2}, {0x2001, 0x400, 1, 2}
1732 };
1733 
1734 const int CURVED_CONNECTOR_5_DEFAULT_ADJUST[] =
1735 {
1736   10800, 10800, 10800
1737 };
1738 
1739 const CustomShape CS_CURVED_CONNECTOR_5(
1740   CURVED_CONNECTOR_5_VERTICES, sizeof(CURVED_CONNECTOR_5_VERTICES) / sizeof(Vertex),
1741   CURVED_CONNECTOR_5_SEGMENTS, sizeof(CURVED_CONNECTOR_5_SEGMENTS) / sizeof(unsigned short),
1742   CURVED_CONNECTOR_5_CALC, sizeof(CURVED_CONNECTOR_5_CALC) / sizeof(Calculation),
1743   CURVED_CONNECTOR_5_DEFAULT_ADJUST, sizeof(CURVED_CONNECTOR_5_DEFAULT_ADJUST) / sizeof(int),
1744   nullptr, 0,
1745   21600, 21600,
1746   nullptr, 0);
1747 
1748 const Vertex CURVED_CONNECTOR_4_VERTICES[] =
1749 {
1750   {0, 0}, {CALCULATED_VALUE(1), 0}, {CALCULATED_VALUE(0), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(8)}, {21600, CALCULATED_VALUE(14)}, {21600, 21600}
1751 };
1752 
1753 const unsigned short CURVED_CONNECTOR_4_SEGMENTS[] =
1754 {
1755   0x4000, 0x2003, 0x8000
1756 };
1757 
1758 const Calculation CURVED_CONNECTOR_4_CALC[] =
1759 {
1760   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2001, 0x400, 1, 2}, {0x4000, 21600, 0x400, 0}, {0x2001, 0x402, 1, 2}, {0x6000, 0x400, 0x403, 0}, {0x2001, 0x404, 1, 2}, {0x2000, 0x403, 21600, 0}, {0x2001, 0x406, 1, 2}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2001, PROP_ADJUST_VAL_FIRST + 1, 1, 2}, {0x2001, PROP_ADJUST_VAL_FIRST + 1, 1, 4}, {0x6000, 0x408, 0x409, 0}, {0x2001, 0x40b, 1, 2}, {0x2000, 0x408, 21600, 0}, {0x2001, 0x40d, 1, 2}
1761 };
1762 
1763 const int CURVED_CONNECTOR_4_DEFAULT_ADJUST[] =
1764 {
1765   10800, 10800
1766 };
1767 
1768 const CustomShape CS_CURVED_CONNECTOR_4(
1769   CURVED_CONNECTOR_4_VERTICES, sizeof(CURVED_CONNECTOR_4_VERTICES) / sizeof(Vertex),
1770   CURVED_CONNECTOR_4_SEGMENTS, sizeof(CURVED_CONNECTOR_4_SEGMENTS) / sizeof(unsigned short),
1771   CURVED_CONNECTOR_4_CALC, sizeof(CURVED_CONNECTOR_4_CALC) / sizeof(Calculation),
1772   CURVED_CONNECTOR_4_DEFAULT_ADJUST, sizeof(CURVED_CONNECTOR_4_DEFAULT_ADJUST) / sizeof(int),
1773   nullptr, 0,
1774   21600, 21600,
1775   nullptr, 0);
1776 
1777 const Vertex CURVED_CONNECTOR_3_VERTICES[] =
1778 {
1779   {0, 0}, {CALCULATED_VALUE(1), 0}, {CALCULATED_VALUE(0), 5400}, {CALCULATED_VALUE(0), 10800}, {CALCULATED_VALUE(0), 16200}, {CALCULATED_VALUE(3), 21600}, {21600, 21600}
1780 };
1781 
1782 const unsigned short CURVED_CONNECTOR_3_SEGMENTS[] =
1783 {
1784   0x4000, 0x2002, 0x8000
1785 };
1786 
1787 const Calculation CURVED_CONNECTOR_3_CALC[] =
1788 {
1789   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2001, 0x400, 1, 2}, {0x2000, 0x400, 21600, 0}, {0x2001, 0x402, 1, 2}
1790 };
1791 
1792 const int CURVED_CONNECTOR_3_DEFAULT_ADJUST[] =
1793 {
1794   10800
1795 };
1796 
1797 const CustomShape CS_CURVED_CONNECTOR_3(
1798   CURVED_CONNECTOR_3_VERTICES, sizeof(CURVED_CONNECTOR_3_VERTICES) / sizeof(Vertex),
1799   CURVED_CONNECTOR_3_SEGMENTS, sizeof(CURVED_CONNECTOR_3_SEGMENTS) / sizeof(unsigned short),
1800   CURVED_CONNECTOR_3_CALC, sizeof(CURVED_CONNECTOR_3_CALC) / sizeof(Calculation),
1801   CURVED_CONNECTOR_3_DEFAULT_ADJUST, sizeof(CURVED_CONNECTOR_3_DEFAULT_ADJUST) / sizeof(int),
1802   nullptr, 0,
1803   21600, 21600,
1804   nullptr, 0);
1805 
1806 
1807 const Vertex BENT_CONNECTOR_5_VERTICES[] =
1808 {
1809   {0, 0}, {CALCULATED_VALUE(0), 0}, {CALCULATED_VALUE(0), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(1), 21600}, {21600, 21600}
1810 };
1811 
1812 const unsigned short BENT_CONNECTOR_5_SEGMENTS[] =
1813 {
1814   0x4000, 0x0005, 0x8000
1815 };
1816 
1817 const Calculation BENT_CONNECTOR_5_CALC[] =
1818 {
1819   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 2, 0, 0}, {0x6000, 0x400, 0x401, 0}, {0x2001, 0x402, 1, 2}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2001, 0x404, 1, 2}, {0x4000, 21600, 0x404, 0}, {0x2001, 0x406, 1, 2}
1820 };
1821 
1822 const int BENT_CONNECTOR_5_DEFAULT_ADJUST[] =
1823 {
1824   10800, 10800, 10800
1825 };
1826 
1827 const CustomShape CS_BENT_CONNECTOR_5(
1828   BENT_CONNECTOR_5_VERTICES, sizeof(BENT_CONNECTOR_5_VERTICES) / sizeof(Vertex),
1829   BENT_CONNECTOR_5_SEGMENTS, sizeof(BENT_CONNECTOR_5_SEGMENTS) / sizeof(unsigned short),
1830   BENT_CONNECTOR_5_CALC, sizeof(BENT_CONNECTOR_5_CALC) / sizeof(Calculation),
1831   BENT_CONNECTOR_5_DEFAULT_ADJUST, sizeof(BENT_CONNECTOR_5_DEFAULT_ADJUST) / sizeof(int),
1832   nullptr, 0,
1833   21600, 21600,
1834   nullptr, 0);
1835 
1836 const Vertex CURVED_CONNECTOR_2_VERTICES[] =
1837 {
1838   {0, 0}, {10800, 0}, {21600, 10800}, {21600, 21600}
1839 };
1840 
1841 const unsigned short CURVED_CONNECTOR_2_SEGMENTS[] =
1842 {
1843   0x4000, 0x2001, 0x8000
1844 };
1845 
1846 const CustomShape CS_CURVED_CONNECTOR_2(
1847   CURVED_CONNECTOR_2_VERTICES, sizeof(CURVED_CONNECTOR_2_VERTICES) / sizeof(Vertex),
1848   CURVED_CONNECTOR_2_SEGMENTS, sizeof(CURVED_CONNECTOR_2_SEGMENTS) / sizeof(unsigned short),
1849   nullptr, 0,
1850   nullptr, 0,
1851   nullptr, 0,
1852   21600, 21600,
1853   nullptr, 0);
1854 
1855 const Vertex BENT_CONNECTOR_4_VERTICES[] =
1856 {
1857   {0, 0}, {CALCULATED_VALUE(0), 0}, {CALCULATED_VALUE(0), CALCULATED_VALUE(1)}, {21600, CALCULATED_VALUE(1)}, {21600, 21600}
1858 };
1859 
1860 const unsigned short BENT_CONNECTOR_4_SEGMENTS[] =
1861 {
1862   0x4000, 0x0004, 0x8000
1863 };
1864 
1865 const Calculation BENT_CONNECTOR_4_CALC[] =
1866 {
1867   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, 0x400, 21600, 0}, {0x2001, 0x402, 1, 2}, {0x2001, 0x401, 1, 2}
1868 };
1869 
1870 const int BENT_CONNECTOR_4_DEFAULT_ADJUST[] =
1871 {
1872   10800, 10800
1873 };
1874 
1875 const CustomShape CS_BENT_CONNECTOR_4(
1876   BENT_CONNECTOR_4_VERTICES, sizeof(BENT_CONNECTOR_4_VERTICES) / sizeof(Vertex),
1877   BENT_CONNECTOR_4_SEGMENTS, sizeof(BENT_CONNECTOR_4_SEGMENTS) / sizeof(unsigned short),
1878   BENT_CONNECTOR_4_CALC, sizeof(BENT_CONNECTOR_4_CALC) / sizeof(Calculation),
1879   BENT_CONNECTOR_4_DEFAULT_ADJUST, sizeof(BENT_CONNECTOR_4_DEFAULT_ADJUST) / sizeof(int),
1880   nullptr, 0,
1881   21600, 21600,
1882   nullptr, 0);
1883 
1884 const Vertex BENT_CONNECTOR_3_VERTICES[] =
1885 {
1886   {0, 0}, {CALCULATED_VALUE(0), 0}, {CALCULATED_VALUE(0), 21600}, {21600, 21600}
1887 };
1888 
1889 const unsigned short BENT_CONNECTOR_3_SEGMENTS[] =
1890 {
1891   0x4000, 0x0003, 0x8000
1892 };
1893 
1894 const Calculation BENT_CONNECTOR_3_CALC[] =
1895 {
1896   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}
1897 };
1898 
1899 const int BENT_CONNECTOR_3_DEFAULT_ADJUST[] =
1900 {
1901   10800
1902 };
1903 
1904 const CustomShape CS_BENT_CONNECTOR_3(
1905   BENT_CONNECTOR_3_VERTICES, sizeof(BENT_CONNECTOR_3_VERTICES) / sizeof(Vertex),
1906   BENT_CONNECTOR_3_SEGMENTS, sizeof(BENT_CONNECTOR_3_SEGMENTS) / sizeof(unsigned short),
1907   BENT_CONNECTOR_3_CALC, sizeof(BENT_CONNECTOR_3_CALC) / sizeof(Calculation),
1908   BENT_CONNECTOR_3_DEFAULT_ADJUST, sizeof(BENT_CONNECTOR_3_DEFAULT_ADJUST) / sizeof(int),
1909   nullptr, 0,
1910   21600, 21600,
1911   nullptr, 0);
1912 
1913 const Vertex BENT_CONNECTOR_2_VERTICES[] =
1914 {
1915   {0, 0}, {21600, 0}, {21600, 21600}
1916 };
1917 
1918 const unsigned short BENT_CONNECTOR_2_SEGMENTS[] =
1919 {
1920   0x4000, 0x0002, 0x8000
1921 };
1922 
1923 const CustomShape CS_BENT_CONNECTOR_2(
1924   BENT_CONNECTOR_2_VERTICES, sizeof(BENT_CONNECTOR_2_VERTICES) / sizeof(Vertex),
1925   BENT_CONNECTOR_2_SEGMENTS, sizeof(BENT_CONNECTOR_2_SEGMENTS) / sizeof(unsigned short),
1926   nullptr, 0,
1927   nullptr, 0,
1928   nullptr, 0,
1929   21600, 21600,
1930   nullptr, 0);
1931 
1932 const Vertex STRAIGHT_CONNECTOR_1_VERTICES[] =
1933 {
1934   {0, 0}, {21600, 21600}
1935 };
1936 
1937 const unsigned short STRAIGHT_CONNECTOR_1_SEGMENTS[] =
1938 {
1939   0x4000, 0x0001, 0x8000
1940 };
1941 
1942 const CustomShape CS_STRAIGHT_CONNECTOR_1(
1943   STRAIGHT_CONNECTOR_1_VERTICES, sizeof(STRAIGHT_CONNECTOR_1_VERTICES) / sizeof(Vertex),
1944   STRAIGHT_CONNECTOR_1_SEGMENTS, sizeof(STRAIGHT_CONNECTOR_1_SEGMENTS) / sizeof(unsigned short),
1945   nullptr, 0,
1946   nullptr, 0,
1947   nullptr, 0,
1948   21600, 21600,
1949   nullptr, 0);
1950 
1951 const Vertex TEXT_SIMPLE_VERTICES[] =
1952 {
1953   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}
1954 };
1955 
1956 const CustomShape CS_TEXT_SIMPLE(
1957   TEXT_SIMPLE_VERTICES, sizeof(TEXT_SIMPLE_VERTICES) / sizeof(Vertex),
1958   nullptr, 0,
1959   nullptr, 0,
1960   nullptr, 0,
1961   nullptr, 0,
1962   21600, 21600,
1963   nullptr, 0);
1964 
1965 const Vertex DONUT_VERTICES[] =
1966 {
1967   {10800, 10800}, {10800, 10800}, {0, 360}, {10800, 10800}, {CALCULATED_VALUE(1), CALCULATED_VALUE(1)}, {0, 360}
1968 };
1969 
1970 const unsigned short DONUT_SEGMENTS[] =
1971 {
1972   0xa203, 0x6000, 0xa203, 0x8000
1973 };
1974 
1975 const Calculation DONUT_CALC[] =
1976 {
1977   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}
1978 };
1979 
1980 const TextRectangle DONUT_TRS[] =
1981 {
1982   { {3163, 3163}, {18437, 18437} }
1983 };
1984 
1985 const int DONUT_DEFAULT_ADJUST[] =
1986 {
1987   5400
1988 };
1989 
1990 const Vertex DONUT_GLUE_POINTS[] =
1991 {
1992   {10800, 0}, {3163, 3163}, {0, 10800}, {3163, 18437}, {10800, 21600}, {18437, 18437}, {21600, 10800}, {18437, 3163}
1993 };
1994 
1995 const CustomShape CS_DONUT(
1996   DONUT_VERTICES, sizeof(DONUT_VERTICES) / sizeof(Vertex),
1997   DONUT_SEGMENTS, sizeof(DONUT_SEGMENTS) / sizeof(unsigned short),
1998   DONUT_CALC, sizeof(DONUT_CALC) / sizeof(Calculation),
1999   DONUT_DEFAULT_ADJUST, sizeof(DONUT_DEFAULT_ADJUST) / sizeof(int),
2000   DONUT_TRS, sizeof(DONUT_TRS) / sizeof(TextRectangle),
2001   21600, 21600,
2002   DONUT_GLUE_POINTS, sizeof(DONUT_GLUE_POINTS) / sizeof(Vertex));
2003 
2004 const Vertex CAN_VERTICES[] =
2005 {
2006   {44, 0}, {20, 0}, {0, CALCULATED_VALUE(2)}, {0, CALCULATED_VALUE(0)}, {0, CALCULATED_VALUE(3)}, {0, CALCULATED_VALUE(4)}, {20, 21600}, {44, 21600}, {68, 21600}, {88, CALCULATED_VALUE(4)}, {88, CALCULATED_VALUE(3)}, {88, CALCULATED_VALUE(0)}, {88, CALCULATED_VALUE(2)}, {68, 0}, {44, 0}, {44, 0}, {20, 0}, {0, CALCULATED_VALUE(2)}, {0, CALCULATED_VALUE(0)}, {0, CALCULATED_VALUE(5)}, {20, CALCULATED_VALUE(6)}, {44, CALCULATED_VALUE(6)}, {68, CALCULATED_VALUE(6)}, {88, CALCULATED_VALUE(5)}, {88, CALCULATED_VALUE(0)}, {88, CALCULATED_VALUE(2)}, {68, 0}, {44, 0}
2007 };
2008 
2009 const unsigned short CAN_SEGMENTS[] =
2010 {
2011   0x4000, 0x2001, 0x0001, 0x2002, 0x0001, 0x2001, 0x6001, 0x8000, 0x4000, 0x2004, 0x6001, 0x8000
2012 };
2013 
2014 const Calculation CAN_CALC[] =
2015 {
2016   {0x2001, PROP_ADJUST_VAL_FIRST, 2, 4}, {0x2001, OTHER_CALC_VAL, 6, 11}, {0xA000, OTHER_CALC_VAL, 0, OTHER_CALC_VAL | 0x1}, {0x8000, 21600, 0, OTHER_CALC_VAL}, {0x6000, OTHER_CALC_VAL | 0x3, OTHER_CALC_VAL | 0x1, 0}, {0x6000, OTHER_CALC_VAL, OTHER_CALC_VAL | 0x1, 0}, {0x2001, PROP_ADJUST_VAL_FIRST, 2, 2}, {0x0000, 44, 0, 0}
2017 };
2018 
2019 const TextRectangle CAN_TRS[] =
2020 {
2021   { {0, CALCULATED_VALUE(6)}, {88, CALCULATED_VALUE(3)} }
2022 };
2023 
2024 const int CAN_DEFAULT_ADJUST[] =
2025 {
2026   5400
2027 };
2028 
2029 const Vertex CAN_GLUE_POINTS[] =
2030 {
2031   {44, CALCULATED_VALUE(6)}, {44, 0}, {0, 10800}, {44, 21600}, {88, 10800}
2032 };
2033 
2034 const CustomShape CS_CAN(
2035   CAN_VERTICES, sizeof(CAN_VERTICES) / sizeof(Vertex),
2036   CAN_SEGMENTS, sizeof(CAN_SEGMENTS) / sizeof(unsigned short),
2037   CAN_CALC, sizeof(CAN_CALC) / sizeof(Calculation),
2038   CAN_DEFAULT_ADJUST, sizeof(CAN_DEFAULT_ADJUST) / sizeof(int),
2039   CAN_TRS, sizeof(CAN_TRS) / sizeof(TextRectangle),
2040   88, 21600,
2041   CAN_GLUE_POINTS, sizeof(CAN_GLUE_POINTS) / sizeof(Vertex));
2042 
2043 const Vertex PLAQUE_VERTICES[] =
2044 {
2045   {CALCULATED_VALUE(0), 0}, {0, CALCULATED_VALUE(1)}, {0, CALCULATED_VALUE(2)}, {CALCULATED_VALUE(0), 21600}, {CALCULATED_VALUE(3), 21600}, {21600, CALCULATED_VALUE(2)}, {21600, CALCULATED_VALUE(1)}, {CALCULATED_VALUE(3), 0}
2046 };
2047 
2048 const unsigned short PLAQUE_SEGMENTS[] =
2049 {
2050   0x4000, 0xA801, 0x0001, 0xA701, 0x0001, 0xA801, 0x0001, 0xA701, 0x6000, 0x8000
2051 };
2052 
2053 const Calculation PLAQUE_CALC[] =
2054 {
2055   {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xA000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0xA000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0x2082, PROP_ADJUST_VAL_FIRST, 0, 45}, {0x2000, OTHER_CALC_VAL | 0x4, 0, 10800}, {0x8000, 0, 0, PROP_ADJUST_VAL_FIRST}, {0xA000, OTHER_CALC_VAL | 0x6, 0, OTHER_CALC_VAL | 0x5}, {0xA000, PROP_GEO_LEFT, 0, OTHER_CALC_VAL | 0x7}, {0xA000, PROP_GEO_TOP, 0, OTHER_CALC_VAL | 0x7}, {0x6000, PROP_GEO_RIGHT, OTHER_CALC_VAL | 0x7, 0}, {0x6000, PROP_GEO_BOTTOM, OTHER_CALC_VAL | 0x7, 0}, {0xA000, PROP_GEO_LEFT, 0, OTHER_CALC_VAL | 0x5}, {0xA000, PROP_GEO_TOP, 0, OTHER_CALC_VAL | 0x5}, {0x6000, PROP_GEO_RIGHT, OTHER_CALC_VAL | 0x5, 0}, {0x6000, PROP_GEO_BOTTOM, OTHER_CALC_VAL | 0x5, 0}
2056 };
2057 
2058 const TextRectangle PLAQUE_TRS[] =
2059 {
2060   { {CALCULATED_VALUE(0xC), CALCULATED_VALUE(0xD)}, {CALCULATED_VALUE(0xE), CALCULATED_VALUE(0xF)} }
2061 };
2062 
2063 const int PLAQUE_DEFAULT_ADJUST[] =
2064 {
2065   3600
2066 };
2067 
2068 const Vertex PLAQUE_GLUE_POINTS[] =
2069 {
2070   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
2071 };
2072 
2073 const CustomShape CS_PLAQUE(
2074   PLAQUE_VERTICES, sizeof(PLAQUE_VERTICES) / sizeof(Vertex),
2075   PLAQUE_SEGMENTS, sizeof(PLAQUE_SEGMENTS) / sizeof(unsigned short),
2076   PLAQUE_CALC, sizeof(PLAQUE_CALC) / sizeof(Calculation),
2077   PLAQUE_DEFAULT_ADJUST, sizeof(PLAQUE_DEFAULT_ADJUST) / sizeof(int),
2078   PLAQUE_TRS, sizeof(PLAQUE_TRS) / sizeof(TextRectangle),
2079   21600, 21600,
2080   PLAQUE_GLUE_POINTS, sizeof(PLAQUE_GLUE_POINTS) / sizeof(Vertex));
2081 
2082 
2083 const Vertex BALLOON_VERTICES[] =
2084 {
2085   {3590, 0}, {0, 3590}, {0, 14460}, {3590, 18050}, {CALCULATED_VALUE(40), 21600}, {5420, 18050}, {18010, 18050}, {21600, 14460}, {21600, 3590}, {18010, 0}
2086 };
2087 
2088 const unsigned short BALLOON_SEGMENTS[] =
2089 {
2090   0x4000, 0xA701, 0x0001, 0xA801, 0x0003, 0xA701, 0x0001, 0xA801, 0x6001, 0x8000
2091 };
2092 
2093 const Calculation BALLOON_CALC[] =
2094 {
2095   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 10800}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 10800}, {0x6006, OTHER_CALC_VAL | 0x12, PROP_ADJUST_VAL_FIRST, 0}, {0x6006, OTHER_CALC_VAL | 0x12, PROP_ADJUST_VAL_FIRST + 1, 6280}, {OTHER_CALC_VAL | 0x17, PROP_ADJUST_VAL_FIRST, 0, 0x6006}, {0x6006, OTHER_CALC_VAL | 0x17, PROP_ADJUST_VAL_FIRST + 1, 15320}, {0x6006, OTHER_CALC_VAL | 0x1A, PROP_ADJUST_VAL_FIRST, 6280}, {0x6006, OTHER_CALC_VAL | 0x1A, PROP_ADJUST_VAL_FIRST + 1, 21600}, {0x6006, OTHER_CALC_VAL | 0x1D, PROP_ADJUST_VAL_FIRST, 15320}, {0x6006, OTHER_CALC_VAL | 0x1D, PROP_ADJUST_VAL_FIRST + 1, 21600}, {0x6006, OTHER_CALC_VAL | 0x20, PROP_ADJUST_VAL_FIRST, 21600}, {0x6006, OTHER_CALC_VAL | 0x20, PROP_ADJUST_VAL_FIRST + 1, 15320}, {0x6006, OTHER_CALC_VAL | 0x22, PROP_ADJUST_VAL_FIRST, 21600}, {0x6006, OTHER_CALC_VAL | 0x22, PROP_ADJUST_VAL_FIRST + 1, 6280}, {0x6006, OTHER_CALC_VAL | 0x24, PROP_ADJUST_VAL_FIRST, 15320}, {0x6006, OTHER_CALC_VAL | 0x24, PROP_ADJUST_VAL_FIRST + 1, 0}, {0x6006, OTHER_CALC_VAL | 0x26, PROP_ADJUST_VAL_FIRST, 6280}, {0x6006, OTHER_CALC_VAL | 0x26, PROP_ADJUST_VAL_FIRST + 1, 0}, {0xA006, PROP_ADJUST_VAL_FIRST, -1, OTHER_CALC_VAL | 0x13}, {0xA006, OTHER_CALC_VAL | 0x1, -1, OTHER_CALC_VAL | 0x16}, {0x2003, OTHER_CALC_VAL, 0, 0}, {0x2003, OTHER_CALC_VAL | 0x1, 0, 0}, {0xA000, OTHER_CALC_VAL | 0x14, 0, OTHER_CALC_VAL | 0x15}, {0xA006, PROP_ADJUST_VAL_FIRST, -1, OTHER_CALC_VAL | 0x18}, {0x6006, OTHER_CALC_VAL | 0x1, OTHER_CALC_VAL | 0x16, -1}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 21600}, {0x6006, OTHER_CALC_VAL | 0x19, OTHER_CALC_VAL | 0x1B, -1}, {0xA006, OTHER_CALC_VAL, -1, OTHER_CALC_VAL | 0x1C}, {0xA000, OTHER_CALC_VAL | 0x15, 0, OTHER_CALC_VAL | 0x14}, {0x6006, OTHER_CALC_VAL | 0x19, OTHER_CALC_VAL | 0x1E, -1}, {0x6006, OTHER_CALC_VAL, OTHER_CALC_VAL | 0x1C, -1}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 21600}, {0x6006, OTHER_CALC_VAL | 0x1F, OTHER_CALC_VAL | 0x21, -1}, {0x6006, OTHER_CALC_VAL | 0x1, OTHER_CALC_VAL | 0x16, -1}, {0x6006, OTHER_CALC_VAL | 0x1F, OTHER_CALC_VAL | 0x23, -1}, {0xA006, OTHER_CALC_VAL | 0x1, -1, OTHER_CALC_VAL | 0x16}, {0xA006, PROP_ADJUST_VAL_FIRST + 1, -1, OTHER_CALC_VAL | 0x25}, {0x6006, OTHER_CALC_VAL, OTHER_CALC_VAL | 0x1C, -1}, {0xA006, PROP_ADJUST_VAL_FIRST + 1, -1, OTHER_CALC_VAL | 0x27}, {0xA006, OTHER_CALC_VAL, -1, OTHER_CALC_VAL | 0x1C}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}
2096 };
2097 
2098 const TextRectangle BALLOON_TRS[] =
2099 {
2100   { {800, 800}, {20800, 17250} }
2101 };
2102 
2103 const int BALLOON_DEFAULT_ADJUST[] =
2104 {
2105   1400, 25920
2106 };
2107 
2108 const Vertex ARC_VERTICES[] =
2109 {
2110   {0, 0}, {21600, 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(5)}, {10800, 10800}, {0, 0}, {21600, 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(5)}
2111 };
2112 
2113 const unsigned short ARC_SEGMENTS[] =
2114 {
2115   0xa504, 0xab00, 0x0001, 0x6001, 0x8000, 0xa504, 0xaa00, 0x8000
2116 };
2117 
2118 const Calculation ARC_CALC[] =
2119 {
2120   {0x4009, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x2000, 0x400, 10800, 0}, {0x400a, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x2000, 0x402, 10800, 0}, {0x4009, 10800, PROP_ADJUST_VAL_FIRST + 1, 0}, {0x2000, 0x404, 10800, 0}, {0x400a, 10800, PROP_ADJUST_VAL_FIRST + 1, 0}, {0x2000, 0x406, 10800, 0}
2121 };
2122 
2123 const int ARC_DEFAULT_ADJUST[] =
2124 {
2125   270 << 16, 0
2126 };
2127 
2128 const Vertex ARC_GLUE_POINTS[] =
2129 {
2130   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
2131 };
2132 
2133 const CustomShape CS_ARC(
2134   ARC_VERTICES, sizeof(ARC_VERTICES) / sizeof(Vertex),
2135   ARC_SEGMENTS, sizeof(ARC_SEGMENTS) / sizeof(unsigned short),
2136   ARC_CALC, sizeof(ARC_CALC) / sizeof(Calculation),
2137   ARC_DEFAULT_ADJUST, sizeof(ARC_DEFAULT_ADJUST) / sizeof(int),
2138   nullptr, 0,
2139   21600, 21600,
2140   ARC_GLUE_POINTS, sizeof(ARC_GLUE_POINTS) / sizeof(Vertex), 2 | 1);
2141 
2142 const CustomShape CS_BALLOON(
2143   BALLOON_VERTICES, sizeof(BALLOON_VERTICES) / sizeof(Vertex),
2144   BALLOON_SEGMENTS, sizeof(BALLOON_SEGMENTS) / sizeof(unsigned short),
2145   BALLOON_CALC, sizeof(BALLOON_CALC) / sizeof(Calculation),
2146   BALLOON_DEFAULT_ADJUST, sizeof(BALLOON_DEFAULT_ADJUST) / sizeof(int),
2147   BALLOON_TRS, sizeof(BALLOON_TRS) / sizeof(TextRectangle),
2148   21600, 21600,
2149   nullptr, 0);
2150 
2151 const Vertex CUBE_VERTICES[] =
2152 {
2153   {0, CALCULATED_VALUE(12)}, {0, CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), 0}, {CALCULATED_VALUE(11), 0}, {CALCULATED_VALUE(11), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(12)}, {0, CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), 0}, {CALCULATED_VALUE(11), 0}, {CALCULATED_VALUE(4), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(11), 0}, {CALCULATED_VALUE(11), CALCULATED_VALUE(3)}
2154 };
2155 
2156 const unsigned short CUBE_SEGMENTS[] =
2157 {
2158   0x4000, 0x0005, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000
2159 };
2160 
2161 const Calculation CUBE_CALC[] =
2162 {
2163   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x6000, PROP_GEO_TOP, OTHER_CALC_VAL, 0}, {0x6000, PROP_GEO_LEFT, OTHER_CALC_VAL, 0}, {0xA000, PROP_GEO_BOTTOM, 0, OTHER_CALC_VAL}, {0xA000, PROP_GEO_RIGHT, 0, OTHER_CALC_VAL}, {0xA000, PROP_GEO_RIGHT, 0, OTHER_CALC_VAL | 2}, {0x2001, OTHER_CALC_VAL | 5, 1, 2}, {0x6000, OTHER_CALC_VAL | 2, OTHER_CALC_VAL | 6, 0}, {0xA000, PROP_GEO_BOTTOM, 0, OTHER_CALC_VAL | 1}, {0x2001, OTHER_CALC_VAL | 8, 1, 2}, {0x6000, OTHER_CALC_VAL | 1, OTHER_CALC_VAL | 9, 0}, {0x2000, PROP_GEO_RIGHT, 0, 0}, {0x2000, PROP_GEO_BOTTOM, 0, 0}
2164 };
2165 
2166 const TextRectangle CUBE_TRS[] =
2167 {
2168   { {0, CALCULATED_VALUE(1)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(12)} }
2169 };
2170 
2171 const int CUBE_DEFAULT_ADJUST[] =
2172 {
2173   5400
2174 };
2175 
2176 const Vertex CUBE_GLUE_POINTS[] =
2177 {
2178   {CALCULATED_VALUE(7), 0}, {CALCULATED_VALUE(6), CALCULATED_VALUE(1)}, {0, CALCULATED_VALUE(10)}, {CALCULATED_VALUE(6), 21600}, {CALCULATED_VALUE(4), CALCULATED_VALUE(10)}, {21600, CALCULATED_VALUE(9)}
2179 };
2180 
2181 const CustomShape CS_CUBE(
2182   CUBE_VERTICES, sizeof(CUBE_VERTICES) / sizeof(Vertex),
2183   CUBE_SEGMENTS, sizeof(CUBE_SEGMENTS) / sizeof(unsigned short),
2184   CUBE_CALC, sizeof(CUBE_CALC) / sizeof(Calculation),
2185   CUBE_DEFAULT_ADJUST, sizeof(CUBE_DEFAULT_ADJUST) / sizeof(int),
2186   CUBE_TRS, sizeof(CUBE_TRS) / sizeof(TextRectangle),
2187   21600, 21600,
2188   CUBE_GLUE_POINTS, sizeof(CUBE_GLUE_POINTS) / sizeof(Vertex));
2189 
2190 const Vertex HOME_PLATE_VERTICES[] =
2191 {
2192   {0, 0}, {CALCULATED_VALUE(0), 0}, {21600, 10800}, {CALCULATED_VALUE(0), 21600}, {0, 21600}
2193 };
2194 
2195 const unsigned short HOME_PLATE_SEGMENTS[] =
2196 {
2197   0x4000, 0x0004, 0x6001, 0x8000
2198 };
2199 
2200 const Calculation HOME_PLATE_CALC[] =
2201 {
2202   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}
2203 };
2204 
2205 const TextRectangle HOME_PLATE_TRS[] =
2206 {
2207   { {0, 0}, {21600, 21600} }
2208 };
2209 
2210 const int HOME_PLATE_DEFAULT_ADJUST[] =
2211 {
2212   16200
2213 };
2214 
2215 const CustomShape CS_HOME_PLATE(
2216   HOME_PLATE_VERTICES, sizeof(HOME_PLATE_VERTICES) / sizeof(Vertex),
2217   HOME_PLATE_SEGMENTS, sizeof(HOME_PLATE_SEGMENTS) / sizeof(unsigned short),
2218   HOME_PLATE_CALC, sizeof(HOME_PLATE_CALC) / sizeof(Calculation),
2219   HOME_PLATE_DEFAULT_ADJUST, sizeof(HOME_PLATE_DEFAULT_ADJUST) / sizeof(int),
2220   HOME_PLATE_TRS, sizeof(HOME_PLATE_TRS) / sizeof(TextRectangle),
2221   21600, 21600,
2222   nullptr, 0);
2223 
2224 const Vertex ARROW_VERTICES[] =
2225 {
2226   {0, CALCULATED_VALUE(0)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(0) }, {CALCULATED_VALUE(1), 0}, {21600, 10800}, {CALCULATED_VALUE(1), 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2) }, {0, CALCULATED_VALUE(2) }
2227 };
2228 
2229 const unsigned short ARROW_SEGMENTS[] =
2230 {
2231   0x4000, 0x0006, 0x6001, 0x8000
2232 };
2233 
2234 const Calculation ARROW_CALC[] =
2235 {
2236   {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x8000, 21600, 0, OTHER_CALC_VAL  | 1}, {0x6001, OTHER_CALC_VAL | 3, OTHER_CALC_VAL, 10800}, {0x6000, OTHER_CALC_VAL | 1, OTHER_CALC_VAL | 4, 0}, {0x6001, OTHER_CALC_VAL | 1, OTHER_CALC_VAL, 10800}, {0xA000, OTHER_CALC_VAL | 1, 0, OTHER_CALC_VAL | 6}
2237 };
2238 
2239 const TextRectangle ARROW_TRS[] =
2240 {
2241   { {0, CALCULATED_VALUE(0)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(2)} }
2242 };
2243 
2244 const int ARROW_DEFAULT_ADJUST[] =
2245 {
2246   16200, 5400
2247 };
2248 
2249 const CustomShape CS_ARROW(
2250   ARROW_VERTICES, sizeof(ARROW_VERTICES) / sizeof(Vertex),
2251   ARROW_SEGMENTS, sizeof(ARROW_SEGMENTS) / sizeof(unsigned short),
2252   ARROW_CALC, sizeof(ARROW_CALC) / sizeof(Calculation),
2253   ARROW_DEFAULT_ADJUST, sizeof(ARROW_DEFAULT_ADJUST) / sizeof(int),
2254   ARROW_TRS, sizeof(ARROW_TRS) / sizeof(TextRectangle),
2255   21600, 21600,
2256   nullptr, 0);
2257 
2258 const Vertex OCTAGON_VERTICES[] =
2259 {
2260   {CALCULATED_VALUE(0), 0}, {CALCULATED_VALUE(2), 0}, {21600, CALCULATED_VALUE(1)}, {21600, CALCULATED_VALUE(3)}, {CALCULATED_VALUE(2), 21600}, {CALCULATED_VALUE(0), 21600}, {0, CALCULATED_VALUE(3)}, {0, CALCULATED_VALUE(1)}
2261 };
2262 
2263 const unsigned short OCTAGON_SEGMENTS[] =
2264 {
2265   0x4000, 0x0007, 0x6001, 0x8000
2266 };
2267 
2268 const Calculation OCTAGON_CALC[] =
2269 {
2270   {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xA000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0xA000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, PROP_ADJUST_VAL_FIRST, 1, 2}, {0x6000, PROP_GEO_LEFT, OTHER_CALC_VAL | 4, 0}, {0x6000, PROP_GEO_TOP, OTHER_CALC_VAL | 4, 0}, {0xA000, PROP_GEO_RIGHT, 0, OTHER_CALC_VAL | 4}, {0xA000, PROP_GEO_BOTTOM, 0, OTHER_CALC_VAL | 4}
2271 };
2272 
2273 const TextRectangle OCTAGON_TRS[] =
2274 {
2275   { {CALCULATED_VALUE(5), CALCULATED_VALUE(6)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(8)} }
2276 };
2277 
2278 const int OCTAGON_DEFAULT_ADJUST[] =
2279 {
2280   5000
2281 };
2282 
2283 const Vertex OCTAGON_GLUE_POINTS[] =
2284 {
2285   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
2286 };
2287 
2288 const CustomShape CS_OCTAGON(
2289   OCTAGON_VERTICES, sizeof(OCTAGON_VERTICES) / sizeof(Vertex),
2290   OCTAGON_SEGMENTS, sizeof(OCTAGON_SEGMENTS) / sizeof(unsigned short),
2291   OCTAGON_CALC, sizeof(OCTAGON_CALC) / sizeof(Calculation),
2292   OCTAGON_DEFAULT_ADJUST, sizeof(OCTAGON_DEFAULT_ADJUST) / sizeof(int),
2293   OCTAGON_TRS, sizeof(OCTAGON_TRS) / sizeof(TextRectangle),
2294   21600, 21600,
2295   OCTAGON_GLUE_POINTS, sizeof(OCTAGON_GLUE_POINTS) / sizeof(Vertex));
2296 
2297 const Vertex ROUND_RECTANGLE_VERTICES[] =
2298 {
2299   {CALCULATED_VALUE(7), 0},
2300   {0, CALCULATED_VALUE(8)},
2301   {0, CALCULATED_VALUE(9)},
2302   {CALCULATED_VALUE(7), 21600},
2303   {CALCULATED_VALUE(10), 21600},
2304   {21600, CALCULATED_VALUE(9)},
2305   {21600, CALCULATED_VALUE(8)},
2306   {CALCULATED_VALUE(10), 0}
2307 };
2308 
2309 const unsigned short ROUND_RECTANGLE_SEGMENTS[] =
2310 {
2311   0x4000, 0xA701, 0x0001, 0xA801, 0x0001, 0xA701, 0x0001, 0xA801, 0x6000, 0x8000
2312 };
2313 
2314 const Calculation ROUND_RECTANGLE_CALC[] =
2315 {
2316   {0x000E, 0, 45, 0},                                  // 0
2317   {0x6009, PROP_ADJUST_VAL_FIRST, OTHER_CALC_VAL, 0},  // 1
2318   {0x2001, OTHER_CALC_VAL | 1, 3163, 7636},            // 2
2319   {0x6000, PROP_GEO_LEFT, OTHER_CALC_VAL | 2, 0},      // 3
2320   {0x6000, PROP_GEO_TOP, OTHER_CALC_VAL | 2, 0},       // 4
2321   {0xA000, PROP_GEO_RIGHT, 0, OTHER_CALC_VAL | 2},     // 5
2322   {0xA000, PROP_GEO_BOTTOM, 0, OTHER_CALC_VAL | 2},    // 6
2323   {0x6000, PROP_GEO_LEFT, OTHER_CALC_VAL | 13, 0},   // 7
2324   {0x6000, PROP_GEO_TOP, OTHER_CALC_VAL | 14, 0},    // 8
2325   {0xA000, PROP_GEO_BOTTOM, 0, OTHER_CALC_VAL | 14}, // 9
2326   {0xA000, PROP_GEO_RIGHT, 0, OTHER_CALC_VAL | 13},  // 10
2327   {0x2005, ASPECT_RATIO, 1, 0},                           // 11
2328   {0x2004, ASPECT_RATIO, 1, 0},                           // 12
2329   {0xA001, PROP_ADJUST_VAL_FIRST, 1, OTHER_CALC_VAL | 11}, // 13
2330   {0x6001, PROP_ADJUST_VAL_FIRST, OTHER_CALC_VAL | 12, 1} // 14
2331 };
2332 
2333 const TextRectangle ROUND_RECTANGLE_TRS[] =
2334 {
2335   { {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(6)} }
2336 };
2337 
2338 const int ROUND_RECTANGLE_DEFAULT_ADJUST[] =
2339 {
2340   3600
2341 };
2342 
2343 const CustomShape CS_ROUND_RECTANGLE(
2344   ROUND_RECTANGLE_VERTICES, sizeof(ROUND_RECTANGLE_VERTICES) / sizeof(Vertex),
2345   ROUND_RECTANGLE_SEGMENTS, sizeof(ROUND_RECTANGLE_SEGMENTS) / sizeof(unsigned short),
2346   ROUND_RECTANGLE_CALC, sizeof(ROUND_RECTANGLE_CALC) / sizeof(Calculation),
2347   ROUND_RECTANGLE_DEFAULT_ADJUST, sizeof(ROUND_RECTANGLE_DEFAULT_ADJUST) / sizeof(int),
2348   ROUND_RECTANGLE_TRS, sizeof(ROUND_RECTANGLE_TRS) / sizeof(TextRectangle),
2349   21600, 21600,
2350   nullptr, 0);
2351 
2352 const Vertex STAR_VERTICES[] =
2353 {
2354   {10797, 0}, {8278, 8256}, {0, 8256}, {6722, 13405}, {4198, 21600}, {10797, 16580}, {17401, 21600}, {14878, 13405}, {21600, 8256}, {13321, 8256}, {10797, 0}
2355 };
2356 
2357 const TextRectangle STAR_TRS[] =
2358 {
2359   { {6722, 8256}, {14878, 15460} }
2360 };
2361 
2362 const CustomShape CS_STAR(
2363   STAR_VERTICES, sizeof(STAR_VERTICES) / sizeof(Vertex),
2364   nullptr, 0,
2365   nullptr, 0,
2366   nullptr, 0,
2367   STAR_TRS, sizeof(STAR_TRS) / sizeof(TextRectangle),
2368   21600, 21600,
2369   nullptr, 0);
2370 
2371 const Vertex PLUS_VERTICES[] =
2372 {
2373   {CALCULATED_VALUE(1), 0}, {CALCULATED_VALUE(2), 0}, {CALCULATED_VALUE(2), CALCULATED_VALUE(1)}, {21600, CALCULATED_VALUE(1)}, {21600, CALCULATED_VALUE(3)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(2), 21600}, {CALCULATED_VALUE(1), 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(3)}, {0, CALCULATED_VALUE(3)}, {0, CALCULATED_VALUE(1)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(1), 0}
2374 };
2375 
2376 const Calculation PLUS_CALC[] =
2377 {
2378   {0x2001, PROP_ADJUST_VAL_FIRST, 10799, 10800}, {0x2000, OTHER_CALC_VAL, 0, 0}, {0xA000, PROP_GEO_RIGHT, 0, OTHER_CALC_VAL}, {0xA000, PROP_GEO_BOTTOM, 0, OTHER_CALC_VAL}
2379 };
2380 
2381 const TextRectangle PLUS_TRS[] =
2382 {
2383   { {CALCULATED_VALUE(1), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)} }
2384 };
2385 
2386 const int PLUS_DEFAULT_ADJUST[] =
2387 {
2388   5400
2389 };
2390 
2391 const Vertex PLUS_GLUE_POINTS[] =
2392 {
2393   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
2394 };
2395 
2396 const CustomShape CS_PLUS(
2397   PLUS_VERTICES, sizeof(PLUS_VERTICES) / sizeof(Vertex),
2398   nullptr, 0,
2399   PLUS_CALC, sizeof(PLUS_CALC) / sizeof(Calculation),
2400   PLUS_DEFAULT_ADJUST, sizeof(PLUS_DEFAULT_ADJUST) / sizeof(int),
2401   PLUS_TRS, sizeof(PLUS_TRS) / sizeof(TextRectangle),
2402   21600, 21600,
2403   PLUS_GLUE_POINTS, sizeof(PLUS_GLUE_POINTS) / sizeof(Vertex));
2404 
2405 
2406 const Vertex TRAPEZOID_VERTICES[] =
2407 {
2408   {0, 0}, {21600, 0}, {CALCULATED_VALUE(0), 21600}, {CALCULATED_VALUE(1), 21600}
2409 };
2410 
2411 const unsigned short TRAPEZOID_SEGMENTS[] =
2412 {
2413   0x4000, 0x0003, 0x6001, 0x8000
2414 };
2415 
2416 const Calculation TRAPEZOID_CALC[] =
2417 {
2418   {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2001, PROP_ADJUST_VAL_FIRST, 10, 18}, {0x2000, OTHER_CALC_VAL | 2, 1750, 0}, {0x8000, 21600, 0, OTHER_CALC_VAL | 3}, {0x2001, PROP_ADJUST_VAL_FIRST, 1, 2}, {0x8000, 21600, 0, OTHER_CALC_VAL | 5}
2419 };
2420 
2421 const TextRectangle TRAPEZOID_TRS[] =
2422 {
2423   { {CALCULATED_VALUE(3), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(4)} }
2424 };
2425 
2426 const int TRAPEZOID_DEFAULT_ADJUST[] =
2427 {
2428   5400
2429 };
2430 
2431 const Vertex TRAPEZOID_GLUE_POINTS[] =
2432 {
2433   {CALCULATED_VALUE(6), 10800}, {10800, 21600}, {CALCULATED_VALUE(5), 10800}, {10800, 0}
2434 };
2435 
2436 const CustomShape CS_TRAPEZOID(
2437   TRAPEZOID_VERTICES, sizeof(TRAPEZOID_VERTICES) / sizeof(Vertex),
2438   TRAPEZOID_SEGMENTS, sizeof(TRAPEZOID_SEGMENTS) / sizeof(unsigned short),
2439   TRAPEZOID_CALC, sizeof(TRAPEZOID_CALC) / sizeof(Calculation),
2440   TRAPEZOID_DEFAULT_ADJUST, sizeof(TRAPEZOID_DEFAULT_ADJUST) / sizeof(int),
2441   TRAPEZOID_TRS, sizeof(TRAPEZOID_TRS) / sizeof(TextRectangle),
2442   21600, 21600,
2443   TRAPEZOID_GLUE_POINTS, sizeof(TRAPEZOID_GLUE_POINTS) / sizeof(Vertex));
2444 
2445 const Vertex DIAMOND_VERTICES[] =
2446 {
2447   {10800, 0}, {21600, 10800}, {10800, 21600}, {0, 10800}, {10800, 0}
2448 };
2449 
2450 const TextRectangle DIAMOND_TRS[] =
2451 {
2452   { {5400, 5400}, {16200, 16200} }
2453 };
2454 
2455 const Vertex DIAMOND_GLUE_POINTS[] =
2456 {
2457   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
2458 };
2459 
2460 const CustomShape CS_DIAMOND(
2461   DIAMOND_VERTICES, sizeof(DIAMOND_VERTICES) / sizeof(Vertex),
2462   nullptr, 0,
2463   nullptr, 0,
2464   nullptr, 0,
2465   DIAMOND_TRS, sizeof(DIAMOND_TRS) / sizeof(TextRectangle),
2466   21600, 21600,
2467   DIAMOND_GLUE_POINTS, sizeof(DIAMOND_GLUE_POINTS) / sizeof(Vertex));
2468 
2469 const Vertex RIGHT_TRIANGLE_VERTICES[] =
2470 {
2471   {0, 0}, {21600, 21600}, {0, 21600}, {0, 0}
2472 };
2473 
2474 const TextRectangle RIGHT_TRIANGLE_TRS[] =
2475 {
2476   { {1900, 12700}, {12700, 19700} }
2477 };
2478 
2479 const Vertex RIGHT_TRIANGLE_GLUE_POINTS[] =
2480 {
2481   {10800, 0}, {5400, 10800}, {0, 21600}, {10800, 21600}, {21600, 21600}, {16200, 10800}
2482 };
2483 
2484 const CustomShape CS_RIGHT_TRIANGLE(
2485   RIGHT_TRIANGLE_VERTICES, sizeof(RIGHT_TRIANGLE_VERTICES) / sizeof(Vertex),
2486   nullptr, 0,
2487   nullptr, 0,
2488   nullptr, 0,
2489   RIGHT_TRIANGLE_TRS, sizeof(RIGHT_TRIANGLE_TRS) / sizeof(TextRectangle),
2490   21600, 21600,
2491   RIGHT_TRIANGLE_GLUE_POINTS, sizeof(RIGHT_TRIANGLE_GLUE_POINTS) / sizeof(Vertex));
2492 
2493 
2494 const Vertex RECTANGLE_VERTICES[] =
2495 {
2496   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}
2497 };
2498 
2499 const CustomShape CS_RECTANGLE(
2500   RECTANGLE_VERTICES, sizeof(RECTANGLE_VERTICES) / sizeof(Vertex),
2501   nullptr, 0,
2502   nullptr, 0,
2503   nullptr, 0,
2504   nullptr, 0,
2505   21600, 21600,
2506   nullptr, 0);
2507 
2508 const Vertex ELLIPSE_VERTICES[] =
2509 {
2510   {10800, 10800}, {10800, 10800}, {0, 360}
2511 };
2512 
2513 const unsigned short ELLIPSE_SEGMENTS[] =
2514 {
2515   0xA203, 0x6000, 0x8000
2516 };
2517 
2518 const TextRectangle ELLIPSE_TRS[] =
2519 {
2520   { {3163, 3163}, {18437, 18437} }
2521 };
2522 
2523 const Vertex ELLIPSE_GLUE_PTS[] =
2524 {
2525   {10800, 0}, {3163, 3163}, {0, 10800}, {3163, 18437}, {10800, 21600},
2526   {18437, 18437}, {21600, 10800}, {18437, 3163}
2527 };
2528 
2529 const CustomShape CS_ELLIPSE(
2530   ELLIPSE_VERTICES, sizeof(ELLIPSE_VERTICES) / sizeof(Vertex),
2531   ELLIPSE_SEGMENTS, sizeof(ELLIPSE_SEGMENTS) / sizeof(unsigned short),
2532   nullptr, 0,
2533   nullptr, 0,
2534   ELLIPSE_TRS, sizeof(ELLIPSE_TRS) / sizeof(TextRectangle),
2535   21600, 21600,
2536   ELLIPSE_GLUE_PTS, sizeof(ELLIPSE_GLUE_PTS) / sizeof(Vertex));
2537 
2538 const Vertex SEAL_4_VERTICES[] =
2539 {
2540   {0, 10800}, {CALCULATED_VALUE(4), CALCULATED_VALUE(4)},
2541   {10800, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)},
2542   {21600, 10800}, {CALCULATED_VALUE(3), CALCULATED_VALUE(3)},
2543   {10800, 21600}, {CALCULATED_VALUE(4), CALCULATED_VALUE(3)},
2544   {0, 10800}
2545 };
2546 
2547 const Calculation SEAL_4_CALC[] =
2548 {
2549   {0x0000, 7600, 0, 0},
2550   {0x6001, OTHER_CALC_VAL, PROP_ADJUST_VAL_FIRST, 10800},
2551   {0xA000, OTHER_CALC_VAL, 0, OTHER_CALC_VAL | 1},
2552   {0x4000, 10800, OTHER_CALC_VAL | 2, 0},
2553   {0x8000, 10800, 0, OTHER_CALC_VAL | 2}
2554 };
2555 
2556 const TextRectangle SEAL_4_TRS[] =
2557 {
2558   { {CALCULATED_VALUE(4), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(3)} }
2559 };
2560 
2561 const int SEAL_4_DEFAULT_ADJUST[] =
2562 {
2563   8100
2564 };
2565 
2566 const CustomShape CS_SEAL_4(
2567   SEAL_4_VERTICES, sizeof(SEAL_4_VERTICES) / sizeof(Vertex),
2568   nullptr, 0,
2569   SEAL_4_CALC, sizeof(SEAL_4_CALC) / sizeof(Calculation),
2570   SEAL_4_DEFAULT_ADJUST, sizeof(SEAL_4_DEFAULT_ADJUST) / sizeof(int),
2571   SEAL_4_TRS, sizeof(SEAL_4_TRS) / sizeof(TextRectangle),
2572   21600, 21600,
2573   nullptr, 0);
2574 
2575 const Vertex ISOCELES_TRIANGLE_VERTICES[] =
2576 {
2577   {CALCULATED_VALUE(0), 0}, {21600, 21600}, {0, 21600}
2578 };
2579 
2580 const unsigned short ISOCELES_TRIANGLE_SEGMENTS[] =
2581 {
2582   0x4000, 0x0002, 0x6001, 0x8000
2583 };
2584 
2585 const Calculation ISOCELES_TRIANGLE_CALC[] =
2586 {
2587   {0x4000, 0, PROP_ADJUST_VAL_FIRST, 0},
2588   {0x2001, PROP_ADJUST_VAL_FIRST, 1, 2},
2589   {0x2000, OTHER_CALC_VAL | 1, 10800, 0},
2590   {0x2001, PROP_ADJUST_VAL_FIRST, 2, 3},
2591   {0x2000, OTHER_CALC_VAL | 3, 7200, 0},
2592   {0x8000, 21600, 0, OTHER_CALC_VAL},
2593   {0x2001, OTHER_CALC_VAL | 5, 1, 2},
2594   {0x8000, 21600, 0, OTHER_CALC_VAL | 6}
2595 };
2596 
2597 const TextRectangle ISOCELES_TRIANGLE_TRS[] =
2598 {
2599   { {CALCULATED_VALUE(1), 10800}, {CALCULATED_VALUE(2), 18000} },
2600   { {CALCULATED_VALUE(3), 7200}, {CALCULATED_VALUE(4), 21600} }
2601 };
2602 
2603 const Vertex ISOCELES_TRIANGLE_GLUE_POINTS[] =
2604 {
2605   {10800, 0}, {CALCULATED_VALUE(1), 10800},
2606   {0, 21600}, {10800, 21600},
2607   {21600, 21600}, {CALCULATED_VALUE(7), 10800}
2608 };
2609 
2610 const int ISOCELES_TRIANGLE_DEFAULT_ADJUST[] =
2611 {
2612   10800
2613 };
2614 
2615 const CustomShape CS_ISOCELES_TRIANGLE(
2616   ISOCELES_TRIANGLE_VERTICES, sizeof(ISOCELES_TRIANGLE_VERTICES) / sizeof(Vertex),
2617   ISOCELES_TRIANGLE_SEGMENTS, sizeof(ISOCELES_TRIANGLE_SEGMENTS) / sizeof(unsigned short),
2618   ISOCELES_TRIANGLE_CALC, sizeof(ISOCELES_TRIANGLE_CALC) / sizeof(Calculation),
2619   ISOCELES_TRIANGLE_DEFAULT_ADJUST, sizeof(ISOCELES_TRIANGLE_DEFAULT_ADJUST) / sizeof(int),
2620   ISOCELES_TRIANGLE_TRS, sizeof(ISOCELES_TRIANGLE_TRS) / sizeof(TextRectangle),
2621   21600, 21600,
2622   ISOCELES_TRIANGLE_GLUE_POINTS, sizeof(ISOCELES_TRIANGLE_GLUE_POINTS) / sizeof(Vertex));
2623 
2624 const Vertex PARALLELOGRAM_VERTICES[] =
2625 {
2626   {CALCULATED_VALUE(0), 0}, {21600, 0}, {CALCULATED_VALUE(1), 21600}, {0, 21600}
2627 };
2628 
2629 const unsigned short PARALLELOGRAM_SEGMENTS[] =
2630 {
2631   0x4000, 0x003, 0x6001, 0x8000
2632 };
2633 
2634 const Calculation PARALLELOGRAM_CALC[] =
2635 {
2636   {0x4000, 0, PROP_ADJUST_VAL_FIRST, 0}, {0x8000, 0, 21600, PROP_ADJUST_VAL_FIRST}, {0x2001, PROP_ADJUST_VAL_FIRST, 10, 24}, {0x2000, OTHER_CALC_VAL | 2, 1750, 0}, {0x8000, 21600, 0, OTHER_CALC_VAL | 3}, {0x2001, OTHER_CALC_VAL, 1, 2}, {0x4000, 10800, OTHER_CALC_VAL | 5, 0}, {0x2000, OTHER_CALC_VAL, 0, 10800}, {0x6006, OTHER_CALC_VAL | 7, OTHER_CALC_VAL | 0xC, 21600}, {0x8000, 21600, 0, OTHER_CALC_VAL | 5}, {0x8001, 21600, 10800, OTHER_CALC_VAL}, {0x8000, 21600, 0, OTHER_CALC_VAL | 0xC}
2637 };
2638 
2639 const TextRectangle PARALLELOGRAM_TRS[] =
2640 {
2641   { {CALCULATED_VALUE(3), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(4)} }
2642 };
2643 
2644 const int PARALLELOGRAM_DEFAULT_ADJUST[] =
2645 {
2646   5400
2647 };
2648 
2649 const Vertex PARALLELOGRAM_GLUE_POINTS[] =
2650 {
2651   {CALCULATED_VALUE(6), 0}, {10800, CALCULATED_VALUE(8)}, {CALCULATED_VALUE(11), 10800}, {CALCULATED_VALUE(9), 21600}, {10800, CALCULATED_VALUE(10)}, {CALCULATED_VALUE(5), 10800}
2652 };
2653 
2654 const CustomShape CS_PARALLELOGRAM(
2655   PARALLELOGRAM_VERTICES, sizeof(PARALLELOGRAM_VERTICES) / sizeof(Vertex),
2656   PARALLELOGRAM_SEGMENTS, sizeof(PARALLELOGRAM_SEGMENTS) / sizeof(unsigned short),
2657   PARALLELOGRAM_CALC, sizeof(PARALLELOGRAM_CALC) / sizeof(Calculation),
2658   PARALLELOGRAM_DEFAULT_ADJUST, sizeof(PARALLELOGRAM_DEFAULT_ADJUST) / sizeof(int),
2659   PARALLELOGRAM_TRS, sizeof(PARALLELOGRAM_TRS) / sizeof(TextRectangle),
2660   21600, 21600,
2661   PARALLELOGRAM_GLUE_POINTS, sizeof(PARALLELOGRAM_GLUE_POINTS) / sizeof(Vertex));
2662 
2663 const Vertex HEXAGON_VERTICES[] =
2664 {
2665   {CALCULATED_VALUE(0), 0}, {CALCULATED_VALUE(1), 0}, {21600, 10800}, {CALCULATED_VALUE(1), 21600}, {CALCULATED_VALUE(0), 21600}, {0, 10800}
2666 };
2667 
2668 const unsigned short HEXAGON_SEGMENTS[] =
2669 {
2670   0x4000, 0x0005, 0x6001, 0x8000
2671 };
2672 
2673 const Calculation HEXAGON_CALC[] =
2674 {
2675   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, PROP_ADJUST_VAL_FIRST, 100, 234}, {0x2000, OTHER_CALC_VAL | 2, 1700, 0}, {0x8000, 21600, 0, OTHER_CALC_VAL | 3}
2676 };
2677 
2678 const TextRectangle HEXAGON_TRS[] =
2679 {
2680   { {CALCULATED_VALUE(3), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(4)} }
2681 };
2682 
2683 const int HEXAGON_DEFAULT_ADJUST[] =
2684 {
2685   5400
2686 };
2687 
2688 const Vertex HEXAGON_GLUE_POINTS[] =
2689 {
2690   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
2691 };
2692 
2693 const CustomShape CS_HEXAGON(
2694   HEXAGON_VERTICES, sizeof(HEXAGON_VERTICES) / sizeof(Vertex),
2695   HEXAGON_SEGMENTS, sizeof(HEXAGON_SEGMENTS) / sizeof(unsigned short),
2696   HEXAGON_CALC, sizeof(HEXAGON_CALC) / sizeof(Calculation),
2697   HEXAGON_DEFAULT_ADJUST, sizeof(HEXAGON_DEFAULT_ADJUST) / sizeof(int),
2698   HEXAGON_TRS, sizeof(HEXAGON_TRS) / sizeof(TextRectangle),
2699   21600, 21600,
2700   HEXAGON_GLUE_POINTS, sizeof(HEXAGON_GLUE_POINTS) / sizeof(Vertex));
2701 
2702 const Vertex FLOW_CHART_SUMMING_JUNCTION_VERTICES[] =
2703 {
2704   {10800, 10800}, {10800, 10800}, {0, 360}, {3100, 3100}, {18500, 18500}, {3100, 18500}, {18500, 3100}
2705 };
2706 
2707 const unsigned short FLOW_CHART_SUMMING_JUNCTION_SEGMENTS[] =
2708 {
2709   0xa203, 0x6000, 0x8000, 0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
2710 };
2711 
2712 const TextRectangle FLOW_CHART_SUMMING_JUNCTION_TRS[] =
2713 {
2714   { {3100, 3100}, {18500, 18500} }
2715 };
2716 
2717 const Vertex FLOW_CHART_SUMMING_JUNCTION_GLUE_POINTS[] =
2718 {
2719   {10800, 0}, {3163, 3163}, {0, 10800}, {3163, 18437}, {10800, 21600}, {18437, 18437}, {21600, 10800}, {18437, 3163}
2720 };
2721 
2722 const CustomShape CS_FLOW_CHART_SUMMING_JUNCTION(
2723   FLOW_CHART_SUMMING_JUNCTION_VERTICES, sizeof(FLOW_CHART_SUMMING_JUNCTION_VERTICES) / sizeof(Vertex),
2724   FLOW_CHART_SUMMING_JUNCTION_SEGMENTS, sizeof(FLOW_CHART_SUMMING_JUNCTION_SEGMENTS) / sizeof(unsigned short),
2725   nullptr, 0,
2726   nullptr, 0,
2727   FLOW_CHART_SUMMING_JUNCTION_TRS, sizeof(FLOW_CHART_SUMMING_JUNCTION_TRS) / sizeof(TextRectangle),
2728   21600, 21600,
2729   FLOW_CHART_SUMMING_JUNCTION_GLUE_POINTS, sizeof(FLOW_CHART_SUMMING_JUNCTION_GLUE_POINTS) / sizeof(Vertex));
2730 
2731 const Vertex FLOW_CHART_PREPARATION_VERTICES[] =
2732 {
2733   {4350, 0}, {17250, 0}, {21600, 10800}, {17250, 21600}, {4350, 21600}, {0, 10800}, {4350, 0}
2734 };
2735 
2736 const TextRectangle FLOW_CHART_PREPARATION_TRS[] =
2737 {
2738   { {4350, 0}, {17250, 21600} }
2739 };
2740 
2741 const Vertex FLOW_CHART_PREPARATION_GLUE_POINTS[] =
2742 {
2743   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
2744 };
2745 
2746 const CustomShape CS_FLOW_CHART_PREPARATION(
2747   FLOW_CHART_PREPARATION_VERTICES, sizeof(FLOW_CHART_PREPARATION_VERTICES) / sizeof(Vertex),
2748   nullptr, 0,
2749   nullptr, 0,
2750   nullptr, 0,
2751   FLOW_CHART_PREPARATION_TRS, sizeof(FLOW_CHART_PREPARATION_TRS) / sizeof(TextRectangle),
2752   21600, 21600,
2753   FLOW_CHART_PREPARATION_GLUE_POINTS, sizeof(FLOW_CHART_PREPARATION_GLUE_POINTS) / sizeof(Vertex));
2754 
2755 const Vertex FLOW_CHART_PUNCHED_TAPE_VERTICES[] =
2756 {
2757   {0, 2230}, {820, 3990}, {3410, 3980}, {5370, 4360}, {7430, 4030}, {10110, 3890}, {10690, 2270}, {11440, 300}, {14200, 160}, {16150, 0}, {18670, 170}, {20690, 390}, {21600, 2230}, {21600, 19420}, {20640, 17510}, {18320, 17490}, {16140, 17240}, {14710, 17370}, {11310, 17510}, {10770, 19430}, {10150, 21150}, {7380, 21290}, {5290, 21600}, {3220, 21250}, {610, 21130}, {0, 19420}
2758 };
2759 
2760 const unsigned short FLOW_CHART_PUNCHED_TAPE_SEGMENTS[] =
2761 {
2762   0x4000, 0x2004, 0x0001, 0x2004, 0x6000, 0x8000
2763 };
2764 
2765 const TextRectangle FLOW_CHART_PUNCHED_TAPE_TRS[] =
2766 {
2767   { {0, 4360}, {21600, 17240} }
2768 };
2769 
2770 const Vertex FLOW_CHART_PUNCHED_TAPE_GLUE_POINTS[] =
2771 {
2772   {10800, 2020}, {0, 10800}, {10800, 19320}, {21600, 10800}
2773 };
2774 
2775 const CustomShape CS_FLOW_CHART_PUNCHED_TAPE(
2776   FLOW_CHART_PUNCHED_TAPE_VERTICES, sizeof(FLOW_CHART_PUNCHED_TAPE_VERTICES) / sizeof(Vertex),
2777   FLOW_CHART_PUNCHED_TAPE_SEGMENTS, sizeof(FLOW_CHART_PUNCHED_TAPE_SEGMENTS) / sizeof(unsigned short),
2778   nullptr, 0,
2779   nullptr, 0,
2780   FLOW_CHART_PUNCHED_TAPE_TRS, sizeof(FLOW_CHART_PUNCHED_TAPE_TRS) / sizeof(TextRectangle),
2781   21600, 21600,
2782   FLOW_CHART_PUNCHED_TAPE_GLUE_POINTS, sizeof(FLOW_CHART_PUNCHED_TAPE_GLUE_POINTS) / sizeof(Vertex));
2783 
2784 const Vertex FLOW_CHART_PUNCHED_CARD_VERTICES[] =
2785 {
2786   {4300, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 4300}, {4300, 0}
2787 };
2788 
2789 const TextRectangle FLOW_CHART_PUNCHED_CARD_TRS[] =
2790 {
2791   { {0, 4300}, {21600, 21600} }
2792 };
2793 
2794 const Vertex FLOW_CHART_PUNCHED_CARD_GLUE_POINTS[] =
2795 {
2796   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
2797 };
2798 
2799 const CustomShape CS_FLOW_CHART_PUNCHED_CARD(
2800   FLOW_CHART_PUNCHED_CARD_VERTICES, sizeof(FLOW_CHART_PUNCHED_CARD_VERTICES) / sizeof(Vertex),
2801   nullptr, 0,
2802   nullptr, 0,
2803   nullptr, 0,
2804   FLOW_CHART_PUNCHED_CARD_TRS, sizeof(FLOW_CHART_PUNCHED_CARD_TRS) / sizeof(TextRectangle),
2805   21600, 21600,
2806   FLOW_CHART_PUNCHED_CARD_GLUE_POINTS, sizeof(FLOW_CHART_PUNCHED_CARD_GLUE_POINTS) / sizeof(Vertex));
2807 
2808 const Vertex FLOW_CHART_CONNECTOR_VERTICES[] =
2809 {
2810   {10800, 10800}, {10800, 10800}, {0, 360}
2811 };
2812 
2813 const unsigned short FLOW_CHART_CONNECTOR_SEGMENTS[] =
2814 {
2815   0xa203, 0x6000, 0x8000
2816 };
2817 
2818 const TextRectangle FLOW_CHART_CONNECTOR_TRS[] =
2819 {
2820   { {3180, 3180}, {18420, 18420} }
2821 };
2822 
2823 const Vertex FLOW_CHART_CONNECTOR_GLUE_POINTS[] =
2824 {
2825   {10800, 0}, {3163, 3163}, {0, 10800}, {3163, 18437}, {10800, 21600}, {18437, 18437}, {21600, 10800}, {18437, 3163}
2826 };
2827 
2828 const CustomShape CS_FLOW_CHART_CONNECTOR(
2829   FLOW_CHART_CONNECTOR_VERTICES, sizeof(FLOW_CHART_CONNECTOR_VERTICES) / sizeof(Vertex),
2830   FLOW_CHART_CONNECTOR_SEGMENTS, sizeof(FLOW_CHART_CONNECTOR_SEGMENTS) / sizeof(unsigned short),
2831   nullptr, 0,
2832   nullptr, 0,
2833   FLOW_CHART_CONNECTOR_TRS, sizeof(FLOW_CHART_CONNECTOR_TRS) / sizeof(TextRectangle),
2834   21600, 21600,
2835   FLOW_CHART_CONNECTOR_GLUE_POINTS, sizeof(FLOW_CHART_CONNECTOR_GLUE_POINTS) / sizeof(Vertex));
2836 
2837 const Vertex FLOW_CHART_MANUAL_OPERATION_VERTICES[] =
2838 {
2839   {0, 0}, {21600, 0}, {17250, 21600}, {4350, 21600}, {0, 0}
2840 };
2841 
2842 const TextRectangle FLOW_CHART_MANUAL_OPERATION_TRS[] =
2843 {
2844   { {4350, 0}, {17250, 21600} }
2845 };
2846 
2847 const Vertex FLOW_CHART_MANUAL_OPERATION_GLUE_POINTS[] =
2848 {
2849   {10800, 0}, {2160, 10800}, {10800, 21600}, {19440, 10800}
2850 };
2851 
2852 const CustomShape CS_FLOW_CHART_MANUAL_OPERATION(
2853   FLOW_CHART_MANUAL_OPERATION_VERTICES, sizeof(FLOW_CHART_MANUAL_OPERATION_VERTICES) / sizeof(Vertex),
2854   nullptr, 0,
2855   nullptr, 0,
2856   nullptr, 0,
2857   FLOW_CHART_MANUAL_OPERATION_TRS, sizeof(FLOW_CHART_MANUAL_OPERATION_TRS) / sizeof(TextRectangle),
2858   21600, 21600,
2859   FLOW_CHART_MANUAL_OPERATION_GLUE_POINTS, sizeof(FLOW_CHART_MANUAL_OPERATION_GLUE_POINTS) / sizeof(Vertex));
2860 
2861 const Vertex FLOW_CHART_MANUAL_INPUT_VERTICES[] =
2862 {
2863   {0, 4300}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 4300}
2864 };
2865 
2866 const TextRectangle FLOW_CHART_MANUAL_INPUT_TRS[] =
2867 {
2868   { {0, 4300}, {21600, 21600} }
2869 };
2870 
2871 const Vertex FLOW_CHART_MANUAL_INPUT_GLUE_POINTS[] =
2872 {
2873   {10800, 2150}, {0, 10800}, {10800, 19890}, {21600, 10800}
2874 };
2875 
2876 const CustomShape CS_FLOW_CHART_MANUAL_INPUT(
2877   FLOW_CHART_MANUAL_INPUT_VERTICES, sizeof(FLOW_CHART_MANUAL_INPUT_VERTICES) / sizeof(Vertex),
2878   nullptr, 0,
2879   nullptr, 0,
2880   nullptr, 0,
2881   FLOW_CHART_MANUAL_INPUT_TRS, sizeof(FLOW_CHART_MANUAL_INPUT_TRS) / sizeof(TextRectangle),
2882   21600, 21600,
2883   FLOW_CHART_MANUAL_INPUT_GLUE_POINTS, sizeof(FLOW_CHART_MANUAL_INPUT_GLUE_POINTS) / sizeof(Vertex));
2884 
2885 
2886 const Vertex FLOW_CHART_OR_VERTICES[] =
2887 {
2888   {10800, 10800}, {10800, 10800}, {0, 360}, {0, 10800}, {21600, 10800}, {10800, 0}, {10800, 21600}
2889 };
2890 
2891 const unsigned short FLOW_CHART_OR_SEGMENTS[] =
2892 {
2893   0xa203, 0x6000, 0x8000, 0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
2894 };
2895 
2896 const TextRectangle FLOW_CHART_OR_TRS[] =
2897 {
2898   { {3100, 3100}, {18500, 18500} }
2899 };
2900 
2901 const Vertex FLOW_CHART_OR_GLUE_POINTS[] =
2902 {
2903   {10800, 0}, {3163, 3163}, {0, 10800}, {3163, 18437}, {10800, 21600}, {18437, 18437}, {21600, 10800}, {18437, 3163}
2904 };
2905 
2906 const CustomShape CS_FLOW_CHART_OR(
2907   FLOW_CHART_OR_VERTICES, sizeof(FLOW_CHART_OR_VERTICES) / sizeof(Vertex),
2908   FLOW_CHART_OR_SEGMENTS, sizeof(FLOW_CHART_OR_SEGMENTS) / sizeof(unsigned short),
2909   nullptr, 0,
2910   nullptr, 0,
2911   FLOW_CHART_OR_TRS, sizeof(FLOW_CHART_OR_TRS) / sizeof(TextRectangle),
2912   21600, 21600,
2913   FLOW_CHART_OR_GLUE_POINTS, sizeof(FLOW_CHART_OR_GLUE_POINTS) / sizeof(Vertex));
2914 
2915 const Vertex FLOW_CHART_COLLATE_VERTICES[] =
2916 {
2917   {0, 0}, {21600, 21600}, {0, 21600}, {21600, 0}, {0, 0}
2918 };
2919 
2920 const TextRectangle FLOW_CHART_COLLATE_TRS[] =
2921 {
2922   { {5400, 5400}, {16200, 16200} }
2923 };
2924 
2925 const Vertex FLOW_CHART_COLLATE_GLUE_POINTS[] =
2926 {
2927   {10800, 0}, {10800, 10800}, {10800, 21600}
2928 };
2929 
2930 const CustomShape CS_FLOW_CHART_COLLATE(
2931   FLOW_CHART_COLLATE_VERTICES, sizeof(FLOW_CHART_COLLATE_VERTICES) / sizeof(Vertex),
2932   nullptr, 0,
2933   nullptr, 0,
2934   nullptr, 0,
2935   FLOW_CHART_COLLATE_TRS, sizeof(FLOW_CHART_COLLATE_TRS) / sizeof(TextRectangle),
2936   21600, 21600,
2937   FLOW_CHART_COLLATE_GLUE_POINTS, sizeof(FLOW_CHART_COLLATE_GLUE_POINTS) / sizeof(Vertex));
2938 
2939 const Vertex FLOW_CHART_SORT_VERTICES[] =
2940 {
2941   {0, 10800}, {10800, 0}, {21600, 10800}, {10800, 21600}, {0, 10800}, {21600, 10800}
2942 };
2943 
2944 const unsigned short FLOW_CHART_SORT_SEGMENTS[] =
2945 {
2946   0x4000, 0x0003, 0x6000, 0x8000, 0x4000, 0x0001, 0x8000
2947 };
2948 
2949 const TextRectangle FLOW_CHART_SORT_TRS[] =
2950 {
2951   { {5400, 5400}, {16200, 16200} }
2952 };
2953 
2954 const CustomShape CS_FLOW_CHART_SORT(
2955   FLOW_CHART_SORT_VERTICES, sizeof(FLOW_CHART_SORT_VERTICES) / sizeof(Vertex),
2956   FLOW_CHART_SORT_SEGMENTS, sizeof(FLOW_CHART_SORT_SEGMENTS) / sizeof(unsigned short),
2957   nullptr, 0,
2958   nullptr, 0,
2959   FLOW_CHART_SORT_TRS, sizeof(FLOW_CHART_SORT_TRS) / sizeof(TextRectangle),
2960   21600, 21600,
2961   nullptr, 0);
2962 
2963 const Vertex FLOW_CHART_EXTRACT_VERTICES[] =
2964 {
2965   {10800, 0}, {21600, 21600}, {0, 21600}, {10800, 0}
2966 };
2967 
2968 const TextRectangle FLOW_CHART_EXTRACT_TRS[] =
2969 {
2970   { {5400, 10800}, {16200, 21600} }
2971 };
2972 
2973 const Vertex FLOW_CHART_EXTRACT_GLUE_POINTS[] =
2974 {
2975   {10800, 0}, {5400, 10800}, {10800, 21600}, {16200, 10800}
2976 };
2977 
2978 const CustomShape CS_FLOW_CHART_EXTRACT(
2979   FLOW_CHART_EXTRACT_VERTICES, sizeof(FLOW_CHART_EXTRACT_VERTICES) / sizeof(Vertex),
2980   nullptr, 0,
2981   nullptr, 0,
2982   nullptr, 0,
2983   FLOW_CHART_EXTRACT_TRS, sizeof(FLOW_CHART_EXTRACT_TRS) / sizeof(TextRectangle),
2984   21600, 21600,
2985   FLOW_CHART_EXTRACT_GLUE_POINTS, sizeof(FLOW_CHART_EXTRACT_GLUE_POINTS) / sizeof(Vertex));
2986 
2987 const Vertex FLOW_CHART_MERGE_VERTICES[] =
2988 {
2989   {0, 0}, {21600, 0}, {10800, 21600}, {0, 0}
2990 };
2991 
2992 const TextRectangle FLOW_CHART_MERGE_TRS[] =
2993 {
2994   { {5400, 0}, {16200, 10800} }
2995 };
2996 
2997 const Vertex FLOW_CHART_MERGE_GLUE_POINTS[] =
2998 {
2999   {10800, 0}, {5400, 10800}, {10800, 21600}, {16200, 10800}
3000 };
3001 
3002 const CustomShape CS_FLOW_CHART_MERGE(
3003   FLOW_CHART_MERGE_VERTICES, sizeof(FLOW_CHART_MERGE_VERTICES) / sizeof(Vertex),
3004   nullptr, 0,
3005   nullptr, 0,
3006   nullptr, 0,
3007   FLOW_CHART_MERGE_TRS, sizeof(FLOW_CHART_MERGE_TRS) / sizeof(TextRectangle),
3008   21600, 21600,
3009   FLOW_CHART_MERGE_GLUE_POINTS, sizeof(FLOW_CHART_MERGE_GLUE_POINTS) / sizeof(Vertex));
3010 
3011 const Vertex FLOW_CHART_ONLINE_STORAGE_VERTICES[] =
3012 {
3013   {3600, 21600}, {0, 10800}, {3600, 0}, {21600, 0}, {18000, 10800}, {21600, 21600}
3014 };
3015 
3016 const unsigned short FLOW_CHART_ONLINE_STORAGE_SEGMENTS[] =
3017 {
3018   0x4000, 0xa702, 0x0001, 0xa702, 0x6000, 0x8000
3019 };
3020 
3021 const TextRectangle FLOW_CHART_ONLINE_STORAGE_TRS[] =
3022 {
3023   { {3600, 0}, {18000, 21600} }
3024 };
3025 
3026 const Vertex FLOW_CHART_ONLINE_STORAGE_GLUE_POINTS[] =
3027 {
3028   {10800, 0}, {0, 10800}, {10800, 21600}, {18000, 10800}
3029 };
3030 
3031 const CustomShape CS_FLOW_CHART_ONLINE_STORAGE(
3032   FLOW_CHART_ONLINE_STORAGE_VERTICES, sizeof(FLOW_CHART_ONLINE_STORAGE_VERTICES) / sizeof(Vertex),
3033   FLOW_CHART_ONLINE_STORAGE_SEGMENTS, sizeof(FLOW_CHART_ONLINE_STORAGE_SEGMENTS) / sizeof(unsigned short),
3034   nullptr, 0,
3035   nullptr, 0,
3036   FLOW_CHART_ONLINE_STORAGE_TRS, sizeof(FLOW_CHART_ONLINE_STORAGE_TRS) / sizeof(TextRectangle),
3037   21600, 21600,
3038   FLOW_CHART_ONLINE_STORAGE_GLUE_POINTS, sizeof(FLOW_CHART_ONLINE_STORAGE_GLUE_POINTS) / sizeof(Vertex));
3039 
3040 const Vertex FLOW_CHART_MAGNETIC_TAPE_VERTICES[] =
3041 {
3042   {20980, 18150}, {20980, 21600}, {10670, 21600}, {4770, 21540}, {0, 16720}, {0, 10800}, {0, 4840}, {4840, 0}, {10800, 0}, {16740, 0}, {21600, 4840}, {21600, 10800}, {21600, 13520}, {20550, 16160}, {18670, 18170}
3043 };
3044 
3045 const unsigned short FLOW_CHART_MAGNETIC_TAPE_SEGMENTS[] =
3046 {
3047   0x4000, 0x0002, 0x2004, 0x6000, 0x8000
3048 };
3049 
3050 const TextRectangle FLOW_CHART_MAGNETIC_TAPE_TRS[] =
3051 {
3052   { {3100, 3100}, {18500, 18500} }
3053 };
3054 
3055 const Vertex FLOW_CHART_MAGNETIC_TAPE_GLUE_POINTS[] =
3056 {
3057   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
3058 };
3059 
3060 const CustomShape CS_FLOW_CHART_MAGNETIC_TAPE(
3061   FLOW_CHART_MAGNETIC_TAPE_VERTICES, sizeof(FLOW_CHART_MAGNETIC_TAPE_VERTICES) / sizeof(Vertex),
3062   FLOW_CHART_MAGNETIC_TAPE_SEGMENTS, sizeof(FLOW_CHART_MAGNETIC_TAPE_SEGMENTS) / sizeof(unsigned short),
3063   nullptr, 0,
3064   nullptr, 0,
3065   FLOW_CHART_MAGNETIC_TAPE_TRS, sizeof(FLOW_CHART_MAGNETIC_TAPE_TRS) / sizeof(TextRectangle),
3066   21600, 21600,
3067   FLOW_CHART_MAGNETIC_TAPE_GLUE_POINTS, sizeof(FLOW_CHART_MAGNETIC_TAPE_GLUE_POINTS) / sizeof(Vertex));
3068 
3069 const Vertex FLOW_CHART_MAGNETIC_DISK_VERTICES[] =
3070 {
3071   {0, 3400}, {10800, 0}, {21600, 3400}, {21600, 18200}, {10800, 21600}, {0, 18200}, {0, 3400}, {10800, 6800}, {21600, 3400}
3072 };
3073 
3074 const unsigned short FLOW_CHART_MAGNETIC_DISK_SEGMENTS[] =
3075 {
3076   0x4000, 0xa802, 0x0001, 0xa802, 0x6000, 0x8000, 0x4000, 0xa802, 0x8000
3077 };
3078 
3079 const TextRectangle FLOW_CHART_MAGNETIC_DISK_TRS[] =
3080 {
3081   { {0, 6800}, {21600, 18200} }
3082 };
3083 
3084 const Vertex FLOW_CHART_MAGNETIC_DISK_GLUE_POINTS[] =
3085 {
3086   {10800, 6800}, {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
3087 };
3088 
3089 const CustomShape CS_FLOW_CHART_MAGNETIC_DISK(
3090   FLOW_CHART_MAGNETIC_DISK_VERTICES, sizeof(FLOW_CHART_MAGNETIC_DISK_VERTICES) / sizeof(Vertex),
3091   FLOW_CHART_MAGNETIC_DISK_SEGMENTS, sizeof(FLOW_CHART_MAGNETIC_DISK_SEGMENTS) / sizeof(unsigned short),
3092   nullptr, 0,
3093   nullptr, 0,
3094   FLOW_CHART_MAGNETIC_DISK_TRS, sizeof(FLOW_CHART_MAGNETIC_DISK_TRS) / sizeof(TextRectangle),
3095   21600, 21600,
3096   FLOW_CHART_MAGNETIC_DISK_GLUE_POINTS, sizeof(FLOW_CHART_MAGNETIC_DISK_GLUE_POINTS) / sizeof(Vertex));
3097 
3098 const Vertex FLOW_CHART_MAGNETIC_DRUM_VERTICES[] =
3099 {
3100   {18200, 0}, {21600, 10800}, {18200, 21600}, {3400, 21600}, {0, 10800}, {3400, 0}, {18200, 0}, {14800, 10800}, {18200, 21600}
3101 };
3102 
3103 const unsigned short FLOW_CHART_MAGNETIC_DRUM_SEGMENTS[] =
3104 {
3105   0x4000, 0xa702, 0x0001, 0xa702, 0x6000, 0x8000, 0x4000, 0xa702, 0x8000
3106 };
3107 
3108 const TextRectangle FLOW_CHART_MAGNETIC_DRUM_TRS[] =
3109 {
3110   { {3400, 0}, {14800, 21600} }
3111 };
3112 
3113 const Vertex FLOW_CHART_MAGNETIC_DRUM_GLUE_POINTS[] =
3114 {
3115   {10800, 0}, {0, 10800}, {10800, 21600}, {14800, 10800}, {21600, 10800}
3116 };
3117 
3118 const CustomShape CS_FLOW_CHART_MAGNETIC_DRUM(
3119   FLOW_CHART_MAGNETIC_DRUM_VERTICES, sizeof(FLOW_CHART_MAGNETIC_DRUM_VERTICES) / sizeof(Vertex),
3120   FLOW_CHART_MAGNETIC_DRUM_SEGMENTS, sizeof(FLOW_CHART_MAGNETIC_DRUM_SEGMENTS) / sizeof(unsigned short),
3121   nullptr, 0,
3122   nullptr, 0,
3123   FLOW_CHART_MAGNETIC_DRUM_TRS, sizeof(FLOW_CHART_MAGNETIC_DRUM_TRS) / sizeof(TextRectangle),
3124   21600, 21600,
3125   FLOW_CHART_MAGNETIC_DRUM_GLUE_POINTS, sizeof(FLOW_CHART_MAGNETIC_DRUM_GLUE_POINTS) / sizeof(Vertex));
3126 
3127 const Vertex FLOW_CHART_DIPSLAY_VERTICES[] =
3128 {
3129   {3600, 0}, {17800, 0}, {21600, 10800}, {17800, 21600}, {3600, 21600}, {0, 10800}
3130 };
3131 
3132 const unsigned short FLOW_CHART_DIPSLAY_SEGMENTS[] =
3133 {
3134   0x4000, 0x0001, 0xa702, 0x0002, 0x6000, 0x8000
3135 };
3136 
3137 const TextRectangle FLOW_CHART_DIPSLAY_TRS[] =
3138 {
3139   { {3600, 0}, {17800, 21600} }
3140 };
3141 
3142 const Vertex FLOW_CHART_DIPSLAY_GLUE_POINTS[] =
3143 {
3144   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
3145 };
3146 
3147 const CustomShape CS_FLOW_CHART_DIPSLAY(
3148   FLOW_CHART_DIPSLAY_VERTICES, sizeof(FLOW_CHART_DIPSLAY_VERTICES) / sizeof(Vertex),
3149   FLOW_CHART_DIPSLAY_SEGMENTS, sizeof(FLOW_CHART_DIPSLAY_SEGMENTS) / sizeof(unsigned short),
3150   nullptr, 0,
3151   nullptr, 0,
3152   FLOW_CHART_DIPSLAY_TRS, sizeof(FLOW_CHART_DIPSLAY_TRS) / sizeof(TextRectangle),
3153   21600, 21600,
3154   FLOW_CHART_DIPSLAY_GLUE_POINTS, sizeof(FLOW_CHART_DIPSLAY_GLUE_POINTS) / sizeof(Vertex));
3155 
3156 const Vertex FLOW_CHART_DELAY_VERTICES[] =
3157 {
3158   {10800, 0}, {21600, 10800}, {10800, 21600}, {0, 21600}, {0, 0}
3159 };
3160 
3161 const unsigned short FLOW_CHART_DELAY_SEGMENTS[] =
3162 {
3163   0x4000, 0xa702, 0x0002, 0x6000, 0x8000
3164 };
3165 
3166 const TextRectangle FLOW_CHART_DELAY_TRS[] =
3167 {
3168   { {0, 3100}, {18500, 18500} }
3169 };
3170 
3171 const Vertex FLOW_CHART_DELAY_GLUE_POINTS[] =
3172 {
3173   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
3174 };
3175 
3176 const CustomShape CS_FLOW_CHART_DELAY(
3177   FLOW_CHART_DELAY_VERTICES, sizeof(FLOW_CHART_DELAY_VERTICES) / sizeof(Vertex),
3178   FLOW_CHART_DELAY_SEGMENTS, sizeof(FLOW_CHART_DELAY_SEGMENTS) / sizeof(unsigned short),
3179   nullptr, 0,
3180   nullptr, 0,
3181   FLOW_CHART_DELAY_TRS, sizeof(FLOW_CHART_DELAY_TRS) / sizeof(TextRectangle),
3182   21600, 21600,
3183   FLOW_CHART_DELAY_GLUE_POINTS, sizeof(FLOW_CHART_DELAY_GLUE_POINTS) / sizeof(Vertex));
3184 
3185 const Vertex TEXT_PLAIN_TEXT_VERTICES[] =
3186 {
3187   {CALCULATED_VALUE(3), 0}, {CALCULATED_VALUE(5), 0}, {CALCULATED_VALUE(6), 21600}, {CALCULATED_VALUE(7), 21600}
3188 };
3189 
3190 const unsigned short TEXT_PLAIN_TEXT_SEGMENTS[] =
3191 {
3192   0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
3193 };
3194 
3195 const Calculation TEXT_PLAIN_TEXT_CALC[] =
3196 {
3197   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 10800}, {0x2001, 0x400, 2, 1}, {0x2003, 0x401, 0, 0}, {0xa006, 0x401, 0, 0x402}, {0x8000, 21600, 0, 0x402}, {0x6006, 0x401, 0x404, 21600}, {0x6006, 0x401, 0x402, 0}, {0xa006, 0x401, 21600, 0x404}
3198 };
3199 
3200 const TextRectangle TEXT_PLAIN_TEXT_TRS[] =
3201 {
3202   { {0, 0}, {21600, 21600} }
3203 };
3204 
3205 const int TEXT_PLAIN_TEXT_DEFAULT_ADJUST[] =
3206 {
3207   10800
3208 };
3209 
3210 const CustomShape CS_TEXT_PLAIN_TEXT(
3211   TEXT_PLAIN_TEXT_VERTICES, sizeof(TEXT_PLAIN_TEXT_VERTICES) / sizeof(Vertex),
3212   TEXT_PLAIN_TEXT_SEGMENTS, sizeof(TEXT_PLAIN_TEXT_SEGMENTS) / sizeof(unsigned short),
3213   TEXT_PLAIN_TEXT_CALC, sizeof(TEXT_PLAIN_TEXT_CALC) / sizeof(Calculation),
3214   TEXT_PLAIN_TEXT_DEFAULT_ADJUST, sizeof(TEXT_PLAIN_TEXT_DEFAULT_ADJUST) / sizeof(int),
3215   TEXT_PLAIN_TEXT_TRS, sizeof(TEXT_PLAIN_TEXT_TRS) / sizeof(TextRectangle),
3216   21600, 21600,
3217   nullptr, 0);
3218 
3219 const Vertex TEXT_STOP_VERTICES[] =
3220 {
3221   {0, CALCULATED_VALUE(0)}, {7200, 0}, {14400, 0}, {21600, CALCULATED_VALUE(0)}, {0, CALCULATED_VALUE(1)}, {7200, 21600}, {14400, 21600}, {21600, CALCULATED_VALUE(1)}
3222 };
3223 
3224 const unsigned short TEXT_STOP_SEGMENTS[] =
3225 {
3226   0x4000, 0x0003, 0x8000, 0x4000, 0x0003, 0x8000
3227 };
3228 
3229 const Calculation TEXT_STOP_CALC[] =
3230 {
3231   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}
3232 };
3233 
3234 const TextRectangle TEXT_STOP_TRS[] =
3235 {
3236   { {0, 0}, {21600, 21600} }
3237 };
3238 
3239 const int TEXT_STOP_DEFAULT_ADJUST[] =
3240 {
3241   2700
3242 };
3243 
3244 const CustomShape CS_TEXT_STOP(
3245   TEXT_STOP_VERTICES, sizeof(TEXT_STOP_VERTICES) / sizeof(Vertex),
3246   TEXT_STOP_SEGMENTS, sizeof(TEXT_STOP_SEGMENTS) / sizeof(unsigned short),
3247   TEXT_STOP_CALC, sizeof(TEXT_STOP_CALC) / sizeof(Calculation),
3248   TEXT_STOP_DEFAULT_ADJUST, sizeof(TEXT_STOP_DEFAULT_ADJUST) / sizeof(int),
3249   TEXT_STOP_TRS, sizeof(TEXT_STOP_TRS) / sizeof(TextRectangle),
3250   21600, 21600,
3251   nullptr, 0);
3252 
3253 const Vertex TEXT_TRIANGLE_VERTICES[] =
3254 {
3255   {0, CALCULATED_VALUE(0)}, {10800, 0}, {21600, CALCULATED_VALUE(0)}, {0, 21600}, {21600, 21600}
3256 };
3257 
3258 const unsigned short TEXT_TRIANGLE_SEGMENTS[] =
3259 {
3260   0x4000, 0x0002, 0x8000, 0x4000, 0x0001, 0x8000
3261 };
3262 
3263 const Calculation TEXT_TRIANGLE_CALC[] =
3264 {
3265   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}
3266 };
3267 
3268 const TextRectangle TEXT_TRIANGLE_TRS[] =
3269 {
3270   { {0, 0}, {21600, 21600} }
3271 };
3272 
3273 const int TEXT_TRIANGLE_DEFAULT_ADJUST[] =
3274 {
3275   10800
3276 };
3277 
3278 const CustomShape CS_TEXT_TRIANGLE(
3279   TEXT_TRIANGLE_VERTICES, sizeof(TEXT_TRIANGLE_VERTICES) / sizeof(Vertex),
3280   TEXT_TRIANGLE_SEGMENTS, sizeof(TEXT_TRIANGLE_SEGMENTS) / sizeof(unsigned short),
3281   TEXT_TRIANGLE_CALC, sizeof(TEXT_TRIANGLE_CALC) / sizeof(Calculation),
3282   TEXT_TRIANGLE_DEFAULT_ADJUST, sizeof(TEXT_TRIANGLE_DEFAULT_ADJUST) / sizeof(int),
3283   TEXT_TRIANGLE_TRS, sizeof(TEXT_TRIANGLE_TRS) / sizeof(TextRectangle),
3284   21600, 21600,
3285   nullptr, 0);
3286 
3287 const Vertex TEXT_TRIANGLE_INVERTED_VERTICES[] =
3288 {
3289   {0, 0}, {21600, 0}, {0, CALCULATED_VALUE(0)}, {10800, 21600}, {21600, CALCULATED_VALUE(0)}
3290 };
3291 
3292 const unsigned short TEXT_TRIANGLE_INVERTED_SEGMENTS[] =
3293 {
3294   0x4000, 0x0001, 0x8000, 0x4000, 0x0002, 0x8000
3295 };
3296 
3297 const Calculation TEXT_TRIANGLE_INVERTED_CALC[] =
3298 {
3299   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}
3300 };
3301 
3302 const TextRectangle TEXT_TRIANGLE_INVERTED_TRS[] =
3303 {
3304   { {0, 0}, {21600, 21600} }
3305 };
3306 
3307 const int TEXT_TRIANGLE_INVERTED_DEFAULT_ADJUST[] =
3308 {
3309   10800
3310 };
3311 
3312 const CustomShape CS_TEXT_TRIANGLE_INVERTED(
3313   TEXT_TRIANGLE_INVERTED_VERTICES, sizeof(TEXT_TRIANGLE_INVERTED_VERTICES) / sizeof(Vertex),
3314   TEXT_TRIANGLE_INVERTED_SEGMENTS, sizeof(TEXT_TRIANGLE_INVERTED_SEGMENTS) / sizeof(unsigned short),
3315   TEXT_TRIANGLE_INVERTED_CALC, sizeof(TEXT_TRIANGLE_INVERTED_CALC) / sizeof(Calculation),
3316   TEXT_TRIANGLE_INVERTED_DEFAULT_ADJUST, sizeof(TEXT_TRIANGLE_INVERTED_DEFAULT_ADJUST) / sizeof(int),
3317   TEXT_TRIANGLE_INVERTED_TRS, sizeof(TEXT_TRIANGLE_INVERTED_TRS) / sizeof(TextRectangle),
3318   21600, 21600,
3319   nullptr, 0);
3320 
3321 const Vertex FLOW_CHART_DISPLAY_VERTICES[] =
3322 {
3323   {3600, 0}, {17800, 0}, {21600, 10800}, {17800, 21600}, {3600, 21600}, {0, 10800}
3324 };
3325 
3326 const unsigned short FLOW_CHART_DISPLAY_SEGMENTS[] =
3327 {
3328   0x4000, 0x0001, 0xa702, 0x0002, 0x6000, 0x8000
3329 };
3330 
3331 const TextRectangle FLOW_CHART_DISPLAY_TRS[] =
3332 {
3333   { {3600, 0}, {17800, 21600} }
3334 };
3335 
3336 const Vertex FLOW_CHART_DISPLAY_GLUE_POINTS[] =
3337 {
3338   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
3339 };
3340 
3341 const CustomShape CS_FLOW_CHART_DISPLAY(
3342   FLOW_CHART_DISPLAY_VERTICES, sizeof(FLOW_CHART_DISPLAY_VERTICES) / sizeof(Vertex),
3343   FLOW_CHART_DISPLAY_SEGMENTS, sizeof(FLOW_CHART_DISPLAY_SEGMENTS) / sizeof(unsigned short),
3344   nullptr, 0,
3345   nullptr, 0,
3346   FLOW_CHART_DISPLAY_TRS, sizeof(FLOW_CHART_DISPLAY_TRS) / sizeof(TextRectangle),
3347   21600, 21600,
3348   FLOW_CHART_DISPLAY_GLUE_POINTS, sizeof(FLOW_CHART_DISPLAY_GLUE_POINTS) / sizeof(Vertex));
3349 
3350 const Vertex TEXT_CHEVRON_VERTICES[] =
3351 {
3352   {0, CALCULATED_VALUE(0)}, {10800, 0}, {21600, CALCULATED_VALUE(0)}, {0, 21600}, {10800, CALCULATED_VALUE(1)}, {21600, 21600}
3353 };
3354 
3355 const unsigned short TEXT_CHEVRON_SEGMENTS[] =
3356 {
3357   0x4000, 0x0002, 0x8000, 0x4000, 0x0002, 0x8000
3358 };
3359 
3360 const Calculation TEXT_CHEVRON_CALC[] =
3361 {
3362   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}
3363 };
3364 
3365 const TextRectangle TEXT_CHEVRON_TRS[] =
3366 {
3367   { {0, 0}, {21600, 21600} }
3368 };
3369 
3370 const int TEXT_CHEVRON_DEFAULT_ADJUST[] =
3371 {
3372   5400
3373 };
3374 
3375 const CustomShape CS_TEXT_CHEVRON(
3376   TEXT_CHEVRON_VERTICES, sizeof(TEXT_CHEVRON_VERTICES) / sizeof(Vertex),
3377   TEXT_CHEVRON_SEGMENTS, sizeof(TEXT_CHEVRON_SEGMENTS) / sizeof(unsigned short),
3378   TEXT_CHEVRON_CALC, sizeof(TEXT_CHEVRON_CALC) / sizeof(Calculation),
3379   TEXT_CHEVRON_DEFAULT_ADJUST, sizeof(TEXT_CHEVRON_DEFAULT_ADJUST) / sizeof(int),
3380   TEXT_CHEVRON_TRS, sizeof(TEXT_CHEVRON_TRS) / sizeof(TextRectangle),
3381   21600, 21600,
3382   nullptr, 0);
3383 
3384 const Vertex TEXT_CHEVRON_INVERTED_VERTICES[] =
3385 {
3386   {0, 0}, {10800, CALCULATED_VALUE(1)}, {21600, 0}, {0, CALCULATED_VALUE(0)}, {10800, 21600}, {21600, CALCULATED_VALUE(0)}
3387 };
3388 
3389 const unsigned short TEXT_CHEVRON_INVERTED_SEGMENTS[] =
3390 {
3391   0x4000, 0x0002, 0x8000, 0x4000, 0x0002, 0x8000
3392 };
3393 
3394 const Calculation TEXT_CHEVRON_INVERTED_CALC[] =
3395 {
3396   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}
3397 };
3398 
3399 const TextRectangle TEXT_CHEVRON_INVERTED_TRS[] =
3400 {
3401   { {0, 0}, {21600, 21600} }
3402 };
3403 
3404 const int TEXT_CHEVRON_INVERTED_DEFAULT_ADJUST[] =
3405 {
3406   16200
3407 };
3408 
3409 const Vertex TEXT_CHEVRON_INVERTED_GLUE_POINTS[] =
3410 {
3411   {0, 0}, {21600, 21600}
3412 };
3413 
3414 const CustomShape CS_TEXT_CHEVRON_INVERTED(
3415   TEXT_CHEVRON_INVERTED_VERTICES, sizeof(TEXT_CHEVRON_INVERTED_VERTICES) / sizeof(Vertex),
3416   TEXT_CHEVRON_INVERTED_SEGMENTS, sizeof(TEXT_CHEVRON_INVERTED_SEGMENTS) / sizeof(unsigned short),
3417   TEXT_CHEVRON_INVERTED_CALC, sizeof(TEXT_CHEVRON_INVERTED_CALC) / sizeof(Calculation),
3418   TEXT_CHEVRON_INVERTED_DEFAULT_ADJUST, sizeof(TEXT_CHEVRON_INVERTED_DEFAULT_ADJUST) / sizeof(int),
3419   TEXT_CHEVRON_INVERTED_TRS, sizeof(TEXT_CHEVRON_INVERTED_TRS) / sizeof(TextRectangle),
3420   21600, 21600,
3421   TEXT_CHEVRON_INVERTED_GLUE_POINTS, sizeof(TEXT_CHEVRON_INVERTED_GLUE_POINTS) / sizeof(Vertex));
3422 
3423 const Vertex TEXT_RING_OUTSIDE_VERTICES[] =
3424 {
3425   {10800, CALCULATED_VALUE(0)}, {10800, CALCULATED_VALUE(0)}, {180, 359}, {10800, CALCULATED_VALUE(1)}, {10800, CALCULATED_VALUE(0)}, {180, 359}
3426 };
3427 
3428 const unsigned short TEXT_RING_OUTSIDE_SEGMENTS[] =
3429 {
3430   0xA203, 0x8000, 0xA203, 0x8000
3431 };
3432 
3433 const Calculation TEXT_RING_OUTSIDE_CALC[] =
3434 {
3435   {0x2001, PROP_ADJUST_VAL_FIRST, 1, 2}, {0x8000, 21600, 0, 0x400}
3436 };
3437 
3438 const TextRectangle TEXT_RING_OUTSIDE_TRS[] =
3439 {
3440   { {0, 0}, {21600, 21600} }
3441 };
3442 
3443 const int TEXT_RING_OUTSIDE_DEFAULT_ADJUST[] =
3444 {
3445   16200
3446 };
3447 
3448 const CustomShape CS_TEXT_RING_OUTSIDE(
3449   TEXT_RING_OUTSIDE_VERTICES, sizeof(TEXT_RING_OUTSIDE_VERTICES) / sizeof(Vertex),
3450   TEXT_RING_OUTSIDE_SEGMENTS, sizeof(TEXT_RING_OUTSIDE_SEGMENTS) / sizeof(unsigned short),
3451   TEXT_RING_OUTSIDE_CALC, sizeof(TEXT_RING_OUTSIDE_CALC) / sizeof(Calculation),
3452   TEXT_RING_OUTSIDE_DEFAULT_ADJUST, sizeof(TEXT_RING_OUTSIDE_DEFAULT_ADJUST) / sizeof(int),
3453   TEXT_RING_OUTSIDE_TRS, sizeof(TEXT_RING_OUTSIDE_TRS) / sizeof(TextRectangle),
3454   21600, 21600,
3455   nullptr, 0);
3456 
3457 const Vertex TEXT_ARCH_UP_CURVE_VERTICES[] =
3458 {
3459   {0, 0}, {21600, 21600}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(3)}
3460 };
3461 
3462 const unsigned short TEXT_ARCH_UP_CURVE_SEGMENTS[] =
3463 {
3464   0xA504, 0x8000
3465 };
3466 
3467 const Calculation TEXT_ARCH_UP_CURVE_CALC[] =
3468 {
3469   {0x400a, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x4009, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x2000, 0x400, 10800, 0}, {0x2000, 0x401, 10800, 0}, {0x8000, 21600, 0, 0x402}
3470 };
3471 
3472 const TextRectangle TEXT_ARCH_UP_CURVE_TRS[] =
3473 {
3474   { {0, 0}, {21600, 21600} }
3475 };
3476 
3477 const int TEXT_ARCH_UP_CURVE_DEFAULT_ADJUST[] =
3478 {
3479   180
3480 };
3481 
3482 const CustomShape CS_TEXT_ARCH_UP_CURVE(
3483   TEXT_ARCH_UP_CURVE_VERTICES, sizeof(TEXT_ARCH_UP_CURVE_VERTICES) / sizeof(Vertex),
3484   TEXT_ARCH_UP_CURVE_SEGMENTS, sizeof(TEXT_ARCH_UP_CURVE_SEGMENTS) / sizeof(unsigned short),
3485   TEXT_ARCH_UP_CURVE_CALC, sizeof(TEXT_ARCH_UP_CURVE_CALC) / sizeof(Calculation),
3486   TEXT_ARCH_UP_CURVE_DEFAULT_ADJUST, sizeof(TEXT_ARCH_UP_CURVE_DEFAULT_ADJUST) / sizeof(int),
3487   TEXT_ARCH_UP_CURVE_TRS, sizeof(TEXT_ARCH_UP_CURVE_TRS) / sizeof(TextRectangle),
3488   21600, 21600,
3489   nullptr, 0);
3490 
3491 const Vertex TEXT_ARCH_UP_POUR_VERTICES[] =
3492 {
3493   {0, 0}, {21600, 21600}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(5)}, {CALCULATED_VALUE(11), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(8), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(9)}
3494 };
3495 
3496 const unsigned short TEXT_ARCH_UP_POUR_SEGMENTS[] =
3497 {
3498   0xA504, 0x8000, 0xA504, 0x8000
3499 };
3500 
3501 const Calculation TEXT_ARCH_UP_POUR_CALC[] =
3502 {
3503   {0x400a, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x4009, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x2000, 0x400, 10800, 0}, {0x2000, 0x401, 10800, 0}, {0x8000, 21600, 0, 0x402}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x600a, 0x405, PROP_ADJUST_VAL_FIRST, 0}, {0x6009, 0x405, PROP_ADJUST_VAL_FIRST, 0}, {0x2000, 0x406, 10800, 0}, {0x2000, 0x407, 10800, 0}, {0x8000, 21600, 0, 0x408}, {0x8000, 21600, 0, 0x405}
3504 };
3505 
3506 const TextRectangle TEXT_ARCH_UP_POUR_TRS[] =
3507 {
3508   { {0, 0}, {21600, 21600} }
3509 };
3510 
3511 const int TEXT_ARCH_UP_POUR_DEFAULT_ADJUST[] =
3512 {
3513   180, 5400
3514 };
3515 
3516 const CustomShape CS_TEXT_ARCH_UP_POUR(
3517   TEXT_ARCH_UP_POUR_VERTICES, sizeof(TEXT_ARCH_UP_POUR_VERTICES) / sizeof(Vertex),
3518   TEXT_ARCH_UP_POUR_SEGMENTS, sizeof(TEXT_ARCH_UP_POUR_SEGMENTS) / sizeof(unsigned short),
3519   TEXT_ARCH_UP_POUR_CALC, sizeof(TEXT_ARCH_UP_POUR_CALC) / sizeof(Calculation),
3520   TEXT_ARCH_UP_POUR_DEFAULT_ADJUST, sizeof(TEXT_ARCH_UP_POUR_DEFAULT_ADJUST) / sizeof(int),
3521   TEXT_ARCH_UP_POUR_TRS, sizeof(TEXT_ARCH_UP_POUR_TRS) / sizeof(TextRectangle),
3522   21600, 21600,
3523   nullptr, 0);
3524 
3525 const Vertex TEXT_ARCH_DOWN_CURVE_VERTICES[] =
3526 {
3527   {0, 0}, {21600, 21600}, {CALCULATED_VALUE(4), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}
3528 };
3529 
3530 const unsigned short TEXT_ARCH_DOWN_CURVE_SEGMENTS[] =
3531 {
3532   0xA304, 0x8000
3533 };
3534 
3535 const Calculation TEXT_ARCH_DOWN_CURVE_CALC[] =
3536 {
3537   {0x400a, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x4009, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x2000, 0x400, 10800, 0}, {0x2000, 0x401, 10800, 0}, {0x8000, 21600, 0, 0x402}
3538 };
3539 
3540 const TextRectangle TEXT_ARCH_DOWN_CURVE_TRS[] =
3541 {
3542   { {0, 0}, {21600, 21600} }
3543 };
3544 
3545 const int TEXT_ARCH_DOWN_CURVE_DEFAULT_ADJUST[] =
3546 {
3547   0
3548 };
3549 
3550 const CustomShape CS_TEXT_ARCH_DOWN_CURVE(
3551   TEXT_ARCH_DOWN_CURVE_VERTICES, sizeof(TEXT_ARCH_DOWN_CURVE_VERTICES) / sizeof(Vertex),
3552   TEXT_ARCH_DOWN_CURVE_SEGMENTS, sizeof(TEXT_ARCH_DOWN_CURVE_SEGMENTS) / sizeof(unsigned short),
3553   TEXT_ARCH_DOWN_CURVE_CALC, sizeof(TEXT_ARCH_DOWN_CURVE_CALC) / sizeof(Calculation),
3554   TEXT_ARCH_DOWN_CURVE_DEFAULT_ADJUST, sizeof(TEXT_ARCH_DOWN_CURVE_DEFAULT_ADJUST) / sizeof(int),
3555   TEXT_ARCH_DOWN_CURVE_TRS, sizeof(TEXT_ARCH_DOWN_CURVE_TRS) / sizeof(TextRectangle),
3556   21600, 21600,
3557   nullptr, 0);
3558 
3559 const Vertex TEXT_CIRCLE_CURVE_VERTICES[] =
3560 {
3561   {0, 0}, {21600, 21600}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(4)}
3562 };
3563 
3564 const unsigned short TEXT_CIRCLE_CURVE_SEGMENTS[] =
3565 {
3566   0xA504, 0x8000
3567 };
3568 
3569 const Calculation TEXT_CIRCLE_CURVE_CALC[] =
3570 {
3571   {0x400a, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x4009, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x2000, 0x400, 10800, 0}, {0x2000, 0x401, 10800, 0}, {0x8000, 21600, 0, 0x403}
3572 };
3573 
3574 const TextRectangle TEXT_CIRCLE_CURVE_TRS[] =
3575 {
3576   { {0, 0}, {21600, 21600} }
3577 };
3578 
3579 const int TEXT_CIRCLE_CURVE_DEFAULT_ADJUST[] =
3580 {
3581   -179
3582 };
3583 
3584 const CustomShape CS_TEXT_CIRCLE_CURVE(
3585   TEXT_CIRCLE_CURVE_VERTICES, sizeof(TEXT_CIRCLE_CURVE_VERTICES) / sizeof(Vertex),
3586   TEXT_CIRCLE_CURVE_SEGMENTS, sizeof(TEXT_CIRCLE_CURVE_SEGMENTS) / sizeof(unsigned short),
3587   TEXT_CIRCLE_CURVE_CALC, sizeof(TEXT_CIRCLE_CURVE_CALC) / sizeof(Calculation),
3588   TEXT_CIRCLE_CURVE_DEFAULT_ADJUST, sizeof(TEXT_CIRCLE_CURVE_DEFAULT_ADJUST) / sizeof(int),
3589   TEXT_CIRCLE_CURVE_TRS, sizeof(TEXT_CIRCLE_CURVE_TRS) / sizeof(TextRectangle),
3590   21600, 21600,
3591   nullptr, 0);
3592 
3593 const Vertex TEXT_BUTTON_CURVE_VERTICES[] =
3594 {
3595   {0, 0}, {21600, 21600}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(3)}, {0, 10800}, {21600, 10800}, {0, 0}, {21600, 21600}, {CALCULATED_VALUE(2), CALCULATED_VALUE(5)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(5)}
3596 };
3597 
3598 const unsigned short TEXT_BUTTON_CURVE_SEGMENTS[] =
3599 {
3600   0xA504, 0x8000, 0x4000, 0x0001, 0x8000, 0xA304, 0x8000
3601 };
3602 
3603 const Calculation TEXT_BUTTON_CURVE_CALC[] =
3604 {
3605   {0x400a, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x4009, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x2000, 0x400, 10800, 0}, {0x2000, 0x401, 10800, 0}, {0x8000, 21600, 0, 0x402}, {0x8000, 21600, 0, 0x403}
3606 };
3607 
3608 const TextRectangle TEXT_BUTTON_CURVE_TRS[] =
3609 {
3610   { {0, 0}, {21600, 21600} }
3611 };
3612 
3613 const int TEXT_BUTTON_CURVE_DEFAULT_ADJUST[] =
3614 {
3615   180
3616 };
3617 
3618 const CustomShape CS_TEXT_BUTTON_CURVE(
3619   TEXT_BUTTON_CURVE_VERTICES, sizeof(TEXT_BUTTON_CURVE_VERTICES) / sizeof(Vertex),
3620   TEXT_BUTTON_CURVE_SEGMENTS, sizeof(TEXT_BUTTON_CURVE_SEGMENTS) / sizeof(unsigned short),
3621   TEXT_BUTTON_CURVE_CALC, sizeof(TEXT_BUTTON_CURVE_CALC) / sizeof(Calculation),
3622   TEXT_BUTTON_CURVE_DEFAULT_ADJUST, sizeof(TEXT_BUTTON_CURVE_DEFAULT_ADJUST) / sizeof(int),
3623   TEXT_BUTTON_CURVE_TRS, sizeof(TEXT_BUTTON_CURVE_TRS) / sizeof(TextRectangle),
3624   21600, 21600,
3625   nullptr, 0);
3626 
3627 const Vertex TEXT_ARCH_DOWN_POUR_VERTICES[] =
3628 {
3629   {CALCULATED_VALUE(5), CALCULATED_VALUE(5)}, {CALCULATED_VALUE(11), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(8), CALCULATED_VALUE(9)}, {0, 0}, {21600, 21600}, {CALCULATED_VALUE(4), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}
3630 };
3631 
3632 const unsigned short TEXT_ARCH_DOWN_POUR_SEGMENTS[] =
3633 {
3634   0xA304, 0x8000, 0xA304, 0x8000
3635 };
3636 
3637 const Calculation TEXT_ARCH_DOWN_POUR_CALC[] =
3638 {
3639   {0x400a, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x4009, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x2000, 0x400, 10800, 0}, {0x2000, 0x401, 10800, 0}, {0x8000, 21600, 0, 0x402}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x600a, 0x405, PROP_ADJUST_VAL_FIRST, 0}, {0x6009, 0x405, PROP_ADJUST_VAL_FIRST, 0}, {0x2000, 0x406, 10800, 0}, {0x2000, 0x407, 10800, 0}, {0x8000, 21600, 0, 0x408}, {0x8000, 21600, 0, 0x405}
3640 };
3641 
3642 const TextRectangle TEXT_ARCH_DOWN_POUR_TRS[] =
3643 {
3644   { {0, 0}, {21600, 21600} }
3645 };
3646 
3647 const int TEXT_ARCH_DOWN_POUR_DEFAULT_ADJUST[] =
3648 {
3649   0, 5400
3650 };
3651 
3652 const CustomShape CS_TEXT_ARCH_DOWN_POUR(
3653   TEXT_ARCH_DOWN_POUR_VERTICES, sizeof(TEXT_ARCH_DOWN_POUR_VERTICES) / sizeof(Vertex),
3654   TEXT_ARCH_DOWN_POUR_SEGMENTS, sizeof(TEXT_ARCH_DOWN_POUR_SEGMENTS) / sizeof(unsigned short),
3655   TEXT_ARCH_DOWN_POUR_CALC, sizeof(TEXT_ARCH_DOWN_POUR_CALC) / sizeof(Calculation),
3656   TEXT_ARCH_DOWN_POUR_DEFAULT_ADJUST, sizeof(TEXT_ARCH_DOWN_POUR_DEFAULT_ADJUST) / sizeof(int),
3657   TEXT_ARCH_DOWN_POUR_TRS, sizeof(TEXT_ARCH_DOWN_POUR_TRS) / sizeof(TextRectangle),
3658   21600, 21600,
3659   nullptr, 0);
3660 
3661 const Vertex TEXT_CIRCLE_POUR_VERTICES[] =
3662 {
3663   {0, 0}, {21600, 21600}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(5)}, {CALCULATED_VALUE(11), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(8), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(8), CALCULATED_VALUE(0xa)}
3664 };
3665 
3666 const unsigned short TEXT_CIRCLE_POUR_SEGMENTS[] =
3667 {
3668   0xA504, 0x8000, 0xA504, 0x8000
3669 };
3670 
3671 const Calculation TEXT_CIRCLE_POUR_CALC[] =
3672 {
3673   {0x400a, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x4009, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x2000, 0x400, 10800, 0}, {0x2000, 0x401, 10800, 0}, {0x8000, 21600, 0, 0x403}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x600a, 0x405, PROP_ADJUST_VAL_FIRST, 0}, {0x6009, 0x405, PROP_ADJUST_VAL_FIRST, 0}, {0x2000, 0x406, 10800, 0}, {0x2000, 0x407, 10800, 0}, {0x8000, 21600, 0, 0x409}, {0x8000, 21600, 0, 0x405}, {0x000, 21600, 0, 0}
3674 };
3675 
3676 const TextRectangle TEXT_CIRCLE_POUR_TRS[] =
3677 {
3678   { {0, 0}, {21600, 21600} }
3679 };
3680 
3681 const int TEXT_CIRCLE_POUR_DEFAULT_ADJUST[] =
3682 {
3683   -179, 5400
3684 };
3685 
3686 const CustomShape CS_TEXT_CIRCLE_POUR(
3687   TEXT_CIRCLE_POUR_VERTICES, sizeof(TEXT_CIRCLE_POUR_VERTICES) / sizeof(Vertex),
3688   TEXT_CIRCLE_POUR_SEGMENTS, sizeof(TEXT_CIRCLE_POUR_SEGMENTS) / sizeof(unsigned short),
3689   TEXT_CIRCLE_POUR_CALC, sizeof(TEXT_CIRCLE_POUR_CALC) / sizeof(Calculation),
3690   TEXT_CIRCLE_POUR_DEFAULT_ADJUST, sizeof(TEXT_CIRCLE_POUR_DEFAULT_ADJUST) / sizeof(int),
3691   TEXT_CIRCLE_POUR_TRS, sizeof(TEXT_CIRCLE_POUR_TRS) / sizeof(TextRectangle),
3692   21600, 21600,
3693   nullptr, 0);
3694 
3695 const Vertex TEXT_BUTTON_POUR_VERTICES[] =
3696 {
3697   {0, 0}, {21600, 21600}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(6), CALCULATED_VALUE(6)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(7)}, {CALCULATED_VALUE(10), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(11)}, {CALCULATED_VALUE(0x16), CALCULATED_VALUE(16)}, {CALCULATED_VALUE(0x15), CALCULATED_VALUE(16)}, {CALCULATED_VALUE(0x16), CALCULATED_VALUE(15)}, {CALCULATED_VALUE(0x15), CALCULATED_VALUE(15)}, {CALCULATED_VALUE(6), CALCULATED_VALUE(6)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(7)}, {CALCULATED_VALUE(10), CALCULATED_VALUE(13)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(13)}, {0, 0}, {21600, 21600}, {CALCULATED_VALUE(2), CALCULATED_VALUE(5)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(5)}
3698 };
3699 
3700 const unsigned short TEXT_BUTTON_POUR_SEGMENTS[] =
3701 {
3702   0xA504, 0x8000, 0xA504, 0x8000, 0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000, 0xA304, 0x8000, 0xA304, 0x8000
3703 };
3704 
3705 const Calculation TEXT_BUTTON_POUR_CALC[] =
3706 {
3707   {0x400a, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x4009, 10800, PROP_ADJUST_VAL_FIRST, 0}, {0x2000, 0x400, 10800, 0}, {0x2000, 0x401, 10800, 0}, {0x8000, 21600, 0, 0x402}, {0x8000, 21600, 0, 0x403}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x8000, 21600, 0, 0x406}, {0x600a, PROP_ADJUST_VAL_FIRST + 1, PROP_ADJUST_VAL_FIRST, 0}, {0x6009, PROP_ADJUST_VAL_FIRST + 1, PROP_ADJUST_VAL_FIRST, 0}, {0x2000, 0x408, 10800, 0}, {0x2000, 0x409, 10800, 0}, {0x8000, 21600, 0, 0x40a}, {0x8000, 21600, 0, 0x40b}, {0x2001, 0x406, 1, 2}, {0x4000, 10800, 0x40e, 0}, {0x8000, 10800, 0, 0x40e}, {0x6001, 0x40e, 0x40e, 1}, {0x6001, PROP_ADJUST_VAL_FIRST + 1, PROP_ADJUST_VAL_FIRST + 1, 1}, {0xA000, 0x412, 0, 0x411}, {0x200d, 0x413, 0, 0}, {0x4000, 10800, 0x414, 0}, {0x8000, 10800, 0, 0x414}
3708 };
3709 
3710 const TextRectangle TEXT_BUTTON_POUR_TRS[] =
3711 {
3712   { {0, 0}, {21600, 21600} }
3713 };
3714 
3715 const int TEXT_BUTTON_POUR_DEFAULT_ADJUST[] =
3716 {
3717   180, 5400
3718 };
3719 
3720 const CustomShape CS_TEXT_BUTTON_POUR(
3721   TEXT_BUTTON_POUR_VERTICES, sizeof(TEXT_BUTTON_POUR_VERTICES) / sizeof(Vertex),
3722   TEXT_BUTTON_POUR_SEGMENTS, sizeof(TEXT_BUTTON_POUR_SEGMENTS) / sizeof(unsigned short),
3723   TEXT_BUTTON_POUR_CALC, sizeof(TEXT_BUTTON_POUR_CALC) / sizeof(Calculation),
3724   TEXT_BUTTON_POUR_DEFAULT_ADJUST, sizeof(TEXT_BUTTON_POUR_DEFAULT_ADJUST) / sizeof(int),
3725   TEXT_BUTTON_POUR_TRS, sizeof(TEXT_BUTTON_POUR_TRS) / sizeof(TextRectangle),
3726   21600, 21600,
3727   nullptr, 0);
3728 
3729 const Vertex TEXT_CURVE_UP_VERTICES[] =
3730 {
3731   {0, CALCULATED_VALUE(0)}, {4900, CALCULATED_VALUE(1) /*12170->0 14250 ->0*/}, {11640, CALCULATED_VALUE(2) /*12170->0 12800 ->0*/}, {21600, 0}, {0, CALCULATED_VALUE(4) /*12170->0 17220 ->21600*/}, {3700, 21600}, {8500, 21600}, {10100, 21600}, {14110, 21600}, {15910, 21600}, {21600, CALCULATED_VALUE(4) /*12170->0 17220 ->21600*/}
3732 };
3733 
3734 const unsigned short TEXT_CURVE_UP_SEGMENTS[] =
3735 {
3736   0x4000, 0x2001, 0x8000, 0x4000, 0x2002, 0x8000
3737 };
3738 
3739 const Calculation TEXT_CURVE_UP_CALC[] =
3740 {
3741   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x4001, 14250, 0x400, 12170}, {0x4001, 12800, 0x400, 12170}, {0x4001, 6380, 0x400, 12170}, {0x8000, 21600, 0, 0x403}
3742 };
3743 
3744 const TextRectangle TEXT_CURVE_UP_TRS[] =
3745 {
3746   { {0, 0}, {21600, 21600} }
3747 };
3748 
3749 const int TEXT_CURVE_UP_DEFAULT_ADJUST[] =
3750 {
3751   9900
3752 };
3753 
3754 const CustomShape CS_TEXT_CURVE_UP(
3755   TEXT_CURVE_UP_VERTICES, sizeof(TEXT_CURVE_UP_VERTICES) / sizeof(Vertex),
3756   TEXT_CURVE_UP_SEGMENTS, sizeof(TEXT_CURVE_UP_SEGMENTS) / sizeof(unsigned short),
3757   TEXT_CURVE_UP_CALC, sizeof(TEXT_CURVE_UP_CALC) / sizeof(Calculation),
3758   TEXT_CURVE_UP_DEFAULT_ADJUST, sizeof(TEXT_CURVE_UP_DEFAULT_ADJUST) / sizeof(int),
3759   TEXT_CURVE_UP_TRS, sizeof(TEXT_CURVE_UP_TRS) / sizeof(TextRectangle),
3760   21600, 21600,
3761   nullptr, 0);
3762 
3763 const Vertex TEXT_CURVE_DOWN_VERTICES[] =
3764 {
3765   {0, 0}, {9960, CALCULATED_VALUE(2)}, {16700, CALCULATED_VALUE(1)}, {21600, CALCULATED_VALUE(0)}, {0, CALCULATED_VALUE(4)}, {5690, 21600}, {7490, 21600}, {11500, 21600}, {13100, 21600}, {17900, 21600}, {21600, CALCULATED_VALUE(4)}
3766 };
3767 
3768 const unsigned short TEXT_CURVE_DOWN_SEGMENTS[] =
3769 {
3770   0x4000, 0x2001, 0x8000, 0x4000, 0x2002, 0x8000
3771 };
3772 
3773 const Calculation TEXT_CURVE_DOWN_CALC[] =
3774 {
3775   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x4001, 14250, 0x400, 12170}, {0x4001, 12800, 0x400, 12170}, {0x4001, 6380, 0x400, 12170}, {0x8000, 21600, 0, 0x403}
3776 };
3777 
3778 const TextRectangle TEXT_CURVE_DOWN_TRS[] =
3779 {
3780   { {0, 0}, {21600, 21600} }
3781 };
3782 
3783 const int TEXT_CURVE_DOWN_DEFAULT_ADJUST[] =
3784 {
3785   9900
3786 };
3787 
3788 const CustomShape CS_TEXT_CURVE_DOWN(
3789   TEXT_CURVE_DOWN_VERTICES, sizeof(TEXT_CURVE_DOWN_VERTICES) / sizeof(Vertex),
3790   TEXT_CURVE_DOWN_SEGMENTS, sizeof(TEXT_CURVE_DOWN_SEGMENTS) / sizeof(unsigned short),
3791   TEXT_CURVE_DOWN_CALC, sizeof(TEXT_CURVE_DOWN_CALC) / sizeof(Calculation),
3792   TEXT_CURVE_DOWN_DEFAULT_ADJUST, sizeof(TEXT_CURVE_DOWN_DEFAULT_ADJUST) / sizeof(int),
3793   TEXT_CURVE_DOWN_TRS, sizeof(TEXT_CURVE_DOWN_TRS) / sizeof(TextRectangle),
3794   21600, 21600,
3795   nullptr, 0);
3796 
3797 const Vertex TEXT_CASCADE_UP_VERTICES[] =
3798 {
3799   {0, CALCULATED_VALUE(2)}, {21600, 0}, {0, 21600}, {21600, CALCULATED_VALUE(0)}
3800 };
3801 
3802 const unsigned short TEXT_CASCADE_UP_SEGMENTS[] =
3803 {
3804   0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
3805 };
3806 
3807 const Calculation TEXT_CASCADE_UP_CALC[] =
3808 {
3809   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x401, 1, 4}
3810 };
3811 
3812 const TextRectangle TEXT_CASCADE_UP_TRS[] =
3813 {
3814   { {0, 0}, {21600, 21600} }
3815 };
3816 
3817 const int TEXT_CASCADE_UP_DEFAULT_ADJUST[] =
3818 {
3819   9600
3820 };
3821 
3822 const CustomShape CS_TEXT_CASCADE_UP(
3823   TEXT_CASCADE_UP_VERTICES, sizeof(TEXT_CASCADE_UP_VERTICES) / sizeof(Vertex),
3824   TEXT_CASCADE_UP_SEGMENTS, sizeof(TEXT_CASCADE_UP_SEGMENTS) / sizeof(unsigned short),
3825   TEXT_CASCADE_UP_CALC, sizeof(TEXT_CASCADE_UP_CALC) / sizeof(Calculation),
3826   TEXT_CASCADE_UP_DEFAULT_ADJUST, sizeof(TEXT_CASCADE_UP_DEFAULT_ADJUST) / sizeof(int),
3827   TEXT_CASCADE_UP_TRS, sizeof(TEXT_CASCADE_UP_TRS) / sizeof(TextRectangle),
3828   21600, 21600,
3829   nullptr, 0);
3830 
3831 const Vertex TEXT_CASCADE_DOWN_VERTICES[] =
3832 {
3833   {0, 0}, {21600, CALCULATED_VALUE(2)}, {0, CALCULATED_VALUE(0)}, {21600, 21600}
3834 };
3835 
3836 const unsigned short TEXT_CASCADE_DOWN_SEGMENTS[] =
3837 {
3838   0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
3839 };
3840 
3841 const Calculation TEXT_CASCADE_DOWN_CALC[] =
3842 {
3843   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x401, 1, 4}
3844 };
3845 
3846 const TextRectangle TEXT_CASCADE_DOWN_TRS[] =
3847 {
3848   { {0, 0}, {21600, 21600} }
3849 };
3850 
3851 const int TEXT_CASCADE_DOWN_DEFAULT_ADJUST[] =
3852 {
3853   9600
3854 };
3855 
3856 const CustomShape CS_TEXT_CASCADE_DOWN(
3857   TEXT_CASCADE_DOWN_VERTICES, sizeof(TEXT_CASCADE_DOWN_VERTICES) / sizeof(Vertex),
3858   TEXT_CASCADE_DOWN_SEGMENTS, sizeof(TEXT_CASCADE_DOWN_SEGMENTS) / sizeof(unsigned short),
3859   TEXT_CASCADE_DOWN_CALC, sizeof(TEXT_CASCADE_DOWN_CALC) / sizeof(Calculation),
3860   TEXT_CASCADE_DOWN_DEFAULT_ADJUST, sizeof(TEXT_CASCADE_DOWN_DEFAULT_ADJUST) / sizeof(int),
3861   TEXT_CASCADE_DOWN_TRS, sizeof(TEXT_CASCADE_DOWN_TRS) / sizeof(TextRectangle),
3862   21600, 21600,
3863   nullptr, 0);
3864 
3865 const Vertex TEXT_WAVE_1_VERTICES[] =
3866 {
3867   {CALCULATED_VALUE(7), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(15), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(16), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(29), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(27), CALCULATED_VALUE(28)}, {CALCULATED_VALUE(25), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(24), CALCULATED_VALUE(1)}
3868 };
3869 
3870 const unsigned short TEXT_WAVE_1_SEGMENTS[] =
3871 {
3872   0x4000, 0x2001, 0x8000, 0x4000, 0x2001, 0x8000
3873 };
3874 
3875 const Calculation TEXT_WAVE_1_CALC[] =
3876 {
3877   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, 0x400}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, 0x402, 0, 10800}, {0x2001, 0x403, 2, 1}, {0x2003, 0x404, 0, 0}, {0x8000, 4320, 0, 0x405}, {0xa006, 0x403, 0, 0x405}, {0x4001, 15800, 0x400, 4460}, {0xa000, 0x400, 0, 0x408}, {0x6000, 0x400, 0x408, 0}, {0x8000, 21600, 0, 0x404}, {0x6006, 0x403, 0x40b, 21600}, {0xa000, 0x40c, 0, 0x407}, {0x2001, 0x405, 1, 2}, {0xa000, 0x407, 7200, 0x40e}, {0x6000, 0x40c, 0x40e, 7200}, {0x2001, 0x40d, 1, 2}, {0x6000, 0x407, 0x411, 0}, {0x8000, 21600, 0, 0x412}, {0x2001, 0x405, 1, 2}, {0x8000, 21600, 0, 0x414}, {0x2001, 0x400, 2, 1}, {0x8000, 21600, 0, 0x416}, {0x8000, 21600, 0, 0x407}, {0x8000, 21600, 0, 0x40f}, {0x6000, 0x401, 0x408, 0}, {0x8000, 21600, 0, 0x410}, {0xa000, 0x401, 0, 0x408}, {0x8000, 21600, 0, 0x40c}
3878 };
3879 
3880 const TextRectangle TEXT_WAVE_1_TRS[] =
3881 {
3882   { {0, 0}, {21600, 21600} }
3883 };
3884 
3885 const int TEXT_WAVE_1_DEFAULT_ADJUST[] =
3886 {
3887   1400, 10800
3888 };
3889 
3890 const CustomShape CS_TEXT_WAVE_1(
3891   TEXT_WAVE_1_VERTICES, sizeof(TEXT_WAVE_1_VERTICES) / sizeof(Vertex),
3892   TEXT_WAVE_1_SEGMENTS, sizeof(TEXT_WAVE_1_SEGMENTS) / sizeof(unsigned short),
3893   TEXT_WAVE_1_CALC, sizeof(TEXT_WAVE_1_CALC) / sizeof(Calculation),
3894   TEXT_WAVE_1_DEFAULT_ADJUST, sizeof(TEXT_WAVE_1_DEFAULT_ADJUST) / sizeof(int),
3895   TEXT_WAVE_1_TRS, sizeof(TEXT_WAVE_1_TRS) / sizeof(TextRectangle),
3896   21600, 21600,
3897   nullptr, 0);
3898 
3899 const Vertex TEXT_WAVE_2_VERTICES[] =
3900 {
3901   {CALCULATED_VALUE(7), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(15), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(16), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(29), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(27), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(25), CALCULATED_VALUE(28)}, {CALCULATED_VALUE(24), CALCULATED_VALUE(1)}
3902 };
3903 
3904 const unsigned short TEXT_WAVE_2_SEGMENTS[] =
3905 {
3906   0x4000, 0x2001, 0x8000, 0x4000, 0x2001, 0x8000
3907 };
3908 
3909 const Calculation TEXT_WAVE_2_CALC[] =
3910 {
3911   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, 0x400}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, 0x402, 0, 10800}, {0x2001, 0x403, 2, 1}, {0x2003, 0x404, 0, 0}, {0x8000, 4320, 0, 0x405}, {0xa006, 0x403, 0, 0x405}, {0x4001, 15800, 0x400, 4460}, {0xa000, 0x400, 0, 0x408}, {0x6000, 0x400, 0x408, 0}, {0x8000, 21600, 0, 0x404}, {0x6006, 0x403, 0x40b, 21600}, {0xa000, 0x40c, 0, 0x407}, {0x2001, 0x405, 1, 2}, {0xa000, 0x407, 7200, 0x40e}, {0x6000, 0x40c, 0x40e, 7200}, {0x2001, 0x40d, 1, 2}, {0x6000, 0x407, 0x411, 0}, {0x8000, 21600, 0, 0x412}, {0x2001, 0x405, 1, 2}, {0x8000, 21600, 0, 0x414}, {0x2001, 0x400, 2, 1}, {0x8000, 21600, 0, 0x416}, {0x8000, 21600, 0, 0x407}, {0x8000, 21600, 0, 0x40f}, {0x6000, 0x401, 0x408, 0}, {0x8000, 21600, 0, 0x410}, {0xa000, 0x401, 0, 0x408}, {0x8000, 21600, 0, 0x40c}
3912 };
3913 
3914 const TextRectangle TEXT_WAVE_2_TRS[] =
3915 {
3916   { {0, 0}, {21600, 21600} }
3917 };
3918 
3919 const int TEXT_WAVE_2_DEFAULT_ADJUST[] =
3920 {
3921   1400, 10800
3922 };
3923 
3924 const CustomShape CS_TEXT_WAVE_2(
3925   TEXT_WAVE_2_VERTICES, sizeof(TEXT_WAVE_2_VERTICES) / sizeof(Vertex),
3926   TEXT_WAVE_2_SEGMENTS, sizeof(TEXT_WAVE_2_SEGMENTS) / sizeof(unsigned short),
3927   TEXT_WAVE_2_CALC, sizeof(TEXT_WAVE_2_CALC) / sizeof(Calculation),
3928   TEXT_WAVE_2_DEFAULT_ADJUST, sizeof(TEXT_WAVE_2_DEFAULT_ADJUST) / sizeof(int),
3929   TEXT_WAVE_2_TRS, sizeof(TEXT_WAVE_2_TRS) / sizeof(TextRectangle),
3930   21600, 21600,
3931   nullptr, 0);
3932 
3933 const Vertex TEXT_WAVE_3_VERTICES[] =
3934 {
3935   {CALCULATED_VALUE(7), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(15), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(0x1e), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(0x1f), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(16), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(29), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(27), CALCULATED_VALUE(28)}, {CALCULATED_VALUE(0x20), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(0x13), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0x21), CALCULATED_VALUE(28)}, {CALCULATED_VALUE(25), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(24), CALCULATED_VALUE(1)}
3936 };
3937 
3938 const unsigned short TEXT_WAVE_3_SEGMENTS[] =
3939 {
3940   0x4000, 0x2002, 0x8000, 0x4000, 0x2002, 0x8000
3941 };
3942 
3943 const Calculation TEXT_WAVE_3_CALC[] =
3944 {
3945   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, 0x400}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, 0x402, 0, 10800}, {0x2001, 0x403, 2, 1}, {0x2003, 0x404, 0, 0}, {0x8000, 4320, 0, 0x405}, {0xa006, 0x403, 0, 0x405}, {0x4001, 7900, 0x400, 2230}, {0xa000, 0x400, 0, 0x408}, {0x6000, 0x400, 0x408, 0}, {0x8000, 21600, 0, 0x404}, {0x6006, 0x403, 0x40b, 21600}, {0xa000, 0x40c, 0, 0x407}, {0x2001, 0x405, 1, 2}, {0xa000, 0x407, 3600, 0x40e}, {0x6000, 0x40c, 0x40e, 3600}, {0x2001, 0x40d, 1, 2}, {0x6000, 0x407, 0x411, 0}, {0x8000, 21600, 0, 0x412}, {0x2001, 0x405, 1, 2}, {0x8000, 21600, 0, 0x414}, {0x2001, 0x400, 2, 1}, {0x8000, 21600, 0, 0x416}, {0x8000, 21600, 0, 0x407}, {0x8000, 21600, 0, 0x40f}, {0x6000, 0x401, 0x408, 0}, {0x8000, 21600, 0, 0x410}, {0xa000, 0x401, 0, 0x408}, {0x8000, 21600, 0, 0x40c}, {0xa000, 0x412, 0, 0x40e}, {0x6000, 0x412, 0x40e, 0}, {0xa000, 0x413, 0, 0x40e}, {0x6000, 0x413, 0x40e, 0}
3946 };
3947 
3948 const TextRectangle TEXT_WAVE_3_TRS[] =
3949 {
3950   { {0, 0}, {21600, 21600} }
3951 };
3952 
3953 const int TEXT_WAVE_3_DEFAULT_ADJUST[] =
3954 {
3955   1400, 10800
3956 };
3957 
3958 const CustomShape CS_TEXT_WAVE_3(
3959   TEXT_WAVE_3_VERTICES, sizeof(TEXT_WAVE_3_VERTICES) / sizeof(Vertex),
3960   TEXT_WAVE_3_SEGMENTS, sizeof(TEXT_WAVE_3_SEGMENTS) / sizeof(unsigned short),
3961   TEXT_WAVE_3_CALC, sizeof(TEXT_WAVE_3_CALC) / sizeof(Calculation),
3962   TEXT_WAVE_3_DEFAULT_ADJUST, sizeof(TEXT_WAVE_3_DEFAULT_ADJUST) / sizeof(int),
3963   TEXT_WAVE_3_TRS, sizeof(TEXT_WAVE_3_TRS) / sizeof(TextRectangle),
3964   21600, 21600,
3965   nullptr, 0);
3966 
3967 const Vertex TEXT_WAVE_4_VERTICES[] =
3968 {
3969   {CALCULATED_VALUE(7), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(15), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(0x1e), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(0x1f), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(16), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(29), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(27), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(0x20), CALCULATED_VALUE(28)}, {CALCULATED_VALUE(0x13), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0x21), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(25), CALCULATED_VALUE(28)}, {CALCULATED_VALUE(24), CALCULATED_VALUE(1)}
3970 };
3971 
3972 const unsigned short TEXT_WAVE_4_SEGMENTS[] =
3973 {
3974   0x4000, 0x2002, 0x8000, 0x4000, 0x2002, 0x8000
3975 };
3976 
3977 const Calculation TEXT_WAVE_4_CALC[] =
3978 {
3979   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, 0x400}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, 0x402, 0, 10800}, {0x2001, 0x403, 2, 1}, {0x2003, 0x404, 0, 0}, {0x8000, 4320, 0, 0x405}, {0xa006, 0x403, 0, 0x405}, {0x4001, 7900, 0x400, 2230}, {0xa000, 0x400, 0, 0x408}, {0x6000, 0x400, 0x408, 0}, {0x8000, 21600, 0, 0x404}, {0x6006, 0x403, 0x40b, 21600}, {0xa000, 0x40c, 0, 0x407}, {0x2001, 0x405, 1, 2}, {0xa000, 0x407, 3600, 0x40e}, {0x6000, 0x40c, 0x40e, 3600}, {0x2001, 0x40d, 1, 2}, {0x6000, 0x407, 0x411, 0}, {0x8000, 21600, 0, 0x412}, {0x2001, 0x405, 1, 2}, {0x8000, 21600, 0, 0x414}, {0x2001, 0x400, 2, 1}, {0x8000, 21600, 0, 0x416}, {0x8000, 21600, 0, 0x407}, {0x8000, 21600, 0, 0x40f}, {0x6000, 0x401, 0x408, 0}, {0x8000, 21600, 0, 0x410}, {0xa000, 0x401, 0, 0x408}, {0x8000, 21600, 0, 0x40c}, {0xa000, 0x412, 0, 0x40e}, {0x6000, 0x412, 0x40e, 0}, {0xa000, 0x413, 0, 0x40e}, {0x6000, 0x413, 0x40e, 0}
3980 };
3981 
3982 const TextRectangle TEXT_WAVE_4_TRS[] =
3983 {
3984   { {CALCULATED_VALUE(5), CALCULATED_VALUE(22)}, {CALCULATED_VALUE(11), CALCULATED_VALUE(23)} }
3985 };
3986 
3987 const int TEXT_WAVE_4_DEFAULT_ADJUST[] =
3988 {
3989   1400, 10800
3990 };
3991 
3992 const Vertex TEXT_WAVE_4_GLUE_POINTS[] =
3993 {
3994   {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(0x14), 10800}, {CALCULATED_VALUE(0x13), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0x15), 10800}
3995 };
3996 
3997 const CustomShape CS_TEXT_WAVE_4(
3998   TEXT_WAVE_4_VERTICES, sizeof(TEXT_WAVE_4_VERTICES) / sizeof(Vertex),
3999   TEXT_WAVE_4_SEGMENTS, sizeof(TEXT_WAVE_4_SEGMENTS) / sizeof(unsigned short),
4000   TEXT_WAVE_4_CALC, sizeof(TEXT_WAVE_4_CALC) / sizeof(Calculation),
4001   TEXT_WAVE_4_DEFAULT_ADJUST, sizeof(TEXT_WAVE_4_DEFAULT_ADJUST) / sizeof(int),
4002   TEXT_WAVE_4_TRS, sizeof(TEXT_WAVE_4_TRS) / sizeof(TextRectangle),
4003   21600, 21600,
4004   TEXT_WAVE_4_GLUE_POINTS, sizeof(TEXT_WAVE_4_GLUE_POINTS) / sizeof(Vertex));
4005 
4006 const Vertex TEXT_INFLATE_VERTICES[] =
4007 {
4008   {0, CALCULATED_VALUE(0)}, {4100, CALCULATED_VALUE(1)}, {7300, 0}, {10800, 0}, {14300, 0}, {17500, CALCULATED_VALUE(1)}, {21600, CALCULATED_VALUE(0)}, {0, CALCULATED_VALUE(2)}, {4100, CALCULATED_VALUE(3)}, {7300, 21600}, {10800, 21600}, {14300, 21600}, {17500, CALCULATED_VALUE(3)}, {21600, CALCULATED_VALUE(2)}
4009 };
4010 
4011 const unsigned short TEXT_INFLATE_SEGMENTS[] =
4012 {
4013   0x4000, 0x2002, 0x8000, 0x4000, 0x2002, 0x8000
4014 };
4015 
4016 const Calculation TEXT_INFLATE_CALC[] =
4017 {
4018   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x4001, 1530, 0x400, 4650}, {0x8000, 21600, 0, 0x400}, {0x8000, 21600, 0, 0x401}
4019 };
4020 
4021 const TextRectangle TEXT_INFLATE_TRS[] =
4022 {
4023   { {0, 0}, {21600, 21600} }
4024 };
4025 
4026 const int TEXT_INFLATE_DEFAULT_ADJUST[] =
4027 {
4028   2950
4029 };
4030 
4031 const CustomShape CS_TEXT_INFLATE(
4032   TEXT_INFLATE_VERTICES, sizeof(TEXT_INFLATE_VERTICES) / sizeof(Vertex),
4033   TEXT_INFLATE_SEGMENTS, sizeof(TEXT_INFLATE_SEGMENTS) / sizeof(unsigned short),
4034   TEXT_INFLATE_CALC, sizeof(TEXT_INFLATE_CALC) / sizeof(Calculation),
4035   TEXT_INFLATE_DEFAULT_ADJUST, sizeof(TEXT_INFLATE_DEFAULT_ADJUST) / sizeof(int),
4036   TEXT_INFLATE_TRS, sizeof(TEXT_INFLATE_TRS) / sizeof(TextRectangle),
4037   21600, 21600,
4038   nullptr, 0);
4039 
4040 const Vertex TEXT_DEFLATE_VERTICES[] =
4041 {
4042   {0, 0}, {3500, CALCULATED_VALUE(1)}, {7100, CALCULATED_VALUE(0)}, {10800, CALCULATED_VALUE(0)}, {14500, CALCULATED_VALUE(0)}, {18100, CALCULATED_VALUE(1)}, {21600, 0}, {0, 21600}, {3500, CALCULATED_VALUE(3)}, {7100, CALCULATED_VALUE(2)}, {10800, CALCULATED_VALUE(2)}, {14500, CALCULATED_VALUE(2)}, {18100, CALCULATED_VALUE(3)}, {21600, 21600}
4043 };
4044 
4045 const unsigned short TEXT_DEFLATE_SEGMENTS[] =
4046 {
4047   0x4000, 0x2002, 0x8000, 0x4000, 0x2002, 0x8000
4048 };
4049 
4050 const Calculation TEXT_DEFLATE_CALC[] =
4051 {
4052   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2001, 0x400, 5320, 7100}, {0x8000, 21600, 0, 0x400}, {0x8000, 21600, 0, 0x401}
4053 };
4054 
4055 const TextRectangle TEXT_DEFLATE_TRS[] =
4056 {
4057   { {0, 0}, {21600, 21600} }
4058 };
4059 
4060 const int TEXT_DEFLATE_DEFAULT_ADJUST[] =
4061 {
4062   8100
4063 };
4064 
4065 const CustomShape CS_TEXT_DEFLATE(
4066   TEXT_DEFLATE_VERTICES, sizeof(TEXT_DEFLATE_VERTICES) / sizeof(Vertex),
4067   TEXT_DEFLATE_SEGMENTS, sizeof(TEXT_DEFLATE_SEGMENTS) / sizeof(unsigned short),
4068   TEXT_DEFLATE_CALC, sizeof(TEXT_DEFLATE_CALC) / sizeof(Calculation),
4069   TEXT_DEFLATE_DEFAULT_ADJUST, sizeof(TEXT_DEFLATE_DEFAULT_ADJUST) / sizeof(int),
4070   TEXT_DEFLATE_TRS, sizeof(TEXT_DEFLATE_TRS) / sizeof(TextRectangle),
4071   21600, 21600,
4072   nullptr, 0);
4073 
4074 const Vertex TEXT_INFLATE_BOTTOM_VERTICES[] =
4075 {
4076   {0, 0}, {21600, 0}, {0, CALCULATED_VALUE(0)}, {3500, CALCULATED_VALUE(3)}, {7300, 21600}, {10800, 21600}, {14300, 21600}, {18100, CALCULATED_VALUE(3)}, {21600, CALCULATED_VALUE(0)}
4077 };
4078 
4079 const unsigned short TEXT_INFLATE_BOTTOM_SEGMENTS[] =
4080 {
4081   0x4000, 0x0001, 0x8000, 0x4000, 0x2002, 0x8000
4082 };
4083 
4084 const Calculation TEXT_INFLATE_BOTTOM_CALC[] =
4085 {
4086   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, 0x400, 0, 11150}, {0x2001, 0x401, 3900, 10450}, {0x2000, 0x402, 17700, 0}
4087 };
4088 
4089 const TextRectangle TEXT_INFLATE_BOTTOM_TRS[] =
4090 {
4091   { {0, 0}, {21600, 21600} }
4092 };
4093 
4094 const int TEXT_INFLATE_BOTTOM_DEFAULT_ADJUST[] =
4095 {
4096   14700
4097 };
4098 
4099 const CustomShape CS_TEXT_INFLATE_BOTTOM(
4100   TEXT_INFLATE_BOTTOM_VERTICES, sizeof(TEXT_INFLATE_BOTTOM_VERTICES) / sizeof(Vertex),
4101   TEXT_INFLATE_BOTTOM_SEGMENTS, sizeof(TEXT_INFLATE_BOTTOM_SEGMENTS) / sizeof(unsigned short),
4102   TEXT_INFLATE_BOTTOM_CALC, sizeof(TEXT_INFLATE_BOTTOM_CALC) / sizeof(Calculation),
4103   TEXT_INFLATE_BOTTOM_DEFAULT_ADJUST, sizeof(TEXT_INFLATE_BOTTOM_DEFAULT_ADJUST) / sizeof(int),
4104   TEXT_INFLATE_BOTTOM_TRS, sizeof(TEXT_INFLATE_BOTTOM_TRS) / sizeof(TextRectangle),
4105   21600, 21600,
4106   nullptr, 0);
4107 
4108 const Vertex TEXT_DEFLATE_BOTTOM_VERTICES[] =
4109 {
4110   {0, 0}, {21600, 0}, {0, 21600}, {2900, CALCULATED_VALUE(3)}, {7200, CALCULATED_VALUE(0)}, {10800, CALCULATED_VALUE(0)}, {14400, CALCULATED_VALUE(0)}, {18700, CALCULATED_VALUE(3)}, {21600, 21600}
4111 };
4112 
4113 const unsigned short TEXT_DEFLATE_BOTTOM_SEGMENTS[] =
4114 {
4115   0x4000, 0x0001, 0x8000, 0x4000, 0x2002, 0x8000
4116 };
4117 
4118 const Calculation TEXT_DEFLATE_BOTTOM_CALC[] =
4119 {
4120   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, 0x400, 0, 1350}, {0x2001, 0x401, 12070, 20250}, {0x2000, 0x402, 9530, 0}
4121 };
4122 
4123 const TextRectangle TEXT_DEFLATE_BOTTOM_TRS[] =
4124 {
4125   { {0, 0}, {21600, 21600} }
4126 };
4127 
4128 const int TEXT_DEFLATE_BOTTOM_DEFAULT_ADJUST[] =
4129 {
4130   11500
4131 };
4132 
4133 const CustomShape CS_TEXT_DEFLATE_BOTTOM(
4134   TEXT_DEFLATE_BOTTOM_VERTICES, sizeof(TEXT_DEFLATE_BOTTOM_VERTICES) / sizeof(Vertex),
4135   TEXT_DEFLATE_BOTTOM_SEGMENTS, sizeof(TEXT_DEFLATE_BOTTOM_SEGMENTS) / sizeof(unsigned short),
4136   TEXT_DEFLATE_BOTTOM_CALC, sizeof(TEXT_DEFLATE_BOTTOM_CALC) / sizeof(Calculation),
4137   TEXT_DEFLATE_BOTTOM_DEFAULT_ADJUST, sizeof(TEXT_DEFLATE_BOTTOM_DEFAULT_ADJUST) / sizeof(int),
4138   TEXT_DEFLATE_BOTTOM_TRS, sizeof(TEXT_DEFLATE_BOTTOM_TRS) / sizeof(TextRectangle),
4139   21600, 21600,
4140   nullptr, 0);
4141 
4142 const Vertex TEXT_INFLATE_TOP_VERTICES[] =
4143 {
4144   {0, CALCULATED_VALUE(0)}, {3500, CALCULATED_VALUE(1)}, {7300, 0}, {10800, 0}, {14300, 0}, {18100, CALCULATED_VALUE(1)}, {21600, CALCULATED_VALUE(0)}, {0, 21600}, {21600, 21600}
4145 };
4146 
4147 const unsigned short TEXT_INFLATE_TOP_SEGMENTS[] =
4148 {
4149   0x4000, 0x2002, 0x8000, 0x4000, 0x0001, 0x8000
4150 };
4151 
4152 const Calculation TEXT_INFLATE_TOP_CALC[] =
4153 {
4154   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2001, 0x400, 3900, 10450}
4155 };
4156 
4157 const TextRectangle TEXT_INFLATE_TOP_TRS[] =
4158 {
4159   { {0, 0}, {21600, 21600} }
4160 };
4161 
4162 const int TEXT_INFLATE_TOP_DEFAULT_ADJUST[] =
4163 {
4164   6900
4165 };
4166 
4167 const CustomShape CS_TEXT_INFLATE_TOP(
4168   TEXT_INFLATE_TOP_VERTICES, sizeof(TEXT_INFLATE_TOP_VERTICES) / sizeof(Vertex),
4169   TEXT_INFLATE_TOP_SEGMENTS, sizeof(TEXT_INFLATE_TOP_SEGMENTS) / sizeof(unsigned short),
4170   TEXT_INFLATE_TOP_CALC, sizeof(TEXT_INFLATE_TOP_CALC) / sizeof(Calculation),
4171   TEXT_INFLATE_TOP_DEFAULT_ADJUST, sizeof(TEXT_INFLATE_TOP_DEFAULT_ADJUST) / sizeof(int),
4172   TEXT_INFLATE_TOP_TRS, sizeof(TEXT_INFLATE_TOP_TRS) / sizeof(TextRectangle),
4173   21600, 21600,
4174   nullptr, 0);
4175 
4176 const Vertex TEXT_DEFLATE_TOP_VERTICES[] =
4177 {
4178   {0, 0}, {2900, CALCULATED_VALUE(1)}, {7200, CALCULATED_VALUE(0)}, {10800, CALCULATED_VALUE(0)}, {14400, CALCULATED_VALUE(0)}, {18700, CALCULATED_VALUE(1)}, {21600, 0}, {0, 21600}, {21600, 21600}
4179 };
4180 
4181 const unsigned short TEXT_DEFLATE_TOP_SEGMENTS[] =
4182 {
4183   0x4000, 0x2002, 0x8000, 0x4000, 0x0001, 0x8000
4184 };
4185 
4186 const Calculation TEXT_DEFLATE_TOP_CALC[] =
4187 {
4188   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2001, 0x400, 12070, 20250}
4189 };
4190 
4191 const TextRectangle TEXT_DEFLATE_TOP_TRS[] =
4192 {
4193   { {0, 0}, {21600, 21600} }
4194 };
4195 
4196 const int TEXT_DEFLATE_TOP_DEFAULT_ADJUST[] =
4197 {
4198   10100
4199 };
4200 
4201 const CustomShape CS_TEXT_DEFLATE_TOP(
4202   TEXT_DEFLATE_TOP_VERTICES, sizeof(TEXT_DEFLATE_TOP_VERTICES) / sizeof(Vertex),
4203   TEXT_DEFLATE_TOP_SEGMENTS, sizeof(TEXT_DEFLATE_TOP_SEGMENTS) / sizeof(unsigned short),
4204   TEXT_DEFLATE_TOP_CALC, sizeof(TEXT_DEFLATE_TOP_CALC) / sizeof(Calculation),
4205   TEXT_DEFLATE_TOP_DEFAULT_ADJUST, sizeof(TEXT_DEFLATE_TOP_DEFAULT_ADJUST) / sizeof(int),
4206   TEXT_DEFLATE_TOP_TRS, sizeof(TEXT_DEFLATE_TOP_TRS) / sizeof(TextRectangle),
4207   21600, 21600,
4208   nullptr, 0);
4209 
4210 const Vertex TEXT_DEFLATE_INFLATE_VERTICES[] =
4211 {
4212   {0, 0}, {21600, 0}, {0, 10100}, {3300, CALCULATED_VALUE(3)}, {7100, CALCULATED_VALUE(5)}, {10800, CALCULATED_VALUE(5)}, {14500, CALCULATED_VALUE(5)}, {18300, CALCULATED_VALUE(3)}, {21600, 10100}, {0, 11500}, {3300, CALCULATED_VALUE(4)}, {7100, CALCULATED_VALUE(6)}, {10800, CALCULATED_VALUE(6)}, {14500, CALCULATED_VALUE(6)}, {18300, CALCULATED_VALUE(4)}, {21600, 11500}, {0, 21600}, {21600, 21600}
4213 };
4214 
4215 const unsigned short TEXT_DEFLATE_INFLATE_SEGMENTS[] =
4216 {
4217   0x4000, 0x0001, 0x8000, 0x4000, 0x2002, 0x8000, 0x4000, 0x2002, 0x8000, 0x4000, 0x0001, 0x8000
4218 };
4219 
4220 const Calculation TEXT_DEFLATE_INFLATE_CALC[] =
4221 {
4222   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 10800, 0, 0x400}, {0x2001, 0x401, 5770, 9500}, {0x8000, 10100, 0, 0x402}, {0x8000, 11500, 0, 0x402}, {0x2000, 0x400, 0, 700}, {0x2000, 0x400, 700, 0}
4223 };
4224 
4225 const TextRectangle TEXT_DEFLATE_INFLATE_TRS[] =
4226 {
4227   { {0, 0}, {21600, 21600} }
4228 };
4229 
4230 const int TEXT_DEFLATE_INFLATE_DEFAULT_ADJUST[] =
4231 {
4232   6500
4233 };
4234 
4235 const CustomShape CS_TEXT_DEFLATE_INFLATE(
4236   TEXT_DEFLATE_INFLATE_VERTICES, sizeof(TEXT_DEFLATE_INFLATE_VERTICES) / sizeof(Vertex),
4237   TEXT_DEFLATE_INFLATE_SEGMENTS, sizeof(TEXT_DEFLATE_INFLATE_SEGMENTS) / sizeof(unsigned short),
4238   TEXT_DEFLATE_INFLATE_CALC, sizeof(TEXT_DEFLATE_INFLATE_CALC) / sizeof(Calculation),
4239   TEXT_DEFLATE_INFLATE_DEFAULT_ADJUST, sizeof(TEXT_DEFLATE_INFLATE_DEFAULT_ADJUST) / sizeof(int),
4240   TEXT_DEFLATE_INFLATE_TRS, sizeof(TEXT_DEFLATE_INFLATE_TRS) / sizeof(TextRectangle),
4241   21600, 21600,
4242   nullptr, 0);
4243 
4244 const Vertex TEXT_DEFLATE_INFLATE_DEFLATE_VERTICES[] =
4245 {
4246   {0, 0}, {21600, 0}, {0, 6600}, {3600, CALCULATED_VALUE(3)}, {7250, CALCULATED_VALUE(4)}, {10800, CALCULATED_VALUE(4)}, {14350, CALCULATED_VALUE(4)}, {18000, CALCULATED_VALUE(3)}, {21600, 6600}, {0, 7500}, {3600, CALCULATED_VALUE(5)}, {7250, CALCULATED_VALUE(6)}, {10800, CALCULATED_VALUE(6)}, {14350, CALCULATED_VALUE(6)}, {18000, CALCULATED_VALUE(5)}, {21600, 7500}, {0, 14100}, {3600, CALCULATED_VALUE(9)}, {7250, CALCULATED_VALUE(10)}, {10800, CALCULATED_VALUE(10)}, {14350, CALCULATED_VALUE(10)}, {18000, CALCULATED_VALUE(9)}, {21600, 14100}, {0, 15000}, {3600, CALCULATED_VALUE(7)}, {7250, CALCULATED_VALUE(8)}, {10800, CALCULATED_VALUE(8)}, {14350, CALCULATED_VALUE(8)}, {18000, CALCULATED_VALUE(7)}, {21600, 15000}, {0, 21600}, {21600, 21600}
4247 };
4248 
4249 const unsigned short TEXT_DEFLATE_INFLATE_DEFLATE_SEGMENTS[] =
4250 {
4251   0x4000, 0x0001, 0x8000, 0x4000, 0x2002, 0x8000, 0x4000, 0x2002, 0x8000, 0x4000, 0x2002, 0x8000, 0x4000, 0x2002, 0x8000, 0x4000, 0x0001, 0x8000
4252 };
4253 
4254 const Calculation TEXT_DEFLATE_INFLATE_DEFLATE_CALC[] =
4255 {
4256   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 850}, {0x2001, 0x400, 6120, 8700}, {0x2000, 0x401, 0, 4280}, {0x4000, 6600, 0x402, 0}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 450}, {0x2000, 0x403, 900, 0}, {0x2000, 0x404, 900, 0}, {0x8000, 21600, 0, 0x403}, {0x8000, 21600, 0, 0x404}, {0x8000, 21600, 0, 0x405}, {0x8000, 21600, 0, 0x406}
4257 };
4258 
4259 const TextRectangle TEXT_DEFLATE_INFLATE_DEFLATE_TRS[] =
4260 {
4261   { {0, 0}, {21600, 21600} }
4262 };
4263 
4264 const int TEXT_DEFLATE_INFLATE_DEFLATE_DEFAULT_ADJUST[] =
4265 {
4266   6050
4267 };
4268 
4269 const CustomShape CS_TEXT_DEFLATE_INFLATE_DEFLATE(
4270   TEXT_DEFLATE_INFLATE_DEFLATE_VERTICES, sizeof(TEXT_DEFLATE_INFLATE_DEFLATE_VERTICES) / sizeof(Vertex),
4271   TEXT_DEFLATE_INFLATE_DEFLATE_SEGMENTS, sizeof(TEXT_DEFLATE_INFLATE_DEFLATE_SEGMENTS) / sizeof(unsigned short),
4272   TEXT_DEFLATE_INFLATE_DEFLATE_CALC, sizeof(TEXT_DEFLATE_INFLATE_DEFLATE_CALC) / sizeof(Calculation),
4273   TEXT_DEFLATE_INFLATE_DEFLATE_DEFAULT_ADJUST, sizeof(TEXT_DEFLATE_INFLATE_DEFLATE_DEFAULT_ADJUST) / sizeof(int),
4274   TEXT_DEFLATE_INFLATE_DEFLATE_TRS, sizeof(TEXT_DEFLATE_INFLATE_DEFLATE_TRS) / sizeof(TextRectangle),
4275   21600, 21600,
4276   nullptr, 0);
4277 
4278 const Vertex TEXT_FADE_RIGHT_VERTICES[] =
4279 {
4280   {0, 0}, {21600, CALCULATED_VALUE(0)}, {0, 21600}, {21600, CALCULATED_VALUE(1)}
4281 };
4282 
4283 const unsigned short TEXT_FADE_RIGHT_SEGMENTS[] =
4284 {
4285   0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
4286 };
4287 
4288 const Calculation TEXT_FADE_RIGHT_CALC[] =
4289 {
4290   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}
4291 };
4292 
4293 const TextRectangle TEXT_FADE_RIGHT_TRS[] =
4294 {
4295   { {0, 0}, {21600, 21600} }
4296 };
4297 
4298 const int TEXT_FADE_RIGHT_DEFAULT_ADJUST[] =
4299 {
4300   7200
4301 };
4302 
4303 const CustomShape CS_TEXT_FADE_RIGHT(
4304   TEXT_FADE_RIGHT_VERTICES, sizeof(TEXT_FADE_RIGHT_VERTICES) / sizeof(Vertex),
4305   TEXT_FADE_RIGHT_SEGMENTS, sizeof(TEXT_FADE_RIGHT_SEGMENTS) / sizeof(unsigned short),
4306   TEXT_FADE_RIGHT_CALC, sizeof(TEXT_FADE_RIGHT_CALC) / sizeof(Calculation),
4307   TEXT_FADE_RIGHT_DEFAULT_ADJUST, sizeof(TEXT_FADE_RIGHT_DEFAULT_ADJUST) / sizeof(int),
4308   TEXT_FADE_RIGHT_TRS, sizeof(TEXT_FADE_RIGHT_TRS) / sizeof(TextRectangle),
4309   21600, 21600,
4310   nullptr, 0);
4311 
4312 const Vertex TEXT_FADE_LEFT_VERTICES[] =
4313 {
4314   {0, CALCULATED_VALUE(0)}, {21600, 0}, {0, CALCULATED_VALUE(1)}, {21600, 21600}
4315 };
4316 
4317 const unsigned short TEXT_FADE_LEFT_SEGMENTS[] =
4318 {
4319   0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
4320 };
4321 
4322 const Calculation TEXT_FADE_LEFT_CALC[] =
4323 {
4324   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}
4325 };
4326 
4327 const TextRectangle TEXT_FADE_LEFT_TRS[] =
4328 {
4329   { {0, 0}, {21600, 21600} }
4330 };
4331 
4332 const int TEXT_FADE_LEFT_DEFAULT_ADJUST[] =
4333 {
4334   7200
4335 };
4336 
4337 const CustomShape CS_TEXT_FADE_LEFT(
4338   TEXT_FADE_LEFT_VERTICES, sizeof(TEXT_FADE_LEFT_VERTICES) / sizeof(Vertex),
4339   TEXT_FADE_LEFT_SEGMENTS, sizeof(TEXT_FADE_LEFT_SEGMENTS) / sizeof(unsigned short),
4340   TEXT_FADE_LEFT_CALC, sizeof(TEXT_FADE_LEFT_CALC) / sizeof(Calculation),
4341   TEXT_FADE_LEFT_DEFAULT_ADJUST, sizeof(TEXT_FADE_LEFT_DEFAULT_ADJUST) / sizeof(int),
4342   TEXT_FADE_LEFT_TRS, sizeof(TEXT_FADE_LEFT_TRS) / sizeof(TextRectangle),
4343   21600, 21600,
4344   nullptr, 0);
4345 
4346 const Vertex TEXT_FADE_UP_VERTICES[] =
4347 {
4348   {CALCULATED_VALUE(0), 0}, {CALCULATED_VALUE(1), 0}, {0, 21600}, {21600, 21600}
4349 };
4350 
4351 const unsigned short TEXT_FADE_UP_SEGMENTS[] =
4352 {
4353   0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
4354 };
4355 
4356 const Calculation TEXT_FADE_UP_CALC[] =
4357 {
4358   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}
4359 };
4360 
4361 const TextRectangle TEXT_FADE_UP_TRS[] =
4362 {
4363   { {0, 0}, {21600, 21600} }
4364 };
4365 
4366 const int TEXT_FADE_UP_DEFAULT_ADJUST[] =
4367 {
4368   7200
4369 };
4370 
4371 const CustomShape CS_TEXT_FADE_UP(
4372   TEXT_FADE_UP_VERTICES, sizeof(TEXT_FADE_UP_VERTICES) / sizeof(Vertex),
4373   TEXT_FADE_UP_SEGMENTS, sizeof(TEXT_FADE_UP_SEGMENTS) / sizeof(unsigned short),
4374   TEXT_FADE_UP_CALC, sizeof(TEXT_FADE_UP_CALC) / sizeof(Calculation),
4375   TEXT_FADE_UP_DEFAULT_ADJUST, sizeof(TEXT_FADE_UP_DEFAULT_ADJUST) / sizeof(int),
4376   TEXT_FADE_UP_TRS, sizeof(TEXT_FADE_UP_TRS) / sizeof(TextRectangle),
4377   21600, 21600,
4378   nullptr, 0);
4379 
4380 const Vertex TEXT_FADE_DOWN_VERTICES[] =
4381 {
4382   {0, 0}, {21600, 0}, {CALCULATED_VALUE(0), 21600}, {CALCULATED_VALUE(1), 21600}
4383 };
4384 
4385 const unsigned short TEXT_FADE_DOWN_SEGMENTS[] =
4386 {
4387   0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
4388 };
4389 
4390 const Calculation TEXT_FADE_DOWN_CALC[] =
4391 {
4392   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}
4393 };
4394 
4395 const TextRectangle TEXT_FADE_DOWN_TRS[] =
4396 {
4397   { {0, 0}, {21600, 21600} }
4398 };
4399 
4400 const int TEXT_FADE_DOWN_DEFAULT_ADJUST[] =
4401 {
4402   7200
4403 };
4404 
4405 const CustomShape CS_TEXT_FADE_DOWN(
4406   TEXT_FADE_DOWN_VERTICES, sizeof(TEXT_FADE_DOWN_VERTICES) / sizeof(Vertex),
4407   TEXT_FADE_DOWN_SEGMENTS, sizeof(TEXT_FADE_DOWN_SEGMENTS) / sizeof(unsigned short),
4408   TEXT_FADE_DOWN_CALC, sizeof(TEXT_FADE_DOWN_CALC) / sizeof(Calculation),
4409   TEXT_FADE_DOWN_DEFAULT_ADJUST, sizeof(TEXT_FADE_DOWN_DEFAULT_ADJUST) / sizeof(int),
4410   TEXT_FADE_DOWN_TRS, sizeof(TEXT_FADE_DOWN_TRS) / sizeof(TextRectangle),
4411   21600, 21600,
4412   nullptr, 0);
4413 
4414 const Vertex TEXT_SLANT_UP_VERTICES[] =
4415 {
4416   {0, CALCULATED_VALUE(0)}, {21600, 0}, {0, 21600}, {21600, CALCULATED_VALUE(1)}
4417 };
4418 
4419 const unsigned short TEXT_SLANT_UP_SEGMENTS[] =
4420 {
4421   0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
4422 };
4423 
4424 const Calculation TEXT_SLANT_UP_CALC[] =
4425 {
4426   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}
4427 };
4428 
4429 const TextRectangle TEXT_SLANT_UP_TRS[] =
4430 {
4431   { {0, 0}, {21600, 21600} }
4432 };
4433 
4434 const int TEXT_SLANT_UP_DEFAULT_ADJUST[] =
4435 {
4436   12000
4437 };
4438 
4439 const CustomShape CS_TEXT_SLANT_UP(
4440   TEXT_SLANT_UP_VERTICES, sizeof(TEXT_SLANT_UP_VERTICES) / sizeof(Vertex),
4441   TEXT_SLANT_UP_SEGMENTS, sizeof(TEXT_SLANT_UP_SEGMENTS) / sizeof(unsigned short),
4442   TEXT_SLANT_UP_CALC, sizeof(TEXT_SLANT_UP_CALC) / sizeof(Calculation),
4443   TEXT_SLANT_UP_DEFAULT_ADJUST, sizeof(TEXT_SLANT_UP_DEFAULT_ADJUST) / sizeof(int),
4444   TEXT_SLANT_UP_TRS, sizeof(TEXT_SLANT_UP_TRS) / sizeof(TextRectangle),
4445   21600, 21600,
4446   nullptr, 0);
4447 
4448 const Vertex TEXT_SLANT_DOWN_VERTICES[] =
4449 {
4450   {0, 0}, {21600, CALCULATED_VALUE(1)}, {0, CALCULATED_VALUE(0)}, {21600, 21600}
4451 };
4452 
4453 const unsigned short TEXT_SLANT_DOWN_SEGMENTS[] =
4454 {
4455   0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
4456 };
4457 
4458 const Calculation TEXT_SLANT_DOWN_CALC[] =
4459 {
4460   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}
4461 };
4462 
4463 const TextRectangle TEXT_SLANT_DOWN_TRS[] =
4464 {
4465   { {0, 0}, {21600, 21600} }
4466 };
4467 
4468 const int TEXT_SLANT_DOWN_DEFAULT_ADJUST[] =
4469 {
4470   12000
4471 };
4472 
4473 const CustomShape CS_TEXT_SLANT_DOWN(
4474   TEXT_SLANT_DOWN_VERTICES, sizeof(TEXT_SLANT_DOWN_VERTICES) / sizeof(Vertex),
4475   TEXT_SLANT_DOWN_SEGMENTS, sizeof(TEXT_SLANT_DOWN_SEGMENTS) / sizeof(unsigned short),
4476   TEXT_SLANT_DOWN_CALC, sizeof(TEXT_SLANT_DOWN_CALC) / sizeof(Calculation),
4477   TEXT_SLANT_DOWN_DEFAULT_ADJUST, sizeof(TEXT_SLANT_DOWN_DEFAULT_ADJUST) / sizeof(int),
4478   TEXT_SLANT_DOWN_TRS, sizeof(TEXT_SLANT_DOWN_TRS) / sizeof(TextRectangle),
4479   21600, 21600,
4480   nullptr, 0);
4481 
4482 const Vertex TEXT_CAN_UP_VERTICES[] =
4483 {
4484   {0, CALCULATED_VALUE(1)}, {900, 0}, {7100, 0}, {10800, 0}, {14500, 0}, {20700, 0}, {21600, CALCULATED_VALUE(1)}, {0, 21600}, {900, CALCULATED_VALUE(4)}, {7100, CALCULATED_VALUE(0)}, {10800, CALCULATED_VALUE(0)}, {14500, CALCULATED_VALUE(0)}, {20700, CALCULATED_VALUE(4)}, {21600, 21600}
4485 };
4486 
4487 const unsigned short TEXT_CAN_UP_SEGMENTS[] =
4488 {
4489   0x4000, 0x2002, 0x8000, 0x4000, 0x2002, 0x8000
4490 };
4491 
4492 const Calculation TEXT_CAN_UP_CALC[] =
4493 {
4494   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 14400}, {0x4001, 5470, 0x402, 7200}, {0x4000, 16130, 0x403, 0}
4495 };
4496 
4497 const TextRectangle TEXT_CAN_UP_TRS[] =
4498 {
4499   { {0, 0}, {21600, 21600} }
4500 };
4501 
4502 const int TEXT_CAN_UP_DEFAULT_ADJUST[] =
4503 {
4504   18500
4505 };
4506 
4507 const CustomShape CS_TEXT_CAN_UP(
4508   TEXT_CAN_UP_VERTICES, sizeof(TEXT_CAN_UP_VERTICES) / sizeof(Vertex),
4509   TEXT_CAN_UP_SEGMENTS, sizeof(TEXT_CAN_UP_SEGMENTS) / sizeof(unsigned short),
4510   TEXT_CAN_UP_CALC, sizeof(TEXT_CAN_UP_CALC) / sizeof(Calculation),
4511   TEXT_CAN_UP_DEFAULT_ADJUST, sizeof(TEXT_CAN_UP_DEFAULT_ADJUST) / sizeof(int),
4512   TEXT_CAN_UP_TRS, sizeof(TEXT_CAN_UP_TRS) / sizeof(TextRectangle),
4513   21600, 21600,
4514   nullptr, 0);
4515 
4516 const Vertex TEXT_CAN_DOWN_VERTICES[] =
4517 {
4518   {0, 0}, {900, CALCULATED_VALUE(2)}, {7100, CALCULATED_VALUE(0)}, {10800, CALCULATED_VALUE(0)}, {14500, CALCULATED_VALUE(0)}, {20700, CALCULATED_VALUE(2)}, {21600, 0}, {0, CALCULATED_VALUE(1)}, {900, 21600}, {7100, 21600}, {10800, 21600}, {14500, 21600}, {20700, 21600}, {21600, CALCULATED_VALUE(1)}
4519 };
4520 
4521 const unsigned short TEXT_CAN_DOWN_SEGMENTS[] =
4522 {
4523   0x4000, 0x2002, 0x8000, 0x4000, 0x2002, 0x8000
4524 };
4525 
4526 const Calculation TEXT_CAN_DOWN_CALC[] =
4527 {
4528   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x4001, 5470, 0x400, 7200}
4529 };
4530 
4531 const TextRectangle TEXT_CAN_DOWN_TRS[] =
4532 {
4533   { {0, 0}, {21600, 21600} }
4534 };
4535 
4536 const int TEXT_CAN_DOWN_DEFAULT_ADJUST[] =
4537 {
4538   3100
4539 };
4540 
4541 const CustomShape CS_TEXT_CAN_DOWN(
4542   TEXT_CAN_DOWN_VERTICES, sizeof(TEXT_CAN_DOWN_VERTICES) / sizeof(Vertex),
4543   TEXT_CAN_DOWN_SEGMENTS, sizeof(TEXT_CAN_DOWN_SEGMENTS) / sizeof(unsigned short),
4544   TEXT_CAN_DOWN_CALC, sizeof(TEXT_CAN_DOWN_CALC) / sizeof(Calculation),
4545   TEXT_CAN_DOWN_DEFAULT_ADJUST, sizeof(TEXT_CAN_DOWN_DEFAULT_ADJUST) / sizeof(int),
4546   TEXT_CAN_DOWN_TRS, sizeof(TEXT_CAN_DOWN_TRS) / sizeof(TextRectangle),
4547   21600, 21600,
4548   nullptr, 0);
4549 
4550 const Vertex FLOW_CHART_ALTERNATE_PROCESS_VERTICES[] =
4551 {
4552   {0, CALCULATED_VALUE(2)}, {CALCULATED_VALUE(0), 0}, {CALCULATED_VALUE(1), 0}, {21600, CALCULATED_VALUE(2)}, {21600, CALCULATED_VALUE(3)}, {CALCULATED_VALUE(1), 21600}, {CALCULATED_VALUE(0), 21600}, {0, CALCULATED_VALUE(3)}
4553 };
4554 
4555 const unsigned short FLOW_CHART_ALTERNATE_PROCESS_SEGMENTS[] =
4556 {
4557   0x4000, 0xa801, 0x0001, 0xa701, 0x0001, 0xa801, 0x0001, 0xa701, 0x6000, 0x8000
4558 };
4559 
4560 const Calculation FLOW_CHART_ALTERNATE_PROCESS_CALC[] =
4561 {
4562   {0x2000, PROP_GEO_LEFT, 2540, 0}, {0x2000, PROP_GEO_RIGHT, 0, 2540}, {0x2000, PROP_GEO_TOP, 2540, 0}, {0x2000, PROP_GEO_BOTTOM, 0, 2540}, {0x2000, PROP_GEO_LEFT, 800, 0}, {0x2000, PROP_GEO_RIGHT, 0, 800}, {0x2000, PROP_GEO_TOP, 800, 0}, {0x2000, PROP_GEO_BOTTOM, 0, 800}
4563 };
4564 
4565 const TextRectangle FLOW_CHART_ALTERNATE_PROCESS_TRS[] =
4566 {
4567   { {CALCULATED_VALUE(4), CALCULATED_VALUE(6)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(7)} }
4568 };
4569 
4570 const Vertex FLOW_CHART_ALTERNATE_PROCESS_GLUE_POINTS[] =
4571 {
4572   {0, 10800}, {10800, 0}, {21600, 10800}, {10800, 21600}
4573 };
4574 
4575 const CustomShape CS_FLOW_CHART_ALTERNATE_PROCESS(
4576   FLOW_CHART_ALTERNATE_PROCESS_VERTICES, sizeof(FLOW_CHART_ALTERNATE_PROCESS_VERTICES) / sizeof(Vertex),
4577   FLOW_CHART_ALTERNATE_PROCESS_SEGMENTS, sizeof(FLOW_CHART_ALTERNATE_PROCESS_SEGMENTS) / sizeof(unsigned short),
4578   FLOW_CHART_ALTERNATE_PROCESS_CALC, sizeof(FLOW_CHART_ALTERNATE_PROCESS_CALC) / sizeof(Calculation),
4579   nullptr, 0,
4580   FLOW_CHART_ALTERNATE_PROCESS_TRS, sizeof(FLOW_CHART_ALTERNATE_PROCESS_TRS) / sizeof(TextRectangle),
4581   21600, 21600,
4582   FLOW_CHART_ALTERNATE_PROCESS_GLUE_POINTS, sizeof(FLOW_CHART_ALTERNATE_PROCESS_GLUE_POINTS) / sizeof(Vertex));
4583 
4584 const Vertex FLOW_CHART_OFFPAGE_CONNECTOR_VERTICES[] =
4585 {
4586   {0, 0}, {21600, 0}, {21600, 17150}, {10800, 21600}, {0, 17150}, {0, 0}
4587 };
4588 
4589 const TextRectangle FLOW_CHART_OFFPAGE_CONNECTOR_TRS[] =
4590 {
4591   { {0, 0}, {21600, 17150} }
4592 };
4593 
4594 const Vertex FLOW_CHART_OFFPAGE_CONNECTOR_GLUE_POINTS[] =
4595 {
4596   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
4597 };
4598 
4599 const CustomShape CS_FLOW_CHART_OFFPAGE_CONNECTOR(
4600   FLOW_CHART_OFFPAGE_CONNECTOR_VERTICES, sizeof(FLOW_CHART_OFFPAGE_CONNECTOR_VERTICES) / sizeof(Vertex),
4601   nullptr, 0,
4602   nullptr, 0,
4603   nullptr, 0,
4604   FLOW_CHART_OFFPAGE_CONNECTOR_TRS, sizeof(FLOW_CHART_OFFPAGE_CONNECTOR_TRS) / sizeof(TextRectangle),
4605   21600, 21600,
4606   FLOW_CHART_OFFPAGE_CONNECTOR_GLUE_POINTS, sizeof(FLOW_CHART_OFFPAGE_CONNECTOR_GLUE_POINTS) / sizeof(Vertex));
4607 
4608 const Vertex LEFT_RIGHT_UP_ARROW_VERTICES[] =
4609 {
4610   {10800, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(0)}, {21600, 10800}, {CALCULATED_VALUE(5), CALCULATED_VALUE(3)}, {CALCULATED_VALUE(5), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(3)}, {0, 10800}, {CALCULATED_VALUE(2), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(2), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(2)}
4611 };
4612 
4613 const unsigned short LEFT_RIGHT_UP_ARROW_SEGMENTS[] =
4614 {
4615   0x4000, 0x0010, 0x6001, 0x8000
4616 };
4617 
4618 const Calculation LEFT_RIGHT_UP_ARROW_CALC[] =
4619 {
4620   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x6001, 0x0403, PROP_ADJUST_VAL_FIRST + 2, 21600}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST + 1}, {0x8000, 21600, 0, 0x0402}
4621 };
4622 
4623 const TextRectangle LEFT_RIGHT_UP_ARROW_TRS[] =
4624 {
4625   { {0, 0}, {21600, 21600} }
4626 };
4627 
4628 const int LEFT_RIGHT_UP_ARROW_DEFAULT_ADJUST[] =
4629 {
4630   6500, 8600, 6200
4631 };
4632 
4633 const CustomShape CS_LEFT_RIGHT_UP_ARROW(
4634   LEFT_RIGHT_UP_ARROW_VERTICES, sizeof(LEFT_RIGHT_UP_ARROW_VERTICES) / sizeof(Vertex),
4635   LEFT_RIGHT_UP_ARROW_SEGMENTS, sizeof(LEFT_RIGHT_UP_ARROW_SEGMENTS) / sizeof(unsigned short),
4636   LEFT_RIGHT_UP_ARROW_CALC, sizeof(LEFT_RIGHT_UP_ARROW_CALC) / sizeof(Calculation),
4637   LEFT_RIGHT_UP_ARROW_DEFAULT_ADJUST, sizeof(LEFT_RIGHT_UP_ARROW_DEFAULT_ADJUST) / sizeof(int),
4638   LEFT_RIGHT_UP_ARROW_TRS, sizeof(LEFT_RIGHT_UP_ARROW_TRS) / sizeof(TextRectangle),
4639   21600, 21600,
4640   nullptr, 0);
4641 
4642 const Vertex SUN_VERTICES[] =
4643 {
4644   {0, 10800}, {CALCULATED_VALUE(4), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(4), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(0x0a), CALCULATED_VALUE(0x0b)}, {CALCULATED_VALUE(0x0c), CALCULATED_VALUE(0x0d)}, {CALCULATED_VALUE(0x0e), CALCULATED_VALUE(0x0f)}, {CALCULATED_VALUE(0x10), CALCULATED_VALUE(0x11)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0x13)}, {CALCULATED_VALUE(0x14), CALCULATED_VALUE(0x15)}, {CALCULATED_VALUE(0x16), CALCULATED_VALUE(0x17)}, {CALCULATED_VALUE(0x18), CALCULATED_VALUE(0x19)}, {CALCULATED_VALUE(0x1a), CALCULATED_VALUE(0x1b)}, {CALCULATED_VALUE(0x1c), CALCULATED_VALUE(0x1d)}, {CALCULATED_VALUE(0x1e), CALCULATED_VALUE(0x1f)}, {CALCULATED_VALUE(0x20), CALCULATED_VALUE(0x21)}, {CALCULATED_VALUE(0x22), CALCULATED_VALUE(0x23)}, {CALCULATED_VALUE(0x24), CALCULATED_VALUE(0x25)}, {CALCULATED_VALUE(0x26), CALCULATED_VALUE(0x27)}, {CALCULATED_VALUE(0x28), CALCULATED_VALUE(0x29)}, {CALCULATED_VALUE(0x2a), CALCULATED_VALUE(0x2b)}, {CALCULATED_VALUE(0x2c), CALCULATED_VALUE(0x2d)}, {CALCULATED_VALUE(0x2e), CALCULATED_VALUE(0x2f)}, {CALCULATED_VALUE(0x30), CALCULATED_VALUE(0x31)}, {CALCULATED_VALUE(0x32), CALCULATED_VALUE(0x33)}, {10800, 10800}, {CALCULATED_VALUE(0x36), CALCULATED_VALUE(0x36)}, {0, 360}
4645 };
4646 
4647 const unsigned short SUN_SEGMENTS[] =
4648 {
4649   0x4000, 0x0002, 0x6001, 0x8000, 0x4000, 0x0002, 0x6001, 0x8000, 0x4000, 0x0002, 0x6001, 0x8000, 0x4000, 0x0002, 0x6001, 0x8000, 0x4000, 0x0002, 0x6001, 0x8000, 0x4000, 0x0002, 0x6001, 0x8000, 0x4000, 0x0002, 0x6001, 0x8000, 0x4000, 0x0002, 0x6001, 0x8000, 0xa203, 0x6000, 0x8000
4650 };
4651 
4652 const Calculation SUN_CALC[] =
4653 {
4654   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x2000, PROP_ADJUST_VAL_FIRST, 0, 2700}, {0x2001, 0x402, 5080, 7425}, {0x2000, 0x403, 2540, 0}, {0x8000, 10125, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x405, 2120, 7425}, {0x2000, 0x406, 210, 0}, {0x4000, 10800, 0x407, 0}, {0x8000, 10800, 0, 0x407}, {0x0081, 0, 10800, 45}, {0x0082, 0, 10800, 45}, {0x6081, 0x404, 0x408, 45}, {0x6082, 0x404, 0x408, 45}, {0x6081, 0x404, 0x409, 45}, {0x6082, 0x404, 0x409, 45}, {0x0081, 0, 10800, 90}, {0x0082, 0, 10800, 90}, {0x6081, 0x404, 0x408, 90}, {0x6082, 0x404, 0x408, 90}, {0x6081, 0x404, 0x409, 90}, {0x6082, 0x404, 0x409, 90}, {0x0081, 0, 10800, 135}, {0x0082, 0, 10800, 135}, {0x6081, 0x404, 0x408, 135}, {0x6082, 0x404, 0x408, 135}, {0x6081, 0x404, 0x409, 135}, {0x6082, 0x404, 0x409, 135}, {0x0081, 0, 10800, 180}, {0x0082, 0, 10800, 180}, {0x6081, 0x404, 0x408, 180}, {0x6082, 0x404, 0x408, 180}, {0x6081, 0x404, 0x409, 180}, {0x6082, 0x404, 0x409, 180}, {0x0081, 0, 10800, 225}, {0x0082, 0, 10800, 225}, {0x6081, 0x404, 0x408, 225}, {0x6082, 0x404, 0x408, 225}, {0x6081, 0x404, 0x409, 225}, {0x6082, 0x404, 0x409, 225}, {0x0081, 0, 10800, 270}, {0x0082, 0, 10800, 270}, {0x6081, 0x404, 0x408, 270}, {0x6082, 0x404, 0x408, 270}, {0x6081, 0x404, 0x409, 270}, {0x6082, 0x404, 0x409, 270}, {0x0081, 0, 10800, 315}, {0x0082, 0, 10800, 315}, {0x6081, 0x404, 0x408, 315}, {0x6082, 0x404, 0x408, 315}, {0x6081, 0x404, 0x409, 315}, {0x6082, 0x404, 0x409, 315}, {0x2081, PROP_ADJUST_VAL_FIRST, 10800, 45}, {0x2081, PROP_ADJUST_VAL_FIRST, 10800, 225}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}
4655 };
4656 
4657 const TextRectangle SUN_TRS[] =
4658 {
4659   { {CALCULATED_VALUE(0x34), CALCULATED_VALUE(0x34)}, {CALCULATED_VALUE(0x35), CALCULATED_VALUE(0x35)} }
4660 };
4661 
4662 const int SUN_DEFAULT_ADJUST[] =
4663 {
4664   5400
4665 };
4666 
4667 const Vertex SUN_GLUE_POINTS[] =
4668 {
4669   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
4670 };
4671 
4672 const CustomShape CS_SUN(
4673   SUN_VERTICES, sizeof(SUN_VERTICES) / sizeof(Vertex),
4674   SUN_SEGMENTS, sizeof(SUN_SEGMENTS) / sizeof(unsigned short),
4675   SUN_CALC, sizeof(SUN_CALC) / sizeof(Calculation),
4676   SUN_DEFAULT_ADJUST, sizeof(SUN_DEFAULT_ADJUST) / sizeof(int),
4677   SUN_TRS, sizeof(SUN_TRS) / sizeof(TextRectangle),
4678   21600, 21600,
4679   SUN_GLUE_POINTS, sizeof(SUN_GLUE_POINTS) / sizeof(Vertex));
4680 
4681 const Vertex MOON_VERTICES[] =
4682 {
4683   {21600, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(0), 5080}, {CALCULATED_VALUE(0), 10800}, {CALCULATED_VALUE(0), 16520}, {CALCULATED_VALUE(3), CALCULATED_VALUE(5)}, {21600, 21600}, {9740, 21600}, {0, 16730}, {0, 10800}, {0, 4870}, {9740, 0}, {21600, 0}
4684 };
4685 
4686 const unsigned short MOON_SEGMENTS[] =
4687 {
4688   0x4000, 0x2004, 0x6000, 0x8000
4689 };
4690 
4691 const Calculation MOON_CALC[] =
4692 {
4693   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x401, 1, 2}, {0x6000, 0x402, PROP_ADJUST_VAL_FIRST, 0}, {0x2001, PROP_ADJUST_VAL_FIRST, 1794, 10000}, {0x8000, 21600, 0, 0x0404}, {0x2001, PROP_ADJUST_VAL_FIRST, 400, 18900}, {0x8081, 0, 10800, 0x406}, {0x8082, 0, 10800, 0x406}, {0x6000, 0x407, 0x407, 0}, {0x8000, 21600, 0, 0x408}
4694 };
4695 
4696 const TextRectangle MOON_TRS[] =
4697 {
4698   { {CALCULATED_VALUE(9), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(10)} }
4699 };
4700 
4701 const int MOON_DEFAULT_ADJUST[] =
4702 {
4703   10800
4704 };
4705 
4706 const Vertex MOON_GLUE_POINTS[] =
4707 {
4708   {21600, 0}, {0, 10800}, {21600, 21600}, {CALCULATED_VALUE(0), 10800}
4709 };
4710 
4711 const CustomShape CS_MOON(
4712   MOON_VERTICES, sizeof(MOON_VERTICES) / sizeof(Vertex),
4713   MOON_SEGMENTS, sizeof(MOON_SEGMENTS) / sizeof(unsigned short),
4714   MOON_CALC, sizeof(MOON_CALC) / sizeof(Calculation),
4715   MOON_DEFAULT_ADJUST, sizeof(MOON_DEFAULT_ADJUST) / sizeof(int),
4716   MOON_TRS, sizeof(MOON_TRS) / sizeof(TextRectangle),
4717   21600, 21600,
4718   MOON_GLUE_POINTS, sizeof(MOON_GLUE_POINTS) / sizeof(Vertex));
4719 
4720 const Vertex BRACKET_PAIR_VERTICES[] =
4721 {
4722   {CALCULATED_VALUE(0), 0}, {0, CALCULATED_VALUE(1)}, {0, CALCULATED_VALUE(2)}, {CALCULATED_VALUE(0), 21600}, {CALCULATED_VALUE(3), 21600}, {21600, CALCULATED_VALUE(2)}, {21600, CALCULATED_VALUE(1)}, {CALCULATED_VALUE(3), 0}
4723 };
4724 
4725 const unsigned short BRACKET_PAIR_SEGMENTS[] =
4726 {
4727   0x4000, 0xa701, 0x0001, 0xa801, 0x8000, 0x4000, 0xa701, 0x0001, 0xa801, 0x8000
4728 };
4729 
4730 const Calculation BRACKET_PAIR_CALC[] =
4731 {
4732   {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0x2082, PROP_ADJUST_VAL_FIRST, 0, 45}, {0x2000, 0x404, 0, 10800}, {0x8000, 0, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, 0x406, 0, 0x405}, {0xa000, PROP_GEO_LEFT, 0, 0x407}, {0xa000, PROP_GEO_TOP, 0, 0x407}, {0x6000, PROP_GEO_RIGHT, 0x407, 0}, {0x6000, PROP_GEO_BOTTOM, 0x407, 0}, {0xa000, PROP_GEO_LEFT, 0, 0x405}, {0xa000, PROP_GEO_TOP, 0, 0x405}, {0x6000, PROP_GEO_RIGHT, 0x405, 0}, {0x6000, PROP_GEO_BOTTOM, 0x405, 0}
4733 };
4734 
4735 const TextRectangle BRACKET_PAIR_TRS[] =
4736 {
4737   { {CALCULATED_VALUE(8), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(10), CALCULATED_VALUE(11)} }
4738 };
4739 
4740 const int BRACKET_PAIR_DEFAULT_ADJUST[] =
4741 {
4742   3700
4743 };
4744 
4745 const Vertex BRACKET_PAIR_GLUE_POINTS[] =
4746 {
4747   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
4748 };
4749 
4750 const CustomShape CS_BRACKET_PAIR(
4751   BRACKET_PAIR_VERTICES, sizeof(BRACKET_PAIR_VERTICES) / sizeof(Vertex),
4752   BRACKET_PAIR_SEGMENTS, sizeof(BRACKET_PAIR_SEGMENTS) / sizeof(unsigned short),
4753   BRACKET_PAIR_CALC, sizeof(BRACKET_PAIR_CALC) / sizeof(Calculation),
4754   BRACKET_PAIR_DEFAULT_ADJUST, sizeof(BRACKET_PAIR_DEFAULT_ADJUST) / sizeof(int),
4755   BRACKET_PAIR_TRS, sizeof(BRACKET_PAIR_TRS) / sizeof(TextRectangle),
4756   21600, 21600,
4757   BRACKET_PAIR_GLUE_POINTS, sizeof(BRACKET_PAIR_GLUE_POINTS) / sizeof(Vertex));
4758 
4759 const Vertex BRACE_PAIR_VERTICES[] =
4760 {
4761   {CALCULATED_VALUE(4), 0}, {CALCULATED_VALUE(0), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(6)}, {0, 10800}, {CALCULATED_VALUE(0), CALCULATED_VALUE(7)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(4), 21600}, {CALCULATED_VALUE(8), 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(7)}, {21600, 10800}, {CALCULATED_VALUE(3), CALCULATED_VALUE(6)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(8), 0}
4762 };
4763 
4764 const unsigned short BRACE_PAIR_SEGMENTS[] =
4765 {
4766   0x4000, 0xa701, 0x0001, 0xa801, 0xa701, 0x0001, 0xa801, 0x8000, 0x4000, 0xa701, 0x0001, 0xa801, 0xa701, 0x0001, 0xa801, 0x8000
4767 };
4768 
4769 const Calculation BRACE_PAIR_CALC[] =
4770 {
4771   {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x400, 2, 1}, {0x2001, PROP_ADJUST_VAL_FIRST, 2, 1}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 21600, 0, 0x406}, {0xa000, PROP_GEO_RIGHT, 0, 0x405}, {0x2001, PROP_ADJUST_VAL_FIRST, 1, 3}, {0x6000, 0x409, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_LEFT, 0x40a, 0}, {0x6000, PROP_GEO_TOP, 0x409, 0}, {0xa000, PROP_GEO_RIGHT, 0, 0x40a}, {0xa000, PROP_GEO_BOTTOM, 0, 0x409}
4772 };
4773 
4774 const TextRectangle BRACE_PAIR_TRS[] =
4775 {
4776   { {CALCULATED_VALUE(11), CALCULATED_VALUE(12)}, {CALCULATED_VALUE(13), CALCULATED_VALUE(14)} }
4777 };
4778 
4779 const int BRACE_PAIR_DEFAULT_ADJUST[] =
4780 {
4781   1800
4782 };
4783 
4784 const Vertex BRACE_PAIR_GLUE_POINTS[] =
4785 {
4786   {10800, 0}, {0, 10800}, {10800, 21600}, {21600, 10800}
4787 };
4788 
4789 const CustomShape CS_BRACE_PAIR(
4790   BRACE_PAIR_VERTICES, sizeof(BRACE_PAIR_VERTICES) / sizeof(Vertex),
4791   BRACE_PAIR_SEGMENTS, sizeof(BRACE_PAIR_SEGMENTS) / sizeof(unsigned short),
4792   BRACE_PAIR_CALC, sizeof(BRACE_PAIR_CALC) / sizeof(Calculation),
4793   BRACE_PAIR_DEFAULT_ADJUST, sizeof(BRACE_PAIR_DEFAULT_ADJUST) / sizeof(int),
4794   BRACE_PAIR_TRS, sizeof(BRACE_PAIR_TRS) / sizeof(TextRectangle),
4795   21600, 21600,
4796   BRACE_PAIR_GLUE_POINTS, sizeof(BRACE_PAIR_GLUE_POINTS) / sizeof(Vertex));
4797 
4798 const Vertex DOUBLE_WAVE_VERTICES[] =
4799 {
4800   {CALCULATED_VALUE(7), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(15), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(0x1e), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(0x1f), CALCULATED_VALUE(9)}, {CALCULATED_VALUE(16), CALCULATED_VALUE(10)}, {CALCULATED_VALUE(12), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(24), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(25), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(0x21), CALCULATED_VALUE(28)}, {CALCULATED_VALUE(0x13), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0x20), CALCULATED_VALUE(26)}, {CALCULATED_VALUE(27), CALCULATED_VALUE(28)}, {CALCULATED_VALUE(29), CALCULATED_VALUE(1)}
4801 };
4802 
4803 const unsigned short DOUBLE_WAVE_SEGMENTS[] =
4804 {
4805   0x4000, 0x2002, 0x0001, 0x2002, 0x6000, 0x8000
4806 };
4807 
4808 const Calculation DOUBLE_WAVE_CALC[] =
4809 {
4810   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x8000, 21600, 0, 0x400}, {0x2000, PROP_ADJUST_VAL_FIRST + 1, 0, 0}, {0x2000, 0x402, 0, 10800}, {0x2001, 0x403, 2, 1}, {0x2003, 0x404, 0, 0}, {0x8000, 4320, 0, 0x405}, {0xa006, 0x403, 0, 0x405}, {0x4001, 7900, 0x400, 2230}, {0xa000, 0x400, 0, 0x408}, {0x6000, 0x400, 0x408, 0}, {0x8000, 21600, 0, 0x404}, {0x6006, 0x403, 0x40b, 21600}, {0xa000, 0x40c, 0, 0x407}, {0x2001, 0x405, 1, 2}, {0xa000, 0x407, 3600, 0x40e}, {0x6000, 0x40c, 0x40e, 3600}, {0x2001, 0x40d, 1, 2}, {0x6000, 0x407, 0x411, 0}, {0x8000, 21600, 0, 0x412}, {0x2001, 0x405, 1, 2}, {0x8000, 21600, 0, 0x414}, {0x2001, 0x400, 2, 1}, {0x8000, 21600, 0, 0x416}, {0x8000, 21600, 0, 0x407}, {0x8000, 21600, 0, 0x40f}, {0x6000, 0x401, 0x408, 0}, {0x8000, 21600, 0, 0x410}, {0xa000, 0x401, 0, 0x408}, {0x8000, 21600, 0, 0x40c}, {0xa000, 0x412, 0, 0x40e}, {0x6000, 0x412, 0x40e, 0}, {0xa000, 0x413, 0, 0x40e}, {0x6000, 0x413, 0x40e, 0}
4811 };
4812 
4813 const TextRectangle DOUBLE_WAVE_TRS[] =
4814 {
4815   { {CALCULATED_VALUE(5), CALCULATED_VALUE(22)}, {CALCULATED_VALUE(11), CALCULATED_VALUE(23)} }
4816 };
4817 
4818 const int DOUBLE_WAVE_DEFAULT_ADJUST[] =
4819 {
4820   1400, 10800
4821 };
4822 
4823 const Vertex DOUBLE_WAVE_GLUE_POINTS[] =
4824 {
4825   {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(0x14), 10800}, {CALCULATED_VALUE(0x13), CALCULATED_VALUE(1)}, {CALCULATED_VALUE(0x15), 10800}
4826 };
4827 
4828 const CustomShape CS_DOUBLE_WAVE(
4829   DOUBLE_WAVE_VERTICES, sizeof(DOUBLE_WAVE_VERTICES) / sizeof(Vertex),
4830   DOUBLE_WAVE_SEGMENTS, sizeof(DOUBLE_WAVE_SEGMENTS) / sizeof(unsigned short),
4831   DOUBLE_WAVE_CALC, sizeof(DOUBLE_WAVE_CALC) / sizeof(Calculation),
4832   DOUBLE_WAVE_DEFAULT_ADJUST, sizeof(DOUBLE_WAVE_DEFAULT_ADJUST) / sizeof(int),
4833   DOUBLE_WAVE_TRS, sizeof(DOUBLE_WAVE_TRS) / sizeof(TextRectangle),
4834   21600, 21600,
4835   DOUBLE_WAVE_GLUE_POINTS, sizeof(DOUBLE_WAVE_GLUE_POINTS) / sizeof(Vertex));
4836 
4837 const Vertex ACTION_BUTTON_BLANK_VERTICES[] =
4838 {
4839   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}, {21600, 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(0)}, {21600, 0}, {21600, 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(0)}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(0), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {0, 21600}, {0, 0}, {CALCULATED_VALUE(0), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(0), CALCULATED_VALUE(2)}
4840 };
4841 
4842 const unsigned short ACTION_BUTTON_BLANK_SEGMENTS[] =
4843 {
4844   0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000
4845 };
4846 
4847 const Calculation ACTION_BUTTON_BLANK_CALC[] =
4848 {
4849   {0x2001, PROP_ADJUST_VAL_FIRST, 21599, 21600}, {0xa000, PROP_GEO_RIGHT, 0, 0x400}, {0xa000, PROP_GEO_BOTTOM, 0, 0x400}
4850 };
4851 
4852 const TextRectangle ACTION_BUTTON_BLANK_TRS[] =
4853 {
4854   { {CALCULATED_VALUE(0), CALCULATED_VALUE(0)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)} }
4855 };
4856 
4857 const int ACTION_BUTTON_BLANK_DEFAULT_ADJUST[] =
4858 {
4859   1400
4860 };
4861 
4862 const CustomShape CS_ACTION_BUTTON_BLANK(
4863   ACTION_BUTTON_BLANK_VERTICES, sizeof(ACTION_BUTTON_BLANK_VERTICES) / sizeof(Vertex),
4864   ACTION_BUTTON_BLANK_SEGMENTS, sizeof(ACTION_BUTTON_BLANK_SEGMENTS) / sizeof(unsigned short),
4865   ACTION_BUTTON_BLANK_CALC, sizeof(ACTION_BUTTON_BLANK_CALC) / sizeof(Calculation),
4866   ACTION_BUTTON_BLANK_DEFAULT_ADJUST, sizeof(ACTION_BUTTON_BLANK_DEFAULT_ADJUST) / sizeof(int),
4867   ACTION_BUTTON_BLANK_TRS, sizeof(ACTION_BUTTON_BLANK_TRS) / sizeof(TextRectangle),
4868   21600, 21600,
4869   nullptr, 0);
4870 
4871 const Vertex ACTION_BUTTON_HOME_VERTICES[] =
4872 {
4873   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}, {21600, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {21600, 0}, {21600, 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {0, 21600}, {0, 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(0xa)}, {CALCULATED_VALUE(0xc), CALCULATED_VALUE(0xe)}, {CALCULATED_VALUE(0xc), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0x14)}, {CALCULATED_VALUE(0x16), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0x18), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0x18), CALCULATED_VALUE(0x1a)}, {CALCULATED_VALUE(0x1c), CALCULATED_VALUE(0x1a)}, {CALCULATED_VALUE(0x1c), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0x1e), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0xc), CALCULATED_VALUE(0xe)}, {CALCULATED_VALUE(0xc), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0x14)}, {CALCULATED_VALUE(0x20), CALCULATED_VALUE(0x24)}, {CALCULATED_VALUE(0x22), CALCULATED_VALUE(0x24)}, {CALCULATED_VALUE(0x22), CALCULATED_VALUE(0x1a)}, {CALCULATED_VALUE(0x18), CALCULATED_VALUE(0x1a)}, {CALCULATED_VALUE(0x18), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0x1c), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0x1c), CALCULATED_VALUE(0x1a)}, {CALCULATED_VALUE(0x20), CALCULATED_VALUE(0x1a)}
4874 };
4875 
4876 const unsigned short ACTION_BUTTON_HOME_SEGMENTS[] =
4877 {
4878   0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x000a, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0007, 0x6001, 0x8000
4879 };
4880 
4881 const Calculation ACTION_BUTTON_HOME_CALC[] =
4882 {
4883   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x0405, 1, 10800}, {0x2001, PROP_GEO_RIGHT, 1, 2}, {0x2001, PROP_GEO_BOTTOM, 1, 2}, {0x4001, -8000, 0x0406, 1}, {0x6000, 0x0409, 0x0408, 0}, {0x4001, 2960, 0x0406, 1}, {0x6000, 0x040b, 0x0407, 0}, {0x4001, -5000, 0x0406, 1}, {0x6000, 0x040d, 0x0408, 0}, {0x4001, -7000, 0x0406, 1}, {0x6000, 0x040f, 0x0408, 0}, {0x4001, 5000, 0x0406, 1}, {0x6000, 0x0411, 0x0407, 0}, {0x4001, -2960, 0x0406, 1}, {0x6000, 0x0413, 0x0408, 0}, {0x4001, 8000, 0x0406, 1}, {0x6000, 0x0415, 0x0407, 0}, {0x4001, 6100, 0x0406, 1}, {0x6000, 0x0417, 0x0407, 0}, {0x4001, 8260, 0x0406, 1}, {0x6000, 0x0419, 0x0408, 0}, {0x4001, -6100, 0x0406, 1}, {0x6000, 0x041b, 0x0407, 0}, {0x4001, -8000, 0x0406, 1}, {0x6000, 0x041d, 0x0407, 0}, {0x4001, -1060, 0x0406, 1}, {0x6000, 0x041f, 0x0407, 0}, {0x4001, 1060, 0x0406, 1}, {0x6000, 0x0421, 0x0407, 0}, {0x4001, 4020, 0x0406, 1}, {0x6000, 0x0423, 0x0408, 0}
4884 };
4885 
4886 const TextRectangle ACTION_BUTTON_HOME_TRS[] =
4887 {
4888   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
4889 };
4890 
4891 const int ACTION_BUTTON_HOME_DEFAULT_ADJUST[] =
4892 {
4893   1400
4894 };
4895 
4896 const CustomShape CS_ACTION_BUTTON_HOME(
4897   ACTION_BUTTON_HOME_VERTICES, sizeof(ACTION_BUTTON_HOME_VERTICES) / sizeof(Vertex),
4898   ACTION_BUTTON_HOME_SEGMENTS, sizeof(ACTION_BUTTON_HOME_SEGMENTS) / sizeof(unsigned short),
4899   ACTION_BUTTON_HOME_CALC, sizeof(ACTION_BUTTON_HOME_CALC) / sizeof(Calculation),
4900   ACTION_BUTTON_HOME_DEFAULT_ADJUST, sizeof(ACTION_BUTTON_HOME_DEFAULT_ADJUST) / sizeof(int),
4901   ACTION_BUTTON_HOME_TRS, sizeof(ACTION_BUTTON_HOME_TRS) / sizeof(TextRectangle),
4902   21600, 21600,
4903   nullptr, 0);
4904 
4905 const Vertex ACTION_BUTTON_HELP_VERTICES[] =
4906 {
4907   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}, {21600, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {21600, 0}, {21600, 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {0, 21600}, {0, 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(0x3e)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0x3e)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0x14)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0x16)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0x18)}, {CALCULATED_VALUE(0x1a), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0x1c), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0x1e), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0x20), CALCULATED_VALUE(0x22)}, {CALCULATED_VALUE(0x20), CALCULATED_VALUE(0x24)}, {CALCULATED_VALUE(0x20), CALCULATED_VALUE(0x26)}, {CALCULATED_VALUE(0x28), CALCULATED_VALUE(0x2a)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(0x2a)}, {CALCULATED_VALUE(0x2c), CALCULATED_VALUE(0x2a)}, {CALCULATED_VALUE(0x2e), CALCULATED_VALUE(0x26)}, {CALCULATED_VALUE(0x2e), CALCULATED_VALUE(0x24)}, {CALCULATED_VALUE(0x30), CALCULATED_VALUE(0x24)}, {CALCULATED_VALUE(0x30), CALCULATED_VALUE(0x32)}, {CALCULATED_VALUE(0x34), CALCULATED_VALUE(0x36)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(0x36)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0x36)}, {CALCULATED_VALUE(0x1c), CALCULATED_VALUE(0x32)}, {CALCULATED_VALUE(0x1c), CALCULATED_VALUE(0x24)}, {CALCULATED_VALUE(0x1c), CALCULATED_VALUE(0x38)}, {CALCULATED_VALUE(0x3a), CALCULATED_VALUE(0x3c)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0x3c)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(0x3c)}, {CALCULATED_VALUE(0x34), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0x34), CALCULATED_VALUE(0x16)}, {CALCULATED_VALUE(0x34), CALCULATED_VALUE(0x14)}
4908 };
4909 
4910 const unsigned short ACTION_BUTTON_HELP_SEGMENTS[] =
4911 {
4912   0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0xa704, 0x6000, 0x8000, 0x4000, 0x0001, 0x2004, 0x0001, 0x2004, 0x0001, 0x6001, 0x8000
4913 };
4914 
4915 const Calculation ACTION_BUTTON_HELP_CALC[] =
4916 {
4917   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x0405, 1, 10800}, {0x2001, PROP_GEO_RIGHT, 1, 2}, {0x2001, PROP_GEO_BOTTOM, 1, 2}, {0x4001, -1690, 0x0406, 1}, {0x6000, 0x0409, 0x0407, 0}, {0x4001, 4600, 0x0406, 1}, {0x6000, 0x040b, 0x0408, 0}, {0x4001, 1690, 0x0406, 1}, {0x6000, 0x040d, 0x0407, 0}, {0x4001, 7980, 0x0406, 1}, {0x6000, 0x040f, 0x0408, 0}, {0x4001, 1270, 0x0406, 1}, {0x6000, 0x0411, 0x0407, 0}, {0x4001, 4000, 0x0406, 1}, {0x6000, 0x0413, 0x0408, 0}, {0x4001, 1750, 0x0406, 1}, {0x6000, 0x0415, 0x0408, 0}, {0x4001, 800, 0x0406, 1}, {0x6000, 0x0417, 0x0408, 0}, {0x4001, 1650, 0x0406, 1}, {0x6000, 0x0419, 0x0407, 0}, {0x4001, 2340, 0x0406, 1}, {0x6000, 0x041b, 0x0407, 0}, {0x4001, 3640, 0x0406, 1}, {0x6000, 0x041d, 0x0407, 0}, {0x4001, 4670, 0x0406, 1}, {0x6000, 0x041f, 0x0407, 0}, {0x4001, -1570, 0x0406, 1}, {0x6000, 0x0421, 0x0408, 0}, {0x4001, -3390, 0x0406, 1}, {0x6000, 0x0423, 0x0408, 0}, {0x4001, -6050, 0x0406, 1}, {0x6000, 0x0425, 0x0408, 0}, {0x4001, 2540, 0x0406, 1}, {0x6000, 0x0427, 0x0407, 0}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x0429, 0x0408, 0}, {0x4001, -2540, 0x0406, 1}, {0x6000, 0x042b, 0x0407, 0}, {0x4001, -4460, 0x0406, 1}, {0x6000, 0x042d, 0x0407, 0}, {0x4001, -2330, 0x0406, 1}, {0x6000, 0x042f, 0x0407, 0}, {0x4001, -4700, 0x0406, 1}, {0x6000, 0x0431, 0x0408, 0}, {0x4001, -1270, 0x0406, 1}, {0x6000, 0x0433, 0x0407, 0}, {0x4001, -5720, 0x0406, 1}, {0x6000, 0x0435, 0x0408, 0}, {0x4001, -2540, 0x0406, 1}, {0x6000, 0x0437, 0x0408, 0}, {0x4001, 1800, 0x0406, 1}, {0x6000, 0x0439, 0x0407, 0}, {0x4001, -1700, 0x0406, 1}, {0x6000, 0x043b, 0x0408, 0}, {0x4001, 6290, 0x0406, 1}, {0x6000, 0x043d, 0x0408, 0}
4918 };
4919 
4920 const TextRectangle ACTION_BUTTON_HELP_TRS[] =
4921 {
4922   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
4923 };
4924 
4925 const int ACTION_BUTTON_HELP_DEFAULT_ADJUST[] =
4926 {
4927   1400
4928 };
4929 
4930 const CustomShape CS_ACTION_BUTTON_HELP(
4931   ACTION_BUTTON_HELP_VERTICES, sizeof(ACTION_BUTTON_HELP_VERTICES) / sizeof(Vertex),
4932   ACTION_BUTTON_HELP_SEGMENTS, sizeof(ACTION_BUTTON_HELP_SEGMENTS) / sizeof(unsigned short),
4933   ACTION_BUTTON_HELP_CALC, sizeof(ACTION_BUTTON_HELP_CALC) / sizeof(Calculation),
4934   ACTION_BUTTON_HELP_DEFAULT_ADJUST, sizeof(ACTION_BUTTON_HELP_DEFAULT_ADJUST) / sizeof(int),
4935   ACTION_BUTTON_HELP_TRS, sizeof(ACTION_BUTTON_HELP_TRS) / sizeof(TextRectangle),
4936   21600, 21600,
4937   nullptr, 0);
4938 
4939 const Vertex ACTION_BUTTON_INFORMATION_VERTICES[] =
4940 {
4941   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}, {21600, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {21600, 0}, {21600, 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {0, 21600}, {0, 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(0x7), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(0x8)}, {CALCULATED_VALUE(0x7), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0x7), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0x7), CALCULATED_VALUE(0x14)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0x2a)}, {CALCULATED_VALUE(0x7), CALCULATED_VALUE(0x18)}, {CALCULATED_VALUE(0x16), CALCULATED_VALUE(0x2a)}, {CALCULATED_VALUE(0x7), CALCULATED_VALUE(0x14)}, {CALCULATED_VALUE(0x1a), CALCULATED_VALUE(0x1c)}, {CALCULATED_VALUE(0x1e), CALCULATED_VALUE(0x1c)}, {CALCULATED_VALUE(0x1e), CALCULATED_VALUE(0x20)}, {CALCULATED_VALUE(0x22), CALCULATED_VALUE(0x20)}, {CALCULATED_VALUE(0x22), CALCULATED_VALUE(0x24)}, {CALCULATED_VALUE(0x1a), CALCULATED_VALUE(0x24)}, {CALCULATED_VALUE(0x1a), CALCULATED_VALUE(0x20)}, {CALCULATED_VALUE(0x26), CALCULATED_VALUE(0x20)}, {CALCULATED_VALUE(0x26), CALCULATED_VALUE(0x28)}, {CALCULATED_VALUE(0x1a), CALCULATED_VALUE(0x28)}
4942 };
4943 
4944 const unsigned short ACTION_BUTTON_INFORMATION_SEGMENTS[] =
4945 {
4946   0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0xa704, 0x6000, 0x8000, 0x4000, 0xa704, 0x6000, 0x8000, 0x4000, 0x0009, 0x6001, 0x8000
4947 };
4948 
4949 const Calculation ACTION_BUTTON_INFORMATION_CALC[] =
4950 {
4951   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x0405, 1, 10800}, {0x2001, PROP_GEO_RIGHT, 1, 2}, {0x2001, PROP_GEO_BOTTOM, 1, 2}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x0409, 0x0407, 0}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x040b, 0x0408, 0}, {0x4001, 8050, 0x0406, 1}, {0x6000, 0x040d, 0x0407, 0}, {0x4001, 8050, 0x0406, 1}, {0x6000, 0x040f, 0x0408, 0}, {0x4001, -2060, 0x0406, 1}, {0x6000, 0x0411, 0x0407, 0}, {0x4001, -7620, 0x0406, 1}, {0x6000, 0x0413, 0x0408, 0}, {0x4001, 2060, 0x0406, 1}, {0x6000, 0x0415, 0x0407, 0}, {0x4001, -3500, 0x0406, 1}, {0x6000, 0x0417, 0x0408, 0}, {0x4001, -2960, 0x0406, 1}, {0x6000, 0x0419, 0x0407, 0}, {0x4001, -2960, 0x0406, 1}, {0x6000, 0x041b, 0x0408, 0}, {0x4001, 1480, 0x0406, 1}, {0x6000, 0x041d, 0x0407, 0}, {0x4001, 5080, 0x0406, 1}, {0x6000, 0x041f, 0x0408, 0}, {0x4001, 2960, 0x0406, 1}, {0x6000, 0x0421, 0x0407, 0}, {0x4001, 6140, 0x0406, 1}, {0x6000, 0x0423, 0x0408, 0}, {0x4001, -1480, 0x0406, 1}, {0x6000, 0x0425, 0x0407, 0}, {0x4001, -1920, 0x0406, 1}, {0x6000, 0x0427, 0x0408, 0}, {0x4001, -5560, 0x0406, 1}, {0x6000, 0x0429, 0x0408, 0}
4952 };
4953 
4954 const TextRectangle ACTION_BUTTON_INFORMATION_TRS[] =
4955 {
4956   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
4957 };
4958 
4959 const int ACTION_BUTTON_INFORMATION_DEFAULT_ADJUST[] =
4960 {
4961   1400
4962 };
4963 
4964 const CustomShape CS_ACTION_BUTTON_INFORMATION(
4965   ACTION_BUTTON_INFORMATION_VERTICES, sizeof(ACTION_BUTTON_INFORMATION_VERTICES) / sizeof(Vertex),
4966   ACTION_BUTTON_INFORMATION_SEGMENTS, sizeof(ACTION_BUTTON_INFORMATION_SEGMENTS) / sizeof(unsigned short),
4967   ACTION_BUTTON_INFORMATION_CALC, sizeof(ACTION_BUTTON_INFORMATION_CALC) / sizeof(Calculation),
4968   ACTION_BUTTON_INFORMATION_DEFAULT_ADJUST, sizeof(ACTION_BUTTON_INFORMATION_DEFAULT_ADJUST) / sizeof(int),
4969   ACTION_BUTTON_INFORMATION_TRS, sizeof(ACTION_BUTTON_INFORMATION_TRS) / sizeof(TextRectangle),
4970   21600, 21600,
4971   nullptr, 0);
4972 
4973 const Vertex ACTION_BUTTON_FORWARD_NEXT_VERTICES[] =
4974 {
4975   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}, {21600, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {21600, 0}, {21600, 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {0, 21600}, {0, 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(0x10)}
4976 };
4977 
4978 const unsigned short ACTION_BUTTON_FORWARD_NEXT_SEGMENTS[] =
4979 {
4980   0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0002, 0x6001, 0x8000
4981 };
4982 
4983 const Calculation ACTION_BUTTON_FORWARD_NEXT_CALC[] =
4984 {
4985   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x0405, 1, 10800}, {0x2001, PROP_GEO_RIGHT, 1, 2}, {0x2001, PROP_GEO_BOTTOM, 1, 2}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x0409, 0x0407, 0}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x040b, 0x0408, 0}, {0x4001, 8050, 0x0406, 1}, {0x6000, 0x040d, 0x0407, 0}, {0x4001, 8050, 0x0406, 1}, {0x6000, 0x040f, 0x0408, 0}
4986 };
4987 
4988 const TextRectangle ACTION_BUTTON_FORWARD_NEXT_TRS[] =
4989 {
4990   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
4991 };
4992 
4993 const int ACTION_BUTTON_FORWARD_NEXT_DEFAULT_ADJUST[] =
4994 {
4995   1400
4996 };
4997 
4998 const CustomShape CS_ACTION_BUTTON_FORWARD_NEXT(
4999   ACTION_BUTTON_FORWARD_NEXT_VERTICES, sizeof(ACTION_BUTTON_FORWARD_NEXT_VERTICES) / sizeof(Vertex),
5000   ACTION_BUTTON_FORWARD_NEXT_SEGMENTS, sizeof(ACTION_BUTTON_FORWARD_NEXT_SEGMENTS) / sizeof(unsigned short),
5001   ACTION_BUTTON_FORWARD_NEXT_CALC, sizeof(ACTION_BUTTON_FORWARD_NEXT_CALC) / sizeof(Calculation),
5002   ACTION_BUTTON_FORWARD_NEXT_DEFAULT_ADJUST, sizeof(ACTION_BUTTON_FORWARD_NEXT_DEFAULT_ADJUST) / sizeof(int),
5003   ACTION_BUTTON_FORWARD_NEXT_TRS, sizeof(ACTION_BUTTON_FORWARD_NEXT_TRS) / sizeof(TextRectangle),
5004   21600, 21600,
5005   nullptr, 0);
5006 
5007 const Vertex ACTION_BUTTON_BACK_PREVIOUS_VERTICES[] =
5008 {
5009   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}, {21600, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {21600, 0}, {21600, 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {0, 21600}, {0, 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0x10)}
5010 };
5011 
5012 const unsigned short ACTION_BUTTON_BACK_PREVIOUS_SEGMENTS[] =
5013 {
5014   0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0002, 0x6001, 0x8000
5015 };
5016 
5017 const Calculation ACTION_BUTTON_BACK_PREVIOUS_CALC[] =
5018 {
5019   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x0405, 1, 10800}, {0x2001, PROP_GEO_RIGHT, 1, 2}, {0x2001, PROP_GEO_BOTTOM, 1, 2}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x0409, 0x0407, 0}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x040b, 0x0408, 0}, {0x4001, 8050, 0x0406, 1}, {0x6000, 0x040d, 0x0407, 0}, {0x4001, 8050, 0x0406, 1}, {0x6000, 0x040f, 0x0408, 0}
5020 };
5021 
5022 const TextRectangle ACTION_BUTTON_BACK_PREVIOUS_TRS[] =
5023 {
5024   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
5025 };
5026 
5027 const int ACTION_BUTTON_BACK_PREVIOUS_DEFAULT_ADJUST[] =
5028 {
5029   1400
5030 };
5031 
5032 const CustomShape CS_ACTION_BUTTON_BACK_PREVIOUS(
5033   ACTION_BUTTON_BACK_PREVIOUS_VERTICES, sizeof(ACTION_BUTTON_BACK_PREVIOUS_VERTICES) / sizeof(Vertex),
5034   ACTION_BUTTON_BACK_PREVIOUS_SEGMENTS, sizeof(ACTION_BUTTON_BACK_PREVIOUS_SEGMENTS) / sizeof(unsigned short),
5035   ACTION_BUTTON_BACK_PREVIOUS_CALC, sizeof(ACTION_BUTTON_BACK_PREVIOUS_CALC) / sizeof(Calculation),
5036   ACTION_BUTTON_BACK_PREVIOUS_DEFAULT_ADJUST, sizeof(ACTION_BUTTON_BACK_PREVIOUS_DEFAULT_ADJUST) / sizeof(int),
5037   ACTION_BUTTON_BACK_PREVIOUS_TRS, sizeof(ACTION_BUTTON_BACK_PREVIOUS_TRS) / sizeof(TextRectangle),
5038   21600, 21600,
5039   nullptr, 0);
5040 
5041 const Vertex ACTION_BUTTON_END_VERTICES[] =
5042 {
5043   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}, {21600, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {21600, 0}, {21600, 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {0, 21600}, {0, 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(0x16), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0x18), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0x18), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0xc)}
5044 };
5045 
5046 const unsigned short ACTION_BUTTON_END_SEGMENTS[] =
5047 {
5048   0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0002, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000
5049 };
5050 
5051 const Calculation ACTION_BUTTON_END_CALC[] =
5052 {
5053   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x0405, 1, 10800}, {0x2001, PROP_GEO_RIGHT, 1, 2}, {0x2001, PROP_GEO_BOTTOM, 1, 2}, {0x4001, -4020, 0x0406, 1}, {0x6000, 0x0409, 0x0407, 0}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x040b, 0x0408, 0}, {0x4001, 8050, 0x0406, 1}, {0x6000, 0x040d, 0x0407, 0}, {0x4001, 8050, 0x0406, 1}, {0x6000, 0x040f, 0x0408, 0}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x0411, 0x0407, 0}, {0x4001, -6140, 0x0406, 1}, {0x6000, 0x0413, 0x0407, 0}, {0x4001, 4020, 0x0406, 1}, {0x6000, 0x0415, 0x0407, 0}, {0x4001, 6140, 0x0406, 1}, {0x6000, 0x0417, 0x0407, 0}
5054 };
5055 
5056 const TextRectangle ACTION_BUTTON_END_TRS[] =
5057 {
5058   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
5059 };
5060 
5061 const int ACTION_BUTTON_END_DEFAULT_ADJUST[] =
5062 {
5063   1400
5064 };
5065 
5066 const CustomShape CS_ACTION_BUTTON_END(
5067   ACTION_BUTTON_END_VERTICES, sizeof(ACTION_BUTTON_END_VERTICES) / sizeof(Vertex),
5068   ACTION_BUTTON_END_SEGMENTS, sizeof(ACTION_BUTTON_END_SEGMENTS) / sizeof(unsigned short),
5069   ACTION_BUTTON_END_CALC, sizeof(ACTION_BUTTON_END_CALC) / sizeof(Calculation),
5070   ACTION_BUTTON_END_DEFAULT_ADJUST, sizeof(ACTION_BUTTON_END_DEFAULT_ADJUST) / sizeof(int),
5071   ACTION_BUTTON_END_TRS, sizeof(ACTION_BUTTON_END_TRS) / sizeof(TextRectangle),
5072   21600, 21600,
5073   nullptr, 0);
5074 
5075 const Vertex ACTION_BUTTON_BEGINNING_VERTICES[] =
5076 {
5077   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}, {21600, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {21600, 0}, {21600, 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {0, 21600}, {0, 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0x14), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0x14), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0x12), CALCULATED_VALUE(0x10)}
5078 };
5079 
5080 const unsigned short ACTION_BUTTON_BEGINNING_SEGMENTS[] =
5081 {
5082   0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0002, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000
5083 };
5084 
5085 const Calculation ACTION_BUTTON_BEGINNING_CALC[] =
5086 {
5087   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x0405, 1, 10800}, {0x2001, PROP_GEO_RIGHT, 1, 2}, {0x2001, PROP_GEO_BOTTOM, 1, 2}, {0x4001, -4020, 0x0406, 1}, {0x6000, 0x0409, 0x0407, 0}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x040b, 0x0408, 0}, {0x4001, 8050, 0x0406, 1}, {0x6000, 0x040d, 0x0407, 0}, {0x4001, 8050, 0x0406, 1}, {0x6000, 0x040f, 0x0408, 0}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x0411, 0x0407, 0}, {0x4001, -6140, 0x0406, 1}, {0x6000, 0x0413, 0x0407, 0}, {0x4001, 4020, 0x0406, 1}, {0x6000, 0x0415, 0x0407, 0}, {0x4001, 6140, 0x0406, 1}, {0x6000, 0x0417, 0x0407, 0}
5088 };
5089 
5090 const TextRectangle ACTION_BUTTON_BEGINNING_TRS[] =
5091 {
5092   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
5093 };
5094 
5095 const int ACTION_BUTTON_BEGINNING_DEFAULT_ADJUST[] =
5096 {
5097   1400
5098 };
5099 
5100 const CustomShape CS_ACTION_BUTTON_BEGINNING(
5101   ACTION_BUTTON_BEGINNING_VERTICES, sizeof(ACTION_BUTTON_BEGINNING_VERTICES) / sizeof(Vertex),
5102   ACTION_BUTTON_BEGINNING_SEGMENTS, sizeof(ACTION_BUTTON_BEGINNING_SEGMENTS) / sizeof(unsigned short),
5103   ACTION_BUTTON_BEGINNING_CALC, sizeof(ACTION_BUTTON_BEGINNING_CALC) / sizeof(Calculation),
5104   ACTION_BUTTON_BEGINNING_DEFAULT_ADJUST, sizeof(ACTION_BUTTON_BEGINNING_DEFAULT_ADJUST) / sizeof(int),
5105   ACTION_BUTTON_BEGINNING_TRS, sizeof(ACTION_BUTTON_BEGINNING_TRS) / sizeof(TextRectangle),
5106   21600, 21600,
5107   nullptr, 0);
5108 
5109 const Vertex ACTION_BUTTON_RETURN_VERTICES[] =
5110 {
5111   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}, {21600, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {21600, 0}, {21600, 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {0, 21600}, {0, 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0x12)}, {CALCULATED_VALUE(0x14), CALCULATED_VALUE(0x16)}, {CALCULATED_VALUE(0x18), CALCULATED_VALUE(0x16)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(0x16)}, {CALCULATED_VALUE(0x1a), CALCULATED_VALUE(0x16)}, {CALCULATED_VALUE(0x1c), CALCULATED_VALUE(0x12)}, {CALCULATED_VALUE(0x1c), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0x1c), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0x1e), CALCULATED_VALUE(0x20)}, {CALCULATED_VALUE(0x22), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0x24), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0x24), CALCULATED_VALUE(0x10)}, {CALCULATED_VALUE(0x24), CALCULATED_VALUE(0x26)}, {CALCULATED_VALUE(0x28), CALCULATED_VALUE(0x2a)}, {CALCULATED_VALUE(7), CALCULATED_VALUE(0x2a)}, {CALCULATED_VALUE(0x18), CALCULATED_VALUE(0x2a)}, {CALCULATED_VALUE(0x2c), CALCULATED_VALUE(0x2a)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(0x26)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(0x10)}
5112 };
5113 
5114 const unsigned short ACTION_BUTTON_RETURN_SEGMENTS[] =
5115 {
5116   0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0002, 0x2001, 0x0001, 0x2001, 0x0006, 0x2001, 0x0001, 0x2001, 0x6001, 0x8000
5117 };
5118 
5119 const Calculation ACTION_BUTTON_RETURN_CALC[] =
5120 {
5121   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x0405, 1, 10800}, {0x2001, PROP_GEO_RIGHT, 1, 2}, {0x2001, PROP_GEO_BOTTOM, 1, 2}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x0409, 0x0407, 0}, {0x4001, -3800, 0x0406, 1}, {0x6000, 0x040b, 0x0408, 0}, {0x4001, -4020, 0x0406, 1}, {0x6000, 0x040d, 0x0407, 0}, {0x4001, 2330, 0x0406, 1}, {0x6000, 0x040f, 0x0408, 0}, {0x4001, 3390, 0x0406, 1}, {0x6000, 0x0411, 0x0408, 0}, {0x4001, -3100, 0x0406, 1}, {0x6000, 0x0413, 0x0407, 0}, {0x4001, 4230, 0x0406, 1}, {0x6000, 0x0415, 0x0408, 0}, {0x4001, -1910, 0x0406, 1}, {0x6000, 0x0417, 0x0407, 0}, {0x4001, 1190, 0x0406, 1}, {0x6000, 0x0419, 0x0407, 0}, {0x4001, 2110, 0x0406, 1}, {0x6000, 0x041b, 0x0407, 0}, {0x4001, 4030, 0x0406, 1}, {0x6000, 0x041d, 0x0407, 0}, {0x4001, -7830, 0x0406, 1}, {0x6000, 0x041f, 0x0408, 0}, {0x4001, 8250, 0x0406, 1}, {0x6000, 0x0421, 0x0407, 0}, {0x4001, 6140, 0x0406, 1}, {0x6000, 0x0423, 0x0407, 0}, {0x4001, 5510, 0x0406, 1}, {0x6000, 0x0425, 0x0408, 0}, {0x4001, 3180, 0x0406, 1}, {0x6000, 0x0427, 0x0407, 0}, {0x4001, 8450, 0x0406, 1}, {0x6000, 0x0429, 0x0408, 0}, {0x4001, -5090, 0x0406, 1}, {0x6000, 0x042b, 0x0407, 0}
5122 };
5123 
5124 const TextRectangle ACTION_BUTTON_RETURN_TRS[] =
5125 {
5126   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
5127 };
5128 
5129 const int ACTION_BUTTON_RETURN_DEFAULT_ADJUST[] =
5130 {
5131   1400
5132 };
5133 
5134 const CustomShape CS_ACTION_BUTTON_RETURN(
5135   ACTION_BUTTON_RETURN_VERTICES, sizeof(ACTION_BUTTON_RETURN_VERTICES) / sizeof(Vertex),
5136   ACTION_BUTTON_RETURN_SEGMENTS, sizeof(ACTION_BUTTON_RETURN_SEGMENTS) / sizeof(unsigned short),
5137   ACTION_BUTTON_RETURN_CALC, sizeof(ACTION_BUTTON_RETURN_CALC) / sizeof(Calculation),
5138   ACTION_BUTTON_RETURN_DEFAULT_ADJUST, sizeof(ACTION_BUTTON_RETURN_DEFAULT_ADJUST) / sizeof(int),
5139   ACTION_BUTTON_RETURN_TRS, sizeof(ACTION_BUTTON_RETURN_TRS) / sizeof(TextRectangle),
5140   21600, 21600,
5141   nullptr, 0);
5142 
5143 const Vertex ACTION_BUTTON_DOCUMENT_VERTICES[] =
5144 {
5145   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}, {21600, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {21600, 0}, {21600, 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {0, 21600}, {0, 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0x10), CALCULATED_VALUE(0x12)}, {CALCULATED_VALUE(0x10), CALCULATED_VALUE(0x14)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(0x14)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0x10), CALCULATED_VALUE(0x12)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0x12)}
5146 };
5147 
5148 const unsigned short ACTION_BUTTON_DOCUMENT_SEGMENTS[] =
5149 {
5150   0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0004, 0x6001, 0x8000, 0x4000, 0x0002, 0x6001, 0x8000
5151 };
5152 
5153 const Calculation ACTION_BUTTON_DOCUMENT_CALC[] =
5154 {
5155   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x0405, 1, 10800}, {0x2001, PROP_GEO_RIGHT, 1, 2}, {0x2001, PROP_GEO_BOTTOM, 1, 2}, {0x4001, -6350, 0x0406, 1}, {0x6000, 0x0409, 0x0407, 0}, {0x4001, -7830, 0x0406, 1}, {0x6000, 0x040b, 0x0408, 0}, {0x4001, 1690, 0x0406, 1}, {0x6000, 0x040d, 0x0407, 0}, {0x4001, 6350, 0x0406, 1}, {0x6000, 0x040f, 0x0407, 0}, {0x4001, -3810, 0x0406, 1}, {0x6000, 0x0411, 0x0408, 0}, {0x4001, 7830, 0x0406, 1}, {0x6000, 0x0413, 0x0408, 0}
5156 };
5157 
5158 const TextRectangle ACTION_BUTTON_DOCUMENT_TRS[] =
5159 {
5160   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
5161 };
5162 
5163 const int ACTION_BUTTON_DOCUMENT_DEFAULT_ADJUST[] =
5164 {
5165   1400
5166 };
5167 
5168 const CustomShape CS_ACTION_BUTTON_DOCUMENT(
5169   ACTION_BUTTON_DOCUMENT_VERTICES, sizeof(ACTION_BUTTON_DOCUMENT_VERTICES) / sizeof(Vertex),
5170   ACTION_BUTTON_DOCUMENT_SEGMENTS, sizeof(ACTION_BUTTON_DOCUMENT_SEGMENTS) / sizeof(unsigned short),
5171   ACTION_BUTTON_DOCUMENT_CALC, sizeof(ACTION_BUTTON_DOCUMENT_CALC) / sizeof(Calculation),
5172   ACTION_BUTTON_DOCUMENT_DEFAULT_ADJUST, sizeof(ACTION_BUTTON_DOCUMENT_DEFAULT_ADJUST) / sizeof(int),
5173   ACTION_BUTTON_DOCUMENT_TRS, sizeof(ACTION_BUTTON_DOCUMENT_TRS) / sizeof(TextRectangle),
5174   21600, 21600,
5175   nullptr, 0);
5176 
5177 const Vertex ACTION_BUTTON_SOUND_VERTICES[] =
5178 {
5179   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}, {21600, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {21600, 0}, {21600, 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {0, 21600}, {0, 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0x10), CALCULATED_VALUE(0x12)}, {CALCULATED_VALUE(0x10), CALCULATED_VALUE(0x14)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0x16)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(0x16)}, {CALCULATED_VALUE(0x18), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0x1a), CALCULATED_VALUE(8)}, {CALCULATED_VALUE(0x18), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0x1a), CALCULATED_VALUE(0x1c)}, {CALCULATED_VALUE(0x18), CALCULATED_VALUE(0x16)}, {CALCULATED_VALUE(0x1a), CALCULATED_VALUE(0x1e)}
5180 };
5181 
5182 const unsigned short ACTION_BUTTON_SOUND_SEGMENTS[] =
5183 {
5184   0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0005, 0x6001, 0x8000, 0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000, 0x4000, 0x0001, 0x8000
5185 };
5186 
5187 const Calculation ACTION_BUTTON_SOUND_CALC[] =
5188 {
5189   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x0405, 1, 10800}, {0x2001, PROP_GEO_RIGHT, 1, 2}, {0x2001, PROP_GEO_BOTTOM, 1, 2}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x0409, 0x0407, 0}, {0x4001, -2750, 0x0406, 1}, {0x6000, 0x040b, 0x0408, 0}, {0x4001, -2960, 0x0406, 1}, {0x6000, 0x040d, 0x0407, 0}, {0x4001, 2120, 0x0406, 1}, {0x6000, 0x040f, 0x0407, 0}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x0411, 0x0408, 0}, {0x4001, 8050, 0x0406, 1}, {0x6000, 0x0413, 0x0408, 0}, {0x4001, 2750, 0x0406, 1}, {0x6000, 0x0415, 0x0408, 0}, {0x4001, 4020, 0x0406, 1}, {0x6000, 0x0417, 0x0407, 0}, {0x4001, 8050, 0x0406, 1}, {0x6000, 0x0419, 0x0407, 0}, {0x4001, -5930, 0x0406, 1}, {0x6000, 0x041b, 0x0408, 0}, {0x4001, 5930, 0x0406, 1}, {0x6000, 0x041d, 0x0408, 0}
5190 };
5191 
5192 const TextRectangle ACTION_BUTTON_SOUND_TRS[] =
5193 {
5194   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
5195 };
5196 
5197 const int ACTION_BUTTON_SOUND_DEFAULT_ADJUST[] =
5198 {
5199   1400
5200 };
5201 
5202 const CustomShape CS_ACTION_BUTTON_SOUND(
5203   ACTION_BUTTON_SOUND_VERTICES, sizeof(ACTION_BUTTON_SOUND_VERTICES) / sizeof(Vertex),
5204   ACTION_BUTTON_SOUND_SEGMENTS, sizeof(ACTION_BUTTON_SOUND_SEGMENTS) / sizeof(unsigned short),
5205   ACTION_BUTTON_SOUND_CALC, sizeof(ACTION_BUTTON_SOUND_CALC) / sizeof(Calculation),
5206   ACTION_BUTTON_SOUND_DEFAULT_ADJUST, sizeof(ACTION_BUTTON_SOUND_DEFAULT_ADJUST) / sizeof(int),
5207   ACTION_BUTTON_SOUND_TRS, sizeof(ACTION_BUTTON_SOUND_TRS) / sizeof(TextRectangle),
5208   21600, 21600,
5209   nullptr, 0);
5210 
5211 const Vertex ACTION_BUTTON_MOVIE_VERTICES[] =
5212 {
5213   {0, 0}, {21600, 0}, {21600, 21600}, {0, 21600}, {0, 0}, {21600, 0}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {21600, 0}, {21600, 21600}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(2)}, {21600, 21600}, {0, 21600}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)}, {0, 21600}, {0, 0}, {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(1), CALCULATED_VALUE(4)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0xc)}, {CALCULATED_VALUE(0x10), CALCULATED_VALUE(0x12)}, {CALCULATED_VALUE(0x14), CALCULATED_VALUE(0x12)}, {CALCULATED_VALUE(0x16), CALCULATED_VALUE(0x18)}, {CALCULATED_VALUE(0x16), CALCULATED_VALUE(0x1a)}, {CALCULATED_VALUE(0x1c), CALCULATED_VALUE(0x1a)}, {CALCULATED_VALUE(0x1e), CALCULATED_VALUE(0x18)}, {CALCULATED_VALUE(0x20), CALCULATED_VALUE(0x18)}, {CALCULATED_VALUE(0x20), CALCULATED_VALUE(0x22)}, {CALCULATED_VALUE(0x1e), CALCULATED_VALUE(0x22)}, {CALCULATED_VALUE(0x1c), CALCULATED_VALUE(0x24)}, {CALCULATED_VALUE(0x16), CALCULATED_VALUE(0x24)}, {CALCULATED_VALUE(0x16), CALCULATED_VALUE(0x26)}, {CALCULATED_VALUE(0x2a), CALCULATED_VALUE(0x26)}, {CALCULATED_VALUE(0x2a), CALCULATED_VALUE(0x28)}, {CALCULATED_VALUE(0x10), CALCULATED_VALUE(0x28)}, {CALCULATED_VALUE(0xe), CALCULATED_VALUE(0x2c)}, {CALCULATED_VALUE(0xa), CALCULATED_VALUE(0x2c)}
5214 };
5215 
5216 const unsigned short ACTION_BUTTON_MOVIE_SEGMENTS[] =
5217 {
5218   0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0003, 0x6001, 0x8000, 0x4000, 0x0012, 0x6001, 0x8000
5219 };
5220 
5221 const Calculation ACTION_BUTTON_MOVIE_CALC[] =
5222 {
5223   {0x2000, PROP_ADJUST_VAL_FIRST, 0, 0}, {0x6000, PROP_GEO_LEFT, PROP_ADJUST_VAL_FIRST, 0}, {0x6000, PROP_GEO_TOP, PROP_ADJUST_VAL_FIRST, 0}, {0xa000, PROP_GEO_RIGHT, 0, PROP_ADJUST_VAL_FIRST}, {0xa000, PROP_GEO_BOTTOM, 0, PROP_ADJUST_VAL_FIRST}, {0x8000, 10800, 0, PROP_ADJUST_VAL_FIRST}, {0x2001, 0x0405, 1, 10800}, {0x2001, PROP_GEO_RIGHT, 1, 2}, {0x2001, PROP_GEO_BOTTOM, 1, 2}, {0x4001, -8050, 0x0406, 1}, {0x6000, 0x0409, 0x0407, 0}, {0x4001, -4020, 0x0406, 1}, {0x6000, 0x040b, 0x0408, 0}, {0x4001, -7000, 0x0406, 1}, {0x6000, 0x040d, 0x0407, 0}, {0x4001, -6560, 0x0406, 1}, {0x6000, 0x040f, 0x0407, 0}, {0x4001, -3600, 0x0406, 1}, {0x6000, 0x0411, 0x0408, 0}, {0x4001, 4020, 0x0406, 1}, {0x6000, 0x0413, 0x0407, 0}, {0x4001, 4660, 0x0406, 1}, {0x6000, 0x0415, 0x0407, 0}, {0x4001, -2960, 0x0406, 1}, {0x6000, 0x0417, 0x0408, 0}, {0x4001, -2330, 0x0406, 1}, {0x6000, 0x0419, 0x0408, 0}, {0x4001, 6780, 0x0406, 1}, {0x6000, 0x041b, 0x0407, 0}, {0x4001, 7200, 0x0406, 1}, {0x6000, 0x041d, 0x0407, 0}, {0x4001, 8050, 0x0406, 1}, {0x6000, 0x041f, 0x0407, 0}, {0x4001, 2960, 0x0406, 1}, {0x6000, 0x0421, 0x0408, 0}, {0x4001, 2330, 0x0406, 1}, {0x6000, 0x0423, 0x0408, 0}, {0x4001, 3800, 0x0406, 1}, {0x6000, 0x0425, 0x0408, 0}, {0x4001, -1060, 0x0406, 1}, {0x6000, 0x0427, 0x0408, 0}, {0x4001, -6350, 0x0406, 1}, {0x6000, 0x0429, 0x0407, 0}, {0x4001, -640, 0x0406, 1}, {0x6000, 0x042b, 0x0408, 0}
5224 };
5225 
5226 const TextRectangle ACTION_BUTTON_MOVIE_TRS[] =
5227 {
5228   { {CALCULATED_VALUE(1), CALCULATED_VALUE(2)}, {CALCULATED_VALUE(3), CALCULATED_VALUE(4)} }
5229 };
5230 
5231 const int ACTION_BUTTON_MOVIE_DEFAULT_ADJUST[] =
5232 {
5233   1400
5234 };
5235 
5236 const CustomShape CS_ACTION_BUTTON_MOVIE(
5237   ACTION_BUTTON_MOVIE_VERTICES, sizeof(ACTION_BUTTON_MOVIE_VERTICES) / sizeof(Vertex),
5238   ACTION_BUTTON_MOVIE_SEGMENTS, sizeof(ACTION_BUTTON_MOVIE_SEGMENTS) / sizeof(unsigned short),
5239   ACTION_BUTTON_MOVIE_CALC, sizeof(ACTION_BUTTON_MOVIE_CALC) / sizeof(Calculation),
5240   ACTION_BUTTON_MOVIE_DEFAULT_ADJUST, sizeof(ACTION_BUTTON_MOVIE_DEFAULT_ADJUST) / sizeof(int),
5241   ACTION_BUTTON_MOVIE_TRS, sizeof(ACTION_BUTTON_MOVIE_TRS) / sizeof(TextRectangle),
5242   21600, 21600,
5243   nullptr, 0);
5244 
getCustomShape(ShapeType type)5245 const CustomShape *getCustomShape(ShapeType type)
5246 {
5247   switch (type)
5248   {
5249   case RECTANGLE:
5250     return &CS_RECTANGLE;
5251   case ELLIPSE:
5252     return &CS_ELLIPSE;
5253   case ISOCELES_TRIANGLE:
5254     return &CS_ISOCELES_TRIANGLE;
5255   case SEAL_4:
5256     return &CS_SEAL_4;
5257   case PARALLELOGRAM:
5258     return &CS_PARALLELOGRAM;
5259   case RIGHT_TRIANGLE:
5260     return &CS_RIGHT_TRIANGLE;
5261   case DIAMOND:
5262     return &CS_DIAMOND;
5263   case TRAPEZOID:
5264     return &CS_TRAPEZOID;
5265   case HEXAGON:
5266     return &CS_HEXAGON;
5267   case STAR:
5268     return &CS_STAR;
5269   case PLUS:
5270     return &CS_PLUS;
5271   case ROUND_RECTANGLE:
5272     return &CS_ROUND_RECTANGLE;
5273   case OCTAGON:
5274     return &CS_OCTAGON;
5275   case ARROW:
5276     return &CS_ARROW;
5277   case HOME_PLATE:
5278     return &CS_HOME_PLATE;
5279   case CUBE:
5280     return &CS_CUBE;
5281   case BALLOON:
5282     return &CS_BALLOON;
5283   case ARC_SHAPE:
5284     return &CS_ARC;
5285   case PLAQUE:
5286     return &CS_PLAQUE;
5287   case CAN:
5288     return &CS_CAN;
5289   case DONUT:
5290     return &CS_DONUT;
5291   case TEXT_BOX:
5292   case TEXT_SIMPLE:
5293     return &CS_TEXT_SIMPLE;
5294   case STRAIGHT_CONNECTOR_1:
5295     return &CS_STRAIGHT_CONNECTOR_1;
5296   case BENT_CONNECTOR_2:
5297     return &CS_BENT_CONNECTOR_2;
5298   case BENT_CONNECTOR_3:
5299     return &CS_BENT_CONNECTOR_3;
5300   case BENT_CONNECTOR_4:
5301     return &CS_BENT_CONNECTOR_4;
5302   case BENT_CONNECTOR_5:
5303     return &CS_BENT_CONNECTOR_5;
5304   case CURVED_CONNECTOR_2:
5305     return &CS_CURVED_CONNECTOR_2;
5306   case CURVED_CONNECTOR_3:
5307     return &CS_CURVED_CONNECTOR_3;
5308   case CURVED_CONNECTOR_4:
5309     return &CS_CURVED_CONNECTOR_4;
5310   case CURVED_CONNECTOR_5:
5311     return &CS_CURVED_CONNECTOR_5;
5312   case CALLOUT_1:
5313     return &CS_CALLOUT_1;
5314   case CALLOUT_2:
5315     return &CS_CALLOUT_2;
5316   case CALLOUT_3:
5317     return &CS_CALLOUT_3;
5318   case RIBBON:
5319     return &CS_RIBBON;
5320   case RIBBON_2:
5321     return &CS_RIBBON_2;
5322   case CHEVRON:
5323     return &CS_CHEVRON;
5324   case PENTAGON:
5325     return &CS_PENTAGON;
5326   case NO_SMOKING:
5327     return &CS_NO_SMOKING;
5328   case SEAL_8:
5329     return &CS_SEAL_8;
5330   case SEAL_16:
5331     return &CS_SEAL_16;
5332   case SEAL_32:
5333     return &CS_SEAL_32;
5334   case WAVE:
5335     return &CS_WAVE;
5336   case LINE:
5337     return &CS_LINE;
5338   case FOLDED_CORNER:
5339     return &CS_FOLDED_CORNER;
5340   case LEFT_ARROW:
5341     return &CS_LEFT_ARROW;
5342   case DOWN_ARROW:
5343     return &CS_DOWN_ARROW;
5344   case UP_ARROW:
5345     return &CS_UP_ARROW;
5346   case LEFT_RIGHT_ARROW:
5347     return &CS_LEFT_RIGHT_ARROW;
5348   case UP_DOWN_ARROW:
5349     return &CS_UP_DOWN_ARROW;
5350   case IRREGULAR_SEAL_1:
5351     return &CS_IRREGULAR_SEAL_1;
5352   case IRREGULAR_SEAL_2:
5353     return &CS_IRREGULAR_SEAL_2;
5354   case LIGHTNING_BOLT:
5355     return &CS_LIGHTNING_BOLT;
5356   case HEART:
5357     return &CS_HEART;
5358   case PICTURE_FRAME:
5359     return &CS_RECTANGLE; // treat it as RECTANGLE for now
5360   case QUAD_ARROW:
5361     return &CS_QUAD_ARROW;
5362   case BEVEL:
5363     return &CS_BEVEL;
5364   case LEFT_BRACKET:
5365     return &CS_LEFT_BRACKET;
5366   case RIGHT_BRACKET:
5367     return &CS_RIGHT_BRACKET;
5368   case LEFT_BRACE:
5369     return &CS_LEFT_BRACE;
5370   case RIGHT_BRACE:
5371     return &CS_RIGHT_BRACE;
5372   case LEFT_UP_ARROW:
5373     return &CS_LEFT_UP_ARROW;
5374   case BENT_UP_ARROW:
5375     return &CS_BENT_UP_ARROW;
5376   case BENT_ARROW:
5377     return &CS_BENT_ARROW;
5378   case SEAL_24:
5379     return &CS_SEAL_24;
5380   case STRIPED_RIGHT_ARROW:
5381     return &CS_STRIPED_RIGHT_ARROW;
5382   case NOTCHED_RIGHT_ARROW:
5383     return &CS_NOTCHED_RIGHT_ARROW;
5384   case BLOCK_ARC:
5385     return &CS_BLOCK_ARC;
5386   case SMILEY_FACE:
5387     return &CS_SMILEY_FACE;
5388   case VERTICAL_SCROLL:
5389     return &CS_VERTICAL_SCROLL;
5390   case HORIZONTAL_SCROLL:
5391     return &CS_HORIZONTAL_SCROLL;
5392   case CIRCULAR_ARROW:
5393     return &CS_CIRCULAR_ARROW;
5394   case U_TURN_ARROW:
5395     return &CS_U_TURN_ARROW;
5396   case CURVED_RIGHT_ARROW:
5397     return &CS_CURVED_RIGHT_ARROW;
5398   case CURVED_LEFT_ARROW:
5399     return &CS_CURVED_LEFT_ARROW;
5400   case CURVED_UP_ARROW:
5401     return &CS_CURVED_UP_ARROW;
5402   case CURVED_DOWN_ARROW:
5403     return &CS_CURVED_DOWN_ARROW;
5404   case FLOW_CHART_PROCESS:
5405     return &CS_FLOW_CHART_PROCESS;
5406   case FLOW_CHART_DECISION:
5407     return &CS_FLOW_CHART_DECISION;
5408   case FLOW_CHART_IO:
5409     return &CS_FLOW_CHART_IO;
5410   case FLOW_CHART_PREDEFINED_PROCESS:
5411     return &CS_FLOW_CHART_PREDEFINED_PROCESS;
5412   case FLOW_CHART_INTERNAL_STORAGE:
5413     return &CS_FLOW_CHART_INTERNAL_STORAGE;
5414   case FLOW_CHART_DOCUMENT:
5415     return &CS_FLOW_CHART_DOCUMENT;
5416   case FLOW_CHART_MULTI_DOCUMENT:
5417     return &CS_FLOW_CHART_MULTI_DOCUMENT;
5418   case FLOW_CHART_TERMINATOR:
5419     return &CS_FLOW_CHART_TERMINATOR;
5420   case FLOW_CHART_PREPARATION:
5421     return &CS_FLOW_CHART_PREPARATION;
5422   case FLOW_CHART_MANUAL_INPUT:
5423     return &CS_FLOW_CHART_MANUAL_INPUT;
5424   case FLOW_CHART_MANUAL_OPERATION:
5425     return &CS_FLOW_CHART_MANUAL_OPERATION;
5426   case FLOW_CHART_CONNECTOR:
5427     return &CS_FLOW_CHART_CONNECTOR;
5428   case FLOW_CHART_PUNCHED_CARD:
5429     return &CS_FLOW_CHART_PUNCHED_CARD;
5430   case FLOW_CHART_PUNCHED_TAPE:
5431     return &CS_FLOW_CHART_PUNCHED_TAPE;
5432   case FLOW_CHART_SUMMING_JUNCTION:
5433     return &CS_FLOW_CHART_SUMMING_JUNCTION;
5434   case FLOW_CHART_OR:
5435     return &CS_FLOW_CHART_OR;
5436   case FLOW_CHART_COLLATE:
5437     return &CS_FLOW_CHART_COLLATE;
5438   case FLOW_CHART_SORT:
5439     return &CS_FLOW_CHART_SORT;
5440   case FLOW_CHART_EXTRACT:
5441     return &CS_FLOW_CHART_EXTRACT;
5442   case FLOW_CHART_MERGE:
5443     return &CS_FLOW_CHART_MERGE;
5444   case FLOW_CHART_ONLINE_STORAGE:
5445     return &CS_FLOW_CHART_ONLINE_STORAGE;
5446   case FLOW_CHART_MAGNETIC_TAPE:
5447     return &CS_FLOW_CHART_MAGNETIC_TAPE;
5448   case FLOW_CHART_MAGNETIC_DISK:
5449     return &CS_FLOW_CHART_MAGNETIC_DISK;
5450   case FLOW_CHART_MAGNETIC_DRUM:
5451     return &CS_FLOW_CHART_MAGNETIC_DRUM;
5452   case FLOW_CHART_DISPLAY:
5453     return &CS_FLOW_CHART_DISPLAY;
5454   case FLOW_CHART_DELAY:
5455     return &CS_FLOW_CHART_DELAY;
5456   case TEXT_PLAIN_TEXT:
5457     return &CS_TEXT_PLAIN_TEXT;
5458   case TEXT_STOP:
5459     return &CS_TEXT_STOP;
5460   case TEXT_TRIANGLE:
5461     return &CS_TEXT_TRIANGLE;
5462   case TEXT_TRIANGLE_INVERTED:
5463     return &CS_TEXT_TRIANGLE_INVERTED;
5464   case TEXT_CHEVRON:
5465     return &CS_TEXT_CHEVRON;
5466   case TEXT_CHEVRON_INVERTED:
5467     return &CS_TEXT_CHEVRON_INVERTED;
5468   case TEXT_RING_OUTSIDE:
5469     return &CS_TEXT_RING_OUTSIDE;
5470   case TEXT_ARCH_UP_CURVE:
5471     return &CS_TEXT_ARCH_UP_CURVE;
5472   case TEXT_ARCH_DOWN_CURVE:
5473     return &CS_TEXT_ARCH_DOWN_CURVE;
5474   case TEXT_CIRCLE_CURVE:
5475     return &CS_TEXT_CIRCLE_CURVE;
5476   case TEXT_BUTTON_CURVE:
5477     return &CS_TEXT_BUTTON_CURVE;
5478   case TEXT_ARCH_UP_POUR:
5479     return &CS_TEXT_ARCH_UP_POUR;
5480   case TEXT_ARCH_DOWN_POUR:
5481     return &CS_TEXT_ARCH_DOWN_POUR;
5482   case TEXT_CIRCLE_POUR:
5483     return &CS_TEXT_CIRCLE_POUR;
5484   case TEXT_BUTTON_POUR:
5485     return &CS_TEXT_BUTTON_POUR;
5486   case TEXT_CURVE_UP:
5487     return &CS_TEXT_CURVE_UP;
5488   case TEXT_CURVE_DOWN:
5489     return &CS_TEXT_CURVE_DOWN;
5490   case TEXT_CASCADE_UP:
5491     return &CS_TEXT_CASCADE_UP;
5492   case TEXT_CASCADE_DOWN:
5493     return &CS_TEXT_CASCADE_DOWN;
5494   case TEXT_WAVE_1:
5495     return &CS_TEXT_WAVE_1;
5496   case TEXT_WAVE_2:
5497     return &CS_TEXT_WAVE_2;
5498   case TEXT_WAVE_3:
5499     return &CS_TEXT_WAVE_3;
5500   case TEXT_WAVE_4:
5501     return &CS_TEXT_WAVE_4;
5502   case TEXT_INFLATE:
5503     return &CS_TEXT_INFLATE;
5504   case TEXT_DEFLATE:
5505     return &CS_TEXT_DEFLATE;
5506   case TEXT_INFLATE_BOTTOM:
5507     return &CS_TEXT_INFLATE_BOTTOM;
5508   case TEXT_DEFLATE_BOTTOM:
5509     return &CS_TEXT_DEFLATE_BOTTOM;
5510   case TEXT_INFLATE_TOP:
5511     return &CS_TEXT_INFLATE_TOP;
5512   case TEXT_DEFLATE_TOP:
5513     return &CS_TEXT_DEFLATE_TOP;
5514   case TEXT_DEFLATE_INFLATE:
5515     return &CS_TEXT_DEFLATE_INFLATE;
5516   case TEXT_DEFLATE_INFLATE_DEFLATE: // great name
5517     return &CS_TEXT_DEFLATE_INFLATE_DEFLATE;
5518   case TEXT_FADE_RIGHT:
5519     return &CS_TEXT_FADE_RIGHT;
5520   case TEXT_FADE_LEFT:
5521     return &CS_TEXT_FADE_LEFT;
5522   case TEXT_FADE_UP:
5523     return &CS_TEXT_FADE_UP;
5524   case TEXT_FADE_DOWN:
5525     return &CS_TEXT_FADE_DOWN;
5526   case TEXT_SLANT_UP:
5527     return &CS_TEXT_SLANT_UP;
5528   case TEXT_SLANT_DOWN:
5529     return &CS_TEXT_SLANT_DOWN;
5530   case TEXT_CAN_UP:
5531     return &CS_TEXT_CAN_UP;
5532   case TEXT_CAN_DOWN:
5533     return &CS_TEXT_CAN_DOWN;
5534   case FLOW_CHART_ALTERNATE_PROCESS:
5535     return &CS_FLOW_CHART_ALTERNATE_PROCESS;
5536   case FLOW_CHART_OFFPAGE_CONNECTOR:
5537     return &CS_FLOW_CHART_OFFPAGE_CONNECTOR;
5538   case LEFT_RIGHT_UP_ARROW:
5539     return &CS_LEFT_RIGHT_UP_ARROW;
5540   case SUN:
5541     return &CS_SUN;
5542   case MOON:
5543     return &CS_MOON;
5544   case BRACKET_PAIR:
5545     return &CS_BRACKET_PAIR;
5546   case BRACE_PAIR:
5547     return &CS_BRACE_PAIR;
5548   case DOUBLE_WAVE:
5549     return &CS_DOUBLE_WAVE;
5550   case ACTION_BUTTON_BLANK:
5551     return &CS_ACTION_BUTTON_BLANK;
5552   case ACTION_BUTTON_HOME:
5553     return &CS_ACTION_BUTTON_HOME;
5554   case ACTION_BUTTON_HELP:
5555     return &CS_ACTION_BUTTON_HELP;
5556   case ACTION_BUTTON_INFORMATION:
5557     return &CS_ACTION_BUTTON_INFORMATION;
5558   case ACTION_BUTTON_FORWARD_NEXT:
5559     return &CS_ACTION_BUTTON_FORWARD_NEXT;
5560   case ACTION_BUTTON_BACK_PREVIOUS:
5561     return &CS_ACTION_BUTTON_BACK_PREVIOUS;
5562   case ACTION_BUTTON_END:
5563     return &CS_ACTION_BUTTON_END;
5564   case ACTION_BUTTON_BEGINNING:
5565     return &CS_ACTION_BUTTON_BEGINNING;
5566   case ACTION_BUTTON_RETURN:
5567     return &CS_ACTION_BUTTON_RETURN;
5568   case ACTION_BUTTON_DOCUMENT:
5569     return &CS_ACTION_BUTTON_DOCUMENT;
5570   case ACTION_BUTTON_SOUND:
5571     return &CS_ACTION_BUTTON_SOUND;
5572   case ACTION_BUTTON_MOVIE:
5573     return &CS_ACTION_BUTTON_MOVIE;
5574   default:
5575     return nullptr;
5576   }
5577 }
5578 
5579 enum Command
5580 {
5581   MOVETO,
5582   LINETO,
5583   CURVETO,
5584   NOFILL,
5585   NOSTROKE,
5586   ANGLEELLIPSE,
5587   CLOSESUBPATH,
5588   ARCTO,
5589   ARC,
5590   CLOCKWISEARCTO,
5591   CLOCKWISEARC,
5592   ENDSUBPATH,
5593   ELLIPTICALQUADRANTX,
5594   ELLIPTICALQUADRANTY
5595 };
5596 
5597 struct ShapeElementCommand
5598 {
5599   Command m_command;
5600   unsigned char m_count;
ShapeElementCommandlibmspub::ShapeElementCommand5601   ShapeElementCommand(Command command, unsigned char count) : m_command(command), m_count(count) { }
5602 };
5603 
getCommandFromBinary(unsigned short binary)5604 ShapeElementCommand getCommandFromBinary(unsigned short binary)
5605 {
5606   Command cmd;
5607   unsigned count = 0;
5608   switch (binary >> 8)
5609   {
5610   case 0xAA:
5611     cmd = NOFILL;
5612     break;
5613   case 0xAB:
5614     cmd = NOSTROKE;
5615     break;
5616   case 0xAD:
5617   case 0xB3:
5618   case 0x20:
5619   case 0xAF:
5620     cmd = CURVETO;
5621     count = (binary & 0xFF);
5622     break;
5623   case 0xA2:
5624     cmd = ANGLEELLIPSE;
5625     count = (binary & 0xFF) / 3;
5626     break;
5627   case 0xA3:
5628     cmd = ARCTO;
5629     count = (binary & 0xFF) / 4;
5630     break;
5631   case 0xA4:
5632     cmd = ARC;
5633     count = (binary & 0xFF) / 4;
5634     break;
5635   case 0xA5:
5636     cmd = CLOCKWISEARCTO;
5637     count = (binary & 0xFF) / 4;
5638     break;
5639   case 0xA6:
5640     cmd = CLOCKWISEARC;
5641     count = (binary & 0xFF) / 4;
5642     break;
5643   case 0xA7:
5644     cmd = ELLIPTICALQUADRANTX;
5645     count = (binary & 0xFF);
5646     break;
5647   case 0xA8:
5648     cmd = ELLIPTICALQUADRANTY;
5649     count = (binary & 0xFF);
5650     break;
5651   case 0xAC:
5652   case 0xAE:
5653   case 0x0:
5654     cmd = LINETO;
5655     count = (binary & 0xFF);
5656     break;
5657   case 0x40:
5658     cmd = MOVETO;
5659     count = (binary & 0xFF);
5660     count = count ? count : 1;
5661     break;
5662   case 0x60:
5663     cmd = CLOSESUBPATH;
5664     break;
5665   case 0x80:
5666     cmd = ENDSUBPATH;
5667     break;
5668   default:
5669     MSPUB_DEBUG_MSG(("unknown segment command 0x%x\n", binary >> 8));
5670     cmd = MOVETO;
5671     count = 1;
5672     break;
5673   }
5674   return ShapeElementCommand(cmd, count);
5675 }
5676 
getSpecialIfNecessary(std::function<double (unsigned index)> calculator,int val)5677 double getSpecialIfNecessary(std::function<double(unsigned index)> calculator, int val)
5678 {
5679   bool special = val & 0x80000000;
5680   return special ? calculator(val ^ 0x80000000) : val;
5681 }
5682 
getTextRectangle(double x,double y,double width,double height,std::function<double (unsigned index)> calculator) const5683 Coordinate CustomShape::getTextRectangle(double x, double y, double width, double height, std::function<double(unsigned index)> calculator) const
5684 {
5685   double scaleX = width * m_coordWidth;
5686   double scaleY = height * m_coordHeight;
5687   if (m_numTextRectangles == 0)
5688   {
5689     return Coordinate(x, y, x + width, y + height);
5690   }
5691   const Vertex &start = mp_textRectangles[0].first;
5692   const Vertex &end = mp_textRectangles[0].second;
5693   double startX = x + scaleX * getSpecialIfNecessary(calculator, start.m_x);
5694   double startY = y + scaleY * getSpecialIfNecessary(calculator, start.m_y);
5695   double endX = x + scaleX * getSpecialIfNecessary(calculator, end.m_x);
5696   double endY = y + scaleY * getSpecialIfNecessary(calculator, end.m_y);
5697   return Coordinate(startX, startY, endX, endY);
5698 }
5699 
5700 namespace
5701 {
5702 
5703 struct LineInfo
5704 {
5705   librevenge::RVNGPropertyListVector m_vertices;
5706   double m_width;
5707   librevenge::RVNGString m_color;
5708   bool m_lineExists;
LineInfolibmspub::__anond9defa060111::LineInfo5709   LineInfo(librevenge::RVNGPropertyListVector vertices, Line current, std::vector<Color> palette) : m_vertices(vertices),
5710     m_width((double)(current.m_widthInEmu) / EMUS_IN_INCH),
5711     m_color(MSPUBCollector::getColorString(current.m_color.getFinalColor(palette))),
5712     m_lineExists(current.m_lineExists) { }
outputlibmspub::__anond9defa060111::LineInfo5713   void output(librevenge::RVNGDrawingInterface *painter, librevenge::RVNGPropertyList &graphicsProps)
5714   {
5715     graphicsProps.insert("draw:stroke", m_lineExists ? "solid" : "none");
5716     graphicsProps.insert("svg:stroke-width", m_width);
5717     graphicsProps.insert("svg:stroke-color", m_color);
5718     painter->setStyle(graphicsProps);
5719     librevenge::RVNGPropertyList points;
5720     points.insert("svg:points", m_vertices);
5721     painter->drawPolyline(points);
5722   }
5723 private:
5724 };
5725 
5726 }
5727 
drawEmulatedLine(std::shared_ptr<const CustomShape> shape,ShapeType shapeType,const std::vector<Line> & lines,Vector2D center,VectorTransformation2D transform,double x,double y,double scaleX,double scaleY,bool drawStroke,librevenge::RVNGPropertyList & graphicsProps,librevenge::RVNGDrawingInterface * painter,std::function<double (unsigned index)> calculator,const std::vector<Color> & palette)5728 void drawEmulatedLine(std::shared_ptr<const CustomShape> shape, ShapeType shapeType, const std::vector<Line> &lines,
5729                       Vector2D center, VectorTransformation2D transform,
5730                       double x, double y, double scaleX, double scaleY,
5731                       bool drawStroke, librevenge::RVNGPropertyList &graphicsProps, librevenge::RVNGDrawingInterface *painter,
5732                       std::function<double(unsigned index)> calculator,
5733                       const std::vector<Color> &palette)
5734 {
5735   std::vector<LineInfo> lineInfos;
5736   unsigned i_line = 0;
5737   bool rectangle = isShapeTypeRectangle(shapeType) && !lines.empty(); // ugly HACK: special handling for rectangle outlines.
5738   Vector2D vector(0, 0);
5739   Vector2D old(0, 0);
5740   for (unsigned i = 0; i < shape->m_numVertices; ++i)
5741   {
5742     librevenge::RVNGPropertyListVector vertices;
5743     librevenge::RVNGPropertyList vertex;
5744     if (i > 0)
5745     {
5746       librevenge::RVNGPropertyList vertexStart;
5747       double lineWidth = (double)(lines[i_line].m_widthInEmu) / EMUS_IN_INCH;
5748       switch (i - 1) // fudge the lines inward by half their width so they are fully inside the shape and hence proper borders
5749       {
5750       case 0:
5751         old.m_y += lineWidth / 2;
5752         break;
5753       case 1:
5754         old.m_x -= lineWidth / 2;
5755         break;
5756       case 2:
5757         old.m_y -= lineWidth / 2;
5758         break;
5759       case 3:
5760         old.m_x += lineWidth / 2;
5761         break;
5762       }
5763       old = transform.transformWithOrigin(old, center);
5764       vertexStart.insert("svg:x", old.m_x);
5765       vertexStart.insert("svg:y", old.m_y);
5766       vertices.append(vertexStart);
5767     }
5768     vector.m_x = x + scaleX * getSpecialIfNecessary(calculator, shape->mp_vertices[i].m_x);
5769     vector.m_y = y + scaleY * getSpecialIfNecessary(calculator, shape->mp_vertices[i].m_y);
5770     old = vector;
5771     if (rectangle)
5772     {
5773       double lineWidth = (double)(lines[i_line].m_widthInEmu) / EMUS_IN_INCH;
5774       switch (i) // fudge the lines inward by half their width so they are fully inside the shape and hence proper borders
5775       {
5776       case 1:
5777         vector.m_y += lineWidth / 2;
5778         break;
5779       case 2:
5780         vector.m_x -= lineWidth / 2;
5781         break;
5782       case 3:
5783         vector.m_y -= lineWidth / 2;
5784         break;
5785       case 4:
5786         vector.m_x += lineWidth / 2;
5787         break;
5788       }
5789     }
5790     vector = transform.transformWithOrigin(vector, center);
5791     vertex.insert("svg:x", vector.m_x);
5792     vertex.insert("svg:y", vector.m_y);
5793     vertices.append(vertex);
5794     if (i > 0)
5795     {
5796       lineInfos.push_back(LineInfo(vertices, lines[i_line], palette));
5797       if (drawStroke)
5798       {
5799         if (i_line + 1 < lines.size()) // continue using the last element if we run out of lines.
5800         {
5801           ++i_line;
5802         }
5803       }
5804     }
5805   }
5806   if (rectangle)
5807   {
5808     LineInfo *top = &lineInfos[0];
5809     LineInfo *right = (lineInfos.size() > 1) ? &lineInfos[1] : nullptr;
5810     LineInfo *bottom = (lineInfos.size() > 2) ? &lineInfos[2] : nullptr;
5811     LineInfo *left = (lineInfos.size() > 3) ? &lineInfos[3] : nullptr;
5812     if (left)
5813     {
5814       left->output(painter, graphicsProps);
5815     }
5816     if (right)
5817     {
5818       right->output(painter, graphicsProps);
5819     }
5820     if (top)
5821     {
5822       top->output(painter, graphicsProps);
5823     }
5824     if (bottom)
5825     {
5826       bottom->output(painter, graphicsProps);
5827     }
5828   }
5829   else
5830   {
5831     for (auto &lineInfo : lineInfos)
5832     {
5833       lineInfo.output(painter, graphicsProps);
5834     }
5835   }
5836 }
5837 
getRayEllipseIntersection(double initX,double initY,double rx,double ry,double cx,double cy,double & xOut,double & yOut)5838 void getRayEllipseIntersection(double initX, double initY, double rx, double ry, double cx, double cy, double &xOut, double &yOut)
5839 {
5840   double x = initX - cx;
5841   double y = initY - cy;
5842   if (x != 0 && y != 0)
5843   {
5844     xOut = rx * ry / sqrt(ry * ry + rx * rx * (y / x) * (y / x));
5845     if (x < 0)
5846     {
5847       xOut *= -1;
5848     }
5849     yOut = xOut * y / x;
5850   }
5851   else if (y != 0)
5852   {
5853     xOut = 0;
5854     if (y > 0)
5855     {
5856       yOut = ry;
5857     }
5858     else
5859     {
5860       yOut = -ry;
5861     }
5862   }
5863   else if (x != 0)
5864   {
5865     yOut = 0;
5866     if (x > 0)
5867     {
5868       xOut = rx;
5869     }
5870     else
5871     {
5872       xOut = -rx;
5873     }
5874   }
5875   else
5876   {
5877     xOut = yOut = 0;
5878   }
5879   xOut += cx;
5880   yOut += cy;
5881 }
5882 
calcClipPath(const std::vector<Vertex> & verts,double x,double y,double height,double width,VectorTransformation2D transform,std::shared_ptr<const CustomShape> shape)5883 librevenge::RVNGPropertyList calcClipPath(const std::vector<Vertex> &verts, double x, double y, double height, double width, VectorTransformation2D transform, std::shared_ptr<const CustomShape> shape)
5884 {
5885   librevenge::RVNGPropertyList vertices;
5886   Vector2D center(x + width / 2, y + height / 2);
5887   double scaleX = width / shape->m_coordWidth;
5888   double scaleY = height / shape->m_coordHeight;
5889   librevenge::RVNGString clipString;
5890   Vector2D vector(x + scaleX * verts[0].m_x, y + scaleY * verts[0].m_y);
5891   vector = transform.transformWithOrigin(vector, center);
5892   librevenge::RVNGString sValue;
5893   sValue.sprintf("M %f %f", (double)vector.m_x, (double)vector.m_y);
5894   clipString.append(sValue);
5895   for (unsigned i = 1; i < verts.size(); ++i)
5896   {
5897     Vector2D vector2(x + scaleX * verts[i].m_x, y + scaleY * verts[i].m_y);
5898     vector2 = transform.transformWithOrigin(vector2, center);
5899     librevenge::RVNGString sValue2;
5900     sValue2.sprintf(" L %f %f", (double)vector2.m_x, (double)vector2.m_y);
5901     clipString.append(sValue2);
5902   }
5903   clipString.append(" Z");
5904   vertices.insert("svg:clip-path", clipString);
5905   return vertices;
5906 }
5907 
writeCustomShape(ShapeType shapeType,librevenge::RVNGPropertyList & graphicsProps,librevenge::RVNGDrawingInterface * painter,double x,double y,double height,double width,bool closeEverything,VectorTransformation2D transform,std::vector<Line> lines,std::function<double (unsigned index)> calculator,const std::vector<Color> & palette,std::shared_ptr<const CustomShape> shape)5908 void writeCustomShape(ShapeType shapeType, librevenge::RVNGPropertyList &graphicsProps, librevenge::RVNGDrawingInterface *painter, double x, double y, double height, double width, bool closeEverything, VectorTransformation2D transform, std::vector<Line> lines, std::function<double(unsigned index)> calculator, const std::vector<Color> &palette, std::shared_ptr<const CustomShape> shape)
5909 {
5910   MSPUB_DEBUG_MSG(("***STARTING CUSTOM SHAPE***\n"));
5911   if (!shape)
5912   {
5913     return;
5914   }
5915   bool drawStroke = !lines.empty();
5916   bool horizontal = height == 0;
5917   bool vertical = width == 0;
5918   if (horizontal && vertical)
5919   {
5920     return;
5921   }
5922   Vector2D center(x + width / 2, y + height / 2);
5923   double scaleX = width / shape->m_coordWidth;
5924   double scaleY = height / shape->m_coordHeight;
5925   bool allLinesSame = true;
5926   for (unsigned i = 0; allLinesSame && i + 1< lines.size(); ++i)
5927   {
5928     const Line &l1 = lines[i];
5929     const Line &l2 = lines[i + 1];
5930     allLinesSame = l1 == l2;
5931   }
5932   if (shape->mp_elements == nullptr)
5933   {
5934     bool shouldDrawShape = true;
5935     if ((!graphicsProps["draw:fill"]) || (graphicsProps["draw:fill"]->getStr() == "none"))
5936     {
5937       if (!allLinesSame)
5938       {
5939         drawEmulatedLine(shape, shapeType, lines, center, transform,
5940                          x, y, scaleX, scaleY, drawStroke, graphicsProps, painter, calculator, palette);
5941         shouldDrawShape = false;
5942       }
5943       else if (drawStroke)
5944       {
5945         Line &first = lines[0];
5946         if (!first.m_lineExists)
5947         {
5948           graphicsProps.insert("draw:stroke", "none");
5949         }
5950         graphicsProps.insert("svg:stroke-width", (double)(first.m_widthInEmu) / EMUS_IN_INCH);
5951         graphicsProps.insert("svg:stroke-color", MSPUBCollector::getColorString(first.m_color.getFinalColor(palette)));
5952         painter->setStyle(graphicsProps);
5953       }
5954     }
5955     if (shouldDrawShape)
5956     {
5957       librevenge::RVNGPropertyListVector vertices;
5958       for (unsigned i = 0; i < shape->m_numVertices; ++i)
5959       {
5960         librevenge::RVNGPropertyList vertex;
5961         Vector2D vector(x + scaleX * getSpecialIfNecessary(calculator, shape->mp_vertices[i].m_x),
5962                         y + scaleY * getSpecialIfNecessary(calculator, shape->mp_vertices[i].m_y));
5963         vector = transform.transformWithOrigin(vector, center);
5964         vertex.insert("svg:x", vector.m_x);
5965         vertex.insert("svg:y", vector.m_y);
5966         vertices.append(vertex);
5967       }
5968       librevenge::RVNGPropertyList points;
5969       points.insert("svg:points", vertices);
5970       painter->drawPolygon(points);
5971     }
5972   }
5973   else
5974   {
5975     librevenge::RVNGPropertyListVector vertices;
5976     if (drawStroke)
5977     {
5978       // don't bother with different strokes for things defined by segments
5979       Line &first = lines[0];
5980       if (!first.m_lineExists)
5981       {
5982         graphicsProps.insert("draw:stroke", "none");
5983       }
5984       graphicsProps.insert("svg:stroke-width", (double)(first.m_widthInEmu) / EMUS_IN_INCH);
5985       graphicsProps.insert("svg:stroke-color", MSPUBCollector::getColorString(first.m_color.getFinalColor(palette)));
5986       painter->setStyle(graphicsProps);
5987     }
5988     unsigned vertexIndex = 0;
5989     bool hasUnclosedElements = false;
5990     boost::optional<Vector2D> lastPoint;
5991     // Escher assigns segments into subpaths somewhat differently than SVG does,
5992     // so we have to keep track of the following, rather than just adding a 'Z'
5993     // directive on path close and expecting everything to work.
5994     boost::optional<Vector2D> pathBegin;
5995     for (unsigned i = 0; i < shape->m_numElements; ++i)
5996     {
5997       ShapeElementCommand cmd = getCommandFromBinary(shape->mp_elements[i]);
5998       switch (cmd.m_command)
5999       {
6000       case ELLIPTICALQUADRANTX:
6001       case ELLIPTICALQUADRANTY:
6002       {
6003 #ifdef DEBUG
6004         if (cmd.m_command == ELLIPTICALQUADRANTX)
6005         {
6006           MSPUB_DEBUG_MSG(("ELLIPTICALQUADRANTX %d\n", cmd.m_count));
6007         }
6008         else
6009         {
6010           MSPUB_DEBUG_MSG(("ELLIPTICALQUADRANTY %d\n", cmd.m_count));
6011         }
6012 #endif
6013         bool firstDirection = true;
6014         for (unsigned j = 0; (j < cmd.m_count) && (vertexIndex < shape->m_numVertices); ++j, ++vertexIndex)
6015         {
6016           bool modifier = cmd.m_command == ELLIPTICALQUADRANTX ? true : false;
6017           const Vertex &curr = shape->mp_vertices[vertexIndex];
6018           Vector2D curr2D(x + scaleX * getSpecialIfNecessary(calculator, curr.m_x), y + scaleY * getSpecialIfNecessary(calculator, curr.m_y));
6019           if (bool(lastPoint))
6020           {
6021             if (!pathBegin)
6022             {
6023               pathBegin = curr2D;
6024             }
6025             hasUnclosedElements = true;
6026             double prevX = lastPoint.get().m_x;
6027             double prevY = lastPoint.get().m_y;
6028             double tmpX = curr2D.m_x - prevX;
6029             double tmpY = curr2D.m_y - prevY;
6030             if ((tmpX < 0 && tmpY >= 0) || (tmpX >= 0 && tmpY < 0))
6031             {
6032               if (j == 0)
6033               {
6034                 firstDirection = true;
6035               }
6036               else if (! firstDirection)
6037               {
6038                 modifier = !modifier;
6039               }
6040             }
6041             else
6042             {
6043               if (j == 0)
6044               {
6045                 firstDirection = false;
6046               }
6047               else if (firstDirection)
6048               {
6049                 modifier = !modifier;
6050               }
6051             }
6052             if (modifier)
6053             {
6054               tmpX = curr2D.m_x;
6055               tmpY = prevY;
6056             }
6057             else
6058             {
6059               tmpX = prevX;
6060               tmpY = curr2D.m_y;
6061             }
6062             double vecX = (tmpX - prevX) / 2;
6063             double vecY = (tmpY - prevY) / 2;
6064             Vector2D vec1(prevX + vecX, prevY + vecY);
6065             vecX = (tmpX - curr2D.m_x) / 2;
6066             vecY = (tmpY - curr2D.m_y) / 2;
6067             Vector2D vec2(curr2D.m_x + vecX, curr2D.m_y + vecY);
6068             vec1 = transform.transformWithOrigin(vec1, center);
6069             vec2 = transform.transformWithOrigin(vec2, center);
6070             curr2D = transform.transformWithOrigin(curr2D, center);
6071             librevenge::RVNGPropertyList bezier;
6072             bezier.insert("librevenge:path-action", "C");
6073             bezier.insert("svg:x1", vec1.m_x);
6074             bezier.insert("svg:x2", vec2.m_x);
6075             bezier.insert("svg:y1", vec1.m_y);
6076             bezier.insert("svg:y2", vec2.m_y);
6077             bezier.insert("svg:x", curr2D.m_x);
6078             bezier.insert("svg:y", curr2D.m_y);
6079             vertices.append(bezier);
6080           }
6081           else
6082           {
6083             //something is broken, just move
6084             if (vertexIndex < shape->m_numVertices)
6085             {
6086               librevenge::RVNGPropertyList moveVertex;
6087               if (hasUnclosedElements && closeEverything)
6088               {
6089                 librevenge::RVNGPropertyList closeVertex;
6090                 closeVertex.insert("librevenge:path-action", "Z");
6091                 vertices.append(closeVertex);
6092               }
6093               hasUnclosedElements = false;
6094               Vector2D new_(x + scaleX * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex].m_x), y + scaleY * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex].m_y));
6095               new_ = transform.transformWithOrigin(new_, center);
6096               moveVertex.insert("svg:x", new_.m_x);
6097               moveVertex.insert("svg:y", new_.m_y);
6098               moveVertex.insert("librevenge:path-action", "M");
6099               vertices.append(moveVertex);
6100               ++vertexIndex;
6101             }
6102           }
6103         }
6104       }
6105       break;
6106       case CLOCKWISEARCTO:
6107       case CLOCKWISEARC:
6108       case ARCTO:
6109       case ARC:
6110         switch (cmd.m_command)
6111         {
6112         case CLOCKWISEARCTO:
6113           MSPUB_DEBUG_MSG(("CLOCKWISEARCTO %d\n", cmd.m_count));
6114           break;
6115         case CLOCKWISEARC:
6116           MSPUB_DEBUG_MSG(("CLOCKWISEARC %d\n", cmd.m_count));
6117           break;
6118         case ARCTO:
6119           MSPUB_DEBUG_MSG(("ARCTO %d\n", cmd.m_count));
6120           break;
6121         case ARC:
6122           MSPUB_DEBUG_MSG(("ARC %d\n", cmd.m_count));
6123           break;
6124         default:
6125           break;
6126         }
6127         for (unsigned j = 0; (j < cmd.m_count) && (vertexIndex + 3 < shape->m_numVertices); ++j, vertexIndex += 4)
6128         {
6129           for (unsigned k = 0; k < 4; ++k)
6130           {
6131             MSPUB_DEBUG_MSG(("Calculated vertex x: %f, y: %f\n", getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex + k].m_x), getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex + k].m_y)));
6132           }
6133           bool to = cmd.m_command == CLOCKWISEARCTO || cmd.m_command == ARCTO;
6134           bool clockwise = cmd.m_command == CLOCKWISEARCTO || cmd.m_command == CLOCKWISEARC;
6135           const Vertex &bound1 = shape->mp_vertices[vertexIndex];
6136           const Vertex &bound2 = shape->mp_vertices[vertexIndex + 1];
6137           const Vertex &start  = shape->mp_vertices[vertexIndex + 2];
6138           const Vertex &end    = shape->mp_vertices[vertexIndex + 3];
6139 
6140           double bound1X = x + scaleX * getSpecialIfNecessary(calculator, bound1.m_x);
6141           double bound1Y = y + scaleY * getSpecialIfNecessary(calculator, bound1.m_y);
6142           double bound2X = x + scaleX * getSpecialIfNecessary(calculator, bound2.m_x);
6143           double bound2Y = y + scaleY * getSpecialIfNecessary(calculator, bound2.m_y);
6144           double rx = fabs(bound1X - bound2X) / 2;
6145           double ry = fabs(bound1Y - bound2Y) / 2;
6146           double cx = (bound1X + bound2X) / 2;
6147           double cy = (bound1Y + bound2Y) / 2;
6148           double startX = x + scaleX * getSpecialIfNecessary(calculator, start.m_x);
6149           double startY = y + scaleY * getSpecialIfNecessary(calculator, start.m_y);
6150           double endX = x + scaleX * getSpecialIfNecessary(calculator, end.m_x);
6151           double endY = y + scaleY * getSpecialIfNecessary(calculator, end.m_y);
6152           getRayEllipseIntersection(startX, startY, rx, ry, cx, cy, startX, startY);
6153           getRayEllipseIntersection(endX, endY, rx, ry, cx, cy, endX, endY);
6154           Vector2D start2D(startX, startY);
6155           if (!pathBegin)
6156           {
6157             pathBegin = start2D;
6158           }
6159           start2D = transform.transformWithOrigin(start2D, center);
6160           Vector2D end2D(endX, endY);
6161           lastPoint = end2D;
6162           end2D = transform.transformWithOrigin(end2D, center);
6163           bool clockwiseAfterTransform = clockwise ^ transform.orientationReversing();
6164           librevenge::RVNGPropertyList startVertex;
6165           startVertex.insert("svg:x", start2D.m_x);
6166           startVertex.insert("svg:y", start2D.m_y);
6167           startVertex.insert("librevenge:path-action", ((to || closeEverything) && hasUnclosedElements) ? "L" : "M");
6168           vertices.append(startVertex);
6169           double startAngle = atan2(cy - startY, startX - cx);
6170           double endAngle = atan2(cy -endY, endX - cx);
6171           double angleDifference = clockwise ? doubleModulo(startAngle - endAngle, 2 * M_PI)
6172                                    : doubleModulo(endAngle - startAngle, 2 * M_PI);
6173           // don't worry about corner cases; the closer an arc gets to pi radians, the
6174           // less difference there is between the large and small arcs, down to no difference at all
6175           // for an exact 180-degree arc.
6176           bool largeArc = angleDifference >= M_PI;
6177           librevenge::RVNGPropertyList ellipseVertex;
6178           ellipseVertex.insert("svg:x", end2D.m_x);
6179           ellipseVertex.insert("svg:y", end2D.m_y);
6180           // The next two lines won't work if "transform" stretches the shape.
6181           // Since currently the only transforms are flips and rotations, this isn't a problem now,
6182           // but keep it in mind if we ever change how this code works, since it breaks abstraction.
6183           ellipseVertex.insert("svg:rx", rx);
6184           ellipseVertex.insert("svg:ry", ry);
6185           ellipseVertex.insert("librevenge:large-arc", largeArc ? 1 : 0);
6186           ellipseVertex.insert("librevenge:sweep", clockwiseAfterTransform ? 1 : 0);
6187           ellipseVertex.insert("librevenge:rotate", -transform.getRotation());
6188           ellipseVertex.insert("librevenge:path-action", "A");
6189           vertices.append(ellipseVertex);
6190           hasUnclosedElements = true;
6191         }
6192         break;
6193 
6194       case ANGLEELLIPSE:
6195         MSPUB_DEBUG_MSG(("ANGLEELLIPSE %d\n", cmd.m_count));
6196         for (unsigned j = 0; (j < cmd.m_count) && (vertexIndex + 2 < shape->m_numVertices); ++j, vertexIndex += 3)
6197         {
6198           hasUnclosedElements = true;
6199           librevenge::RVNGPropertyList vertex;
6200           double startAngle = getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex + 2].m_x);
6201           double endAngle = getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex + 2].m_y);
6202           double cx = x + scaleX * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex].m_x);
6203           double cy = y + scaleY * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex].m_y);
6204           double rx = scaleX * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex + 1].m_x);
6205           double ry = scaleY * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex + 1].m_y);
6206 
6207           // FIXME: Are angles supposed to be the actual angle of the point with the x-axis,
6208           // or the eccentric anomaly, or something else?
6209           //
6210           // assuming eccentric anomaly for now
6211           librevenge::RVNGPropertyList moveVertex;
6212           Vector2D start(cx + rx * cos(startAngle * M_PI / 180),
6213                          cy + ry * sin(startAngle * M_PI / 180));
6214           if (!pathBegin)
6215           {
6216             pathBegin = start;
6217           }
6218           start = transform.transformWithOrigin(start, center);
6219           moveVertex.insert("librevenge:path-action", "M");
6220           moveVertex.insert("svg:x", start.m_x);
6221           moveVertex.insert("svg:y", start.m_y);
6222           vertices.append(moveVertex);
6223           Vector2D half(cx + rx * cos(endAngle * M_PI / 360),
6224                         cy + ry * sin(endAngle * M_PI / 360));
6225           half = transform.transformWithOrigin(half, center);
6226           librevenge::RVNGPropertyList halfVertex;
6227           halfVertex.insert("librevenge:path-action", "A");
6228           halfVertex.insert("svg:x", half.m_x);
6229           halfVertex.insert("svg:y", half.m_y);
6230           halfVertex.insert("svg:rx", rx * transform.getHorizontalScaling());
6231           halfVertex.insert("svg:ry", ry * transform.getVerticalScaling());
6232           halfVertex.insert("librevenge:rotate", transform.getRotation() * 180 / M_PI);
6233           vertices.append(halfVertex);
6234           Vector2D end(cx + rx * cos(endAngle * M_PI / 180),
6235                        cy + ry * sin(endAngle * M_PI / 180));
6236           lastPoint = end;
6237           end = transform.transformWithOrigin(end, center);
6238           vertex.insert("svg:x", end.m_x);
6239           vertex.insert("svg:y", end.m_y);
6240           vertex.insert("svg:rx", rx);
6241           vertex.insert("svg:ry", ry);
6242           vertex.insert("librevenge:rotate", transform.getRotation() * 180 / M_PI);
6243           vertex.insert("librevenge:path-action", "A");
6244           vertices.append(vertex);
6245         }
6246         break;
6247       case MOVETO:
6248         MSPUB_DEBUG_MSG(("MOVETO %d\n", cmd.m_count));
6249         for (unsigned j = 0; (j < cmd.m_count) && (vertexIndex < shape->m_numVertices); ++j, ++vertexIndex)
6250         {
6251           MSPUB_DEBUG_MSG(("x: %f, y: %f\n", getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex].m_x), getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex].m_y)));
6252           if (hasUnclosedElements && closeEverything)
6253           {
6254             librevenge::RVNGPropertyList closeVertex;
6255             closeVertex.insert("librevenge:path-action", "Z");
6256             vertices.append(closeVertex);
6257           }
6258           hasUnclosedElements = false;
6259           librevenge::RVNGPropertyList moveVertex;
6260           Vector2D new_(x + scaleX * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex].m_x),
6261                         y + scaleY * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex].m_y));
6262           pathBegin = new_;
6263           lastPoint = new_;
6264           new_ = transform.transformWithOrigin(new_, center);
6265           moveVertex.insert("svg:x", new_.m_x);
6266           moveVertex.insert("svg:y", new_.m_y);
6267           moveVertex.insert("librevenge:path-action", "M");
6268           vertices.append(moveVertex);
6269         }
6270         break;
6271       case LINETO:
6272         MSPUB_DEBUG_MSG(("LINETO %d\n", cmd.m_count));
6273         for (unsigned j = 0; (j < cmd.m_count) && (vertexIndex < shape->m_numVertices); ++j, ++vertexIndex)
6274         {
6275           MSPUB_DEBUG_MSG(("x: %f, y: %f\n", getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex].m_x), getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex].m_y)));
6276           hasUnclosedElements = true;
6277           librevenge::RVNGPropertyList vertex;
6278           Vector2D vector(x + scaleX * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex].m_x),
6279                           y + scaleY * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex].m_y));
6280           lastPoint = vector;
6281           vector = transform.transformWithOrigin(vector, center);
6282           vertex.insert("svg:x", vector.m_x);
6283           vertex.insert("svg:y", vector.m_y);
6284           vertex.insert("librevenge:path-action", "L");
6285           vertices.append(vertex);
6286         }
6287         break;
6288       case CURVETO:
6289         MSPUB_DEBUG_MSG(("CURVETO %d\n", cmd.m_count));
6290         for (unsigned j = 0; (j < cmd.m_count) && (vertexIndex + 2 < shape->m_numVertices); ++j, vertexIndex += 3)
6291         {
6292           hasUnclosedElements = true;
6293           Vector2D firstCtrl(x + scaleX * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex].m_x),
6294                              y + scaleY * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex].m_y));
6295           firstCtrl = transform.transformWithOrigin(firstCtrl, center);
6296           Vector2D secondCtrl(x + scaleX * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex + 1].m_x),
6297                               y + scaleY * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex + 1].m_y));
6298           secondCtrl = transform.transformWithOrigin(secondCtrl, center);
6299           Vector2D end(x + scaleX * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex + 2].m_x),
6300                        y + scaleY * getSpecialIfNecessary(calculator, shape->mp_vertices[vertexIndex + 2].m_y));
6301           lastPoint = end;
6302           end = transform.transformWithOrigin(end, center);
6303           librevenge::RVNGPropertyList bezier;
6304           bezier.insert("librevenge:path-action", "C");
6305           bezier.insert("svg:x1", firstCtrl.m_x);
6306           bezier.insert("svg:x2", secondCtrl.m_x);
6307           bezier.insert("svg:y1", firstCtrl.m_y);
6308           bezier.insert("svg:y2", secondCtrl.m_y);
6309           bezier.insert("svg:x", end.m_x);
6310           bezier.insert("svg:y", end.m_y);
6311           vertices.append(bezier);
6312         }
6313         break;
6314       case CLOSESUBPATH:
6315       {
6316         MSPUB_DEBUG_MSG(("CLOSESUBPATH\n"));
6317         if (!pathBegin)
6318         {
6319           MSPUB_DEBUG_MSG(("Tried to close a subpath that hadn't yet begun!\n"));
6320         }
6321         else if (closeEverything)
6322         {
6323           librevenge::RVNGPropertyList end;
6324           end.insert("librevenge:path-action", "Z");
6325           vertices.append(end);
6326         }
6327         else
6328         {
6329           librevenge::RVNGPropertyList end;
6330           end.insert("librevenge:path-action", "L");
6331           Vector2D transformedPathBegin = transform.transformWithOrigin(pathBegin.get(), center);
6332           end.insert("svg:x", transformedPathBegin.m_x);
6333           end.insert("svg:y", transformedPathBegin.m_y);
6334           vertices.append(end);
6335         }
6336         hasUnclosedElements = false;
6337       }
6338       MSPUB_FALLTHROUGH;
6339       case ENDSUBPATH:
6340         MSPUB_DEBUG_MSG(("ENDSUBPATH\n"));
6341         if (closeEverything && bool(pathBegin))
6342         {
6343           librevenge::RVNGPropertyList end;
6344           end.insert("librevenge:path-action", "Z");
6345           vertices.append(end);
6346         }
6347         pathBegin = boost::optional<Vector2D>();
6348         break;
6349       case NOFILL:
6350         MSPUB_DEBUG_MSG(("NOFILL (ignored)\n"));
6351         break;
6352       case NOSTROKE:
6353         MSPUB_DEBUG_MSG(("NOSTROKE (ignored)\n"));
6354         break;
6355       default:
6356         MSPUB_DEBUG_MSG(("Unknown custom shape command %d\n", cmd.m_command));
6357         break;
6358       }
6359     }
6360     if (hasUnclosedElements && closeEverything)
6361     {
6362       if (bool(pathBegin))
6363       {
6364         librevenge::RVNGPropertyList end;
6365         end.insert("librevenge:path-action", "Z");
6366         vertices.append(end);
6367       }
6368     }
6369     librevenge::RVNGPropertyList propList;
6370     propList.insert("svg:d", vertices);
6371     painter->drawPath(propList);
6372   }
6373 }
6374 
isShapeTypeRectangle(ShapeType type)6375 bool isShapeTypeRectangle(ShapeType type)
6376 {
6377   return type == RECTANGLE || type == TEXT_BOX;
6378 }
6379 
6380 
getFromDynamicCustomShape(const DynamicCustomShape & dcs)6381 std::shared_ptr<const CustomShape> getFromDynamicCustomShape(const DynamicCustomShape &dcs)
6382 {
6383   return std::shared_ptr<const CustomShape>(new CustomShape(
6384                                               dcs.m_vertices.empty() ? nullptr : dcs.m_vertices.data(),
6385                                               dcs.m_vertices.size(),
6386                                               dcs.m_elements.empty() ? nullptr : dcs.m_elements.data(),
6387                                               dcs.m_elements.size(),
6388                                               dcs.m_calculations.empty() ? nullptr : dcs.m_calculations.data(),
6389                                               dcs.m_calculations.size(),
6390                                               dcs.m_defaultAdjustValues.empty() ? nullptr :
6391                                               dcs.m_defaultAdjustValues.data(),
6392                                               dcs.m_defaultAdjustValues.size(),
6393                                               dcs.m_textRectangles.empty() ? nullptr : dcs.m_textRectangles.data(),
6394                                               dcs.m_textRectangles.size(),
6395                                               dcs.m_coordWidth, dcs.m_coordHeight,
6396                                               dcs.m_gluePoints.empty() ? nullptr : dcs.m_gluePoints.data(),
6397                                               dcs.m_gluePoints.size(),
6398                                               dcs.m_adjustShiftMask
6399                                             ));
6400 }
6401 
6402 }
6403 
6404 /* vim:set shiftwidth=2 softtabstop=2 expandtab: */
6405