Coverage Report

Created: 2025-11-16 09:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/unotools/source/misc/fontcvt.cxx
Line
Count
Source
1
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2
/*
3
 * This file is part of the LibreOffice project.
4
 *
5
 * This Source Code Form is subject to the terms of the Mozilla Public
6
 * License, v. 2.0. If a copy of the MPL was not distributed with this
7
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8
 *
9
 * This file incorporates work covered by the following license notice:
10
 *
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 .
18
 */
19
20
#include <sal/config.h>
21
22
#include <rtl/ustrbuf.hxx>
23
#include <sal/log.hxx>
24
#include <unotools/fontcvt.hxx>
25
#include <unotools/fontdefs.hxx>
26
27
#include <cstddef>
28
#include <map>
29
#include <vector>
30
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
36
37
const sal_Unicode aStarBatsTab[224] =
38
{
39
    // F020
40
        0x0020,    0x263a,    0x25cf,    0x274d,
41
        0x25a0,    0x25a1,    0xE000,    0x2751,
42
        0x2752,    0xE001,    0xE002,    0xE003,
43
        0x2756,    0xE004,    0xE005,    0x27a2,
44
    // F030
45
        0xE006,    0x2794,    0x2713,    0x2612,
46
        0x2611,    0x27b2,    0x261b,    0x270d,
47
        0x270e,    0xE007,    0x2714,    0xE008,
48
        0xE009,    0xE00A,    0x274f,    0x2750,
49
    // F040
50
        0xE00B,    0xE00C,    0xE00D,    0xE00E,
51
        0x2722,    0x2723,    0x2724,    0x2725,
52
        0x2733,    0x2734,    0x2735,    0x2736,
53
        0x2737,    0x2738,    0x2739,    0x2717,
54
    // F050
55
        0x2718,    0x2719,    0x271a,    0x271b,
56
        0x271c,    0x272b,    0x272c,    0x272d,
57
        0x272e,    0x272f,    0x2730,         0,
58
        0xE00F,    0x278a,    0x278b,    0x278c,
59
    // F060
60
        0x278d,    0x278e,    0x278f,    0x2790,
61
        0x2791,    0x2792,    0x2793,    0xE010,
62
        0x2780,    0x2781,    0x2782,    0x2783,
63
        0x2784,    0x2785,    0x2786,    0x2787,
64
    // F070
65
        0x2788,    0x2789,    0xE011,    0xE012,
66
        0x260e,    0xE013,    0xE014,    0xE015,
67
        0xE016,    0xE017,    0xE018,    0xE019,
68
        0xE01A,    0x261e,    0xE01B,         0,
69
    // F080
70
        0x20ac,         0,    0x201a,    0x0192,
71
        0x201e,    0x2026,    0x2020,    0x2021,
72
        0xE01c,    0x2030,    0x0160,    0x2039,
73
        0x0152,         0,    0x017d,         0,
74
    // F090
75
             0,    0x2018,    0x2019,    0x201c,
76
        0x201d,    0x2022,    0x2013,    0x2014,
77
        0xE01d,    0x2122,    0x0161,    0x203a,
78
        0x0153,         0,    0x017e,    0x0178,
79
    // F0A0
80
             0,    0x21e7,    0x21e8,    0x21e9,
81
        0x21e6,    0xE01e,    0xE01f,    0x00a7,
82
        0xE020,    0xE021,    0xE022,    0x00ab,
83
        0xE023,    0x2639,    0xE024,    0xE025,
84
    // F0B0
85
        0xE026,    0xE027,    0xE028,    0x21e5,
86
        0x21e4,    0x2192,    0x2193,    0x2190,
87
        0x2191,    0xE029,    0xE02a,    0x00bb,
88
        0xE02b,    0xE02c,    0xE02d,    0xE02e,
89
    // F0C0
90
        0xE02f,    0xE030,    0xE031,    0xE032,
91
        0x25be,    0x25b4,    0x25bf,    0x25b5,
92
        0xE033,    0xE034,    0xE035,    0x2702,
93
        0x2708,    0x2721,    0x273f,    0x2744,
94
    // F0D0
95
        0x25d7,    0x2759,    0xE036,    0xE037,
96
        0x2762,    0x2663,    0x2665,    0x2660,
97
        0x2194,    0x2195,    0x2798,    0x279a,
98
        0x27b8,         0,    0x00b6,         0,
99
    // F0E0
100
        0x00a2,    0x00a4,    0x00a5,    0xE038,
101
        0x20a1,    0x20a2,    0x20a3,    0x20a4,
102
        0x20a9,    0x20ab,    0x20a8,    0xE039,
103
             0,         0,         0,         0,
104
    // F0F0
105
             0,         0,         0,         0,
106
             0,         0,         0,         0,
107
             0,         0,         0,         0,
108
             0,         0,         0,    0xE03a
109
};
110
111
const sal_Unicode aStarMathTab[224] =
112
{
113
    // F020
114
        0x0020,    0x0021,    0x0022,    0x0023,
115
        0xE080,    0x0025,    0x0026,    0x221e,
116
        0x0028,    0x0029,    0x002a,    0x002b,
117
        0x002c,    0x002d,    0x002e,    0x002f,
118
    // F030
119
        0x2224,    0x21d2,    0x21d0,    0x21d4,
120
        0xE081,    0xE082,    0x00b0,         0,
121
             0,         0,    0x003a,    0x003b,
122
        0x003c,    0x003d,    0x003e,    0x00bf,
123
    // F040
124
        0x2260,    0xE083,    0x2212,    0x2217,
125
        0x00d7,    0x22c5,    0x00f7,    0x00b1,
126
        0x2213,    0x2295,    0x2296,    0x2297,
127
        0x2298,    0x2299,    0x222a,    0x2229,
128
    // F050
129
        0xE084,    0xE085,    0x2264,    0x2265,
130
        0xE086,    0xE087,    0x226a,    0x226b,
131
        0x007e,    0x2243,    0x2248,    0x225d,
132
        0x2261,    0x221d,    0x2202,    0x2282,
133
    // F060
134
        0x2283,    0x2286,    0x2287,    0x2284,
135
        0x2285,    0x2288,    0x2289,    0x2208,
136
        0x2209,    0xE089,    0x2203,    0x220d,
137
        0x2135,    0x2111,    0x211c,    0x2118,
138
    // F070
139
        0xE08a,    0x2221,    0x2222,    0x2223,
140
        0x2225,    0x22a5,    0xE08b,    0x22ef,
141
        0x22ee,    0x22f0,    0x22f1,    0x22b6,
142
        0x22b7,    0xE08c,    0x2216,    0x00ac,
143
    // F080
144
        0x222b,    0x222c,    0x222d,    0x222e,
145
        0x222f,    0x2230,    0x221a,    0xE08d,
146
        0xE08e,    0xE08f,    0x2210,    0x220f,
147
        0x2211,    0x2207,    0x2200,    0xE090,
148
    // F090
149
        0xE091,    0xE092,    0xE093,    0xE094,
150
        0xE095,    0xE096,    0xE097,    0xE098,
151
        0x02d9,    0x00a8,    0xE09b,    0x02da,
152
        0x2227,    0x2228,    0x220b,    0x2205,
153
    // F0A0
154
        0x007b,    0x007d,    0xe09e,    0xe09f,
155
        0x2329,    0x232a,    0x005b,    0x005d,
156
        0xE0a0,    0x22be,    0xE0a1,    0x2259,
157
        0x2254,    0x2255,    0x21b3,    0x2197,
158
    // F0B0
159
        0x2198,    0x2245,    0x301a,    0x301b,
160
        0x2373,    0xE0a5,    0xE0a6,    0x22a4,
161
        0x2112,    0x2130,    0x2131,         0,
162
        0xE0a7,    0xE0a8,    0xE0a9,    0xE0aa,
163
    // F0C0
164
        0x2308,    0x230a,    0x2309,    0x230b,
165
             0,    0xe0ab,    0xe0ac,    0xe0ad,
166
        0xe0ae,    0xe0af,    0xe0b0,    0xe0b1,
167
        0xe0b2,    0xe0b3,    0xe0b4,    0xe0b5,
168
    // F0D0
169
        0xe0b6,    0xe0b7,    0xe0b8,    0xe0b9,
170
        0xe0ba,    0xe0bb,    0xe0bc,    0xe0bd,
171
        0xe0be,    0xe0bf,    0xe0c0,    0xe0c1,
172
        0xe0c2,    0xe0c3,    0xe0c4,    0xe0c5,
173
    // F0E0
174
        0xe0c6,    0xe0c7,    0xe0c8,    0xe0c9,
175
        0xe0ca,    0xe0cb,    0xe0cc,    0xe0cd,
176
        0xe0ce,    0xe0cf,    0xe0d0,    0xe0d1,
177
        0x03f1,    0xe0d3,    0xe0d4,    0xe0d5,
178
    // F0F0
179
        0x2113,     0xe0d6,   0x2107,    0x2127,
180
        0x210a,     0xe0d9,   0x210f,    0x019b,
181
        0xe0db,     0xe0dc,   0xe0dd,    0x2115,
182
        0x2124,     0x211a,   0x211d,    0x2102
183
};
184
185
const sal_Unicode aWingDingsTab[224] =
186
{
187
    // F020
188
        0x0020,    0xe400,    0xe401,    0xe402,
189
        0xe403,    0xe404,    0xe405,    0xe406,
190
        0xe407,    0xe408,    0xe409,    0xe40a,
191
        0xe40b,    0xe40c,    0xe40d,    0xe40e,
192
    // F030
193
        0xe40f,    0xe410,    0xe411,    0xe412,
194
        0xe413,    0xe414,    0xe415,    0xe416,
195
        0xe417,    0xe418,    0xe419,    0xe41a,
196
        0xe41b,    0xe41c,    0x2707,    0xe41d,
197
    // F040
198
        0xe41e,    0xe41f,    0xe420,    0xe421,
199
        0x261c,    0xe423,    0x261d,    0x261f,
200
        0x261f,    0xe424,    0xe425,    0xe426,
201
        0xe427,    0xe428,    0xe429,    0xe42a,
202
    // F050
203
        0xe42b,    0xe42c,    0x263c,    0xe42d,
204
        0xe42e,    0xe42f,    0xe430,    0xe431,
205
        0xe432,    0xe433,    0x262a,    0x262f,
206
        0x0950,    0xe434,    0x2648,    0x2649,
207
    // F060
208
        0x264a,    0x264b,    0x264c,    0x264d,
209
        0x264e,    0x264f,    0x2650,    0x2651,
210
        0x2652,    0x2653,    0xe435,    0xe436,
211
        0xe437,    0xe438,    0xe439,    0xe43a,
212
    // F070
213
        0xe43b,    0xe43c,    0xe43d,    0xe43e,
214
        0xe43f,    0xe440,    0xe441,    0xe442,
215
        0xe443,    0x2353,    0x2318,    0xe444,
216
        0xe445,    0xe446,    0xe447,         0,
217
    // F080
218
        0xe448,    0xe449,    0xe44a,    0xe44b,
219
        0xe44c,    0xe44d,    0xe44e,    0xe44f,
220
        0xe450,    0xe451,    0xe452,    0xe453,
221
        0xe454,    0xe455,    0xe456,    0xe457,
222
    // F090
223
        0xe458,    0xe459,    0xe45a,    0xe45b,
224
        0xe45c,    0xe45d,    0xe45e,    0xe45f,
225
        0xe460,    0xe461,    0xe462,    0xe463,
226
        0xe464,    0xe465,    0xe466,    0xe467,
227
    // F0a0
228
        0xe468,    0xe469,    0xe46a,    0xe46b,
229
        0xe46c,    0xe46d,    0xe46e,    0xe46f,
230
        0xe470,    0xe471,    0xe472,    0xe473,
231
        0xe474,    0xe475,    0xe476,    0xe477,
232
    // F0b0
233
        0xe478,    0xe479,    0xe47a,    0xe47b,
234
        0xe47c,    0xe47d,    0xe47e,    0xe47f,
235
        0xe480,    0xe481,    0xe482,    0xe483,
236
        0xe484,    0xe485,    0xe486,    0xe487,
237
    // F0c0
238
        0xe488,    0xe489,    0xe48a,    0xe48b,
239
        0xe48c,    0xe48d,    0xe48e,    0xe48f,
240
        0xe490,    0xe491,    0xe492,    0xe493,
241
        0xe494,    0xe495,    0xe496,    0xe497,
242
    // F0d0
243
        0xe498,    0xe499,    0xe49a,    0xe49b,
244
        0xe49c,    0x232b,    0x2326,    0xe49d,
245
        0xe49e,    0xe49f,    0xe4a0,    0xe4a1,
246
        0xe4a2,    0xe4a3,    0xe4a4,    0xe4a5,
247
    // F0e0
248
        0xe4a6,    0xe4a7,    0xe4a8,    0xe4a9,
249
        0xe4aa,    0xe4ab,    0xe4ac,    0xe4ad,
250
        0xe4ae,    0xe4af,    0xe4b0,    0xe4b1,
251
        0xe4b2,    0xe4b3,    0xe4b4,    0xe4b5,
252
    // F0f0
253
        0xe4b6,    0xe4b7,    0xe4b8,    0xe4b9,
254
        0xe4ba,    0xe4bb,    0xe4bc,    0xe4bd,
255
        0xe4be,    0xe4bf,    0xe4c0,    0xe4c1,
256
        0xe4c2,    0xe4c3,    0xe4c4,    0xe4c5
257
};
258
259
const sal_Unicode aWingDings2Tab[224] =
260
{
261
    // F020
262
        0x0020,    0xe500,    0xe501,    0xe502,
263
        0xe503,    0xe504,    0xe505,    0xe506,
264
        0xe507,    0xe508,    0xe509,    0xe50a,
265
        0xe50b,    0xe50c,    0xe50d,    0xe50e,
266
    // F030
267
        0xe50f,    0xe510,    0xe511,    0xe512,
268
        0xe513,    0xe514,    0xe515,    0xe516,
269
        0xe517,    0xe518,    0xe519,    0xe51a,
270
        0xe51b,    0xe51c,    0xe51d,    0xe51e,
271
    // F040
272
        0xe51f,    0xe520,    0xe521,    0xe522,
273
        0xe523,    0xe524,    0xe525,    0xe526,
274
        0xe527,    0xe528,    0xe529,    0xe52a,
275
        0xe52b,    0xe52c,    0xe52d,    0xe52e,
276
    // F050
277
        0xe52f,    0xe530,    0xe531,    0xe532,
278
        0xe533,    0xe534,    0xe535,    0xe536,
279
        0xe537,    0x203D,    0x203D,    0x203D,
280
        0xe53b,    0xe53c,    0xe53d,    0xe53e,
281
    // F060
282
        0xe53f,    0xe540,    0xe541,    0xe542,
283
        0xe543,    0xe544,    0xe545,    0xe546,
284
        0xe547,    0x24EA,    0x2460,    0x2461,
285
        0x2462,    0x2463,    0x2464,    0x2465,
286
    // F070
287
        0x2466,    0x2467,    0x2468,    0x2469,
288
        0xE453,    0x278A,    0x278B,    0x278C,
289
        0x278D,    0x278E,    0x278F,    0x2790,
290
        0x2791,    0x2792,    0x2793,         0,
291
    // F080
292
        0x2609,    0x25cb,    0x263d,    0x263e,
293
        0xe55d,    0xe55e,    0xe55f,    0xe560,
294
        0xe561,    0xe562,    0xe563,    0xe564,
295
        0xe565,    0xe566,    0xe567,    0xe568,
296
    // F090
297
        0xe569,    0xe56a,    0xe56b,    0xe56c,
298
        0xe56d,    0xe56e,    0xe56f,    0xe570,
299
        0xe571,    0xe572,    0xe573,    0xe574,
300
        0xe575,         0,         0,    0xe578,
301
    // F0a0
302
        0xe579,    0xe57a,    0xe57b,    0xe57c,
303
             0,         0,         0,         0,
304
             0,         0,         0,    0xe584,
305
        0xe585,         0,    0xe586,         0,
306
    // F0b0
307
             0,         0,         0,         0,
308
        0xe58d,    0xe58e,    0xe58f,    0xe590,
309
             0,         0,    0xe593,    0xe594,
310
             0,         0,         0,    0xe587,
311
    // F0c0
312
        0xe599,    0xe59a,    0xe59b,    0xe59c,
313
        0xe59d,    0xe59e,    0xe59f,    0xe5a0,
314
        0xe5a1,    0xe5a2,    0xe5a3,    0xe5a4,
315
        0xe5a5,    0xe5a6,    0xe5a7,    0xe5a8,
316
    // F0d0
317
        0xe5a9,    0xe5aa,    0xe5ab,    0xe5ac,
318
        0xe5ad,    0xe5ae,    0xe5af,    0xe5b0,
319
        0xe5b1,    0xe5b2,    0xe5b3,    0xe5b4,
320
        0xe5b5,    0xe5b6,    0xe5b7,    0xe5b8,
321
    // F0e0
322
        0xe5b9,    0xe5ba,    0xe5bb,    0xe5bc,
323
        0xe5bd,    0xe5be,    0xe5bf,    0xe5c0,
324
        0xe5c1,    0xe5c2,    0xe5c3,    0xe5c4,
325
        0xe5c5,    0xe5c6,    0xe5c7,    0xe5c8,
326
    // F0f0
327
        0xe5c9,    0,         0xe5cb,    0xe477,
328
        0xe5cd,    0xe5ce,    0xe5cf,    0xe5d0,
329
        0x203b,    0x2042,         0,         0,
330
             0,         0,         0,         0
331
};
332
333
const sal_Unicode aWingDings3Tab[224] =
334
{
335
    // F020
336
        0x0020,    0xe600,    0xe601,    0xe602,
337
        0xe603,    0x2196,    0xe604,    0x2199,
338
        0xe605,    0xe606,    0xe607,    0xe608,
339
        0xe609,    0xe60a,    0xe60b,    0x21de,
340
    // F030
341
        0x21df,    0xe60c,    0xe60d,    0xe60e,
342
        0x21e2,    0x21e1,    0x21e3,    0x21af,
343
        0x21b5,    0xe60f,    0xe610,    0xe611,
344
        0xe612,    0xe613,    0xe614,    0xe615,
345
    // F040
346
        0xe616,    0xe617,    0xe618,    0xe619,
347
        0x21c4,    0x21c5,    0xe61a,    0xe61b,
348
        0x21c7,    0x21c9,    0x21c8,    0x21ca,
349
        0x21b6,    0x21b7,    0xe61c,    0xe61d,
350
    // F050
351
        0x21bb,    0x21ba,    0xe61e,    0x2324,
352
        0x2303,    0x2325,    0x2334,    0xe61f,
353
        0x21ea,    0xe620,    0xe621,    0xe622,
354
        0xe623,    0xe624,    0xe625,    0xe626,
355
    // F060
356
        0xe627,    0xe628,    0xe629,    0xe62a,
357
        0xe62b,    0xe62c,    0xe62d,    0xe62e,
358
        0xe62f,    0xe630,    0xe631,    0xe632,
359
        0xe633,    0xe634,    0xe635,    0xe636,
360
    // F070
361
        0xe637,    0xe638,    0x25b3,    0x25bd,
362
        0x25c0,    0x25b6,    0x25c1,    0x25b7,
363
        0x25e3,    0xe639,    0x25e4,    0x25e5,
364
        0x25c2,    0x25b8,    0xe63a,         0,
365
    // F080
366
        0xe63b,    0xe63c,    0xe63d,    0xe63e,
367
        0xe63f,    0xe640,    0xe641,    0xe642,
368
        0xe643,    0xe644,    0xe645,    0xe646,
369
        0xe647,    0xe648,    0xe649,    0xe64a,
370
    // F090
371
        0xe64b,    0xe64c,    0xe64d,    0xe64e,
372
        0xe64f,    0xe650,    0xe651,    0xe652,
373
        0xe653,    0xe654,    0xe655,    0xe656,
374
        0xe657,    0xe658,    0xe659,    0xe65a,
375
    // F0a0
376
        0xe65b,    0xe65c,    0xe65d,    0xe65e,
377
        0xe65f,    0xe660,    0xe661,    0xe662,
378
        0xe663,    0xe664,    0xe665,    0xe666,
379
        0xe667,    0xe668,    0xe669,    0xe66a,
380
    // F0b0
381
        0xe66b,    0xe66c,    0xe66d,    0xe66e,
382
        0xe66f,    0xe670,    0xe671,    0xe672,
383
        0xe673,    0xe674,    0xe675,    0xe676,
384
        0xe677,    0xe678,    0xe679,    0xe67a,
385
    // F0c0
386
        0xe67b,    0xe67c,    0xe67d,    0xe67e,
387
        0xe67f,    0xe680,    0xe681,    0xe682,
388
        0xe683,    0xe684,    0xe685,    0xe686,
389
        0xe687,    0xe688,    0xe689,    0xe68a,
390
    // F0d0
391
        0xe68b,    0xe68c,    0xe68d,    0xe68e,
392
        0xe68f,    0xe690,    0xe691,    0xe692,
393
        0xe693,    0xe694,    0xe695,    0xe696,
394
        0xe697,    0xe698,    0xe699,    0xe69a,
395
    // F0e0
396
        0xe69b,    0xe69c,    0xe69d,    0xe69e,
397
        0xe69f,    0xe6a0,    0xe6a1,    0xe6a2,
398
        0xe6a3,    0xe6a4,    0xe6a5,    0xe6a6,
399
        0xe6a7,    0xe6a8,    0xe6a9,    0xe6aa,
400
    // F0f0
401
        0xe6ab,         0,         0,         0,
402
             0,         0,         0,         0,
403
             0,         0,         0,         0,
404
             0,         0,         0,         0
405
};
406
407
const sal_Unicode aWebDingsTab[224] =
408
{
409
    // F020
410
        0x0020,    0xe300,    0xe301,    0xe302,
411
        0xe303,    0xe304,    0xe305,    0xe306,
412
        0xe307,    0xe308,    0xe309,    0xe30a,
413
        0xe30b,    0xe30c,    0xe30d,    0xe30e,
414
    // F030
415
        0xe30f,    0xe310,    0xe311,    0xe312,
416
        0xe313,    0xe314,    0xe315,    0xe316,
417
        0xe317,    0xe318,    0xe319,    0xe31a,
418
        0xe31b,    0xe31c,    0xe31d,    0xe31e,
419
    // F040
420
        0xe31f,    0xe320,    0xe321,    0xe322,
421
        0xe323,    0xe324,    0xe325,    0xe326,
422
        0xe327,    0xe328,    0xe329,    0xe32a,
423
        0xe32b,    0xe32c,    0xe32d,    0xe32e,
424
    // F050
425
        0xe32f,    0xe330,    0xe331,    0xe332,
426
        0xe333,    0xe334,    0xe335,    0xe336,
427
        0xe337,    0xe338,    0xe339,    0xe33a,
428
        0xe33b,    0xe33c,    0xe33d,    0xe33e,
429
    // F060
430
        0xe33f,    0xe340,    0xe341,    0xe342,
431
        0xe343,    0xe344,    0xe345,    0xe346,
432
        0xe347,    0xe348,    0xe349,    0xe34a,
433
        0xe34b,    0xe34c,    0xe34d,    0xe34e,
434
    // F070
435
        0xe34f,    0xe350,    0xe351,    0xe352,
436
        0xe353,    0xe354,    0xe355,    0xe356,
437
        0xe357,    0xe358,    0xe359,    0xe35a,
438
        0xe35b,    0xe35c,    0xe35d,         0,
439
    // F080
440
        0xe35e,    0xe35f,    0xe360,    0xe361,
441
        0xe362,    0xe363,    0xe364,    0xe365,
442
        0xe366,    0xe367,    0xe368,    0xe369,
443
        0xe36a,    0xe36b,    0xe36c,    0xe36d,
444
    // F090
445
        0xe36e,    0xe36f,    0xe370,    0xe371,
446
        0xe372,    0xe373,    0xe374,    0xe375,
447
        0xe376,    0xe377,    0xe378,    0xe379,
448
        0xe37a,    0xe37b,    0xe37c,    0xe37d,
449
    // F0a0
450
        0xe37e,    0xe37f,    0xe380,    0xe381,
451
        0xe382,    0xe383,    0xe384,    0xe385,
452
        0xe386,    0xe387,    0xe388,    0xe389,
453
        0xe38a,    0xe38b,    0xe38c,    0xe38d,
454
    // F0b0
455
        0xe38e,    0xe38f,    0xe390,    0xe391,
456
        0xe392,    0xe393,    0xe394,    0xe395,
457
        0xe396,    0xe397,    0xe398,    0xe399,
458
        0xe39a,    0xe39b,    0xe39c,    0xe39d,
459
    // F0c0
460
        0xe39e,    0xe39f,    0xe3a0,    0xe3a1,
461
        0xe3a2,    0xe3a3,    0xe3a4,    0xe3a5,
462
        0xe3a6,    0xe3a7,    0xe3a8,    0xe3a9,
463
        0xe3aa,    0xe3ab,    0xe3ac,    0xe3ad,
464
    // F0d0
465
        0xe3ae,    0xe3af,    0xe3b0,    0xe3b1,
466
        0xe3b2,    0xe3b3,    0xe3b4,    0xe3b5,
467
        0xe3b6,    0xe3b7,    0xe3b8,    0xe3b9,
468
        0xe3ba,    0xe3bb,    0xe3bc,    0xe3bd,
469
    // F0e0
470
        0xe3be,    0xe3bf,    0xe3c0,    0xe3c1,
471
        0xe3c2,    0xe3c3,    0xe3c4,    0xe3c5,
472
        0xe3c6,    0xe3c7,    0xe3c8,    0xe3c9,
473
        0xe3ca,    0xe3cb,    0xe3cd,    0xe3ce,
474
    // F0f0
475
        0xe3cf,    0xe3d0,    0xe3d1,    0xe3d2,
476
        0xe3d3,    0xe3d4,    0xe3d5,    0xe3d6,
477
        0xe3d7,    0xe3d8,    0xe3d9,    0xe3da,
478
        0xe3db,    0xe3dc,    0xe3dd,    0xe3de
479
};
480
481
// See http://www.iana.org/assignments/character-sets/character-sets.xml
482
// See ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/ADOBE/symbol.txt
483
484
const sal_Unicode aAdobeSymbolTab[224] =
485
{
486
//TODO:
487
    // F020
488
        0x0020,    0xe100,    0xe101,    0xe102,
489
        0xe103,    0xe104,    0xe16a,    0xe105,
490
        0xe106,    0xe107,    0xe108,    0xe109,
491
        0xe10a,    0xe10b,    0xe10c,    0xe10d,
492
    // F030
493
        0x0030,    0x0031,    0x0032,    0x0033,
494
        0x0034,    0x0035,    0x0036,    0x0037,
495
        0x0038,    0x0039,    0xe10e,    0xe10f,
496
        0xe110,    0xe111,    0xe112,    0x003f,
497
    // F040
498
        0xe113,    0x0391,    0x0392,    0x03a7,
499
        0x0394,    0x0395,    0x03a6,    0x0393,
500
        0x0397,    0x0399,    0x03d1,    0x039a,
501
        0x039b,    0x039c,    0x039d,    0x039f,
502
    // F050
503
        0x03a0,    0x0398,    0x03a1,    0x03a3,
504
        0x03a4,    0x03a5,    0x03c2,    0x03a9,
505
        0x039e,    0x03a8,    0x0396,    0xe114,
506
        0x2234,    0xe115,    0xe116,    0x005f,
507
    // F060
508
        0x00af,    0x03b1,    0x03b2,    0x03c7,
509
        0x03b4,    0x03b5,    0x03d5,    0x03b3,
510
        0x03b7,    0x03b9,    0x03c6,    0x03ba,
511
        0x03bb,    0x03bc,    0x03bd,    0x03bf,
512
    // F070
513
        0x03c0,    0x03b8,    0x03c1,    0x03c3,
514
        0x03c4,    0x03c5,    0x03d6,    0x03c9,
515
        0x03be,    0x03c8,    0x03b6,    0xe117,
516
        0x007c,    0xe118,    0xe119,         0,
517
    // F080
518
             0,         0,         0,         0,
519
             0,         0,         0,         0,
520
             0,         0,         0,         0,
521
             0,         0,         0,         0,
522
    // F090
523
             0,         0,         0,         0,
524
             0,         0,         0,         0,
525
             0,         0,         0,         0,
526
             0,         0,         0,         0,
527
    // F0a0
528
        0xe11a,    0x03d2,    0x2032,    0xe11b,
529
        0x2215,    0xe11c,    0xe11d,    0xe11e,
530
        0x2666,    0xe11f,    0xe120,    0xe121,
531
        0xe122,    0xe123,    0xe124,    0xe125,
532
    // F0b0
533
        0xe126,    0xe127,    0x2033,    0xe128,
534
        0xe129,    0xe12a,    0xe12b,    0xe12c,
535
        0xe12d,    0xe12e,    0xe12f,    0xe130,
536
        0xe131,    0x2502,    0x2500,    0x21b2,
537
    // F0c0
538
        0xe132,    0xe133,    0xe134,    0xe135,
539
        0xe136,    0xe137,    0xe138,    0xe139,
540
        0xe13a,    0xe13b,    0xe13c,    0xe13d,
541
        0xe13e,    0xe13f,    0xe140,    0xe141,
542
    // F0d0
543
        0x2220,    0xe142,    0x00ae,    0x00a9,
544
        0xe143,    0xe144,    0xe145,    0xe146,
545
        0xe147,    0xe148,    0xe149,    0xe14a,
546
        0xe14b,    0x21d1,    0xe14c,    0x21d3,
547
    // F0e0
548
        0x25ca,    0xe14d,    0xe14e,    0xe14f,
549
        0xe150,    0xe151,    0xf8eb,    0xf8ec,
550
        0xf8ed,    0xf8ee,    0xf8ef,    0xf8f0,
551
        0xf8f1,    0xf8f2,    0xf8f3,    0xf8f4,
552
    // F0f0
553
             0,    0x232a,    0x222b,    0x2320,
554
        0xf8f5,    0x2321,    0xf8f6,    0xf8f7,
555
        0xf8f8,    0xf8f9,    0xf8fa,    0xf8fb,
556
        0xf8fc,    0xf8fd,    0xf8fe,         0,
557
};
558
559
const sal_Unicode aMonotypeSortsTab[224] =
560
{
561
    // F020
562
        0x0020,    0x2701,    0xe200,    0x2703,
563
        0x2704,    0xe201,    0x2706,    0xe202,
564
        0xe203,    0xe203,    0xe204,    0xe205,
565
        0x270c,    0xe206,    0xe207,    0xe208,
566
    // F030
567
        0x2710,    0x2711,    0x2712,    0xe209,
568
        0xe20a,    0x2715,    0x2716,    0xe20b,
569
        0xe20c,    0xe20d,    0xe20e,    0xe20f,
570
        0xe210,    0x271d,    0x271e,    0x271f,
571
    // F040
572
        0x2720,    0xe211,    0xe212,    0xe213,
573
        0xe214,    0xe215,    0x2726,    0x2727,
574
        0x2605,    0x2729,    0x272a,    0xe216,
575
        0xe217,    0xe218,    0xe219,    0xe21a,
576
    // F050
577
        0xe21b,    0xe21c,    0x2732,    0xe21d,
578
        0xe21e,    0xe21f,    0xe220,    0xe221,
579
        0xe222,    0xe223,    0x273a,    0x273b,
580
        0x273c,    0x273d,    0x273e,    0xe224,
581
    // F060
582
        0x2740,    0x2741,    0x2742,    0x2743,
583
        0xe225,    0x2745,    0x2746,    0x2747,
584
        0x2748,    0x2749,    0x274a,    0x274b,
585
        0xe226,    0xe227,    0xe228,    0xe229,
586
    // F070
587
        0xe22a,    0xe22b,    0xe22c,    0x25b2,
588
        0x25bc,    0xe22d,    0xe22e,    0xe22f,
589
        0x2758,    0xe230,    0x275a,    0x275b,
590
        0x275c,    0x275d,    0x275e,         0,
591
    // F080
592
        0xe231,    0xe232,    0xe233,    0xe234,
593
        0xe235,    0xe236,    0xe237,    0xe238,
594
        0xe239,    0xe23a,    0xe23b,    0xe23c,
595
        0xe23d,    0xe23e,         0,         0,
596
    // F090
597
             0,         0,         0,         0,
598
             0,         0,         0,         0,
599
             0,         0,         0,         0,
600
             0,         0,         0,         0,
601
    // F0a0
602
             0,    0xe23f,    0xe240,    0x2763,
603
        0x2764,    0x2765,    0x2766,    0x2767,
604
        0xe241,    0xe242,    0xe243,    0xe244,
605
        0x2460,    0x2461,    0x2462,    0x2463,
606
    // F0b0
607
        0x2464,    0x2465,    0x2466,    0x2467,
608
        0x2468,    0x2469,    0x2776,    0x2777,
609
        0x2778,    0x2779,    0x277a,    0x277b,
610
        0x277c,    0x277d,    0x277e,    0x277f,
611
    // F0c0
612
        0xe245,    0xe246,    0xe247,    0xe248,
613
        0xe249,    0xe24a,    0xe24b,    0xe24c,
614
        0xe24d,    0xe24e,    0xe24f,    0xe250,
615
        0xe251,    0xe252,    0xe253,    0xe254,
616
    // F0d0
617
        0xe255,    0xe256,    0xe257,    0xe258,
618
        0xe259,    0xe25a,    0xe25b,    0xe25c,
619
        0xe25d,    0x2799,    0xe25e,    0x279b,
620
        0x279c,    0x279d,    0x279e,    0x279f,
621
    // F0e0
622
        0x27a0,    0x27a1,    0xe25f,    0x27a3,
623
        0x27a4,    0x27a5,    0x27a6,    0x27a7,
624
        0x27a8,    0x27a9,    0x27aa,    0x27ab,
625
        0x27ac,    0x27ad,    0x27ae,    0x27af,
626
    // F0f0
627
             0,    0x27b1,    0xe260,    0x27b3,
628
        0x27b4,    0x27b5,    0x27b6,    0x27b7,
629
        0xe261,    0x27b9,    0x27ba,    0x27bb,
630
        0x27bc,    0x27bd,    0x27be,         0,
631
};
632
633
const sal_Unicode aMTExtraTab[224] =
634
{
635
    // F020
636
        0x0020,         0,         0,    0x0300,
637
        0x0302,    0x0303,    0x0307,         0,
638
        0x2323,    0x2322,         0,         0,
639
             0,         0,         0,         0,
640
    // F030
641
             0,    0xEC00,    0xEC01,    0xEC02,
642
        0xEC03,    0xEC0B,    0xEC04,    0xEC05,
643
        0xEC06,         0,    0x223C,    0x2243,
644
        0x22B2,    0x226A,    0x22B3,    0x226B,
645
    // F040
646
        0x225C,    0x2259,    0x2250,    0x2210,
647
        0x019B,    0xEC0E,    0xEC0F,    0xEC10,
648
        0xEC11,    0x2229,    0x2127,    0x2026,
649
        0x22EF,    0x22EE,    0x22F0,    0x22F1,
650
    // F050
651
        0x2225,    0x2235,    0x2221,    0x2222,
652
             0,    0x222A,    0x25B3,    0x25A1,
653
        0x25AD,    0x25B1,    0x2197,    0x2199,
654
        0xEB05,    0x2198,    0x2196,    0xEB06,
655
    // F060
656
        0x2035,    0x21A6,    0x2195,    0x21D5,
657
        0x25CB,    0x2299,    0x227B,    0xE98F,
658
        0x210F,    0xEE00,    0xEE01,         0,
659
        0x2113,    0x2213,    0xFFFD,    0x2218,
660
    // F070
661
        0x227A,    0xEB1A,    0x20D7,    0x20D6,
662
        0x20E1,    0xEB00,    0x20D1,    0x20D0,
663
        0xEB19,         0,         0,    0xFE38,
664
        0xEC0C,    0xFE37,    0xEC0D,         0,
665
    // F080
666
        0x21C4,    0xEB01,    0xEB02,    0x21CC,
667
        0xEB03,    0xEB04,    0x21C0,    0x21BD,
668
        0xF8E7,         0,         0,         0,
669
             0,         0,         0,         0,
670
    // F090
671
             0,         0,         0,         0,
672
             0,         0,         0,         0,
673
             0,         0,         0,         0,
674
             0,         0,         0,         0,
675
    // F0a0
676
             0,    0x211D,    0x2124,    0x2102,
677
        0x211A,    0x2115,         0,    0x301A,
678
        0x301B,    0xEC22,    0xEC23,    0xEC24,
679
        0xEC25,    0xEC26,    0xEC27,         0,
680
    // F0b0
681
        0xEE04,    0xEE05,    0xEE06,         0,
682
             0,    0xEE07,    0xEE08,    0xEE09,
683
             0,         0,    0xEE0A,    0xEE0B,
684
        0xEE0C,         0,         0,         0,
685
    // F0c0
686
        0xEE0D,    0xEE0E,    0xEE0F,    0xEE10,
687
             0,         0,         0,         0,
688
             0,         0,         0,         0,
689
             0,         0,         0,         0,
690
    // F0d0
691
             0,    0xEE11,    0xEE12,    0xEE13,
692
             0,    0xEE15,    0xEE16,         0,
693
             0,         0,         0,         0,
694
             0,         0,         0,         0,
695
    // F0e0
696
             0,         0,         0,         0,
697
             0,         0,         0,    0xF8FF,
698
        0x0160,    0x00DD,    0x00DE,    0x00D0,
699
        0x0161,    0x00FD,    0x00FE,    0x00F0,
700
    // F0f0
701
        0xFB01,    0xFB02,    0x0131,    0x00B9,
702
        0x00B2,    0x00B3,    0x00BD,    0x00BC,
703
        0x00BE,    0x2044,    0x00A6,    0x02DD,
704
        0x02D8,    0x02C7,    0x02DA,    0x02DB,
705
};
706
707
const sal_Unicode aAdobeSymbolToAppleSymbolTab[224] =
708
{
709
    // F020
710
        0x0020,    0x0021,    0x2200,    0x0023,
711
        0x2203,    0x0025,    0x0026,    0x220D,
712
        0x0028,    0x0029,    0x2217,    0x002B,
713
        0x002C,    0x2212,    0x002E,    0x002F,
714
    // F030
715
        0x0030,    0x0031,    0x0032,    0x0033,
716
        0x0034,    0x0035,    0x0036,    0x0037,
717
        0x0038,    0x0039,    0x003A,    0x003B,
718
        0x003C,    0x003D,    0x003E,    0x003F,
719
    // F040
720
        0x2245,    0x0391,    0x0392,    0x03A7,
721
        0x0394,    0x0395,    0x03A6,    0x0393,
722
        0x0397,    0x0399,    0x03D1,    0x039A,
723
        0x039B,    0x039C,    0x039D,    0x039F,
724
    // F050
725
        0x03A0,    0x0398,    0x03A1,    0x03A3,
726
        0x03A4,    0x03A5,    0x03C2,    0x03A9,
727
        0x039E,    0x03A8,    0x0396,    0x005B,
728
        0x2234,    0x005D,    0x22A5,    0x005F,
729
    // F060
730
        0xF8E5,    0x03B1,    0x03B2,    0x03C7,
731
        0x03B4,    0x03B5,    0x03C6,    0x03B3,
732
        0x03B7,    0x03B9,    0x03D5,    0x03BA,
733
        0x03BB,    0x03BC,    0x03BD,    0x03BF,
734
    // F070
735
        0x03C0,    0x03B8,    0x03C1,    0x03C3,
736
        0x03C4,    0x03C5,    0x03D6,    0x03C9,
737
        0x03BE,    0x03C8,    0x03B6,    0x007B,
738
        0x007C,    0x007D,    0x223C,    0x007F,
739
    // F080
740
        0x0080,    0x0081,    0x0082,    0x0083,
741
        0x0084,    0x0085,    0x0086,    0x0087,
742
        0x0088,    0x0089,    0x008A,    0x008B,
743
        0x008C,    0x008D,    0x008E,    0x008F,
744
    // F090
745
        0x0090,    0x0091,    0x0092,    0x0093,
746
        0x0094,    0x0095,    0x0096,    0x0097,
747
        0x0098,    0x0099,    0x009A,    0x009B,
748
        0x009C,    0x009D,    0x009E,    0x009F,
749
    // F0a0
750
        0x20AC,    0x03D2,    0x2032,    0x2264,
751
        0x2044,    0x221E,    0x0192,    0x2663,
752
        0x2666,    0x2665,    0x2660,    0x2194,
753
        0x2190,    0x2191,    0x2192,    0x2193,
754
    // F0b0
755
        0x00B0,    0x00B1,    0x2033,    0x2065,
756
        0x00D7,    0x221D,    0x2202,    0x2022,
757
        0x00F7,    0x2260,    0x2261,    0x2248,
758
        0x2026,    0x23D0,    0x23AF,    0x21B5,
759
    // F0c0
760
        0x2135,    0x2111,    0x211C,    0x2118,
761
        0x2297,    0x2295,    0x2205,    0x2229,
762
        0x222A,    0x2283,    0x2287,    0x2284,
763
        0x2282,    0x2286,    0x2208,    0x2209,
764
    // F0d0
765
        0x2220,    0x2207,    0x00AE,    0x00A9,
766
        0x2122,    0x220F,    0x221A,    0x22C5,
767
        0x00AC,    0x2227,    0x2228,    0x21D4,
768
        0x21D0,    0x21D1,    0x21D2,    0x21D3,
769
    // F0e0
770
        0x25CA,    0x3008,    0x00AE,    0x00A9,
771
        0x2122,    0x2211,    0x239B,    0x239C,
772
        0x239D,    0x23A1,    0x23A2,    0x23A3,
773
        0x23A7,    0x23A8,    0x23A9,    0x23AA,
774
    // F0f0
775
        0xF8FF,    0x3009,    0x222B,    0x2320,
776
        0x23AE,    0x2321,    0x239E,    0x239F,
777
        0x23A0,    0x23A4,    0x23A5,    0x23A6,
778
        0x23AB,    0x23AC,    0x23AD,    0x00FF
779
};
780
781
static sal_Unicode ImplStarSymbolToStarBats( sal_Unicode c )
782
0
{
783
0
    switch ( c )
784
0
    {
785
0
        case 0x00A2: c = 0xF0E0; break;
786
0
        case 0x00A4: c = 0xF0E1; break;
787
0
        case 0x00A5: c = 0xF0E2; break;
788
0
        case 0x00A7: c = 0xF0A7; break;
789
0
        case 0x00AB: c = 0xF0AB; break;
790
0
        case 0x00B6: c = 0xF0DE; break;
791
0
        case 0x00BB: c = 0xF0BB; break;
792
793
0
        case 0x0152: c = 0xF08C; break;
794
0
        case 0x0153: c = 0xF09C; break;
795
0
        case 0x0160: c = 0xF08A; break;
796
0
        case 0x0161: c = 0xF09A; break;
797
0
        case 0x0178: c = 0xF09F; break;
798
0
        case 0x017D: c = 0xF08E; break;
799
0
        case 0x017E: c = 0xF09E; break;
800
801
0
        case 0x0192: c = 0xF083; break;
802
0
        case 0x02C6: c = 0xF088; break;
803
0
        case 0x02DC: c = 0xF098; break;
804
0
        case 0x2013: c = 0xF096; break;
805
0
        case 0x2014: c = 0xF097; break;
806
0
        case 0x2018: c = 0xF091; break;
807
808
0
        case 0x2019: c = 0xF092; break;
809
0
        case 0x201A: c = 0xF082; break;
810
0
        case 0x201C: c = 0xF093; break;
811
0
        case 0x201D: c = 0xF094; break;
812
0
        case 0x201E: c = 0xF084; break;
813
0
        case 0x2020: c = 0xF086; break;
814
815
0
        case 0x2021: c = 0xF087; break;
816
0
        case 0x2022: c = 0xF095; break;
817
0
        case 0x2026: c = 0xF085; break;
818
0
        case 0x2030: c = 0xF089; break;
819
0
        case 0x2039: c = 0xF08B; break;
820
0
        case 0x203A: c = 0xF09B; break;
821
822
0
        case 0x20A1: c = 0xF0E4; break;
823
0
        case 0x20A2: c = 0xF0E5; break;
824
0
        case 0x20A3: c = 0xF0E6; break;
825
0
        case 0x20A4: c = 0xF0E7; break;
826
0
        case 0x20A8: c = 0xF0EA; break;
827
0
        case 0x20A9: c = 0xF0E8; break;
828
0
        case 0x20AB: c = 0xF0E9; break;
829
0
        case 0x20AC: c = 0xF080; break;
830
831
0
        case 0x2122: c = 0xF099; break;
832
0
        case 0x2190: c = 0xF0B7; break;
833
0
        case 0x2191: c = 0xF0B8; break;
834
0
        case 0x2192: c = 0xF0B5; break;
835
0
        case 0x2193: c = 0xF0B6; break;
836
0
        case 0x2194: c = 0xF0D8; break;
837
0
        case 0x2195: c = 0xF0D9; break;
838
839
0
        case 0x21E4: c = 0xF0B4; break;
840
0
        case 0x21E5: c = 0xF0B3; break;
841
0
        case 0x21E6: c = 0xF0A4; break;
842
0
        case 0x21E7: c = 0xF0B2; break;
843
0
        case 0x21E8: c = 0xF0AF; break;
844
0
        case 0x21E9: c = 0xF0A3; break;
845
846
0
        case 0x25A0: c = 0xF024; break;
847
0
        case 0x25A1: c = 0xF025; break;
848
0
        case 0x25B4: c = 0xF0C5; break;
849
0
        case 0x25B5: c = 0xF0C7; break;
850
0
        case 0x25BE: c = 0xF0C4; break;
851
0
        case 0x25BF: c = 0xF0C6; break;
852
0
        case 0x25C6: c = 0xF043; break;
853
0
        case 0x25CF: c = 0xF022; break;
854
0
        case 0x25D7: c = 0xF0D0; break;
855
856
0
        case 0x260E: c = 0xF074; break;
857
0
        case 0x2611: c = 0xF034; break;
858
0
        case 0x2612: c = 0xF033; break;
859
0
        case 0x261B: c = 0xF036; break;
860
0
        case 0x261E: c = 0xF07D; break;
861
0
        case 0x2639: c = 0xF0AD; break;
862
0
        case 0x263A: c = 0xF021; break;
863
864
0
        case 0x2702: c = 0xF0CB; break;
865
0
        case 0x2708: c = 0xF0CC; break;
866
0
        case 0x270D: c = 0xF07E; break;
867
0
        case 0x270E: c = 0xF038; break;
868
869
0
        case 0x2713: c = 0xF039; break;
870
0
        case 0x2714: c = 0xF03A; break;
871
0
        case 0x2717: c = 0xF04F; break;
872
0
        case 0x2718: c = 0xF050; break;
873
0
        case 0x2719: c = 0xF051; break;
874
0
        case 0x271A: c = 0xF052; break;
875
0
        case 0x271B: c = 0xF053; break;
876
0
        case 0x271C: c = 0xF054; break;
877
878
0
        case 0x2721: c = 0xF0CD; break;
879
0
        case 0x2722: c = 0xF044; break;
880
0
        case 0x2723: c = 0xF045; break;
881
0
        case 0x2724: c = 0xF046; break;
882
0
        case 0x2725: c = 0xF047; break;
883
0
        case 0x272B: c = 0xF055; break;
884
0
        case 0x272C: c = 0xF056; break;
885
0
        case 0x272D: c = 0xF057; break;
886
0
        case 0x272E: c = 0xF058; break;
887
0
        case 0x272F: c = 0xF059; break;
888
889
0
        case 0x2730: c = 0xF05A; break;
890
0
        case 0x2733: c = 0xF048; break;
891
0
        case 0x2734: c = 0xF049; break;
892
0
        case 0x2735: c = 0xF04A; break;
893
0
        case 0x2736: c = 0xF04B; break;
894
0
        case 0x2737: c = 0xF04C; break;
895
0
        case 0x2738: c = 0xF04D; break;
896
0
        case 0x2739: c = 0xF04E; break;
897
0
        case 0x273F: c = 0xF0CE; break;
898
899
0
        case 0x2744: c = 0xF0CF; break;
900
0
        case 0x274D: c = 0xF023; break;
901
0
        case 0x274F: c = 0xF03E; break;
902
0
        case 0x2750: c = 0xF03F; break;
903
0
        case 0x2751: c = 0xF027; break;
904
0
        case 0x2752: c = 0xF028; break;
905
0
        case 0x2756: c = 0xF02C; break;
906
0
        case 0x2759: c = 0xF0D1; break;
907
0
        case 0x2762: c = 0xF0D4; break;
908
909
0
        case 0x2780: c = 0xF068; break;
910
0
        case 0x2781: c = 0xF069; break;
911
0
        case 0x2782: c = 0xF06A; break;
912
0
        case 0x2783: c = 0xF06B; break;
913
0
        case 0x2784: c = 0xF06C; break;
914
0
        case 0x2785: c = 0xF06D; break;
915
0
        case 0x2786: c = 0xF06E; break;
916
0
        case 0x2787: c = 0xF06F; break;
917
0
        case 0x2788: c = 0xF070; break;
918
0
        case 0x2789: c = 0xF071; break;
919
0
        case 0x278A: c = 0xF05D; break;
920
0
        case 0x278B: c = 0xF05E; break;
921
0
        case 0x278C: c = 0xF05F; break;
922
0
        case 0x278D: c = 0xF060; break;
923
0
        case 0x278E: c = 0xF061; break;
924
0
        case 0x278F: c = 0xF062; break;
925
926
0
        case 0x2790: c = 0xF063; break;
927
0
        case 0x2791: c = 0xF064; break;
928
0
        case 0x2792: c = 0xF065; break;
929
0
        case 0x2793: c = 0xF066; break;
930
0
        case 0x2794: c = 0xF031; break;
931
0
        case 0x2798: c = 0xF0DA; break;
932
0
        case 0x279A: c = 0xF0DB; break;
933
934
0
        case 0x27A2: c = 0xF02F; break;
935
0
        case 0x27B2: c = 0xF035; break;
936
0
        case 0x27B8: c = 0xF0DC; break;
937
938
0
        case 0xE000: c = 0xF000+38; break;
939
0
        case 0xE001: c = 0xF000+41; break;
940
0
        case 0xE002: c = 0xF000+42; break;
941
0
        case 0xE003: c = 0xF000+43; break;
942
0
        case 0xE004: c = 0xF000+45; break;
943
0
        case 0xE005: c = 0xF000+46; break;
944
0
        case 0xE006: c = 0xF000+48; break;
945
0
        case 0xE007: c = 0xF000+57; break;
946
947
0
        case 0xE008: c = 0xF000+59; break;
948
0
        case 0xE009: c = 0xF000+60; break;
949
0
        case 0xE00a: c = 0xF000+61; break;
950
0
        case 0xE00b: c = 0xF000+64; break;
951
0
        case 0xE00c: c = 0xF000+65; break;
952
0
        case 0xE00d: c = 0xF000+66; break;
953
0
        case 0xE00e: c = 0xF000+67; break;
954
0
        case 0xE00f: c = 0xF000+92; break;
955
956
0
        case 0xE010: c = 0xF000+103; break;
957
0
        case 0xE011: c = 0xF000+114; break;
958
0
        case 0xE012: c = 0xF000+115; break;
959
0
        case 0xE013: c = 0xF000+117; break;
960
0
        case 0xE014: c = 0xF000+118; break;
961
0
        case 0xE015: c = 0xF000+119; break;
962
0
        case 0xE016: c = 0xF000+120; break;
963
0
        case 0xE017: c = 0xF000+121; break;
964
965
0
        case 0xE018: c = 0xF000+122; break;
966
0
        case 0xE019: c = 0xF000+123; break;
967
0
        case 0xE01a: c = 0xF000+124; break;
968
0
        case 0xE01b: c = 0xF000+126; break;
969
0
        case 0xE01c: c = 0xF000+136; break;
970
0
        case 0xE01d: c = 0xF000+155; break;
971
0
        case 0xE01e: c = 0xF000+165; break;
972
0
        case 0xE01f: c = 0xF000+166; break;
973
974
0
        case 0xE020: c = 0xF000+168; break;
975
0
        case 0xE021: c = 0xF000+169; break;
976
0
        case 0xE022: c = 0xF000+170; break;
977
0
        case 0xE023: c = 0xF000+172; break;
978
0
        case 0xE024: c = 0xF000+174; break;
979
0
        case 0xE025: c = 0xF000+175; break;
980
0
        case 0xE026: c = 0xF000+176; break;
981
0
        case 0xE027: c = 0xF000+177; break;
982
983
0
        case 0xE028: c = 0xF000+178; break;
984
0
        case 0xE029: c = 0xF000+185; break;
985
0
        case 0xE02a: c = 0xF000+186; break;
986
0
        case 0xE02b: c = 0xF000+188; break;
987
0
        case 0xE02c: c = 0xF000+189; break;
988
0
        case 0xE02d: c = 0xF000+190; break;
989
0
        case 0xE02e: c = 0xF000+191; break;
990
0
        case 0xE02f: c = 0xF000+192; break;
991
992
0
        case 0xE030: c = 0xF000+193; break;
993
0
        case 0xE031: c = 0xF000+194; break;
994
0
        case 0xE032: c = 0xF000+195; break;
995
0
        case 0xE033: c = 0xF000+200; break;
996
0
        case 0xE034: c = 0xF000+201; break;
997
0
        case 0xE035: c = 0xF000+202; break;
998
0
        case 0xE036: c = 0xF000+210; break;
999
0
        case 0xE037: c = 0xF000+211; break;
1000
1001
0
        case 0xE038: c = 0xF000+227; break;
1002
0
        case 0xE039: c = 0xF000+235; break;
1003
0
        case 0xE03a: c = 0xF000+255; break;
1004
1005
0
        default: c = 0; break;
1006
0
    }
1007
1008
0
    return c;
1009
0
}
1010
1011
namespace {
1012
1013
enum SymbolFont
1014
{
1015
    Symbol=1, Wingdings=2, MonotypeSorts=4, Webdings=8, Wingdings2=16,
1016
    Wingdings3=32, MTExtra=64, TimesNewRoman=128
1017
};
1018
1019
}
1020
1021
constexpr OUString aSymbolNames[] =
1022
{
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
1025
};
1026
1027
namespace {
1028
1029
struct SymbolEntry
1030
{
1031
    sal_uInt8 cIndex;
1032
    enum SymbolFont eFont;
1033
};
1034
1035
class StarSymbolToMSMultiFontImpl : public StarSymbolToMSMultiFont
1036
{
1037
private:
1038
    ::std::multimap<sal_Unicode, SymbolEntry> maMagicMap;
1039
public:
1040
    explicit StarSymbolToMSMultiFontImpl();
1041
    OUString ConvertChar(sal_Unicode &rChar) override;
1042
};
1043
1044
struct ExtraTable { sal_Unicode cStar; sal_uInt8 cMS;};
1045
1046
}
1047
1048
ExtraTable const aWingDingsExtraTab[] =
1049
{
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}
1064
};
1065
1066
ExtraTable const aSymbolExtraTab2[] =
1067
{
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}
1092
};
1093
1094
ExtraTable const aSymbolExtraTab[] =
1095
{
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}
1114
};
1115
1116
ExtraTable const aTNRExtraTab[] =
1117
{
1118
    {0xe021, 0xA9},
1119
    {0xe022, 0x40},
1120
    {0xe024, 0xAE},
1121
    {0xe035, 0x20},
1122
    {0xe036, '('},
1123
    {0xe037, ')'},
1124
    {0xe039, 0x20},
1125
    {0xe03a, 0x80},
1126
    {0xe080, 0x89},
1127
    {0xe083, '+'},
1128
    {0xe084, '<'},
1129
    {0xe085, '>'},
1130
    {0xe0a9, '\\'}
1131
};
1132
1133
StarSymbolToMSMultiFontImpl::StarSymbolToMSMultiFontImpl()
1134
0
{
1135
0
    struct ConvertTable
1136
0
    {
1137
0
        enum SymbolFont meFont;
1138
0
        const sal_Unicode* pTab;
1139
0
    };
1140
1141
    //In order of preference
1142
0
    static const ConvertTable aConservativeTable[] =
1143
0
    {
1144
0
        {Symbol,         aAdobeSymbolTab},
1145
0
        {Wingdings,      aWingDingsTab},
1146
0
        {MonotypeSorts,  aMonotypeSortsTab},
1147
0
        {Webdings,       aWebDingsTab},
1148
0
        {Wingdings2,     aWingDings2Tab},
1149
0
        {Wingdings3,     aWingDings3Tab},
1150
0
        {MTExtra,        aMTExtraTab}
1151
0
    };
1152
1153
0
    struct ExtendedConvertTable
1154
0
    {
1155
0
        enum SymbolFont meFont;
1156
0
        const ExtraTable *mpTable;
1157
0
        size_t mnSize;
1158
0
        ExtendedConvertTable(SymbolFont eFont, const ExtraTable *pTable,
1159
0
            size_t nSize)
1160
0
            : meFont(eFont), mpTable(pTable), mnSize(nSize) {}
1161
0
    };
1162
1163
    //Reverse map from a given starsymbol char to exact matches in ms symbol
1164
    //fonts.
1165
0
    for (auto const & r: aConservativeTable)
1166
0
    {
1167
0
        SymbolEntry aEntry;
1168
0
        aEntry.eFont = r.meFont;
1169
0
        for (aEntry.cIndex = 0xFF; aEntry.cIndex >= 0x20; --aEntry.cIndex)
1170
0
        {
1171
0
            if (sal_Unicode cChar = r.pTab[aEntry.cIndex-0x20])
1172
0
                maMagicMap.emplace(cChar, aEntry);
1173
0
        }
1174
0
    }
1175
1176
    //In order of preference
1177
0
    static const ExtendedConvertTable aAggressiveTable[] =
1178
0
    {
1179
0
        ExtendedConvertTable(Symbol, aSymbolExtraTab2,
1180
0
            sizeof(aSymbolExtraTab2)),
1181
0
        ExtendedConvertTable(Symbol, aSymbolExtraTab,
1182
0
            sizeof(aSymbolExtraTab)),
1183
0
        ExtendedConvertTable(Wingdings, aWingDingsExtraTab,
1184
0
            sizeof(aWingDingsExtraTab)),
1185
0
        ExtendedConvertTable(TimesNewRoman, aTNRExtraTab,
1186
0
            sizeof(aTNRExtraTab))
1187
0
    };
1188
1189
    //Allow extra conversions that are not perfect, but "good enough"
1190
0
    for (auto const & r: aAggressiveTable)
1191
0
    {
1192
0
        SymbolEntry aEntry;
1193
0
        aEntry.eFont = r.meFont;
1194
0
        for (int j = r.mnSize / sizeof(r.mpTable[0]) - 1; j >=0; --j)
1195
0
        {
1196
0
            aEntry.cIndex = r.mpTable[j].cMS;
1197
0
            maMagicMap.emplace(r.mpTable[j].cStar, aEntry);
1198
0
        }
1199
0
    }
1200
0
}
1201
1202
static const OUString & SymbolFontToString(int nResult)
1203
0
{
1204
0
    const OUString *ppName = aSymbolNames;
1205
0
    int nI = Symbol;
1206
0
    while (nI <= nResult)
1207
0
    {
1208
0
        if (!(nI & nResult))
1209
0
            nI = nI << 1;
1210
0
        else
1211
0
            break;
1212
0
        ppName++;
1213
0
    }
1214
0
    return *ppName;
1215
0
}
1216
1217
OUString StarSymbolToMSMultiFontImpl::ConvertChar(sal_Unicode &rChar)
1218
0
{
1219
0
    OUString sRet;
1220
1221
0
    ::std::multimap<sal_Unicode, SymbolEntry>::const_iterator aResult =
1222
0
        maMagicMap.find(rChar);
1223
1224
0
    if (aResult != maMagicMap.end())
1225
0
    {
1226
0
        const SymbolEntry &rEntry = (*aResult).second;
1227
0
        sRet = SymbolFontToString(rEntry.eFont);
1228
0
        rChar = rEntry.cIndex;
1229
0
    }
1230
1231
0
    return sRet;
1232
0
}
1233
1234
StarSymbolToMSMultiFont *CreateStarSymbolToMSMultiFont()
1235
0
{
1236
0
    return new StarSymbolToMSMultiFontImpl;
1237
0
}
1238
1239
sal_Unicode ConvertChar::RecodeChar( sal_Unicode cChar ) const
1240
0
{
1241
0
    sal_Unicode cRetVal = 0;
1242
0
    if( mpCvtFunc )
1243
0
    {
1244
        // use a conversion function for recoding
1245
0
        cRetVal = mpCvtFunc( cChar );
1246
0
    }
1247
0
    else
1248
0
    {
1249
        // use a conversion table for recoding
1250
0
        sal_Unicode cIndex = cChar;
1251
        // allow symbol aliasing
1252
0
        if( cIndex & 0xFF00 )
1253
0
            cIndex -= 0xF000;
1254
        // recode the symbol
1255
0
        if( cIndex>=0x0020 && cIndex<=0x00FF )
1256
0
        {
1257
0
            cRetVal = mpCvtTab[ cIndex - 0x0020 ];
1258
1259
0
            if (!cRetVal && !maSubsFontName.isEmpty())
1260
0
            {
1261
0
                if ( IsOpenSymbol( maSubsFontName ) )
1262
0
                {
1263
0
                    cRetVal = 0xE12C;
1264
0
                    SAL_WARN( "unotools.misc", "Forcing a bullet substitution from 0x" <<
1265
0
                        OString::number(cChar, 16) << " to 0x" <<
1266
0
                        OString::number(cRetVal, 16));
1267
0
                }
1268
0
            }
1269
0
        }
1270
0
    }
1271
1272
0
    return cRetVal ? cRetVal : cChar;
1273
0
}
1274
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
1278
0
{
1279
0
    sal_Int32 nLastIndex = nIndex + nLen;
1280
0
    OUStringBuffer    aTmpStr(rStr);
1281
1282
0
    if( nLastIndex > aTmpStr.getLength() )
1283
0
        nLastIndex = aTmpStr.getLength();
1284
1285
0
    for(; nIndex < nLastIndex; ++nIndex )
1286
0
    {
1287
0
        sal_Unicode cOrig = rStr[ nIndex ];
1288
        // only recode symbols and their U+00xx aliases
1289
0
        if( ((cOrig < 0x0020) || (cOrig > 0x00FF))
1290
0
        &&  ((cOrig < 0xF020) || (cOrig > 0xF0FF)) )
1291
0
            continue;
1292
1293
        // recode a symbol
1294
0
        sal_Unicode cNew = RecodeChar( cOrig );
1295
0
        if( cOrig != cNew )
1296
0
            aTmpStr[ nIndex ] = cNew;
1297
0
    }
1298
0
    rStr = aTmpStr.makeStringAndClear();
1299
0
}
1300
1301
namespace {
1302
1303
struct RecodeTable { const char* pOrgName; ConvertChar aCvt;};
1304
1305
}
1306
1307
constexpr RecodeTable aStarSymbolRecodeTable[] =
1308
{
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}},
1313
1314
    {"symbol",          {aAdobeSymbolTab, u"StarSymbol"_ustr, nullptr}},
