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