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