1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include <sal/config.h>
22 #include <rtl/ustrbuf.hxx>
23 #include <sal/log.hxx>
24 #include <unotools/fontcvt.hxx>
25 #include <unotools/fontdefs.hxx>
31 //These conversion tables were designed for StarSymbol. OpenSymbol
32 //originally didn't have the same code points as StarSymbol, and
33 //then gained some extra code points, but there are still potentially
34 //various holes in OpenSymbol which were filled by StarSymbol, i.e.
35 //destination mapping points which are empty in OpenSymbol
37 const sal_Unicode aStarBatsTab
[224] =
40 0x0020, 0x263a, 0x25cf, 0x274d,
41 0x25a0, 0x25a1, 0xE000, 0x2751,
42 0x2752, 0xE001, 0xE002, 0xE003,
43 0x2756, 0xE004, 0xE005, 0x27a2,
45 0xE006, 0x2794, 0x2713, 0x2612,
46 0x2611, 0x27b2, 0x261b, 0x270d,
47 0x270e, 0xE007, 0x2714, 0xE008,
48 0xE009, 0xE00A, 0x274f, 0x2750,
50 0xE00B, 0xE00C, 0xE00D, 0xE00E,
51 0x2722, 0x2723, 0x2724, 0x2725,
52 0x2733, 0x2734, 0x2735, 0x2736,
53 0x2737, 0x2738, 0x2739, 0x2717,
55 0x2718, 0x2719, 0x271a, 0x271b,
56 0x271c, 0x272b, 0x272c, 0x272d,
57 0x272e, 0x272f, 0x2730, 0,
58 0xE00F, 0x278a, 0x278b, 0x278c,
60 0x278d, 0x278e, 0x278f, 0x2790,
61 0x2791, 0x2792, 0x2793, 0xE010,
62 0x2780, 0x2781, 0x2782, 0x2783,
63 0x2784, 0x2785, 0x2786, 0x2787,
65 0x2788, 0x2789, 0xE011, 0xE012,
66 0x260e, 0xE013, 0xE014, 0xE015,
67 0xE016, 0xE017, 0xE018, 0xE019,
68 0xE01A, 0x261e, 0xE01B, 0,
70 0x20ac, 0, 0x201a, 0x0192,
71 0x201e, 0x2026, 0x2020, 0x2021,
72 0xE01c, 0x2030, 0x0160, 0x2039,
75 0, 0x2018, 0x2019, 0x201c,
76 0x201d, 0x2022, 0x2013, 0x2014,
77 0xE01d, 0x2122, 0x0161, 0x203a,
78 0x0153, 0, 0x017e, 0x0178,
80 0, 0x21e7, 0x21e8, 0x21e9,
81 0x21e6, 0xE01e, 0xE01f, 0x00a7,
82 0xE020, 0xE021, 0xE022, 0x00ab,
83 0xE023, 0x2639, 0xE024, 0xE025,
85 0xE026, 0xE027, 0xE028, 0x21e5,
86 0x21e4, 0x2192, 0x2193, 0x2190,
87 0x2191, 0xE029, 0xE02a, 0x00bb,
88 0xE02b, 0xE02c, 0xE02d, 0xE02e,
90 0xE02f, 0xE030, 0xE031, 0xE032,
91 0x25be, 0x25b4, 0x25bf, 0x25b5,
92 0xE033, 0xE034, 0xE035, 0x2702,
93 0x2708, 0x2721, 0x273f, 0x2744,
95 0x25d7, 0x2759, 0xE036, 0xE037,
96 0x2762, 0x2663, 0x2665, 0x2660,
97 0x2194, 0x2195, 0x2798, 0x279a,
100 0x00a2, 0x00a4, 0x00a5, 0xE038,
101 0x20a1, 0x20a2, 0x20a3, 0x20a4,
102 0x20a9, 0x20ab, 0x20a8, 0xE039,
111 const sal_Unicode aStarMathTab
[224] =
114 0x0020, 0x0021, 0x0022, 0x0023,
115 0xE080, 0x0025, 0x0026, 0x221e,
116 0x0028, 0x0029, 0x002a, 0x002b,
117 0x002c, 0x002d, 0x002e, 0x002f,
119 0x2224, 0x21d2, 0x21d0, 0x21d4,
120 0xE081, 0xE082, 0x00b0, 0,
121 0, 0, 0x003a, 0x003b,
122 0x003c, 0x003d, 0x003e, 0x00bf,
124 0x2260, 0xE083, 0x2212, 0x2217,
125 0x00d7, 0x22c5, 0x00f7, 0x00b1,
126 0x2213, 0x2295, 0x2296, 0x2297,
127 0x2298, 0x2299, 0x222a, 0x2229,
129 0xE084, 0xE085, 0x2264, 0x2265,
130 0xE086, 0xE087, 0x226a, 0x226b,
131 0x007e, 0x2243, 0x2248, 0x225d,
132 0x2261, 0x221d, 0x2202, 0x2282,
134 0x2283, 0x2286, 0x2287, 0x2284,
135 0x2285, 0x2288, 0x2289, 0x2208,
136 0x2209, 0xE089, 0x2203, 0x220d,
137 0x2135, 0x2111, 0x211c, 0x2118,
139 0xE08a, 0x2221, 0x2222, 0x2223,
140 0x2225, 0x22a5, 0xE08b, 0x22ef,
141 0x22ee, 0x22f0, 0x22f1, 0x22b6,
142 0x22b7, 0xE08c, 0x2216, 0x00ac,
144 0x222b, 0x222c, 0x222d, 0x222e,
145 0x222f, 0x2230, 0x221a, 0xE08d,
146 0xE08e, 0xE08f, 0x2210, 0x220f,
147 0x2211, 0x2207, 0x2200, 0xE090,
149 0xE091, 0xE092, 0xE093, 0xE094,
150 0xE095, 0xE096, 0xE097, 0xE098,
151 0x02d9, 0x00a8, 0xE09b, 0x02da,
152 0x2227, 0x2228, 0x220b, 0x2205,
154 0x007b, 0x007d, 0xe09e, 0xe09f,
155 0x2329, 0x232a, 0x005b, 0x005d,
156 0xE0a0, 0x22be, 0xE0a1, 0x2259,
157 0x2254, 0x2255, 0x21b3, 0x2197,
159 0x2198, 0x2245, 0x301a, 0x301b,
160 0x2373, 0xE0a5, 0xE0a6, 0x22a4,
161 0x2112, 0x2130, 0x2131, 0,
162 0xE0a7, 0xE0a8, 0xE0a9, 0xE0aa,
164 0x2308, 0x230a, 0x2309, 0x230b,
165 0, 0xe0ab, 0xe0ac, 0xe0ad,
166 0xe0ae, 0xe0af, 0xe0b0, 0xe0b1,
167 0xe0b2, 0xe0b3, 0xe0b4, 0xe0b5,
169 0xe0b6, 0xe0b7, 0xe0b8, 0xe0b9,
170 0xe0ba, 0xe0bb, 0xe0bc, 0xe0bd,
171 0xe0be, 0xe0bf, 0xe0c0, 0xe0c1,
172 0xe0c2, 0xe0c3, 0xe0c4, 0xe0c5,
174 0xe0c6, 0xe0c7, 0xe0c8, 0xe0c9,
175 0xe0ca, 0xe0cb, 0xe0cc, 0xe0cd,
176 0xe0ce, 0xe0cf, 0xe0d0, 0xe0d1,
177 0x03f1, 0xe0d3, 0xe0d4, 0xe0d5,
179 0x2113, 0xe0d6, 0x2107, 0x2127,
180 0x210a, 0xe0d9, 0x210f, 0x019b,
181 0xe0db, 0xe0dc, 0xe0dd, 0x2115,
182 0x2124, 0x211a, 0x211d, 0x2102
185 const sal_Unicode aWingDingsTab
[224] =
188 0x0020, 0xe400, 0xe401, 0xe402,
189 0xe403, 0xe404, 0xe405, 0xe406,
190 0xe407, 0xe408, 0xe409, 0xe40a,
191 0xe40b, 0xe40c, 0xe40d, 0xe40e,
193 0xe40f, 0xe410, 0xe411, 0xe412,
194 0xe413, 0xe414, 0xe415, 0xe416,
195 0xe417, 0xe418, 0xe419, 0xe41a,
196 0xe41b, 0xe41c, 0x2707, 0xe41d,
198 0xe41e, 0xe41f, 0xe420, 0xe421,
199 0x261c, 0xe423, 0x261d, 0x261f,
200 0x261f, 0xe424, 0xe425, 0xe426,
201 0xe427, 0xe428, 0xe429, 0xe42a,
203 0xe42b, 0xe42c, 0x263c, 0xe42d,
204 0xe42e, 0xe42f, 0xe430, 0xe431,
205 0xe432, 0xe433, 0x262a, 0x262f,
206 0x0950, 0xe434, 0x2648, 0x2649,
208 0x264a, 0x264b, 0x264c, 0x264d,
209 0x264e, 0x264f, 0x2650, 0x2651,
210 0x2652, 0x2653, 0xe435, 0xe436,
211 0xe437, 0xe438, 0xe439, 0xe43a,
213 0xe43b, 0xe43c, 0xe43d, 0xe43e,
214 0xe43f, 0xe440, 0xe441, 0xe442,
215 0xe443, 0x2353, 0x2318, 0xe444,
216 0xe445, 0xe446, 0xe447, 0,
218 0xe448, 0xe449, 0xe44a, 0xe44b,
219 0xe44c, 0xe44d, 0xe44e, 0xe44f,
220 0xe450, 0xe451, 0xe452, 0xe453,
221 0xe454, 0xe455, 0xe456, 0xe457,
223 0xe458, 0xe459, 0xe45a, 0xe45b,
224 0xe45c, 0xe45d, 0xe45e, 0xe45f,
225 0xe460, 0xe461, 0xe462, 0xe463,
226 0xe464, 0xe465, 0xe466, 0xe467,
228 0xe468, 0xe469, 0xe46a, 0xe46b,
229 0xe46c, 0xe46d, 0xe46e, 0xe46f,
230 0xe470, 0xe471, 0xe472, 0xe473,
231 0xe474, 0xe475, 0xe476, 0xe477,
233 0xe478, 0xe479, 0xe47a, 0xe47b,
234 0xe47c, 0xe47d, 0xe47e, 0xe47f,
235 0xe480, 0xe481, 0xe482, 0xe483,
236 0xe484, 0xe485, 0xe486, 0xe487,
238 0xe488, 0xe489, 0xe48a, 0xe48b,
239 0xe48c, 0xe48d, 0xe48e, 0xe48f,
240 0xe490, 0xe491, 0xe492, 0xe493,
241 0xe494, 0xe495, 0xe496, 0xe497,
243 0xe498, 0xe499, 0xe49a, 0xe49b,
244 0xe49c, 0x232b, 0x2326, 0xe49d,
245 0xe49e, 0xe49f, 0xe4a0, 0xe4a1,
246 0xe4a2, 0xe4a3, 0xe4a4, 0xe4a5,
248 0xe4a6, 0xe4a7, 0xe4a8, 0xe4a9,
249 0xe4aa, 0xe4ab, 0xe4ac, 0xe4ad,
250 0xe4ae, 0xe4af, 0xe4b0, 0xe4b1,
251 0xe4b2, 0xe4b3, 0xe4b4, 0xe4b5,
253 0xe4b6, 0xe4b7, 0xe4b8, 0xe4b9,
254 0xe4ba, 0xe4bb, 0xe4bc, 0xe4bd,
255 0xe4be, 0xe4bf, 0xe4c0, 0xe4c1,
256 0xe4c2, 0xe4c3, 0xe4c4, 0xe4c5
259 const sal_Unicode aWingDings2Tab
[224] =
262 0x0020, 0xe500, 0xe501, 0xe502,
263 0xe503, 0xe504, 0xe505, 0xe506,
264 0xe507, 0xe508, 0xe509, 0xe50a,
265 0xe50b, 0xe50c, 0xe50d, 0xe50e,
267 0xe50f, 0xe510, 0xe511, 0xe512,
268 0xe513, 0xe514, 0xe515, 0xe516,
269 0xe517, 0xe518, 0xe519, 0xe51a,
270 0xe51b, 0xe51c, 0xe51d, 0xe51e,
272 0xe51f, 0xe520, 0xe521, 0xe522,
273 0xe523, 0xe524, 0xe525, 0xe526,
274 0xe527, 0xe528, 0xe529, 0xe52a,
275 0xe52b, 0xe52c, 0xe52d, 0xe52e,
277 0xe52f, 0xe530, 0xe531, 0xe532,
278 0xe533, 0xe534, 0xe535, 0xe536,
279 0xe537, 0x203D, 0x203D, 0x203D,
280 0xe53b, 0xe53c, 0xe53d, 0xe53e,
282 0xe53f, 0xe540, 0xe541, 0xe542,
283 0xe543, 0xe544, 0xe545, 0xe546,
284 0xe547, 0x24EA, 0x2460, 0x2461,
285 0x2462, 0x2463, 0x2464, 0x2465,
287 0x2466, 0x2467, 0x2468, 0x2469,
288 0xE453, 0x278A, 0x278B, 0x278C,
289 0x278D, 0x278E, 0x278F, 0x2790,
290 0x2791, 0x2792, 0x2793, 0,
292 0x2609, 0x25cb, 0x263d, 0x263e,
293 0xe55d, 0xe55e, 0xe55f, 0xe560,
294 0xe561, 0xe562, 0xe563, 0xe564,
295 0xe565, 0xe566, 0xe567, 0xe568,
297 0xe569, 0xe56a, 0xe56b, 0xe56c,
298 0xe56d, 0xe56e, 0xe56f, 0xe570,
299 0xe571, 0xe572, 0xe573, 0xe574,
300 0xe575, 0, 0, 0xe578,
302 0xe579, 0xe57a, 0xe57b, 0xe57c,
305 0xe585, 0, 0xe586, 0,
308 0xe58d, 0xe58e, 0xe58f, 0xe590,
309 0, 0, 0xe593, 0xe594,
312 0xe599, 0xe59a, 0xe59b, 0xe59c,
313 0xe59d, 0xe59e, 0xe59f, 0xe5a0,
314 0xe5a1, 0xe5a2, 0xe5a3, 0xe5a4,
315 0xe5a5, 0xe5a6, 0xe5a7, 0xe5a8,
317 0xe5a9, 0xe5aa, 0xe5ab, 0xe5ac,
318 0xe5ad, 0xe5ae, 0xe5af, 0xe5b0,
319 0xe5b1, 0xe5b2, 0xe5b3, 0xe5b4,
320 0xe5b5, 0xe5b6, 0xe5b7, 0xe5b8,
322 0xe5b9, 0xe5ba, 0xe5bb, 0xe5bc,
323 0xe5bd, 0xe5be, 0xe5bf, 0xe5c0,
324 0xe5c1, 0xe5c2, 0xe5c3, 0xe5c4,
325 0xe5c5, 0xe5c6, 0xe5c7, 0xe5c8,
327 0xe5c9, 0, 0xe5cb, 0xe477,
328 0xe5cd, 0xe5ce, 0xe5cf, 0xe5d0,
329 0x203b, 0x2042, 0, 0,
333 const sal_Unicode aWingDings3Tab
[224] =
336 0x0020, 0xe600, 0xe601, 0xe602,
337 0xe603, 0x2196, 0xe604, 0x2199,
338 0xe605, 0xe606, 0xe607, 0xe608,
339 0xe609, 0xe60a, 0xe60b, 0x21de,
341 0x21df, 0xe60c, 0xe60d, 0xe60e,
342 0x21e2, 0x21e1, 0x21e3, 0x21af,
343 0x21b5, 0xe60f, 0xe610, 0xe611,
344 0xe612, 0xe613, 0xe614, 0xe615,
346 0xe616, 0xe617, 0xe618, 0xe619,
347 0x21c4, 0x21c5, 0xe61a, 0xe61b,
348 0x21c7, 0x21c9, 0x21c8, 0x21ca,
349 0x21b6, 0x21b7, 0xe61c, 0xe61d,
351 0x21bb, 0x21ba, 0xe61e, 0x2324,
352 0x2303, 0x2325, 0x2334, 0xe61f,
353 0x21ea, 0xe620, 0xe621, 0xe622,
354 0xe623, 0xe624, 0xe625, 0xe626,
356 0xe627, 0xe628, 0xe629, 0xe62a,
357 0xe62b, 0xe62c, 0xe62d, 0xe62e,
358 0xe62f, 0xe630, 0xe631, 0xe632,
359 0xe633, 0xe634, 0xe635, 0xe636,
361 0xe637, 0xe638, 0x25b3, 0x25bd,
362 0x25c0, 0x25b6, 0x25c1, 0x25b7,
363 0x25e3, 0xe639, 0x25e4, 0x25e5,
364 0x25c2, 0x25b8, 0xe63a, 0,
366 0xe63b, 0xe63c, 0xe63d, 0xe63e,
367 0xe63f, 0xe640, 0xe641, 0xe642,
368 0xe643, 0xe644, 0xe645, 0xe646,
369 0xe647, 0xe648, 0xe649, 0xe64a,
371 0xe64b, 0xe64c, 0xe64d, 0xe64e,
372 0xe64f, 0xe650, 0xe651, 0xe652,
373 0xe653, 0xe654, 0xe655, 0xe656,
374 0xe657, 0xe658, 0xe659, 0xe65a,
376 0xe65b, 0xe65c, 0xe65d, 0xe65e,
377 0xe65f, 0xe660, 0xe661, 0xe662,
378 0xe663, 0xe664, 0xe665, 0xe666,
379 0xe667, 0xe668, 0xe669, 0xe66a,
381 0xe66b, 0xe66c, 0xe66d, 0xe66e,
382 0xe66f, 0xe670, 0xe671, 0xe672,
383 0xe673, 0xe674, 0xe675, 0xe676,
384 0xe677, 0xe678, 0xe679, 0xe67a,
386 0xe67b, 0xe67c, 0xe67d, 0xe67e,
387 0xe67f, 0xe680, 0xe681, 0xe682,
388 0xe683, 0xe684, 0xe685, 0xe686,
389 0xe687, 0xe688, 0xe689, 0xe68a,
391 0xe68b, 0xe68c, 0xe68d, 0xe68e,
392 0xe68f, 0xe690, 0xe691, 0xe692,
393 0xe693, 0xe694, 0xe695, 0xe696,
394 0xe697, 0xe698, 0xe699, 0xe69a,
396 0xe69b, 0xe69c, 0xe69d, 0xe69e,
397 0xe69f, 0xe6a0, 0xe6a1, 0xe6a2,
398 0xe6a3, 0xe6a4, 0xe6a5, 0xe6a6,
399 0xe6a7, 0xe6a8, 0xe6a9, 0xe6aa,
407 const sal_Unicode aWebDingsTab
[224] =
410 0x0020, 0xe300, 0xe301, 0xe302,
411 0xe303, 0xe304, 0xe305, 0xe306,
412 0xe307, 0xe308, 0xe309, 0xe30a,
413 0xe30b, 0xe30c, 0xe30d, 0xe30e,
415 0xe30f, 0xe310, 0xe311, 0xe312,
416 0xe313, 0xe314, 0xe315, 0xe316,
417 0xe317, 0xe318, 0xe319, 0xe31a,
418 0xe31b, 0xe31c, 0xe31d, 0xe31e,
420 0xe31f, 0xe320, 0xe321, 0xe322,
421 0xe323, 0xe324, 0xe325, 0xe326,
422 0xe327, 0xe328, 0xe329, 0xe32a,
423 0xe32b, 0xe32c, 0xe32d, 0xe32e,
425 0xe32f, 0xe330, 0xe331, 0xe332,
426 0xe333, 0xe334, 0xe335, 0xe336,
427 0xe337, 0xe338, 0xe339, 0xe33a,
428 0xe33b, 0xe33c, 0xe33d, 0xe33e,
430 0xe33f, 0xe340, 0xe341, 0xe342,
431 0xe343, 0xe344, 0xe345, 0xe346,
432 0xe347, 0xe348, 0xe349, 0xe34a,
433 0xe34b, 0xe34c, 0xe34d, 0xe34e,
435 0xe34f, 0xe350, 0xe351, 0xe352,
436 0xe353, 0xe354, 0xe355, 0xe356,
437 0xe357, 0xe358, 0xe359, 0xe35a,
438 0xe35b, 0xe35c, 0xe35d, 0,
440 0xe35e, 0xe35f, 0xe360, 0xe361,
441 0xe362, 0xe363, 0xe364, 0xe365,
442 0xe366, 0xe367, 0xe368, 0xe369,
443 0xe36a, 0xe36b, 0xe36c, 0xe36d,
445 0xe36e, 0xe36f, 0xe370, 0xe371,
446 0xe372, 0xe373, 0xe374, 0xe375,
447 0xe376, 0xe377, 0xe378, 0xe379,
448 0xe37a, 0xe37b, 0xe37c, 0xe37d,
450 0xe37e, 0xe37f, 0xe380, 0xe381,
451 0xe382, 0xe383, 0xe384, 0xe385,
452 0xe386, 0xe387, 0xe388, 0xe389,
453 0xe38a, 0xe38b, 0xe38c, 0xe38d,
455 0xe38e, 0xe38f, 0xe390, 0xe391,
456 0xe392, 0xe393, 0xe394, 0xe395,
457 0xe396, 0xe397, 0xe398, 0xe399,
458 0xe39a, 0xe39b, 0xe39c, 0xe39d,
460 0xe39e, 0xe39f, 0xe3a0, 0xe3a1,
461 0xe3a2, 0xe3a3, 0xe3a4, 0xe3a5,
462 0xe3a6, 0xe3a7, 0xe3a8, 0xe3a9,
463 0xe3aa, 0xe3ab, 0xe3ac, 0xe3ad,
465 0xe3ae, 0xe3af, 0xe3b0, 0xe3b1,
466 0xe3b2, 0xe3b3, 0xe3b4, 0xe3b5,
467 0xe3b6, 0xe3b7, 0xe3b8, 0xe3b9,
468 0xe3ba, 0xe3bb, 0xe3bc, 0xe3bd,
470 0xe3be, 0xe3bf, 0xe3c0, 0xe3c1,
471 0xe3c2, 0xe3c3, 0xe3c4, 0xe3c5,
472 0xe3c6, 0xe3c7, 0xe3c8, 0xe3c9,
473 0xe3ca, 0xe3cb, 0xe3cd, 0xe3ce,
475 0xe3cf, 0xe3d0, 0xe3d1, 0xe3d2,
476 0xe3d3, 0xe3d4, 0xe3d5, 0xe3d6,
477 0xe3d7, 0xe3d8, 0xe3d9, 0xe3da,
478 0xe3db, 0xe3dc, 0xe3dd, 0xe3de
481 // See http://www.iana.org/assignments/character-sets/character-sets.xml
482 // See ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/ADOBE/symbol.txt
484 const sal_Unicode aAdobeSymbolTab
[224] =
488 0x0020, 0xe100, 0xe101, 0xe102,
489 0xe103, 0xe104, 0xe16a, 0xe105,
490 0xe106, 0xe107, 0xe108, 0xe109,
491 0xe10a, 0xe10b, 0xe10c, 0xe10d,
493 0x0030, 0x0031, 0x0032, 0x0033,
494 0x0034, 0x0035, 0x0036, 0x0037,
495 0x0038, 0x0039, 0xe10e, 0xe10f,
496 0xe110, 0xe111, 0xe112, 0x003f,
498 0xe113, 0x0391, 0x0392, 0x03a7,
499 0x0394, 0x0395, 0x03a6, 0x0393,
500 0x0397, 0x0399, 0x03d1, 0x039a,
501 0x039b, 0x039c, 0x039d, 0x039f,
503 0x03a0, 0x0398, 0x03a1, 0x03a3,
504 0x03a4, 0x03a5, 0x03c2, 0x03a9,
505 0x039e, 0x03a8, 0x0396, 0xe114,
506 0x2234, 0xe115, 0xe116, 0x005f,
508 0x00af, 0x03b1, 0x03b2, 0x03c7,
509 0x03b4, 0x03b5, 0x03d5, 0x03b3,
510 0x03b7, 0x03b9, 0x03c6, 0x03ba,
511 0x03bb, 0x03bc, 0x03bd, 0x03bf,
513 0x03c0, 0x03b8, 0x03c1, 0x03c3,
514 0x03c4, 0x03c5, 0x03d6, 0x03c9,
515 0x03be, 0x03c8, 0x03b6, 0xe117,
516 0x007c, 0xe118, 0xe119, 0,
528 0xe11a, 0x03d2, 0x2032, 0xe11b,
529 0x2215, 0xe11c, 0xe11d, 0xe11e,
530 0x2666, 0xe11f, 0xe120, 0xe121,
531 0xe122, 0xe123, 0xe124, 0xe125,
533 0xe126, 0xe127, 0x2033, 0xe128,
534 0xe129, 0xe12a, 0xe12b, 0xe12c,
535 0xe12d, 0xe12e, 0xe12f, 0xe130,
536 0xe131, 0x2502, 0x2500, 0x21b2,
538 0xe132, 0xe133, 0xe134, 0xe135,
539 0xe136, 0xe137, 0xe138, 0xe139,
540 0xe13a, 0xe13b, 0xe13c, 0xe13d,
541 0xe13e, 0xe13f, 0xe140, 0xe141,
543 0x2220, 0xe142, 0x00ae, 0x00a9,
544 0xe143, 0xe144, 0xe145, 0xe146,
545 0xe147, 0xe148, 0xe149, 0xe14a,
546 0xe14b, 0x21d1, 0xe14c, 0x21d3,
548 0x25ca, 0xe14d, 0xe14e, 0xe14f,
549 0xe150, 0xe151, 0xf8eb, 0xf8ec,
550 0xf8ed, 0xf8ee, 0xf8ef, 0xf8f0,
551 0xf8f1, 0xf8f2, 0xf8f3, 0xf8f4,
553 0, 0x232a, 0x222b, 0x2320,
554 0xf8f5, 0x2321, 0xf8f6, 0xf8f7,
555 0xf8f8, 0xf8f9, 0xf8fa, 0xf8fb,
556 0xf8fc, 0xf8fd, 0xf8fe, 0,
559 const sal_Unicode aMonotypeSortsTab
[224] =
562 0x0020, 0x2701, 0xe200, 0x2703,
563 0x2704, 0xe201, 0x2706, 0xe202,
564 0xe203, 0xe203, 0xe204, 0xe205,
565 0x270c, 0xe206, 0xe207, 0xe208,
567 0x2710, 0x2711, 0x2712, 0xe209,
568 0xe20a, 0x2715, 0x2716, 0xe20b,
569 0xe20c, 0xe20d, 0xe20e, 0xe20f,
570 0xe210, 0x271d, 0x271e, 0x271f,
572 0x2720, 0xe211, 0xe212, 0xe213,
573 0xe214, 0xe215, 0x2726, 0x2727,
574 0x2605, 0x2729, 0x272a, 0xe216,
575 0xe217, 0xe218, 0xe219, 0xe21a,
577 0xe21b, 0xe21c, 0x2732, 0xe21d,
578 0xe21e, 0xe21f, 0xe220, 0xe221,
579 0xe222, 0xe223, 0x273a, 0x273b,
580 0x273c, 0x273d, 0x273e, 0xe224,
582 0x2740, 0x2741, 0x2742, 0x2743,
583 0xe225, 0x2745, 0x2746, 0x2747,
584 0x2748, 0x2749, 0x274a, 0x274b,
585 0xe226, 0xe227, 0xe228, 0xe229,
587 0xe22a, 0xe22b, 0xe22c, 0x25b2,
588 0x25bc, 0xe22d, 0xe22e, 0xe22f,
589 0x2758, 0xe230, 0x275a, 0x275b,
590 0x275c, 0x275d, 0x275e, 0,
592 0xe231, 0xe232, 0xe233, 0xe234,
593 0xe235, 0xe236, 0xe237, 0xe238,
594 0xe239, 0xe23a, 0xe23b, 0xe23c,
595 0xe23d, 0xe23e, 0, 0,
602 0, 0xe23f, 0xe240, 0x2763,
603 0x2764, 0x2765, 0x2766, 0x2767,
604 0xe241, 0xe242, 0xe243, 0xe244,
605 0x2460, 0x2461, 0x2462, 0x2463,
607 0x2464, 0x2465, 0x2466, 0x2467,
608 0x2468, 0x2469, 0x2776, 0x2777,
609 0x2778, 0x2779, 0x277a, 0x277b,
610 0x277c, 0x277d, 0x277e, 0x277f,
612 0xe245, 0xe246, 0xe247, 0xe248,
613 0xe249, 0xe24a, 0xe24b, 0xe24c,
614 0xe24d, 0xe24e, 0xe24f, 0xe250,
615 0xe251, 0xe252, 0xe253, 0xe254,
617 0xe255, 0xe256, 0xe257, 0xe258,
618 0xe259, 0xe25a, 0xe25b, 0xe25c,
619 0xe25d, 0x2799, 0xe25e, 0x279b,
620 0x279c, 0x279d, 0x279e, 0x279f,
622 0x27a0, 0x27a1, 0xe25f, 0x27a3,
623 0x27a4, 0x27a5, 0x27a6, 0x27a7,
624 0x27a8, 0x27a9, 0x27aa, 0x27ab,
625 0x27ac, 0x27ad, 0x27ae, 0x27af,
627 0, 0x27b1, 0xe260, 0x27b3,
628 0x27b4, 0x27b5, 0x27b6, 0x27b7,
629 0xe261, 0x27b9, 0x27ba, 0x27bb,
630 0x27bc, 0x27bd, 0x27be, 0,
633 const sal_Unicode aMTExtraTab
[224] =
636 0x0020, 0, 0, 0x0300,
637 0x0302, 0x0303, 0x0307, 0,
638 0x2323, 0x2322, 0, 0,
641 0, 0xEC00, 0xEC01, 0xEC02,
642 0xEC03, 0xEC0B, 0xEC04, 0xEC05,
643 0xEC06, 0, 0x223C, 0x2243,
644 0x22B2, 0x226A, 0x22B3, 0x226B,
646 0x225C, 0x2259, 0x2250, 0x2210,
647 0x019B, 0xEC0E, 0xEC0F, 0xEC10,
648 0xEC11, 0x2229, 0x2127, 0x2026,
649 0x22EF, 0x22EE, 0x22F0, 0x22F1,
651 0x2225, 0x2235, 0x2221, 0x2222,
652 0, 0x222A, 0x25B3, 0x25A1,
653 0x25AD, 0x25B1, 0x2197, 0x2199,
654 0xEB05, 0x2198, 0x2196, 0xEB06,
656 0x2035, 0x21A6, 0x2195, 0x21D5,
657 0x25CB, 0x2299, 0x227B, 0xE98F,
658 0x210F, 0xEE00, 0xEE01, 0,
659 0x2113, 0x2213, 0xFFFD, 0x2218,
661 0x227A, 0xEB1A, 0x20D7, 0x20D6,
662 0x20E1, 0xEB00, 0x20D1, 0x20D0,
663 0xEB19, 0, 0, 0xFE38,
664 0xEC0C, 0xFE37, 0xEC0D, 0,
666 0x21C4, 0xEB01, 0xEB02, 0x21CC,
667 0xEB03, 0xEB04, 0x21C0, 0x21BD,
676 0, 0x211D, 0x2124, 0x2102,
677 0x211A, 0x2115, 0, 0x301A,
678 0x301B, 0xEC22, 0xEC23, 0xEC24,
679 0xEC25, 0xEC26, 0xEC27, 0,
681 0xEE04, 0xEE05, 0xEE06, 0,
682 0, 0xEE07, 0xEE08, 0xEE09,
683 0, 0, 0xEE0A, 0xEE0B,
686 0xEE0D, 0xEE0E, 0xEE0F, 0xEE10,
691 0, 0xEE11, 0xEE12, 0xEE13,
692 0, 0xEE15, 0xEE16, 0,
698 0x0160, 0x00DD, 0x00DE, 0x00D0,
699 0x0161, 0x00FD, 0x00FE, 0x00F0,
701 0xFB01, 0xFB02, 0x0131, 0x00B9,
702 0x00B2, 0x00B3, 0x00BD, 0x00BC,
703 0x00BE, 0x2044, 0x00A6, 0x02DD,
704 0x02D8, 0x02C7, 0x02DA, 0x02DB,
707 const sal_Unicode aAdobeSymbolToAppleSymbolTab
[224] =
710 0x0020, 0x0021, 0x2200, 0x0023,
711 0x2203, 0x0025, 0x0026, 0x220D,
712 0x0028, 0x0029, 0x2217, 0x002B,
713 0x002C, 0x2212, 0x002E, 0x002F,
715 0x0030, 0x0031, 0x0032, 0x0033,
716 0x0034, 0x0035, 0x0036, 0x0037,
717 0x0038, 0x0039, 0x003A, 0x003B,
718 0x003C, 0x003D, 0x003E, 0x003F,
720 0x2245, 0x0391, 0x0392, 0x03A7,
721 0x0394, 0x0395, 0x03A6, 0x0393,
722 0x0397, 0x0399, 0x03D1, 0x039A,
723 0x039B, 0x039C, 0x039D, 0x039F,
725 0x03A0, 0x0398, 0x03A1, 0x03A3,
726 0x03A4, 0x03A5, 0x03C2, 0x03A9,
727 0x039E, 0x03A8, 0x0396, 0x005B,
728 0x2234, 0x005D, 0x22A5, 0x005F,
730 0xF8E5, 0x03B1, 0x03B2, 0x03C7,
731 0x03B4, 0x03B5, 0x03C6, 0x03B3,
732 0x03B7, 0x03B9, 0x03D5, 0x03BA,
733 0x03BB, 0x03BC, 0x03BD, 0x03BF,
735 0x03C0, 0x03B8, 0x03C1, 0x03C3,
736 0x03C4, 0x03C5, 0x03D6, 0x03C9,
737 0x03BE, 0x03C8, 0x03B6, 0x007B,
738 0x007C, 0x007D, 0x223C, 0x007F,
740 0x0080, 0x0081, 0x0082, 0x0083,
741 0x0084, 0x0085, 0x0086, 0x0087,
742 0x0088, 0x0089, 0x008A, 0x008B,
743 0x008C, 0x008D, 0x008E, 0x008F,
745 0x0090, 0x0091, 0x0092, 0x0093,
746 0x0094, 0x0095, 0x0096, 0x0097,
747 0x0098, 0x0099, 0x009A, 0x009B,
748 0x009C, 0x009D, 0x009E, 0x009F,
750 0x20AC, 0x03D2, 0x2032, 0x2264,
751 0x2044, 0x221E, 0x0192, 0x2663,
752 0x2666, 0x2665, 0x2660, 0x2194,
753 0x2190, 0x2191, 0x2192, 0x2193,
755 0x00B0, 0x00B1, 0x2033, 0x2065,
756 0x00D7, 0x221D, 0x2202, 0x2022,
757 0x00F7, 0x2260, 0x2261, 0x2248,
758 0x2026, 0x23D0, 0x23AF, 0x21B5,
760 0x2135, 0x2111, 0x211C, 0x2118,
761 0x2297, 0x2295, 0x2205, 0x2229,
762 0x222A, 0x2283, 0x2287, 0x2284,
763 0x2282, 0x2286, 0x2208, 0x2209,
765 0x2220, 0x2207, 0x00AE, 0x00A9,
766 0x2122, 0x220F, 0x221A, 0x22C5,
767 0x00AC, 0x2227, 0x2228, 0x21D4,
768 0x21D0, 0x21D1, 0x21D2, 0x21D3,
770 0x25CA, 0x3008, 0x00AE, 0x00A9,
771 0x2122, 0x2211, 0x239B, 0x239C,
772 0x239D, 0x23A1, 0x23A2, 0x23A3,
773 0x23A7, 0x23A8, 0x23A9, 0x23AA,
775 0xF8FF, 0x3009, 0x222B, 0x2320,
776 0x23AE, 0x2321, 0x239E, 0x239F,
777 0x23A0, 0x23A4, 0x23A5, 0x23A6,
778 0x23AB, 0x23AC, 0x23AD, 0x00FF
781 static sal_Unicode
ImplStarSymbolToStarBats( sal_Unicode c
)
785 case 0x00A2: c
= 0xF0E0; break;
786 case 0x00A4: c
= 0xF0E1; break;
787 case 0x00A5: c
= 0xF0E2; break;
788 case 0x00A7: c
= 0xF0A7; break;
789 case 0x00AB: c
= 0xF0AB; break;
790 case 0x00B6: c
= 0xF0DE; break;
791 case 0x00BB: c
= 0xF0BB; break;
793 case 0x0152: c
= 0xF08C; break;
794 case 0x0153: c
= 0xF09C; break;
795 case 0x0160: c
= 0xF08A; break;
796 case 0x0161: c
= 0xF09A; break;
797 case 0x0178: c
= 0xF09F; break;
798 case 0x017D: c
= 0xF08E; break;
799 case 0x017E: c
= 0xF09E; break;
801 case 0x0192: c
= 0xF083; break;
802 case 0x02C6: c
= 0xF088; break;
803 case 0x02DC: c
= 0xF098; break;
804 case 0x2013: c
= 0xF096; break;
805 case 0x2014: c
= 0xF097; break;
806 case 0x2018: c
= 0xF091; break;
808 case 0x2019: c
= 0xF092; break;
809 case 0x201A: c
= 0xF082; break;
810 case 0x201C: c
= 0xF093; break;
811 case 0x201D: c
= 0xF094; break;
812 case 0x201E: c
= 0xF084; break;
813 case 0x2020: c
= 0xF086; break;
815 case 0x2021: c
= 0xF087; break;
816 case 0x2022: c
= 0xF095; break;
817 case 0x2026: c
= 0xF085; break;
818 case 0x2030: c
= 0xF089; break;
819 case 0x2039: c
= 0xF08B; break;
820 case 0x203A: c
= 0xF09B; break;
822 case 0x20A1: c
= 0xF0E4; break;
823 case 0x20A2: c
= 0xF0E5; break;
824 case 0x20A3: c
= 0xF0E6; break;
825 case 0x20A4: c
= 0xF0E7; break;
826 case 0x20A8: c
= 0xF0EA; break;
827 case 0x20A9: c
= 0xF0E8; break;
828 case 0x20AB: c
= 0xF0E9; break;
829 case 0x20AC: c
= 0xF080; break;
831 case 0x2122: c
= 0xF099; break;
832 case 0x2190: c
= 0xF0B7; break;
833 case 0x2191: c
= 0xF0B8; break;
834 case 0x2192: c
= 0xF0B5; break;
835 case 0x2193: c
= 0xF0B6; break;
836 case 0x2194: c
= 0xF0D8; break;
837 case 0x2195: c
= 0xF0D9; break;
839 case 0x21E4: c
= 0xF0B4; break;
840 case 0x21E5: c
= 0xF0B3; break;
841 case 0x21E6: c
= 0xF0A4; break;
842 case 0x21E7: c
= 0xF0B2; break;
843 case 0x21E8: c
= 0xF0AF; break;
844 case 0x21E9: c
= 0xF0A3; break;
846 case 0x25A0: c
= 0xF024; break;
847 case 0x25A1: c
= 0xF025; break;
848 case 0x25B4: c
= 0xF0C5; break;
849 case 0x25B5: c
= 0xF0C7; break;
850 case 0x25BE: c
= 0xF0C4; break;
851 case 0x25BF: c
= 0xF0C6; break;
852 case 0x25C6: c
= 0xF043; break;
853 case 0x25CF: c
= 0xF022; break;
854 case 0x25D7: c
= 0xF0D0; break;
856 case 0x260E: c
= 0xF074; break;
857 case 0x2611: c
= 0xF034; break;
858 case 0x2612: c
= 0xF033; break;
859 case 0x261B: c
= 0xF036; break;
860 case 0x261E: c
= 0xF07D; break;
861 case 0x2639: c
= 0xF0AD; break;
862 case 0x263A: c
= 0xF021; break;
864 case 0x2702: c
= 0xF0CB; break;
865 case 0x2708: c
= 0xF0CC; break;
866 case 0x270D: c
= 0xF07E; break;
867 case 0x270E: c
= 0xF038; break;
869 case 0x2713: c
= 0xF039; break;
870 case 0x2714: c
= 0xF03A; break;
871 case 0x2717: c
= 0xF04F; break;
872 case 0x2718: c
= 0xF050; break;
873 case 0x2719: c
= 0xF051; break;
874 case 0x271A: c
= 0xF052; break;
875 case 0x271B: c
= 0xF053; break;
876 case 0x271C: c
= 0xF054; break;
878 case 0x2721: c
= 0xF0CD; break;
879 case 0x2722: c
= 0xF044; break;
880 case 0x2723: c
= 0xF045; break;
881 case 0x2724: c
= 0xF046; break;
882 case 0x2725: c
= 0xF047; break;
883 case 0x272B: c
= 0xF055; break;
884 case 0x272C: c
= 0xF056; break;
885 case 0x272D: c
= 0xF057; break;
886 case 0x272E: c
= 0xF058; break;
887 case 0x272F: c
= 0xF059; break;
889 case 0x2730: c
= 0xF05A; break;
890 case 0x2733: c
= 0xF048; break;
891 case 0x2734: c
= 0xF049; break;
892 case 0x2735: c
= 0xF04A; break;
893 case 0x2736: c
= 0xF04B; break;
894 case 0x2737: c
= 0xF04C; break;
895 case 0x2738: c
= 0xF04D; break;
896 case 0x2739: c
= 0xF04E; break;
897 case 0x273F: c
= 0xF0CE; break;
899 case 0x2744: c
= 0xF0CF; break;
900 case 0x274D: c
= 0xF023; break;
901 case 0x274F: c
= 0xF03E; break;
902 case 0x2750: c
= 0xF03F; break;
903 case 0x2751: c
= 0xF027; break;
904 case 0x2752: c
= 0xF028; break;
905 case 0x2756: c
= 0xF02C; break;
906 case 0x2759: c
= 0xF0D1; break;
907 case 0x2762: c
= 0xF0D4; break;
909 case 0x2780: c
= 0xF068; break;
910 case 0x2781: c
= 0xF069; break;
911 case 0x2782: c
= 0xF06A; break;
912 case 0x2783: c
= 0xF06B; break;
913 case 0x2784: c
= 0xF06C; break;
914 case 0x2785: c
= 0xF06D; break;
915 case 0x2786: c
= 0xF06E; break;
916 case 0x2787: c
= 0xF06F; break;
917 case 0x2788: c
= 0xF070; break;
918 case 0x2789: c
= 0xF071; break;
919 case 0x278A: c
= 0xF05D; break;
920 case 0x278B: c
= 0xF05E; break;
921 case 0x278C: c
= 0xF05F; break;
922 case 0x278D: c
= 0xF060; break;
923 case 0x278E: c
= 0xF061; break;
924 case 0x278F: c
= 0xF062; break;
926 case 0x2790: c
= 0xF063; break;
927 case 0x2791: c
= 0xF064; break;
928 case 0x2792: c
= 0xF065; break;
929 case 0x2793: c
= 0xF066; break;
930 case 0x2794: c
= 0xF031; break;
931 case 0x2798: c
= 0xF0DA; break;
932 case 0x279A: c
= 0xF0DB; break;
934 case 0x27A2: c
= 0xF02F; break;
935 case 0x27B2: c
= 0xF035; break;
936 case 0x27B8: c
= 0xF0DC; break;
938 case 0xE000: c
= 0xF000+38; break;
939 case 0xE001: c
= 0xF000+41; break;
940 case 0xE002: c
= 0xF000+42; break;
941 case 0xE003: c
= 0xF000+43; break;
942 case 0xE004: c
= 0xF000+45; break;
943 case 0xE005: c
= 0xF000+46; break;
944 case 0xE006: c
= 0xF000+48; break;
945 case 0xE007: c
= 0xF000+57; break;
947 case 0xE008: c
= 0xF000+59; break;
948 case 0xE009: c
= 0xF000+60; break;
949 case 0xE00a: c
= 0xF000+61; break;
950 case 0xE00b: c
= 0xF000+64; break;
951 case 0xE00c: c
= 0xF000+65; break;
952 case 0xE00d: c
= 0xF000+66; break;
953 case 0xE00e: c
= 0xF000+67; break;
954 case 0xE00f: c
= 0xF000+92; break;
956 case 0xE010: c
= 0xF000+103; break;
957 case 0xE011: c
= 0xF000+114; break;
958 case 0xE012: c
= 0xF000+115; break;
959 case 0xE013: c
= 0xF000+117; break;
960 case 0xE014: c
= 0xF000+118; break;
961 case 0xE015: c
= 0xF000+119; break;
962 case 0xE016: c
= 0xF000+120; break;
963 case 0xE017: c
= 0xF000+121; break;
965 case 0xE018: c
= 0xF000+122; break;
966 case 0xE019: c
= 0xF000+123; break;
967 case 0xE01a: c
= 0xF000+124; break;
968 case 0xE01b: c
= 0xF000+126; break;
969 case 0xE01c: c
= 0xF000+136; break;
970 case 0xE01d: c
= 0xF000+155; break;
971 case 0xE01e: c
= 0xF000+165; break;
972 case 0xE01f: c
= 0xF000+166; break;
974 case 0xE020: c
= 0xF000+168; break;
975 case 0xE021: c
= 0xF000+169; break;
976 case 0xE022: c
= 0xF000+170; break;
977 case 0xE023: c
= 0xF000+172; break;
978 case 0xE024: c
= 0xF000+174; break;
979 case 0xE025: c
= 0xF000+175; break;
980 case 0xE026: c
= 0xF000+176; break;
981 case 0xE027: c
= 0xF000+177; break;
983 case 0xE028: c
= 0xF000+178; break;
984 case 0xE029: c
= 0xF000+185; break;
985 case 0xE02a: c
= 0xF000+186; break;
986 case 0xE02b: c
= 0xF000+188; break;
987 case 0xE02c: c
= 0xF000+189; break;
988 case 0xE02d: c
= 0xF000+190; break;
989 case 0xE02e: c
= 0xF000+191; break;
990 case 0xE02f: c
= 0xF000+192; break;
992 case 0xE030: c
= 0xF000+193; break;
993 case 0xE031: c
= 0xF000+194; break;
994 case 0xE032: c
= 0xF000+195; break;
995 case 0xE033: c
= 0xF000+200; break;
996 case 0xE034: c
= 0xF000+201; break;
997 case 0xE035: c
= 0xF000+202; break;
998 case 0xE036: c
= 0xF000+210; break;
999 case 0xE037: c
= 0xF000+211; break;
1001 case 0xE038: c
= 0xF000+227; break;
1002 case 0xE039: c
= 0xF000+235; break;
1003 case 0xE03a: c
= 0xF000+255; break;
1005 default: c
= 0; break;
1015 Symbol
=1, Wingdings
=2, MonotypeSorts
=4, Webdings
=8, Wingdings2
=16,
1016 Wingdings3
=32, MTExtra
=64, TimesNewRoman
=128
1021 constexpr OUString aSymbolNames
[] =
1023 u
"Symbol"_ustr
, u
"Wingdings"_ustr
, u
"Monotype Sorts"_ustr
, u
"Webdings"_ustr
, u
"Wingdings 2"_ustr
,
1024 u
"Wingdings 3"_ustr
, u
"MT Extra"_ustr
, u
"Times New Roman"_ustr
1032 enum SymbolFont eFont
;
1035 class StarSymbolToMSMultiFontImpl
: public StarSymbolToMSMultiFont
1038 ::std::multimap
<sal_Unicode
, SymbolEntry
> maMagicMap
;
1040 explicit StarSymbolToMSMultiFontImpl();
1041 OUString
ConvertChar(sal_Unicode
&rChar
) override
;
1044 struct ExtraTable
{ sal_Unicode cStar
; sal_uInt8 cMS
;};
1048 ExtraTable
const aWingDingsExtraTab
[] =
1050 {0x25cf, 0x6C}, {0x2714, 0xFC}, {0x2717, 0xFB}, {0x2794, 0xE8},
1051 {0x27a2, 0xD8}, {0xe000, 0x6F}, {0xe001, 0x73}, {0xe002, 0x74},
1052 {0xe003, 0x75}, {0xe004, 0x77}, {0xe005, 0xA6}, {0xe006, 0xE0},
1053 {0xe007, 0xFC}, {0xe008, 0x6C}, {0xe009, 0x6D}, {0xe00a, 0x6E},
1054 {0xe00b, 0x72}, {0xe00c, 0x75}, {0xe00d, 0x76}, {0xe00e, 0x74},
1055 {0xe00f, 0x8B}, {0xe010, 0x80}, {0xe011, 0x2B}, {0xe012, 0x3A},
1056 {0xe013, 0x5D}, {0xe014, 0x29}, {0xe015, 0x3A}, {0xe016, 0x3C},
1057 {0xe017, 0x38}, {0xe018, 0x3A}, {0xe019, 0x2A}, {0xe01a, 0x2B},
1058 {0xe01b, 0x3F}, {0xe01c, 0x9F}, {0xe01d, 0x80}, {0xe01e, 0x8B},
1059 {0xe023, 0x4A}, {0xe025, 0xF0}, {0xe026, 0xF2}, {0xe027, 0xEF},
1060 {0xe028, 0xF1}, {0xe029, 0x52}, {0xe02a, 0x29}, {0xe02b, 0xE0},
1061 {0xe02c, 0xE2}, {0xe02d, 0xDF}, {0xe02e, 0xE1}, {0xe02f, 0xAC},
1062 {0xe030, 0xAD}, {0xe031, 0xAE}, {0xe032, 0x7C}, {0xe033, 0x43},
1063 {0xe034, 0x4D}, {0xe0aa, 0x71}, {0xe422, 0x44}
1066 ExtraTable
const aSymbolExtraTab2
[] =
1068 {0x0020, 0x20}, {0x00A0, 0x20}, {0x0021, 0x21}, {0x2200, 0x22},
1069 {0x0023, 0x23}, {0x2203, 0x24}, {0x0025, 0x25}, {0x0026, 0x26},
1070 {0x220B, 0x27}, {0x0028, 0x28}, {0x0029, 0x29}, {0x2217, 0x2A},
1071 {0x002B, 0x2B}, {0x002C, 0x2C}, {0x2212, 0x2D}, {0x002E, 0x2E},
1072 {0x002F, 0x2F}, {0x003A, 0x3A}, {0x003B, 0x3B}, {0x003C, 0x3C},
1073 {0x003D, 0x3D}, {0x003E, 0x3E}, {0x2245, 0x40}, {0x2206, 0x44},
1074 {0x2126, 0x57}, {0x005B, 0x5B}, {0x005D, 0x5D}, {0x22A5, 0x5E},
1075 {0x03C6, 0x66}, {0x03D5, 0x6A}, {0x00B5, 0x6D}, {0x007B, 0x7B},
1076 {0x007C, 0x7C}, {0x007D, 0x7D}, {0x223C, 0x7E}, {0x20AC, 0xA0},
1077 {0x2032, 0xA2}, {0x2264, 0xA3}, {0x2044, 0xA4}, {0x221E, 0xA5},
1078 {0x0192, 0xA6}, {0x2663, 0xA7}, {0x2665, 0xA9}, {0x2660, 0xAA},
1079 {0x2194, 0xAB}, {0x2190, 0xAC}, {0x2191, 0xAD}, {0x2192, 0xAE},
1080 {0x2193, 0xAF}, {0x00B0, 0xB0}, {0x00B1, 0xB1}, {0x2265, 0xB3},
1081 {0x00D7, 0xB4}, {0x221D, 0xB5}, {0x2202, 0xB6}, {0x2022, 0xB7},
1082 {0x00F7, 0xB8}, {0x2260, 0xB9}, {0x2261, 0xBA}, {0x2248, 0xBB},
1083 {0x2026, 0xBC}, {0x21B5, 0xBF}, {0x2135, 0xC0}, {0x2111, 0xC1},
1084 {0x211C, 0xC2}, {0x2118, 0xC3}, {0x2297, 0xC4}, {0x2295, 0xC5},
1085 {0x2205, 0xC6}, {0x2229, 0xC7}, {0x222A, 0xC8}, {0x2283, 0xC9},
1086 {0x2287, 0xCA}, {0x2284, 0xCB}, {0x2282, 0xCC}, {0x2286, 0xCD},
1087 {0x2208, 0xCE}, {0x2209, 0xCF}, {0x2207, 0xD1}, {0x220F, 0xD5},
1088 {0x221A, 0xD6}, {0x22C5, 0xD7}, {0x00AC, 0xD8}, {0x2227, 0xD9},
1089 {0x2228, 0xDA}, {0x21D4, 0xDB}, {0x21D0, 0xDC}, {0x21D2, 0xDE},
1090 {0x2329, 0xE1}, {0x2211, 0xE5}, {0x232A, 0xF1}, {0x222B, 0xF2},
1091 {0x2320, 0xF3}, {0x2321, 0xF5}, {0x2013, 0x2D}
1094 ExtraTable
const aSymbolExtraTab
[] =
1096 {0xe021, 0xD3}, {0xe024, 0xD2}, {0xe035, 0x20}, {0xe036, 0x28},
1097 {0xe037, 0x29}, {0xe039, 0x20}, {0xe083, 0x2B}, {0xe084, 0x3C},
1098 {0xe085, 0x3E}, {0xe086, 0xA3}, {0xe087, 0xB3}, {0xe089, 0xCE},
1099 {0xe08a, 0xA6}, {0xe08c, 0xAE}, {0xe08d, 0xD6}, {0xe08e, 0xD6},
1100 {0xe08f, 0xD6}, {0xe094, 0xA2}, {0xe09e, 0x28}, {0xe09f, 0x29},
1101 {0xe0a0, 0xD0}, {0xe0a6, 0xA2}, {0xe0a7, 0x7C}, {0xe0a8, 0x2F},
1102 {0xe0ab, 0x7C}, {0xe0ac, 0x47}, {0xe0ad, 0x44}, {0xe0ae, 0x51},
1103 {0xe0af, 0x4C}, {0xe0b0, 0x58}, {0xe0b1, 0x50}, {0xe0b2, 0x53},
1104 {0xe0b3, 0x55}, {0xe0b4, 0x46}, {0xe0b5, 0x59}, {0xe0b6, 0x57},
1105 {0xe0b7, 0x61}, {0xe0b8, 0x62}, {0xe0b9, 0x67}, {0xe0ba, 0x64},
1106 {0xe0bb, 0x65}, {0xe0bc, 0x7A}, {0xe0bd, 0x68}, {0xe0be, 0x71},
1107 {0xe0bf, 0x69}, {0xe0c0, 0x6B}, {0xe0c1, 0x6C}, {0xe0c2, 0x6D},
1108 {0xe0c3, 0x6E}, {0xe0c4, 0x78}, {0xe0c5, 0x6F}, {0xe0c6, 0x70},
1109 {0xe0c7, 0x72}, {0xe0c8, 0x73}, {0xe0c9, 0x74}, {0xe0ca, 0x75},
1110 {0xe0cb, 0x66}, {0xe0cc, 0x63}, {0xe0cd, 0x79}, {0xe0ce, 0x77},
1111 {0xe0cf, 0x65}, {0xe0d0, 0x4A}, {0xe0d1, 0x76}, {0xe0d3, 0x56},
1112 {0xe0d4, 0x6A}, {0xe0d5, 0xB6}, {0xe0d6, 0x69}, {0xe0db, 0xAC},
1113 {0xe0dc, 0xAD}, {0xe0dd, 0xAF}
1116 ExtraTable
const aTNRExtraTab
[] =
1133 StarSymbolToMSMultiFontImpl::StarSymbolToMSMultiFontImpl()
1137 enum SymbolFont meFont
;
1138 const sal_Unicode
* pTab
;
1141 //In order of preference
1142 static const ConvertTable aConservativeTable
[] =
1144 {Symbol
, aAdobeSymbolTab
},
1145 {Wingdings
, aWingDingsTab
},
1146 {MonotypeSorts
, aMonotypeSortsTab
},
1147 {Webdings
, aWebDingsTab
},
1148 {Wingdings2
, aWingDings2Tab
},
1149 {Wingdings3
, aWingDings3Tab
},
1150 {MTExtra
, aMTExtraTab
}
1153 struct ExtendedConvertTable
1155 enum SymbolFont meFont
;
1156 const ExtraTable
*mpTable
;
1158 ExtendedConvertTable(SymbolFont eFont
, const ExtraTable
*pTable
,
1160 : meFont(eFont
), mpTable(pTable
), mnSize(nSize
) {}
1163 //Reverse map from a given starsymbol char to exact matches in ms symbol
1165 for (auto const & r
: aConservativeTable
)
1168 aEntry
.eFont
= r
.meFont
;
1169 for (aEntry
.cIndex
= 0xFF; aEntry
.cIndex
>= 0x20; --aEntry
.cIndex
)
1171 if (sal_Unicode cChar
= r
.pTab
[aEntry
.cIndex
-0x20])
1172 maMagicMap
.emplace(cChar
, aEntry
);
1176 //In order of preference
1177 static const ExtendedConvertTable aAggressiveTable
[] =
1179 ExtendedConvertTable(Symbol
, aSymbolExtraTab2
,
1180 sizeof(aSymbolExtraTab2
)),
1181 ExtendedConvertTable(Symbol
, aSymbolExtraTab
,
1182 sizeof(aSymbolExtraTab
)),
1183 ExtendedConvertTable(Wingdings
, aWingDingsExtraTab
,
1184 sizeof(aWingDingsExtraTab
)),
1185 ExtendedConvertTable(TimesNewRoman
, aTNRExtraTab
,
1186 sizeof(aTNRExtraTab
))
1189 //Allow extra conversions that are not perfect, but "good enough"
1190 for (auto const & r
: aAggressiveTable
)
1193 aEntry
.eFont
= r
.meFont
;
1194 for (int j
= r
.mnSize
/ sizeof(r
.mpTable
[0]) - 1; j
>=0; --j
)
1196 aEntry
.cIndex
= r
.mpTable
[j
].cMS
;
1197 maMagicMap
.emplace(r
.mpTable
[j
].cStar
, aEntry
);
1202 static const OUString
& SymbolFontToString(int nResult
)
1204 const OUString
*ppName
= aSymbolNames
;
1206 while (nI
<= nResult
)
1208 if (!(nI
& nResult
))
1217 OUString
StarSymbolToMSMultiFontImpl::ConvertChar(sal_Unicode
&rChar
)
1221 ::std::multimap
<sal_Unicode
, SymbolEntry
>::const_iterator aResult
=
1222 maMagicMap
.find(rChar
);
1224 if (aResult
!= maMagicMap
.end())
1226 const SymbolEntry
&rEntry
= (*aResult
).second
;
1227 sRet
= SymbolFontToString(rEntry
.eFont
);
1228 rChar
= rEntry
.cIndex
;
1234 StarSymbolToMSMultiFont
*CreateStarSymbolToMSMultiFont()
1236 return new StarSymbolToMSMultiFontImpl
;
1239 sal_Unicode
ConvertChar::RecodeChar( sal_Unicode cChar
) const
1241 sal_Unicode cRetVal
= 0;
1244 // use a conversion function for recoding
1245 cRetVal
= mpCvtFunc( cChar
);
1249 // use a conversion table for recoding
1250 sal_Unicode cIndex
= cChar
;
1251 // allow symbol aliasing
1252 if( cIndex
& 0xFF00 )
1254 // recode the symbol
1255 if( cIndex
>=0x0020 && cIndex
<=0x00FF )
1257 cRetVal
= mpCvtTab
[ cIndex
- 0x0020 ];
1259 if (!cRetVal
&& !maSubsFontName
.isEmpty())
1261 if ( IsOpenSymbol( maSubsFontName
) )
1264 SAL_WARN( "unotools.misc", "Forcing a bullet substitution from 0x" <<
1265 OString::number(cChar
, 16) << " to 0x" <<
1266 OString::number(cRetVal
, 16));
1272 return cRetVal
? cRetVal
: cChar
;
1275 // recode the string assuming the character codes are symbol codes
1276 // from a traditional symbol font (i.e. U+F020..U+F0FF)
1277 void ConvertChar::RecodeString( OUString
& rStr
, sal_Int32 nIndex
, sal_Int32 nLen
) const
1279 sal_Int32 nLastIndex
= nIndex
+ nLen
;
1280 OUStringBuffer
aTmpStr(rStr
);
1282 if( nLastIndex
> aTmpStr
.getLength() )
1283 nLastIndex
= aTmpStr
.getLength();
1285 for(; nIndex
< nLastIndex
; ++nIndex
)
1287 sal_Unicode cOrig
= rStr
[ nIndex
];
1288 // only recode symbols and their U+00xx aliases
1289 if( ((cOrig
< 0x0020) || (cOrig
> 0x00FF))
1290 && ((cOrig
< 0xF020) || (cOrig
> 0xF0FF)) )
1294 sal_Unicode cNew
= RecodeChar( cOrig
);
1296 aTmpStr
[ nIndex
] = cNew
;
1298 rStr
= aTmpStr
.makeStringAndClear();
1303 struct RecodeTable
{ const char* pOrgName
; ConvertChar aCvt
;};
1307 const RecodeTable aStarSymbolRecodeTable
[] =
1309 // the first two entries must be StarMath and StarBats; do not reorder!
1310 // reason: see CreateFontToSubsFontConverter method
1311 {"starbats", {aStarBatsTab
, u
"StarSymbol"_ustr
, nullptr}},
1312 {"starmath", {aStarMathTab
, u
"StarSymbol"_ustr
, nullptr}},
1314 {"symbol", {aAdobeSymbolTab
, u
"StarSymbol"_ustr
, nullptr}},
1315 {"standardsymbols", {aAdobeSymbolTab
, u
"StarSymbol"_ustr
, nullptr}},
1316 {"standardsymbolsl",{aAdobeSymbolTab
, u
"StarSymbol"_ustr
, nullptr}},
1318 {"monotypesorts", {aMonotypeSortsTab
, u
"StarSymbol"_ustr
, nullptr}},
1319 // {"monotypesorts2", {aMonotypeSorts2Tab, u"StarSymbol"_ustr, NULL}}
1320 {"zapfdingbats", {aMonotypeSortsTab
, u
"StarSymbol"_ustr
, nullptr}}, //ZapfDingbats=MonotypeSorts-X?
1321 {"itczapfdingbats", {aMonotypeSortsTab
, u
"StarSymbol"_ustr
, nullptr}},
1322 {"dingbats", {aMonotypeSortsTab
, u
"StarSymbol"_ustr
, nullptr}},
1324 {"webdings", {aWebDingsTab
, u
"StarSymbol"_ustr
, nullptr}},
1325 {"wingdings", {aWingDingsTab
, u
"StarSymbol"_ustr
, nullptr}},
1326 {"wingdings2", {aWingDings2Tab
, u
"StarSymbol"_ustr
, nullptr}},
1327 {"wingdings3", {aWingDings3Tab
, u
"StarSymbol"_ustr
, nullptr}},
1328 {"mtextra", {aMTExtraTab
, u
"StarSymbol"_ustr
, nullptr}}
1331 const RecodeTable aAppleSymbolRecodeTable
[] = {
1332 {"symbol", {aAdobeSymbolToAppleSymbolTab
, u
"AppleSymbol"_ustr
, nullptr}}
1335 static ConvertChar aImplStarSymbolCvt
= { nullptr, u
"StarBats"_ustr
, ImplStarSymbolToStarBats
};
1337 const ConvertChar
* ConvertChar::GetRecodeData( std::u16string_view rOrgFontName
, std::u16string_view rMapFontName
)
1339 const ConvertChar
* pCvt
= nullptr;
1341 // clean up and lowercase font name
1342 OUString
aOrgName( GetEnglishSearchFontName( rOrgFontName
) );
1343 OUString
aMapName( GetEnglishSearchFontName( rMapFontName
) );
1345 if( aMapName
== "starsymbol"
1346 || aMapName
== "opensymbol" )
1348 for (auto const & r
: aStarSymbolRecodeTable
)
1350 if( aOrgName
.equalsAscii( r
.pOrgName
) )
1357 //It's plausible that it's better to implement this
1358 //as an additional encoding alongside the existing
1359 //adobe-symbol to unicode conversion in rtl instead
1360 else if( aMapName
== "applesymbol" )
1362 for (auto const & r
: aAppleSymbolRecodeTable
)
1364 if( aOrgName
.equalsAscii( r
.pOrgName
) )
1371 else if( aMapName
== "starbats" )
1373 if( aOrgName
== "starsymbol" )
1374 pCvt
= &aImplStarSymbolCvt
;
1375 else if( aOrgName
== "opensymbol" )
1376 pCvt
= &aImplStarSymbolCvt
;
1382 FontToSubsFontConverter
CreateFontToSubsFontConverter( std::u16string_view rOrgName
, FontToSubsFontFlags nFlags
)
1384 const ConvertChar
* pCvt
= nullptr;
1386 OUString aName
= GetEnglishSearchFontName( rOrgName
);
1388 if ( nFlags
== FontToSubsFontFlags::IMPORT
)
1390 const std::size_t nEntries
= 2; // only StarMath+StarBats
1391 for( std::size_t i
= 0; i
< nEntries
; ++i
)
1393 const RecodeTable
& r
= aStarSymbolRecodeTable
[i
];
1394 if( aName
.equalsAscii( r
.pOrgName
) )
1403 // TODO: only StarMath+StarBats
1404 if( aName
== "starsymbol" )
1405 pCvt
= &aImplStarSymbolCvt
;
1406 else if( aName
== "opensymbol" )
1407 pCvt
= &aImplStarSymbolCvt
;
1410 return const_cast<ConvertChar
*>(pCvt
);
1413 sal_Unicode
ConvertFontToSubsFontChar(
1414 FontToSubsFontConverter hConverter
, sal_Unicode cChar
)
1417 return static_cast<ConvertChar
*>(hConverter
)->RecodeChar( cChar
);
1422 OUString
GetFontToSubsFontName( FontToSubsFontConverter hConverter
)
1427 return static_cast<ConvertChar
*>(hConverter
)->maSubsFontName
;
1430 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */