1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_unotools.hxx"
26 #include <unotools/fontcvt.hxx>
27 #include <unotools/fontdefs.hxx>
28
29 #ifndef _STLP_MAP
30 #include <map>
31 #endif
32 #ifndef _STLP_VECTOR
33 #include <vector>
34 #endif
35 #ifndef _STLP_ALGORITHM
36 #include <algorithm>
37 #endif
38 #ifndef _STLP_FUNCTIONAL
39 #include <functional>
40 #endif
41
42 //=======================================================================
43 // note: the character mappings that are only approximations
44 // are marked (with an empty comment)
45
46 static const sal_Unicode aStarBatsTab[224] =
47 {
48 // F020
49 0x0020, 0x263a, 0x25cf, 0x274d,
50 0x25a0, 0x25a1, 0xE000, 0x2751,
51 0x2752, 0xE001, 0xE002, 0xE003,
52 0x2756, 0xE004, 0xE005, 0x27a2,
53 // F030
54 0xE006, 0x2794, 0x2713, 0x2612,
55 0x2611, 0x27b2, 0x261b, 0x270d,
56 0x270e, 0xE007, 0x2714, 0xE008,
57 0xE009, 0xE00A, 0x274f, 0x2750,
58 // F040
59 0xE00B, 0xE00C, 0xE00D, 0xE00E,
60 0x2722, 0x2723, 0x2724, 0x2725,
61 0x2733, 0x2734, 0x2735, 0x2736,
62 0x2737, 0x2738, 0x2739, 0x2717,
63 // F050
64 0x2718, 0x2719, 0x271a, 0x271b,
65 0x271c, 0x272b, 0x272c, 0x272d,
66 0x272e, 0x272f, 0x2730, 0,
67 0xE00F, 0x278a, 0x278b, 0x278c,
68 // F060
69 0x278d, 0x278e, 0x278f, 0x2790,
70 0x2791, 0x2792, 0x2793, 0xE010,
71 0x2780, 0x2781, 0x2782, 0x2783,
72 0x2784, 0x2785, 0x2786, 0x2787,
73 // F070
74 0x2788, 0x2789, 0xE011, 0xE012,
75 0x260e, 0xE013, 0xE014, 0xE015,
76 0xE016, 0xE017, 0xE018, 0xE019,
77 0xE01A, 0x261e, 0xE01B, 0,
78 // F080
79 0x20ac, 0, 0x201a, 0x0192,
80 0x201e, 0x2026, 0x2020, 0x2021,
81 0xE01c, 0x2030, 0x0160, 0x2039,
82 0x0152, 0, 0x017d, 0,
83 // F090
84 0, 0x2018, 0x2019, 0x201c,
85 0x201d, 0x2022, 0x2013, 0x2014,
86 0xE01d, 0x2122, 0x0161, 0x203a,
87 0x0153, 0, 0x017e, 0x0178,
88 // F0A0
89 0, 0x21e7, 0x21e8, 0x21e9,
90 0x21e6, 0xE01e, 0xE01f, 0x00a7,
91 0xE020, 0xE021, 0xE022, 0x00ab,
92 0xE023, 0x2639, 0xE024, 0xE025,
93 // F0B0
94 0xE026, 0xE027, 0xE028, 0x21e5,
95 0x21e4, 0x2192, 0x2193, 0x2190,
96 0x2191, 0xE029, 0xE02a, 0x00bb,
97 0xE02b, 0xE02c, 0xE02d, 0xE02e,
98 // F0C0
99 0xE02f, 0xE030, 0xE031, 0xE032,
100 0x25be, 0x25b4, 0x25bf, 0x25b5,
101 0xE033, 0xE034, 0xE035, 0x2702,
102 0x2708, 0x2721, 0x273f, 0x2744,
103 // F0D0
104 0x25d7, 0x2759, 0xE036, 0xE037,
105 0x2762, 0x2663, 0x2665, 0x2660,
106 0x2194, 0x2195, 0x2798, 0x279a,
107 0x27b8, 0, 0x00b6, 0,
108 // F0E0
109 0x00a2, 0x00a4, 0x00a5, 0xE038,
110 0x20a1, 0x20a2, 0x20a3, 0x20a4,
111 0x20a9, 0x20ab, 0x20a8, 0xE039,
112 0, 0, 0, 0,
113 // F0F0
114 0, 0, 0, 0,
115 0, 0, 0, 0,
116 0, 0, 0, 0,
117 0, 0, 0, 0xE03a
118 };
119
120 // -----------------------------------------------------------------------
121
122 static const sal_Unicode aStarMathTab[224] =
123 {
124 // F020
125 0x0020, 0x0021, 0x0022, 0x0023,
126 0xE080, 0x0025, 0x0026, 0x221e,
127 0x0028, 0x0029, 0x002a, 0x002b,
128 0x002c, 0x002d, 0x002e, 0x002f,
129 // F030
130 0x2224, 0x21d2, 0x21d0, 0x21d4,
131 0xE081, 0xE082, 0x00b0, 0,
132 0, 0, 0x003a, 0x003b,
133 0x003c, 0x003d, 0x003e, 0x00bf,
134 // F040
135 0x2260, 0xE083, 0x2212, 0x2217,
136 0x00d7, 0x22c5, 0x00f7, 0x00b1,
137 0x2213, 0x2295, 0x2296, 0x2297,
138 0x2298, 0x2299, 0x222a, 0x2229,
139 // F050
140 0xE084, 0xE085, 0x2264, 0x2265,
141 0xE086, 0xE087, 0x226a, 0x226b,
142 0x007e, 0x2243, 0x2248, 0x225d,
143 0x2261, 0x221d, 0x2202, 0x2282,
144 // F060
145 0x2283, 0x2286, 0x2287, 0x2284,
146 0x2285, 0x2288, 0x2289, 0x2208,
147 0x2209, 0xE089, 0x2203, 0x220d,
148 0x2135, 0x2111, 0x211c, 0x2118,
149 // F070
150 0xE08a, 0x2221, 0x2222, 0x2223,
151 0x2225, 0x22a5, 0xE08b, 0x22ef,
152 0x22ee, 0x22f0, 0x22f1, 0x22b6,
153 0x22b7, 0xE08c, 0x2216, 0x00ac,
154 // F080
155 0x222b, 0x222c, 0x222d, 0x222e,
156 0x222f, 0x2230, 0x221a, 0xE08d,
157 0xE08e, 0xE08f, 0x2210, 0x220f,
158 0x2211, 0x2207, 0x2200, 0xE090,
159 // F090
160 0xE091, 0xE092, 0xE093, 0xE094,
161 0xE095, 0xE096, 0xE097, 0xE098,
162 0x02d9, 0x00a8, 0xE09b, 0x02da,
163 0x2227, 0x2228, 0x220b, 0x2205,
164 // F0A0
165 0x007b, 0x007d, 0xe09e, 0xe09f,
166 0x2329, 0x232a, 0x005b, 0x005d,
167 0xE0a0, 0x22be, 0xE0a1, 0x2259,
168 0x2254, 0x2255, 0x21b3, 0x2197,
169 // F0B0
170 0x2198, 0x2245, 0x301a, 0x301b,
171 0x2373, 0xE0a5, 0xE0a6, 0x22a4,
172 0x2112, 0x2130, 0x2131, 0,
173 0xE0a7, 0xE0a8, 0xE0a9, 0xE0aa,
174 // F0C0
175 0x2308, 0x230a, 0x2309, 0x230b,
176 0, 0xe0ab, 0xe0ac, 0xe0ad,
177 0xe0ae, 0xe0af, 0xe0b0, 0xe0b1,
178 0xe0b2, 0xe0b3, 0xe0b4, 0xe0b5,
179 // F0D0
180 0xe0b6, 0xe0b7, 0xe0b8, 0xe0b9,
181 0xe0ba, 0xe0bb, 0xe0bc, 0xe0bd,
182 0xe0be, 0xe0bf, 0xe0c0, 0xe0c1,
183 0xe0c2, 0xe0c3, 0xe0c4, 0xe0c5,
184 // F0E0
185 0xe0c6, 0xe0c7, 0xe0c8, 0xe0c9,
186 0xe0ca, 0xe0cb, 0xe0cc, 0xe0cd,
187 0xe0ce, 0xe0cf, 0xe0d0, 0xe0d1,
188 0x03f1, 0xe0d3, 0xe0d4, 0xe0d5,
189 // F0F0
190 0x2113, 0xe0d6, 0x2107, 0x2127,
191 0x210a, 0xe0d9, 0x210f, 0x019b,
192 0xe0db, 0xe0dc, 0xe0dd, 0x2115,
193 0x2124, 0x211a, 0x211d, 0x2102
194 };
195
196 // -----------------------------------------------------------------------
197
198 static const sal_Unicode aWingDingsTab[224] =
199 {
200 // F020
201 0x0020, 0xe400, 0xe401, 0xe402,
202 0xe403, 0xe404, 0xe405, 0xe406,
203 0xe407, 0xe408, 0xe409, 0xe40a,
204 0xe40b, 0xe40c, 0xe40d, 0xe40e,
205 // F030
206 0xe40f, 0xe410, 0xe411, 0xe412,
207 0xe413, 0xe414, 0xe415, 0xe416,
208 0xe417, 0xe418, 0xe419, 0xe41a,
209 0xe41b, 0xe41c, 0x2707, 0xe41d,
210 // F040
211 0xe41e, 0xe41f, 0xe420, 0xe421,
212 0x261c, 0xe423, 0x261d, 0x261f,
213 0x261f, 0xe424, 0xe425, 0xe426,
214 0xe427, 0xe428, 0xe429, 0xe42a,
215 // F050
216 0xe42b, 0xe42c, 0x263c, 0xe42d,
217 0xe42e, 0xe42f, 0xe430, 0xe431,
218 0xe432, 0xe433, 0x262a, 0x262f,
219 0x0950, 0xe434, 0x2648, 0x2649,
220 // F060
221 0x264a, 0x264b, 0x264c, 0x264d,
222 0x264e, 0x264f, 0x2650, 0x2651,
223 0x2652, 0x2653, 0xe435, 0xe436,
224 0xe437, 0xe438, 0xe439, 0xe43a,
225 // F070
226 0xe43b, 0xe43c, 0xe43d, 0xe43e,
227 0xe43f, 0xe440, 0xe441, 0xe442,
228 0xe443, 0x2353, 0x2318, 0xe444,
229 0xe445, 0xe446, 0xe447, 0,
230 // F080
231 0xe448, 0xe449, 0xe44a, 0xe44b,
232 0xe44c, 0xe44d, 0xe44e, 0xe44f,
233 0xe450, 0xe451, 0xe452, 0xe453,
234 0xe454, 0xe455, 0xe456, 0xe457,
235 // F090
236 0xe458, 0xe459, 0xe45a, 0xe45b,
237 0xe45c, 0xe45d, 0xe45e, 0xe45f,
238 0xe460, 0xe461, 0xe462, 0xe463,
239 0xe464, 0xe465, 0xe466, 0xe467,
240 // F0a0
241 0xe468, 0xe469, 0xe46a, 0xe46b,
242 0xe46c, 0xe46d, 0xe46e, 0xe46f,
243 0xe470, 0xe471, 0xe472, 0xe473,
244 0xe474, 0xe475, 0xe476, 0xe477,
245 // F0b0
246 0xe478, 0xe479, 0xe47a, 0xe47b,
247 0xe47c, 0xe47d, 0xe47e, 0xe47f,
248 0xe480, 0xe481, 0xe482, 0xe483,
249 0xe484, 0xe485, 0xe486, 0xe487,
250 // F0c0
251 0xe488, 0xe489, 0xe48a, 0xe48b,
252 0xe48c, 0xe48d, 0xe48e, 0xe48f,
253 0xe490, 0xe491, 0xe492, 0xe493,
254 0xe494, 0xe495, 0xe496, 0xe497,
255 // F0d0
256 0xe498, 0xe499, 0xe49a, 0xe49b,
257 0xe49c, 0x232b, 0x2326, 0xe49d,
258 0xe49e, 0xe49f, 0xe4a0, 0xe4a1,
259 0xe4a2, 0xe4a3, 0xe4a4, 0xe4a5,
260 // F0e0
261 0xe4a6, 0xe4a7, 0xe4a8, 0xe4a9,
262 0xe4aa, 0xe4ab, 0xe4ac, 0xe4ad,
263 0xe4ae, 0xe4af, 0xe4b0, 0xe4b1,
264 0xe4b2, 0xe4b3, 0xe4b4, 0xe4b5,
265 // F0f0
266 0xe4b6, 0xe4b7, 0xe4b8, 0xe4b9,
267 0xe4ba, 0xe4bb, 0xe4bc, 0xe4bd,
268 0xe4be, 0xe4bf, 0xe4c0, 0xe4c1,
269 0xe4c2, 0xe4c3, 0xe4c4, 0xe4c5
270 };
271
272 // -----------------------------------------------------------------------
273
274 static const sal_Unicode aWingDings2Tab[224] =
275 {
276 // F020
277 0x0020, 0xe500, 0xe501, 0xe502,
278 0xe503, 0xe504, 0xe505, 0xe506,
279 0xe507, 0xe508, 0xe509, 0xe50a,
280 0xe50b, 0xe50c, 0xe50d, 0xe50e,
281 // F030
282 0xe50f, 0xe510, 0xe511, 0xe512,
283 0xe513, 0xe514, 0xe515, 0xe516,
284 0xe517, 0xe518, 0xe519, 0xe51a,
285 0xe51b, 0xe51c, 0xe51d, 0xe51e,
286 // F040
287 0xe51f, 0xe520, 0xe521, 0xe522,
288 0xe523, 0xe524, 0xe525, 0xe526,
289 0xe527, 0xe528, 0xe529, 0xe52a,
290 0xe52b, 0xe52c, 0xe52d, 0xe52e,
291 // F050
292 0xe52f, 0xe530, 0xe531, 0xe532,
293 0xe533, 0xe534, 0xe535, 0xe536,
294 0xe537, 0x203D, 0x203D, 0x203D,
295 0xe53b, 0xe53c, 0xe53d, 0xe53e,
296 // F060
297 0xe53f, 0xe540, 0xe541, 0xe542,
298 0xe543, 0xe544, 0xe545, 0xe546,
299 0xe547, 0x24EA, 0x2460, 0x2461,
300 0x2462, 0x2463, 0x2464, 0x2465,
301 // F070
302 0x2466, 0x2467, 0x2468, 0x2469,
303 0xE453, 0x278A, 0x278B, 0x278C,
304 0x278D, 0x278E, 0x278F, 0x2790,
305 0x2791, 0x2792, 0x2793, 0,
306 // F080
307 0x2609, 0x25cb, 0x263d, 0x263e,
308 0xe55d, 0xe55e, 0xe55f, 0xe560,
309 0xe561, 0xe562, 0xe563, 0xe564,
310 0xe565, 0xe566, 0xe567, 0xe568,
311 // F090
312 0xe569, 0xe56a, 0xe56b, 0xe56c,
313 0xe56d, 0xe56e, 0xe56f, 0xe570,
314 0xe571, 0xe572, 0xe573, 0xe574,
315 0xe575, 0xe576, 0xe577, 0xe578,
316 // F0a0
317 0xe579, 0xe57a, 0xe57b, 0xe57c,
318 0xe57d, 0xe57e, 0xe57f, 0xe580,
319 0xe581, 0xe582, 0xe583, 0xe584,
320 0xe585, 0xe586, 0xe587, 0xe588,
321 // F0b0
322 0xe589, 0xe58a, 0xe58b, 0xe58c,
323 0xe58d, 0xe58e, 0xe58f, 0xe590,
324 0xe591, 0xe592, 0xe593, 0xe594,
325 0xe595, 0xe596, 0xe597, 0xe598,
326 // F0c0
327 0xe599, 0xe59a, 0xe59b, 0xe59c,
328 0xe59d, 0xe59e, 0xe59f, 0xe5a0,
329 0xe5a1, 0xe5a2, 0xe5a3, 0xe5a4,
330 0xe5a5, 0xe5a6, 0xe5a7, 0xe5a8,
331 // F0d0
332 0xe5a9, 0xe5aa, 0xe5ab, 0xe5ac,
333 0xe5ad, 0xe5ae, 0xe5af, 0xe5b0,
334 0xe5b1, 0xe5b2, 0xe5b3, 0xe5b4,
335 0xe5b5, 0xe5b6, 0xe5b7, 0xe5b8,
336 // F0e0
337 0xe5b9, 0xe5ba, 0xe5bb, 0xe5bc,
338 0xe5bd, 0xe5be, 0xe5bf, 0xe5c0,
339 0xe5c1, 0xe5c2, 0xe5c3, 0xe5c4,
340 0xe5c5, 0xe5c6, 0xe5c7, 0xe5c8,
341 // F0f0
342 0xe5c9, 0, 0xe5cb, 0xe5cc,
343 0xe5cd, 0xe5ce, 0xe5cf, 0xe5d0,
344 0x203b, 0x2042, 0, 0,
345 0, 0, 0, 0
346 };
347
348 // -----------------------------------------------------------------------
349
350 static const sal_Unicode aWingDings3Tab[224] =
351 {
352 // F020
353 0x0020, 0xe600, 0xe601, 0xe602,
354 0xe603, 0x2196, 0xe604, 0x2199,
355 0xe605, 0xe606, 0xe607, 0xe608,
356 0xe609, 0xe60a, 0xe60b, 0x21de,
357 // F030
358 0x21df, 0xe60c, 0xe60d, 0xe60e,
359 0x21e2, 0x21e1, 0x21e3, 0x21af,
360 0x21b5, 0xe60f, 0xe610, 0xe611,
361 0xe612, 0xe613, 0xe614, 0xe615,
362 // F040
363 0xe616, 0xe617, 0xe618, 0xe619,
364 0x21c4, 0x21c5, 0xe61a, 0xe61b,
365 0x21c7, 0x21c9, 0x21c8, 0x21ca,
366 0x21b6, 0x21b7, 0xe61c, 0xe61d,
367 // F050
368 0x21bb, 0x21ba, 0xe61e, 0x2324,
369 0x2303, 0x2325, 0x2334, 0xe61f,
370 0x21ea, 0xe620, 0xe621, 0xe622,
371 0xe623, 0xe624, 0xe625, 0xe626,
372 // F060
373 0xe627, 0xe628, 0xe629, 0xe62a,
374 0xe62b, 0xe62c, 0xe62d, 0xe62e,
375 0xe62f, 0xe630, 0xe631, 0xe632,
376 0xe633, 0xe634, 0xe635, 0xe636,
377 // F070
378 0xe637, 0xe638, 0x25b3, 0x25bd,
379 0x25c0, 0x25b6, 0x25c1, 0x25b7,
380 0x25e3, 0xe639, 0x25e4, 0x25e5,
381 0x25c2, 0x25b8, 0xe63a, 0,
382 // F080
383 0xe63b, 0xe63c, 0xe63d, 0xe63e,
384 0xe63f, 0xe640, 0xe641, 0xe642,
385 0xe643, 0xe644, 0xe645, 0xe646,
386 0xe647, 0xe648, 0xe649, 0xe64a,
387 // F090
388 0xe64b, 0xe64c, 0xe64d, 0xe64e,
389 0xe64f, 0xe650, 0xe651, 0xe652,
390 0xe653, 0xe654, 0xe655, 0xe656,
391 0xe657, 0xe658, 0xe659, 0xe65a,
392 // F0a0
393 0xe65b, 0xe65c, 0xe65d, 0xe65e,
394 0xe65f, 0xe660, 0xe661, 0xe662,
395 0xe663, 0xe664, 0xe665, 0xe666,
396 0xe667, 0xe668, 0xe669, 0xe66a,
397 // F0b0
398 0xe66b, 0xe66c, 0xe66d, 0xe66e,
399 0xe66f, 0xe670, 0xe671, 0xe672,
400 0xe673, 0xe674, 0xe675, 0xe676,
401 0xe677, 0xe678, 0xe679, 0xe67a,
402 // F0c0
403 0xe67b, 0xe67c, 0xe67d, 0xe67e,
404 0xe67f, 0xe680, 0xe681, 0xe682,
405 0xe683, 0xe684, 0xe685, 0xe686,
406 0xe687, 0xe688, 0xe689, 0xe68a,
407 // F0d0
408 0xe68b, 0xe68c, 0xe68d, 0xe68e,
409 0xe68f, 0xe690, 0xe691, 0xe692,
410 0xe693, 0xe694, 0xe695, 0xe696,
411 0xe697, 0xe698, 0xe699, 0xe69a,
412 // F0e0
413 0xe69b, 0xe69c, 0xe69d, 0xe69e,
414 0xe69f, 0xe6a0, 0xe6a1, 0xe6a2,
415 0xe6a3, 0xe6a4, 0xe6a5, 0xe6a6,
416 0xe6a7, 0xe6a8, 0xe6a9, 0xe6aa,
417 // F0f0
418 0xe6ab, 0, 0, 0,
419 0, 0, 0, 0,
420 0, 0, 0, 0,
421 0, 0, 0, 0
422 };
423
424 // -----------------------------------------------------------------------
425
426 static const sal_Unicode aWebDingsTab[224] =
427 {
428 // F020
429 0x0020, 0xe300, 0xe301, 0xe302,
430 0xe303, 0xe304, 0xe305, 0xe306,
431 0xe307, 0xe308, 0xe309, 0xe30a,
432 0xe30b, 0xe30c, 0xe30d, 0xe30e,
433 // F030
434 0xe30f, 0xe310, 0xe311, 0xe312,
435 0xe313, 0xe314, 0xe315, 0xe316,
436 0xe317, 0xe318, 0xe319, 0xe31a,
437 0xe31b, 0xe31c, 0xe31d, 0xe31e,
438 // F040
439 0xe31f, 0xe320, 0xe321, 0xe322,
440 0xe323, 0xe324, 0xe325, 0xe326,
441 0xe327, 0xe328, 0xe329, 0xe32a,
442 0xe32b, 0xe32c, 0xe32d, 0xe32e,
443 // F050
444 0xe32f, 0xe330, 0xe331, 0xe332,
445 0xe333, 0xe334, 0xe335, 0xe336,
446 0xe337, 0xe338, 0xe339, 0xe33a,
447 0xe33b, 0xe33c, 0xe33d, 0xe33e,
448 // F060
449 0xe33f, 0xe340, 0xe341, 0xe342,
450 0xe343, 0xe344, 0xe345, 0xe346,
451 0xe347, 0xe348, 0xe349, 0xe34a,
452 0xe34b, 0xe34c, 0xe34d, 0xe34e,
453 // F070
454 0xe34f, 0xe350, 0xe351, 0xe352,
455 0xe353, 0xe354, 0xe355, 0xe356,
456 0xe357, 0xe358, 0xe359, 0xe35a,
457 0xe35b, 0xe35c, 0xe35d, 0,
458 // F080
459 0xe35e, 0xe35f, 0xe360, 0xe361,
460 0xe362, 0xe363, 0xe364, 0xe365,
461 0xe366, 0xe367, 0xe368, 0xe369,
462 0xe36a, 0xe36b, 0xe36c, 0xe36d,
463 // F090
464 0xe36e, 0xe36f, 0xe370, 0xe371,
465 0xe372, 0xe373, 0xe374, 0xe375,
466 0xe376, 0xe377, 0xe378, 0xe379,
467 0xe37a, 0xe37b, 0xe37c, 0xe37d,
468 // F0a0
469 0xe37e, 0xe37f, 0xe380, 0xe381,
470 0xe382, 0xe383, 0xe384, 0xe385,
471 0xe386, 0xe387, 0xe388, 0xe389,
472 0xe38a, 0xe38b, 0xe38c, 0xe38d,
473 // F0b0
474 0xe38e, 0xe38f, 0xe390, 0xe391,
475 0xe392, 0xe393, 0xe394, 0xe395,
476 0xe396, 0xe397, 0xe398, 0xe399,
477 0xe39a, 0xe39b, 0xe39c, 0xe39d,
478 // F0c0
479 0xe39e, 0xe39f, 0xe3a0, 0xe3a1,
480 0xe3a2, 0xe3a3, 0xe3a4, 0xe3a5,
481 0xe3a6, 0xe3a7, 0xe3a8, 0xe3a9,
482 0xe3aa, 0xe3ab, 0xe3ac, 0xe3ad,
483 // F0d0
484 0xe3ae, 0xe3af, 0xe3b0, 0xe3b1,
485 0xe3b2, 0xe3b3, 0xe3b4, 0xe3b5,
486 0xe3b6, 0xe3b7, 0xe3b8, 0xe3b9,
487 0xe3ba, 0xe3bb, 0xe3bc, 0xe3bd,
488 // F0e0
489 0xe3be, 0xe3bf, 0xe3c0, 0xe3c1,
490 0xe3c2, 0xe3c3, 0xe3c4, 0xe3c5,
491 0xe3c6, 0xe3c7, 0xe3c8, 0xe3c9,
492 0xe3ca, 0xe3cb, 0xe3cd, 0xe3ce,
493 // F0f0
494 0xe3cf, 0xe3d0, 0xe3d1, 0xe3d2,
495 0xe3d3, 0xe3d4, 0xe3d5, 0xe3d6,
496 0xe3d7, 0xe3d8, 0xe3d9, 0xe3da,
497 0xe3db, 0xe3dc, 0xe3dd, 0xe3de
498 };
499
500 // -----------------------------------------------------------------------
501
502 static const sal_Unicode aAdobeSymbolTab[224] =
503 {
504 //TODO:
505 // F020
506 0x0020, 0xe100, 0xe101, 0xe102,
507 0xe103, 0xe104, 0xe16a, 0xe105,
508 0xe106, 0xe107, 0xe108, 0xe109,
509 0xe10a, 0xe10b, 0xe10c, 0xe10d,
510 // F030
511 0x0030, 0x0031, 0x0032, 0x0033,
512 0x0034, 0x0035, 0x0036, 0x0037,
513 0x0038, 0x0039, 0xe10e, 0xe10f,
514 0xe110, 0xe111, 0xe112, 0x003f,
515 // F040
516 0xe113, 0x0391, 0x0392, 0x03a7,
517 0x0394, 0x0395, 0x03a6, 0x0393,
518 0x0397, 0x0399, 0x03d1, 0x039a,
519 0x039b, 0x039c, 0x039d, 0x039f,
520 // F050
521 0x03a0, 0x0398, 0x03a1, 0x03a3,
522 0x03a4, 0x03a5, 0x03c2, 0x03a9,
523 0x039e, 0x03a8, 0x0396, 0xe114,
524 0x2234, 0xe115, 0xe116, 0x005f,
525 // F060
526 0x00af, 0x03b1, 0x03b2, 0x03c7,
527 0x03b4, 0x03b5, 0x03d5, 0x03b3,
528 0x03b7, 0x03b9, 0x03c6, 0x03ba,
529 0x03bb, 0x03bc, 0x03bd, 0x03bf,
530 // F070
531 0x03c0, 0x03b8, 0x03c1, 0x03c3,
532 0x03c4, 0x03c5, 0x03d6, 0x03c9,
533 0x03be, 0x03c8, 0x03b6, 0xe117,
534 0x007c, 0xe118, 0xe119, 0,
535 // F080
536 0, 0, 0, 0,
537 0, 0, 0, 0,
538 0, 0, 0, 0,
539 0, 0, 0, 0,
540 // F090
541 0, 0, 0, 0,
542 0, 0, 0, 0,
543 0, 0, 0, 0,
544 0, 0, 0, 0,
545 // F0a0
546 0xe11a, 0x03d2, 0x0384, 0xe11b,
547 0x2215, 0xe11c, 0xe11d, 0xe11e,
548 0x2666, 0xe11f, 0xe120, 0xe121,
549 0xe122, 0xe123, 0xe124, 0xe125,
550 // F0b0
551 0xe126, 0xe127, 0x2033, 0xe128,
552 0xe129, 0xe12a, 0xe12b, 0xe12c,
553 0xe12d, 0xe12e, 0xe12f, 0xe130,
554 0xe131, 0x2502, 0x2500, 0x21b2,
555 // F0c0
556 0xe132, 0xe133, 0xe134, 0xe135,
557 0xe136, 0xe137, 0xe138, 0xe139,
558 0xe13a, 0xe13b, 0xe13c, 0xe13d,
559 0xe13e, 0xe13f, 0xe140, 0xe141,
560 // F0d0
561 0x2220, 0xe142, 0x00ae, 0x00a9,
562 0xe143, 0xe144, 0xe145, 0xe146,
563 0xe147, 0xe148, 0xe149, 0xe14a,
564 0xe14b, 0x21d1, 0xe14c, 0x21d3,
565 // F0e0
566 0x25ca, 0xe14d, 0xe14e, 0xe14f,
567 0xe150, 0xe151, 0xe152, 0xe153,
568 0xe154, 0xe155, 0xe156, 0xe157,
569 0xe158, 0xe159, 0xe15a, 0xe15b,
570 // F0f0
571 0, 0xe15c, 0xe15d, 0xe15e,
572 0xe15f, 0xe160, 0xe161, 0xe162,
573 0xe163, 0xe164, 0xe165, 0xe166,
574 0xe167, 0xe168, 0xe169, 0,
575 };
576
577 // -----------------------------------------------------------------------
578
579 static const sal_Unicode aMonotypeSortsTab[224] =
580 {
581 // F020
582 0x0020, 0x2701, 0xe200, 0x2703,
583 0x2704, 0xe201, 0x2706, 0xe202,
584 0xe203, 0xe203, 0xe204, 0xe205,
585 0x270c, 0xe206, 0xe207, 0xe208,
586 // F030
587 0x2710, 0x2711, 0x2712, 0xe209,
588 0xe20a, 0x2715, 0x2716, 0xe20b,
589 0xe20c, 0xe20d, 0xe20e, 0xe20f,
590 0xe210, 0x271d, 0x271e, 0x271f,
591 // F040
592 0x2720, 0xe211, 0xe212, 0xe213,
593 0xe214, 0xe215, 0x2726, 0x2727,
594 0x2605, 0x2729, 0x272a, 0xe216,
595 0xe217, 0xe218, 0xe219, 0xe21a,
596 // F050
597 0xe21b, 0xe21c, 0x2732, 0xe21d,
598 0xe21e, 0xe21f, 0xe220, 0xe221,
599 0xe222, 0xe223, 0x273a, 0x273b,
600 0x273c, 0x273d, 0x273e, 0xe224,
601 // F060
602 0x2740, 0x2741, 0x2742, 0x2743,
603 0xe225, 0x2745, 0x2746, 0x2747,
604 0x2748, 0x2749, 0x274a, 0x274b,
605 0xe226, 0xe227, 0xe228, 0xe229,
606 // F070
607 0xe22a, 0xe22b, 0xe22c, 0x25b2,
608 0x25bc, 0xe22d, 0xe22e, 0xe22f,
609 0x2758, 0xe230, 0x275a, 0x275b,
610 0x275c, 0x275d, 0x275e, 0,
611 // F080
612 0xe231, 0xe232, 0xe233, 0xe234,
613 0xe235, 0xe236, 0xe237, 0xe238,
614 0xe239, 0xe23a, 0xe23b, 0xe23c,
615 0xe23d, 0xe23e, 0, 0,
616 // F090
617 0, 0, 0, 0,
618 0, 0, 0, 0,
619 0, 0, 0, 0,
620 0, 0, 0, 0,
621 // F0a0
622 0, 0xe23f, 0xe240, 0x2763,
623 0x2764, 0x2765, 0x2766, 0x2767,
624 0xe241, 0xe242, 0xe243, 0xe244,
625 0x2460, 0x2461, 0x2462, 0x2463,
626 // F0b0
627 0x2464, 0x2465, 0x2466, 0x2467,
628 0x2468, 0x2469, 0x2776, 0x2777,
629 0x2778, 0x2779, 0x277a, 0x277b,
630 0x277c, 0x277d, 0x277e, 0x277f,
631 // F0c0
632 0xe245, 0xe246, 0xe247, 0xe248,
633 0xe249, 0xe24a, 0xe24b, 0xe24c,
634 0xe24d, 0xe24e, 0xe24f, 0xe250,
635 0xe251, 0xe252, 0xe253, 0xe254,
636 // F0d0
637 0xe255, 0xe256, 0xe257, 0xe258,
638 0xe259, 0xe25a, 0xe25b, 0xe25c,
639 0xe25d, 0x2799, 0xe25e, 0x279b,
640 0x279c, 0x279d, 0x279e, 0x279f,
641 // F0e0
642 0x27a0, 0x27a1, 0xe25f, 0x27a3,
643 0x27a4, 0x27a5, 0x27a6, 0x27a7,
644 0x27a8, 0x27a9, 0x27aa, 0x27ab,
645 0x27ac, 0x27ad, 0x27ae, 0x27af,
646 // F0f0
647 0, 0x27b1, 0xe260, 0x27b3,
648 0x27b4, 0x27b5, 0x27b6, 0x27b7,
649 0xe261, 0x27b9, 0x27ba, 0x27bb,
650 0x27bc, 0x27bd, 0x27be, 0,
651 };
652
653 // -----------------------------------------------------------------------
654
655 /*
656 static const sal_Unicode aMonotypeSorts2Tab[224] =
657 {
658 //TODO:
659 // F020
660 0, 0, 0, 0,
661 0, 0, 0, 0,
662 0, 0, 0, 0,
663 0, 0, 0, 0,
664 // F030
665 0, 0, 0, 0,
666 0, 0, 0, 0,
667 0, 0, 0, 0,
668 0, 0, 0, 0,
669 // F040
670 0, 0, 0, 0,
671 0, 0, 0, 0,
672 0, 0, 0, 0,
673 0, 0, 0, 0,
674 // F050
675 0, 0, 0, 0,
676 0, 0, 0, 0,
677 0, 0, 0, 0,
678 0, 0, 0, 0,
679 // F060
680 0, 0, 0, 0,
681 0, 0, 0, 0,
682 0, 0, 0, 0,
683 0, 0, 0, 0,
684 // F070
685 0, 0, 0, 0,
686 0, 0, 0, 0,
687 0, 0, 0, 0,
688 0, 0, 0, 0,
689 // F080
690 0, 0, 0, 0,
691 0, 0, 0, 0,
692 0, 0, 0, 0,
693 0, 0, 0, 0,
694 // F090
695 0, 0, 0, 0,
696 0, 0, 0, 0,
697 0, 0, 0, 0,
698 0, 0, 0, 0,
699 // F0a0
700 0, 0, 0, 0,
701 0, 0, 0, 0,
702 0, 0, 0, 0,
703 0, 0, 0, 0,
704 // F0b0
705 0, 0, 0, 0,
706 0, 0, 0, 0,
707 0, 0, 0, 0,
708 0, 0, 0, 0,
709 // F0c0
710 0, 0, 0, 0,
711 0, 0, 0, 0,
712 0, 0, 0, 0,
713 0, 0, 0, 0,
714 // F0d0
715 0, 0, 0, 0,
716 0, 0, 0, 0,
717 0, 0, 0, 0,
718 0, 0, 0, 0,
719 // F0e0
720 0, 0, 0, 0,
721 0, 0, 0, 0,
722 0, 0, 0, 0,
723 0, 0, 0, 0,
724 // F0f0
725 0, 0, 0, 0,
726 0, 0, 0, 0,
727 0, 0, 0, 0,
728 0, 0, 0, 0,
729 };
730 */
731
732 static const sal_Unicode aMTExtraTab[224] =
733 {
734 // F020
735 0x0020, 0, 0, 0xE095,
736 0xE091, 0xE096, 0x02D9, 0,
737 0xE093, 0, 0, 0,
738 0, 0, 0, 0,
739 // F030
740 0, 0, 0, 0,
741 0, 0, 0, 0,
742 0, 0, 0, 0,
743 0x25C1, 0, 0x25B7, 0,
744 // F040
745 0, 0, 0x2210, 0x019b,
746 0, 0, 0, 0,
747 0, 0x2229, 0, 0xE08B,
748 0x22EF, 0x22EE, 0x22F0, 0x22F1,
749 // F050
750 0, 0, 0, 0,
751 0, 0, 0, 0,
752 0, 0, 0, 0,
753 0, 0, 0, 0,
754 // F060
755 0xE095, 0, 0xE25C, 0xE4BA,
756 0, 0, 0x210F, 0,
757 0, 0, 0, 0,
758 0x2113, 0x2213, 0, 0x00B0,
759 // F070
760 0, 0, 0xE098, 0,
761 0, 0xE097, 0, 0,
762 0, 0, 0, 0xE081,
763 0, 0xE082, 0, 0,
764 // F080
765 0, 0, 0, 0,
766 0, 0, 0, 0,
767 0, 0, 0, 0,
768 0, 0, 0, 0,
769 // F090
770 0, 0, 0, 0,
771 0, 0, 0, 0,
772 0, 0, 0, 0,
773 0, 0, 0, 0,
774 // F0a0
775 0, 0, 0, 0,
776 0, 0, 0, 0,
777 0, 0, 0, 0,
778 0, 0, 0, 0,
779 // F0b0
780 0, 0, 0, 0,
781 0, 0, 0, 0,
782 0, 0, 0, 0,
783 0, 0, 0, 0,
784 // F0c0
785 0, 0, 0, 0,
786 0, 0, 0, 0,
787 0, 0, 0, 0,
788 0, 0, 0, 0,
789 // F0d0
790 0, 0, 0, 0,
791 0, 0, 0, 0,
792 0, 0, 0, 0,
793 0, 0, 0, 0,
794 // F0e0
795 0, 0, 0, 0,
796 0, 0, 0, 0,
797 0, 0, 0, 0,
798 0, 0, 0, 0,
799 // F0f0
800 0, 0, 0, 0,
801 0, 0, 0, 0,
802 0, 0, 0, 0,
803 0, 0, 0, 0
804 };
805
806
807 //=======================================================================
808
ImplStarSymbolToStarBats(sal_Unicode c)809 static sal_Unicode ImplStarSymbolToStarBats( sal_Unicode c )
810 {
811 switch ( c )
812 {
813 case 0x00A2: c = 0xF0E0; break;
814 case 0x00A4: c = 0xF0E1; break;
815 case 0x00A5: c = 0xF0E2; break;
816 case 0x00A7: c = 0xF0A7; break;
817 case 0x00AB: c = 0xF0AB; break;
818 case 0x00B6: c = 0xF0DE; break;
819 case 0x00BB: c = 0xF0BB; break;
820
821 case 0x0152: c = 0xF08C; break;
822 case 0x0153: c = 0xF09C; break;
823 case 0x0160: c = 0xF08A; break;
824 case 0x0161: c = 0xF09A; break;
825 case 0x0178: c = 0xF09F; break;
826 case 0x017D: c = 0xF08E; break;
827 case 0x017E: c = 0xF09E; break;
828
829 case 0x0192: c = 0xF083; break;
830 case 0x02C6: c = 0xF088; break;
831 case 0x02DC: c = 0xF098; break;
832 case 0x2013: c = 0xF096; break;
833 case 0x2014: c = 0xF097; break;
834 case 0x2018: c = 0xF091; break;
835
836 case 0x2019: c = 0xF092; break;
837 case 0x201A: c = 0xF082; break;
838 case 0x201C: c = 0xF093; break;
839 case 0x201D: c = 0xF094; break;
840 case 0x201E: c = 0xF084; break;
841 case 0x2020: c = 0xF086; break;
842
843 case 0x2021: c = 0xF087; break;
844 case 0x2022: c = 0xF095; break;
845 case 0x2026: c = 0xF085; break;
846 case 0x2030: c = 0xF089; break;
847 case 0x2039: c = 0xF08B; break;
848 case 0x203A: c = 0xF09B; break;
849
850 case 0x20A1: c = 0xF0E4; break;
851 case 0x20A2: c = 0xF0E5; break;
852 case 0x20A3: c = 0xF0E6; break;
853 case 0x20A4: c = 0xF0E7; break;
854 case 0x20A8: c = 0xF0EA; break;
855 case 0x20A9: c = 0xF0E8; break;
856 case 0x20AB: c = 0xF0E9; break;
857 case 0x20AC: c = 0xF080; break;
858
859 case 0x2122: c = 0xF099; break;
860 case 0x2190: c = 0xF0B7; break;
861 case 0x2191: c = 0xF0B8; break;
862 case 0x2192: c = 0xF0B5; break;
863 case 0x2193: c = 0xF0B6; break;
864 case 0x2194: c = 0xF0D8; break;
865 case 0x2195: c = 0xF0D9; break;
866
867 case 0x21E4: c = 0xF0B4; break;
868 case 0x21E5: c = 0xF0B3; break;
869 case 0x21E6: c = 0xF0A4; break;
870 case 0x21E7: c = 0xF0B2; break;
871 case 0x21E8: c = 0xF0AF; break;
872 case 0x21E9: c = 0xF0A3; break;
873
874 case 0x25A0: c = 0xF024; break;
875 case 0x25A1: c = 0xF025; break;
876 case 0x25B4: c = 0xF0C5; break;
877 case 0x25B5: c = 0xF0C7; break;
878 case 0x25BE: c = 0xF0C4; break;
879 case 0x25BF: c = 0xF0C6; break;
880 case 0x25C6: c = 0xF043; break;
881 case 0x25CF: c = 0xF022; break;
882 case 0x25D7: c = 0xF0D0; break;
883
884 case 0x260E: c = 0xF074; break;
885 case 0x2611: c = 0xF034; break;
886 case 0x2612: c = 0xF033; break;
887 case 0x261B: c = 0xF036; break;
888 case 0x261E: c = 0xF07D; break;
889 case 0x2639: c = 0xF0AD; break;
890 case 0x263A: c = 0xF021; break;
891
892 case 0x2702: c = 0xF0CB; break;
893 case 0x2708: c = 0xF0CC; break;
894 case 0x270D: c = 0xF07E; break;
895 case 0x270E: c = 0xF038; break;
896
897 case 0x2713: c = 0xF039; break;
898 case 0x2714: c = 0xF03A; break;
899 case 0x2717: c = 0xF04F; break;
900 case 0x2718: c = 0xF050; break;
901 case 0x2719: c = 0xF051; break;
902 case 0x271A: c = 0xF052; break;
903 case 0x271B: c = 0xF053; break;
904 case 0x271C: c = 0xF054; break;
905
906 case 0x2721: c = 0xF0CD; break;
907 case 0x2722: c = 0xF044; break;
908 case 0x2723: c = 0xF045; break;
909 case 0x2724: c = 0xF046; break;
910 case 0x2725: c = 0xF047; break;
911 case 0x272B: c = 0xF055; break;
912 case 0x272C: c = 0xF056; break;
913 case 0x272D: c = 0xF057; break;
914 case 0x272E: c = 0xF058; break;
915 case 0x272F: c = 0xF059; break;
916
917 case 0x2730: c = 0xF05A; break;
918 case 0x2733: c = 0xF048; break;
919 case 0x2734: c = 0xF049; break;
920 case 0x2735: c = 0xF04A; break;
921 case 0x2736: c = 0xF04B; break;
922 case 0x2737: c = 0xF04C; break;
923 case 0x2738: c = 0xF04D; break;
924 case 0x2739: c = 0xF04E; break;
925 case 0x273F: c = 0xF0CE; break;
926
927 case 0x2744: c = 0xF0CF; break;
928 case 0x274D: c = 0xF023; break;
929 case 0x274F: c = 0xF03E; break;
930 case 0x2750: c = 0xF03F; break;
931 case 0x2751: c = 0xF027; break;
932 case 0x2752: c = 0xF028; break;
933 case 0x2756: c = 0xF02C; break;
934 case 0x2759: c = 0xF0D1; break;
935 case 0x2762: c = 0xF0D4; break;
936
937 case 0x2780: c = 0xF068; break;
938 case 0x2781: c = 0xF069; break;
939 case 0x2782: c = 0xF06A; break;
940 case 0x2783: c = 0xF06B; break;
941 case 0x2784: c = 0xF06C; break;
942 case 0x2785: c = 0xF06D; break;
943 case 0x2786: c = 0xF06E; break;
944 case 0x2787: c = 0xF06F; break;
945 case 0x2788: c = 0xF070; break;
946 case 0x2789: c = 0xF071; break;
947 case 0x278A: c = 0xF05D; break;
948 case 0x278B: c = 0xF05E; break;
949 case 0x278C: c = 0xF05F; break;
950 case 0x278D: c = 0xF060; break;
951 case 0x278E: c = 0xF061; break;
952 case 0x278F: c = 0xF062; break;
953
954 case 0x2790: c = 0xF063; break;
955 case 0x2791: c = 0xF064; break;
956 case 0x2792: c = 0xF065; break;
957 case 0x2793: c = 0xF066; break;
958 case 0x2794: c = 0xF031; break;
959 case 0x2798: c = 0xF0DA; break;
960 case 0x279A: c = 0xF0DB; break;
961
962 case 0x27A2: c = 0xF02F; break;
963 case 0x27B2: c = 0xF035; break;
964 case 0x27B8: c = 0xF0DC; break;
965
966 case 0xE000: c = 0xF000+38; break;
967 case 0xE001: c = 0xF000+41; break;
968 case 0xE002: c = 0xF000+42; break;
969 case 0xE003: c = 0xF000+43; break;
970 case 0xE004: c = 0xF000+45; break;
971 case 0xE005: c = 0xF000+46; break;
972 case 0xE006: c = 0xF000+48; break;
973 case 0xE007: c = 0xF000+57; break;
974
975 case 0xE008: c = 0xF000+59; break;
976 case 0xE009: c = 0xF000+60; break;
977 case 0xE00a: c = 0xF000+61; break;
978 case 0xE00b: c = 0xF000+64; break;
979 case 0xE00c: c = 0xF000+65; break;
980 case 0xE00d: c = 0xF000+66; break;
981 case 0xE00e: c = 0xF000+67; break;
982 case 0xE00f: c = 0xF000+92; break;
983
984 case 0xE010: c = 0xF000+103; break;
985 case 0xE011: c = 0xF000+114; break;
986 case 0xE012: c = 0xF000+115; break;
987 case 0xE013: c = 0xF000+117; break;
988 case 0xE014: c = 0xF000+118; break;
989 case 0xE015: c = 0xF000+119; break;
990 case 0xE016: c = 0xF000+120; break;
991 case 0xE017: c = 0xF000+121; break;
992
993 case 0xE018: c = 0xF000+122; break;
994 case 0xE019: c = 0xF000+123; break;
995 case 0xE01a: c = 0xF000+124; break;
996 case 0xE01b: c = 0xF000+126; break;
997 case 0xE01c: c = 0xF000+136; break;
998 case 0xE01d: c = 0xF000+155; break;
999 case 0xE01e: c = 0xF000+165; break;
1000 case 0xE01f: c = 0xF000+166; break;
1001
1002 case 0xE020: c = 0xF000+168; break;
1003 case 0xE021: c = 0xF000+169; break;
1004 case 0xE022: c = 0xF000+170; break;
1005 case 0xE023: c = 0xF000+172; break;
1006 case 0xE024: c = 0xF000+174; break;
1007 case 0xE025: c = 0xF000+175; break;
1008 case 0xE026: c = 0xF000+176; break;
1009 case 0xE027: c = 0xF000+177; break;
1010
1011 case 0xE028: c = 0xF000+178; break;
1012 case 0xE029: c = 0xF000+185; break;
1013 case 0xE02a: c = 0xF000+186; break;
1014 case 0xE02b: c = 0xF000+188; break;
1015 case 0xE02c: c = 0xF000+189; break;
1016 case 0xE02d: c = 0xF000+190; break;
1017 case 0xE02e: c = 0xF000+191; break;
1018 case 0xE02f: c = 0xF000+192; break;
1019
1020 case 0xE030: c = 0xF000+193; break;
1021 case 0xE031: c = 0xF000+194; break;
1022 case 0xE032: c = 0xF000+195; break;
1023 case 0xE033: c = 0xF000+200; break;
1024 case 0xE034: c = 0xF000+201; break;
1025 case 0xE035: c = 0xF000+202; break;
1026 case 0xE036: c = 0xF000+210; break;
1027 case 0xE037: c = 0xF000+211; break;
1028
1029 case 0xE038: c = 0xF000+227; break;
1030 case 0xE039: c = 0xF000+235; break;
1031 case 0xE03a: c = 0xF000+255; break;
1032
1033 default: c = 0; break;
1034 }
1035
1036 return c;
1037 }
1038
1039 enum SymbolFont
1040 {
1041 Symbol=1, Wingdings=2, MonotypeSorts=4, Webdings=8, Wingdings2=16,
1042 Wingdings3=32, MTExtra=64, TimesNewRoman=128
1043 };
1044
1045 const char *aSymbolNames[] =
1046 {
1047 "Symbol", "Wingdings", "Monotype Sorts", "Webdings", "Wingdings 2",
1048 "Wingdings 3", "MT Extra", "Times New Roman"
1049 };
1050
1051 struct SymbolEntry
1052 {
1053 sal_uInt8 cIndex;
1054 enum SymbolFont eFont;
1055 };
1056
1057 class StarSymbolToMSMultiFontImpl : public StarSymbolToMSMultiFont
1058 {
1059 private:
1060 ::std::multimap<sal_Unicode, SymbolEntry> maMagicMap;
1061 public:
1062 StarSymbolToMSMultiFontImpl(bool bPerfectOnly);
1063 String ConvertChar(sal_Unicode &rChar);
1064 String ConvertString(String &rString, xub_StrLen& rIndex);
1065 };
1066
1067 struct ExtraTable { sal_Unicode cStar; sal_uInt8 cMS;};
1068
1069 ExtraTable aWingDingsExtraTab[] =
1070 {
1071 {0x25cf, 0x6C}, {0x2714, 0xFC}, {0x2717, 0xFB}, {0x2794, 0xE8},
1072 {0x27a2, 0xD8}, {0xe000, 0x6F}, {0xe001, 0x73}, {0xe002, 0x74},
1073 {0xe003, 0x75}, {0xe004, 0x77}, {0xe005, 0xA6}, {0xe006, 0xE0},
1074 {0xe007, 0xFC}, {0xe008, 0x6C}, {0xe009, 0x6D}, {0xe00a, 0x6E},
1075 {0xe00b, 0x72}, {0xe00c, 0x75}, {0xe00d, 0x76}, {0xe00e, 0x74},
1076 {0xe00f, 0x8B}, {0xe010, 0x80}, {0xe011, 0x2B}, {0xe012, 0x3A},
1077 {0xe013, 0x5D}, {0xe014, 0x29}, {0xe015, 0x3A}, {0xe016, 0x3C},
1078 {0xe017, 0x38}, {0xe018, 0x3A}, {0xe019, 0x2A}, {0xe01a, 0x2B},
1079 {0xe01b, 0x3F}, {0xe01c, 0x9F}, {0xe01d, 0x80}, {0xe01e, 0x8B},
1080 {0xe023, 0x4A}, {0xe025, 0xF0}, {0xe026, 0xF2}, {0xe027, 0xEF},
1081 {0xe028, 0xF1}, {0xe029, 0x52}, {0xe02a, 0x29}, {0xe02b, 0xE0},
1082 {0xe02c, 0xE2}, {0xe02d, 0xDF}, {0xe02e, 0xE1}, {0xe02f, 0xAC},
1083 {0xe030, 0xAD}, {0xe031, 0xAE}, {0xe032, 0x7C}, {0xe033, 0x43},
1084 {0xe034, 0x4D}, {0xe0aa, 0x71}, {0xe422, 0x44}
1085 };
1086
1087 ExtraTable aSymbolExtraTab2[] =
1088 {
1089 {0x0020, 0x20}, {0x00A0, 0x20}, {0x0021, 0x21}, {0x2200, 0x22},
1090 {0x0023, 0x23}, {0x2203, 0x24}, {0x0025, 0x25}, {0x0026, 0x26},
1091 {0x220B, 0x27}, {0x0028, 0x28}, {0x0029, 0x29}, {0x2217, 0x2A},
1092 {0x002B, 0x2B}, {0x002C, 0x2C}, {0x2212, 0x2D}, {0x002E, 0x2E},
1093 {0x002F, 0x2F}, {0x003A, 0x3A}, {0x003B, 0x3B}, {0x003C, 0x3C},
1094 {0x003D, 0x3D}, {0x003E, 0x3E}, {0x2245, 0x40}, {0x2206, 0x44},
1095 {0x2126, 0x57}, {0x005B, 0x5B}, {0x005D, 0x5D}, {0x22A5, 0x5E},
1096 {0x03C6, 0x66}, {0x03D5, 0x6A}, {0x00B5, 0x6D}, {0x007B, 0x7B},
1097 {0x007C, 0x7C}, {0x007D, 0x7D}, {0x223C, 0x7E}, {0x20AC, 0xA0},
1098 {0x2032, 0xA2}, {0x2264, 0xA3}, {0x2044, 0xA4}, {0x221E, 0xA5},
1099 {0x0192, 0xA6}, {0x2663, 0xA7}, {0x2665, 0xA9}, {0x2660, 0xAA},
1100 {0x2194, 0xAB}, {0x2190, 0xAC}, {0x2191, 0xAD}, {0x2192, 0xAE},
1101 {0x2193, 0xAF}, {0x00B0, 0xB0}, {0x00B1, 0xB1}, {0x2265, 0xB3},
1102 {0x00D7, 0xB4}, {0x221D, 0xB5}, {0x2202, 0xB6}, {0x2022, 0xB7},
1103 {0x00F7, 0xB8}, {0x2260, 0xB9}, {0x2261, 0xBA}, {0x2248, 0xBB},
1104 {0x2026, 0xBC}, {0x21B5, 0xBF}, {0x2135, 0xC0}, {0x2111, 0xC1},
1105 {0x211C, 0xC2}, {0x2118, 0xC3}, {0x2297, 0xC4}, {0x2295, 0xC5},
1106 {0x2205, 0xC6}, {0x2229, 0xC7}, {0x222A, 0xC8}, {0x2283, 0xC9},
1107 {0x2287, 0xCA}, {0x2284, 0xCB}, {0x2282, 0xCC}, {0x2286, 0xCD},
1108 {0x2208, 0xCE}, {0x2209, 0xCF}, {0x2207, 0xD1}, {0x220F, 0xD5},
1109 {0x221A, 0xD6}, {0x22C5, 0xD7}, {0x00AC, 0xD8}, {0x2227, 0xD9},
1110 {0x2228, 0xDA}, {0x21D4, 0xDB}, {0x21D0, 0xDC}, {0x21D2, 0xDE},
1111 {0x2329, 0xE1}, {0x2211, 0xE5}, {0x232A, 0xF1}, {0x222B, 0xF2},
1112 {0x2320, 0xF3}, {0x2321, 0xF5}, {0x2013, 0x2D}
1113 };
1114
1115 ExtraTable aSymbolExtraTab[] =
1116 {
1117 {0xe021, 0xD3}, {0xe024, 0xD2}, {0xe035, 0x20}, {0xe036, 0x28},
1118 {0xe037, 0x29}, {0xe039, 0x20}, {0xe083, 0x2B}, {0xe084, 0x3C},
1119 {0xe085, 0x3E}, {0xe086, 0xA3}, {0xe087, 0xB3}, {0xe089, 0xCE},
1120 {0xe08a, 0xA6}, {0xe08c, 0xAE}, {0xe08d, 0xD6}, {0xe08e, 0xD6},
1121 {0xe08f, 0xD6}, {0xe094, 0xA2}, {0xe09e, 0x28}, {0xe09f, 0x29},
1122 {0xe0a0, 0xD0}, {0xe0a6, 0xA2}, {0xe0a7, 0x7C}, {0xe0a8, 0x2F},
1123 {0xe0ab, 0x7C}, {0xe0ac, 0x47}, {0xe0ad, 0x44}, {0xe0ae, 0x51},
1124 {0xe0af, 0x4C}, {0xe0b0, 0x58}, {0xe0b1, 0x50}, {0xe0b2, 0x53},
1125 {0xe0b3, 0x55}, {0xe0b4, 0x46}, {0xe0b5, 0x59}, {0xe0b6, 0x57},
1126 {0xe0b7, 0x61}, {0xe0b8, 0x62}, {0xe0b9, 0x67}, {0xe0ba, 0x64},
1127 {0xe0bb, 0x65}, {0xe0bc, 0x7A}, {0xe0bd, 0x68}, {0xe0be, 0x71},
1128 {0xe0bf, 0x69}, {0xe0c0, 0x6B}, {0xe0c1, 0x6C}, {0xe0c2, 0x6D},
1129 {0xe0c3, 0x6E}, {0xe0c4, 0x78}, {0xe0c5, 0x6F}, {0xe0c6, 0x70},
1130 {0xe0c7, 0x72}, {0xe0c8, 0x73}, {0xe0c9, 0x74}, {0xe0ca, 0x75},
1131 {0xe0cb, 0x66}, {0xe0cc, 0x63}, {0xe0cd, 0x79}, {0xe0ce, 0x77},
1132 {0xe0cf, 0x65}, {0xe0d0, 0x4A}, {0xe0d1, 0x76}, {0xe0d3, 0x56},
1133 {0xe0d4, 0x6A}, {0xe0d5, 0xB6}, {0xe0d6, 0x69}, {0xe0db, 0xAC},
1134 {0xe0dc, 0xAD}, {0xe0dd, 0xAF}
1135 };
1136
1137 ExtraTable aTNRExtraTab[] =
1138 {
1139 {0xe021, 0xA9},
1140 {0xe022, 0x40},
1141 {0xe024, 0xAE},
1142 {0xe035, 0x20},
1143 {0xe036, '('},
1144 {0xe037, ')'},
1145 {0xe039, 0x20},
1146 {0xe03a, 0x80},
1147 {0xe080, 0x89},
1148 {0xe083, '+'},
1149 {0xe084, '<'},
1150 {0xe085, '>'},
1151 {0xe0a9, '\\'}
1152 };
1153
StarSymbolToMSMultiFontImpl(bool bPerfectOnly)1154 StarSymbolToMSMultiFontImpl::StarSymbolToMSMultiFontImpl(bool bPerfectOnly)
1155 {
1156 struct ConvertTable
1157 {
1158 enum SymbolFont meFont;
1159 const sal_Unicode* pTab;
1160 };
1161
1162 //In order of preference
1163 const ConvertTable aConservativeTable[] =
1164 {
1165 {Symbol, aAdobeSymbolTab},
1166 {Wingdings, aWingDingsTab},
1167 {MonotypeSorts, aMonotypeSortsTab},
1168 {Webdings, aWebDingsTab},
1169 {Wingdings2, aWingDings2Tab},
1170 {Wingdings3, aWingDings3Tab},
1171 {MTExtra, aMTExtraTab}
1172 };
1173
1174 struct ExtendedConvertTable
1175 {
1176 enum SymbolFont meFont;
1177 const ExtraTable *mpTable;
1178 size_t mnSize;
1179 ExtendedConvertTable(SymbolFont eFont, const ExtraTable *pTable,
1180 size_t nSize)
1181 : meFont(eFont), mpTable(pTable), mnSize(nSize) {}
1182 };
1183
1184 //Reverse map from a given starsymbol char to exact matches in ms symbol
1185 //fonts.
1186 int nEntries = sizeof(aConservativeTable) / sizeof(aConservativeTable[0]);
1187 int i;
1188 for (i = 0; i < nEntries; ++i)
1189 {
1190 const ConvertTable& r = aConservativeTable[i];
1191 SymbolEntry aEntry;
1192 aEntry.eFont = r.meFont;
1193 for (aEntry.cIndex = 0xFF; aEntry.cIndex >= 0x20; --aEntry.cIndex)
1194 {
1195 if (sal_Unicode cChar = r.pTab[aEntry.cIndex-0x20])
1196 maMagicMap.insert(
1197 ::std::multimap<sal_Unicode, SymbolEntry>::value_type(
1198 cChar, aEntry));
1199 }
1200 }
1201
1202 //In order of preference
1203 const ExtendedConvertTable aAgressiveTable[] =
1204 {
1205 ExtendedConvertTable(Symbol, aSymbolExtraTab2,
1206 sizeof(aSymbolExtraTab2)),
1207 ExtendedConvertTable(Symbol, aSymbolExtraTab,
1208 sizeof(aSymbolExtraTab)),
1209 ExtendedConvertTable(Wingdings, aWingDingsExtraTab,
1210 sizeof(aWingDingsExtraTab)),
1211 ExtendedConvertTable(TimesNewRoman, aTNRExtraTab,
1212 sizeof(aTNRExtraTab))
1213 };
1214
1215 //Allow extra conversions that are not perfect, but "good enough"
1216 if (!bPerfectOnly)
1217 nEntries = sizeof(aAgressiveTable) / sizeof(aAgressiveTable[0]);
1218 else
1219 nEntries = 1;
1220
1221 for (i = 0; i < nEntries; ++i)
1222 {
1223 const ExtendedConvertTable& r = aAgressiveTable[i];
1224 SymbolEntry aEntry;
1225 aEntry.eFont = r.meFont;
1226 for (int j = r.mnSize / sizeof(r.mpTable[0]); j >=0; --j)
1227 {
1228 aEntry.cIndex = r.mpTable[j].cMS;
1229 maMagicMap.insert(
1230 ::std::multimap<sal_Unicode, SymbolEntry>::value_type(
1231 r.mpTable[j].cStar, aEntry));
1232 }
1233 }
1234 }
1235
SymbolFontToString(int nResult)1236 const char *SymbolFontToString(int nResult)
1237 {
1238 const char **ppName = aSymbolNames;
1239 int nI = Symbol;
1240 while (nI <= nResult)
1241 {
1242 if (!(nI & nResult))
1243 nI = nI << 1;
1244 else
1245 break;
1246 ppName++;
1247 }
1248 return *ppName;
1249 }
1250
ConvertChar(sal_Unicode & rChar)1251 String StarSymbolToMSMultiFontImpl::ConvertChar(sal_Unicode &rChar)
1252 {
1253 String sRet;
1254
1255 ::std::multimap<sal_Unicode, SymbolEntry>::const_iterator aResult =
1256 maMagicMap.find(rChar);
1257
1258 if (aResult != maMagicMap.end())
1259 {
1260 const SymbolEntry &rEntry = (*aResult).second;
1261 sRet.AssignAscii(SymbolFontToString(rEntry.eFont));
1262 rChar = rEntry.cIndex;
1263 }
1264
1265 return sRet;
1266 }
1267
ConvertString(String & rString,xub_StrLen & rIndex)1268 String StarSymbolToMSMultiFontImpl::ConvertString(String &rString,
1269 xub_StrLen& rIndex)
1270 {
1271 typedef ::std::multimap<sal_Unicode, SymbolEntry>::iterator MI;
1272 typedef ::std::pair<MI, MI> Result;
1273
1274 String sRet;
1275
1276 xub_StrLen nLen = rString.Len();
1277 if (rIndex >= nLen)
1278 return sRet;
1279
1280 int nTotal = 0, nResult = 0;
1281 ::std::vector<Result> aPossibilities;
1282 aPossibilities.reserve(nLen - rIndex);
1283 xub_StrLen nStart = rIndex;
1284 do
1285 {
1286 Result aResult = maMagicMap.equal_range(rString.GetChar(rIndex));
1287 int nBitfield = 0;
1288 for (MI aIndex = aResult.first; aIndex != aResult.second; ++aIndex)
1289 nBitfield |= aIndex->second.eFont;
1290
1291 if (!nTotal)
1292 nTotal = nBitfield;
1293 else
1294 {
1295 if (nTotal != nBitfield) //Allow a series of failures
1296 {
1297 nTotal &= nBitfield;
1298 if (!nTotal)
1299 break;
1300 }
1301 }
1302 nResult = nTotal;
1303 if (nResult) //Don't bother storing a series of failures
1304 aPossibilities.push_back(aResult);
1305 ++rIndex;
1306 }while(rIndex < nLen);
1307
1308 if (nResult)
1309 {
1310 int nI = Symbol;
1311 while (nI <= nResult)
1312 {
1313 if (!(nI & nResult))
1314 nI = nI << 1;
1315 else
1316 break;
1317 }
1318 sRet.AssignAscii(SymbolFontToString(nI));
1319
1320 xub_StrLen nSize = sal::static_int_cast<xub_StrLen>(aPossibilities.size());
1321 for(xub_StrLen nPos = 0; nPos < nSize; ++nPos)
1322 {
1323 const Result &rResult = aPossibilities[nPos];
1324
1325 for (MI aIndex = rResult.first; aIndex != rResult.second; ++aIndex)
1326 {
1327 if (aIndex->second.eFont == nI)
1328 {
1329 rString.SetChar(nPos+nStart, aIndex->second.cIndex);
1330 break;
1331 }
1332 }
1333 }
1334 }
1335
1336 return sRet;
1337 }
1338
CreateStarSymbolToMSMultiFont(bool bPerfectOnly)1339 StarSymbolToMSMultiFont *CreateStarSymbolToMSMultiFont(bool bPerfectOnly)
1340 {
1341 return new StarSymbolToMSMultiFontImpl(bPerfectOnly);
1342 }
1343
1344 //=======================================================================
1345
RecodeChar(sal_Unicode cChar) const1346 sal_Unicode ConvertChar::RecodeChar( sal_Unicode cChar ) const
1347 {
1348 sal_Unicode cRetVal = 0;
1349 if( mpCvtFunc )
1350 {
1351 // use a conversion function for recoding
1352 cRetVal = mpCvtFunc( cChar );
1353 }
1354 else
1355 {
1356 // use a conversion table for recoding
1357 sal_Unicode cIndex = cChar;
1358 // allow symbol aliasing
1359 if( cIndex & 0xFF00 )
1360 cIndex -= 0xF000;
1361 // recode the symbol
1362 if( cIndex>=0x0020 && cIndex<=0x00FF )
1363 cRetVal = mpCvtTab[ cIndex - 0x0020 ];
1364 }
1365
1366 return cRetVal ? cRetVal : cChar;
1367 }
1368
1369 // -----------------------------------------------------------------------
1370
1371 // recode the string assuming the character codes are symbol codes
1372 // from an traditional symbol font (i.e. U+F020..U+F0FF)
RecodeString(String & rStr,xub_StrLen nIndex,xub_StrLen nLen) const1373 void ConvertChar::RecodeString( String& rStr, xub_StrLen nIndex, xub_StrLen nLen ) const
1374 {
1375 sal_uLong nLastIndex = (sal_uLong)nIndex + nLen;
1376 if( nLastIndex > rStr.Len() )
1377 nLastIndex = rStr.Len();
1378
1379 for(; nIndex < nLastIndex; ++nIndex )
1380 {
1381 sal_Unicode cOrig = rStr.GetChar( nIndex );
1382 // only recode symbols and their U+00xx aliases
1383 if( ((cOrig < 0x0020) || (cOrig > 0x00FF))
1384 && ((cOrig < 0xF020) || (cOrig > 0xF0FF)) )
1385 continue;
1386
1387 // recode a symbol
1388 sal_Unicode cNew = RecodeChar( cOrig );
1389 if( cOrig != cNew )
1390 rStr.SetChar( nIndex, cNew );
1391 }
1392 }
1393
1394 //=======================================================================
1395
1396 struct RecodeTable { const char* pOrgName; ConvertChar aCvt;};
1397
1398 static RecodeTable aRecodeTable[] =
1399 {
1400 // the first two entries must be StarMath and StarBats; do not reorder!
1401 // reason: grep -F for FONTTOSUBSFONT_ONLYOLDSOSYMBOLFONTS
1402 {"starbats", {aStarBatsTab, "StarSymbol", NULL}},
1403 {"starmath", {aStarMathTab, "StarSymbol", NULL}},
1404
1405 {"symbol", {aAdobeSymbolTab, "StarSymbol", NULL}},
1406 {"standardsymbols", {aAdobeSymbolTab, "StarSymbol", NULL}},
1407 {"standardsymbolsl",{aAdobeSymbolTab, "StarSymbol", NULL}},
1408
1409 {"monotypesorts", {aMonotypeSortsTab, "StarSymbol", NULL}},
1410 // {"monotypesorts2", {aMonotypeSorts2Tab, "StarSymbol", NULL}}
1411 {"zapfdingbats", {aMonotypeSortsTab, "StarSymbol", NULL}}, //ZapfDingbats=MonotypeSorts-X?
1412 {"itczapfdingbats", {aMonotypeSortsTab, "StarSymbol", NULL}},
1413 {"dingbats", {aMonotypeSortsTab, "StarSymbol", NULL}},
1414
1415 {"webdings", {aWebDingsTab, "StarSymbol", NULL}},
1416 {"wingdings", {aWingDingsTab, "StarSymbol", NULL}},
1417 {"wingdings2", {aWingDings2Tab, "StarSymbol", NULL}},
1418 {"wingdings3", {aWingDings3Tab, "StarSymbol", NULL}},
1419 {"mtextra", {aMTExtraTab, "StarSymbol", NULL}}
1420 };
1421
1422 static ConvertChar aImplStarSymbolCvt = { NULL, "StarBats", ImplStarSymbolToStarBats };
1423
1424 // -----------------------------------------------------------------------
1425
GetRecodeData(const String & rOrgFontName,const String & rMapFontName)1426 const ConvertChar* ConvertChar::GetRecodeData( const String& rOrgFontName, const String& rMapFontName )
1427 {
1428 const ConvertChar* pCvt = NULL;
1429 String aOrgName( rOrgFontName );
1430 GetEnglishSearchFontName( aOrgName );
1431 String aMapName( rMapFontName );
1432 GetEnglishSearchFontName( aMapName );
1433
1434 if( aMapName.EqualsAscii( "starsymbol" )
1435 || aMapName.EqualsAscii( "opensymbol" ) )
1436 {
1437 int nEntries = sizeof(aRecodeTable) / sizeof(aRecodeTable[0]);
1438 for( int i = 0; i < nEntries; ++i)
1439 {
1440 RecodeTable& r = aRecodeTable[i];
1441 if( aOrgName.EqualsAscii( r.pOrgName ) )
1442 { pCvt = &r.aCvt; break; }
1443 }
1444 }
1445 else if( aMapName.EqualsAscii( "starbats" ) )
1446 {
1447 if( aOrgName.EqualsAscii( "starsymbol" ) )
1448 pCvt = &aImplStarSymbolCvt;
1449 else if( aOrgName.EqualsAscii( "opensymbol" ) )
1450 pCvt = &aImplStarSymbolCvt;
1451 }
1452
1453 return pCvt;
1454 }
1455
1456 //=======================================================================
1457
CreateFontToSubsFontConverter(const String & rOrgName,sal_uLong nFlags)1458 FontToSubsFontConverter CreateFontToSubsFontConverter(
1459 const String& rOrgName, sal_uLong nFlags )
1460 {
1461 const ConvertChar* pCvt = NULL;
1462
1463 String aName = rOrgName;
1464 GetEnglishSearchFontName( aName );
1465
1466 if ( nFlags & FONTTOSUBSFONT_IMPORT )
1467 {
1468 int nEntries = sizeof(aRecodeTable) / sizeof(aRecodeTable[0]);
1469 if ( nFlags & FONTTOSUBSFONT_ONLYOLDSOSYMBOLFONTS ) // only StarMath+StarBats
1470 nEntries = 2;
1471 for( int i = 0; i < nEntries; ++i )
1472 {
1473 RecodeTable& r = aRecodeTable[i];
1474 if( aName.EqualsAscii( r.pOrgName ) )
1475 { pCvt = &r.aCvt; break; }
1476 }
1477 }
1478 else
1479 {
1480 // TODO: FONTTOSUBSFONT_ONLYOLDSOSYMBOLFONTS
1481 if( aName.EqualsAscii( "starsymbol" ) ) pCvt = &aImplStarSymbolCvt;
1482 else if( aName.EqualsAscii( "opensymbol" ) ) pCvt = &aImplStarSymbolCvt;
1483 }
1484
1485 return (FontToSubsFontConverter)pCvt;
1486 }
1487
1488 // -----------------------------------------------------------------------
1489
DestroyFontToSubsFontConverter(FontToSubsFontConverter)1490 void DestroyFontToSubsFontConverter( FontToSubsFontConverter )
1491 {
1492 // nothing to do for now, because we use static ImplCvtChars
1493 }
1494
1495 // -----------------------------------------------------------------------
1496
ConvertFontToSubsFontChar(FontToSubsFontConverter hConverter,sal_Unicode cChar)1497 sal_Unicode ConvertFontToSubsFontChar(
1498 FontToSubsFontConverter hConverter, sal_Unicode cChar )
1499 {
1500 if ( hConverter )
1501 return ((ConvertChar*)hConverter)->RecodeChar( cChar );
1502 else
1503 return cChar;
1504 }
1505
1506 // -----------------------------------------------------------------------
1507
GetFontToSubsFontName(FontToSubsFontConverter hConverter)1508 String GetFontToSubsFontName( FontToSubsFontConverter hConverter )
1509 {
1510 if ( !hConverter )
1511 return String();
1512
1513 const char* pName = ((ConvertChar*)hConverter)->mpSubsFontName;
1514 return String::CreateFromAscii( pName );
1515 }
1516
1517