1315
    {"standardsymbols", {aAdobeSymbolTab, u"StarSymbol"_ustr, nullptr}},
1316
    {"standardsymbolsl",{aAdobeSymbolTab, u"StarSymbol"_ustr, nullptr}},
1317
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}},
1323
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}}
1329
};
1330
1331
const RecodeTable aAppleSymbolRecodeTable[] = {
1332
    {"symbol",         {aAdobeSymbolToAppleSymbolTab, u"AppleSymbol"_ustr, nullptr}}
1333
};
1334
1335
const ConvertChar aImplStarSymbolCvt = { nullptr, u"StarBats"_ustr, ImplStarSymbolToStarBats };
1336
1337
const ConvertChar* ConvertChar::GetRecodeData( std::u16string_view rOrgFontName, std::u16string_view rMapFontName )
1338
20.4k
{
1339
20.4k
    const ConvertChar* pCvt = nullptr;
1340
1341
    // clean up and lowercase font name
1342
20.4k
    OUString aOrgName( GetEnglishSearchFontName( rOrgFontName ) );
1343
20.4k
    OUString aMapName( GetEnglishSearchFontName( rMapFontName ) );
1344
1345
20.4k
    if( aMapName == "starsymbol"
1346
20.4k
     || aMapName == "opensymbol" )
1347
11.6k
    {
1348
11.6k
        for (auto const & r: aStarSymbolRecodeTable)
1349
121k
        {
1350
121k
            if( aOrgName.equalsAscii( r.pOrgName ) )
1351
8.53k
            {
1352
8.53k
                pCvt = &r.aCvt;
1353
8.53k
                break;
1354
8.53k
            }
1355
121k
        }
1356
11.6k
    }
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
8.77k
    else if( aMapName == "applesymbol" )
1361
0
    {
1362
0
        for (auto const & r: aAppleSymbolRecodeTable)
1363
0
        {
1364
0
            if( aOrgName.equalsAscii( r.pOrgName ) )
1365
0
            {
1366
0
                pCvt = &r.aCvt;
1367
0
                break;
1368
0
            }
1369
0
        }
1370
0
    }
1371
8.77k
    else if( aMapName == "starbats" )
1372
0
    {
1373
0
        if( aOrgName == "starsymbol" )
1374
0
            pCvt = &aImplStarSymbolCvt;
1375
0
        else if( aOrgName == "opensymbol" )
1376
0
            pCvt = &aImplStarSymbolCvt;
1377
0
    }
1378
1379
20.4k
    return pCvt;
1380
20.4k
}
1381
1382
FontToSubsFontConverter CreateFontToSubsFontConverter( std::u16string_view rOrgName, FontToSubsFontFlags nFlags )
1383
0
{
1384
0
    const ConvertChar* pCvt = nullptr;
1385
1386
0
    OUString aName = GetEnglishSearchFontName( rOrgName );
1387
1388
0
    if ( nFlags == FontToSubsFontFlags::IMPORT )
1389
0
    {
1390
0
        const std::size_t nEntries = 2; // only StarMath+StarBats
1391
0
        for( std::size_t i = 0; i < nEntries; ++i )
1392
0
        {
1393
0
            const RecodeTable& r = aStarSymbolRecodeTable[i];
1394
0
            if( aName.equalsAscii( r.pOrgName ) )
1395
0
            {
1396
0
                pCvt = &r.aCvt;
1397
0
                break;
1398
0
            }
1399
0
        }
1400
0
    }
1401
0
    else
1402
0
    {
1403
        // TODO: only StarMath+StarBats
1404
0
        if( aName == "starsymbol" )
1405
0
            pCvt = &aImplStarSymbolCvt;
1406
0
        else if( aName == "opensymbol" )
1407
0
            pCvt = &aImplStarSymbolCvt;
1408
0
    }
1409
1410
0
    return const_cast<ConvertChar *>(pCvt);
1411
0
}
1412
1413
sal_Unicode ConvertFontToSubsFontChar(
1414
    FontToSubsFontConverter hConverter, sal_Unicode cChar )
1415
0
{
1416
0
    if ( hConverter )
1417
0
        return static_cast<ConvertChar*>(hConverter)->RecodeChar( cChar );
1418
0
    else
1419
0
        return cChar;
1420
0
}
1421
1422
OUString GetFontToSubsFontName( FontToSubsFontConverter hConverter )
1423
0
{
1424
0
    if ( !hConverter )
1425
0
        return OUString();
1426
1427
0
    return static_cast<ConvertChar*>(hConverter)->maSubsFontName;
1428
0
}
1429
1430
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */