LCOV - code coverage report
Current view: top level - libreoffice/unotools/source/misc - fontcvt.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 24 353 6.8 %
Date: 2012-12-27 Functions: 2 16 12.5 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.10