Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*
3 : : * Version: MPL 1.1 / GPLv3+ / LGPLv3+
4 : : *
5 : : * The contents of this file are subject to the Mozilla Public License Version
6 : : * 1.1 (the "License"); you may not use this file except in compliance with
7 : : * the License. You may obtain a copy of the License at
8 : : * http://www.mozilla.org/MPL/
9 : : *
10 : : * Software distributed under the License is distributed on an "AS IS" basis,
11 : : * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
12 : : * for the specific language governing rights and limitations under the
13 : : * License.
14 : : *
15 : : * The Initial Developer of the Original Code is
16 : : * [ Caolan McNamara <caolanm@redhat.com> ]
17 : : * Portions created by the Initial Developer are Copyright (C) 2010 the
18 : : * Initial Developer. All Rights Reserved.
19 : : *
20 : : * Contributor(s): Caolan McNamara <caolanm@redhat.com>
21 : : *
22 : : * Alternatively, the contents of this file may be used under the terms of
23 : : * either the GNU General Public License Version 3 or later (the "GPLv3+"), or
24 : : * the GNU Lesser General Public License Version 3 or later (the "LGPLv3+"),
25 : : * in which case the provisions of the GPLv3+ or the LGPLv3+ are applicable
26 : : * instead of those above.
27 : : */
28 : : #include <svtools/sampletext.hxx>
29 : : #include <vcl/font.hxx>
30 : : #include <vcl/outdev.hxx>
31 : : #include <vcl/virdev.hxx>
32 : : #include <vcl/metric.hxx>
33 : : #include <i18nutil/unicode.hxx>
34 : :
35 : 4 : bool isOpenSymbolFont(const Font &rFont)
36 : : {
37 : 4 : return rFont.GetName().EqualsIgnoreCaseAscii("starsymbol") ||
38 [ - + ][ + - ]: 4 : rFont.GetName().EqualsIgnoreCaseAscii("opensymbol");
39 : : }
40 : :
41 : 4 : bool isSymbolFont(const Font &rFont)
42 : : {
43 : 4 : return (rFont.GetCharSet() == RTL_TEXTENCODING_SYMBOL) ||
44 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("cmsy10") ||
45 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("cmex10") ||
46 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("feta26") ||
47 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("jsMath-cmsy10") ||
48 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("jsMath-cmex10") ||
49 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("msam10") ||
50 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("msbm10") ||
51 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("wasy10") ||
52 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("Denemo") ||
53 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("GlyphBasic1") ||
54 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("GlyphBasic2") ||
55 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("GlyphBasic3") ||
56 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("GlyphBasic4") ||
57 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("Letters Laughing") ||
58 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("MusiQwik") ||
59 : 4 : rFont.GetName().EqualsIgnoreCaseAscii("MusiSync") ||
60 [ - + ][ + - : 68 : isOpenSymbolFont(rFont);
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - ]
61 : : }
62 : :
63 : 2 : bool canRenderNameOfSelectedFont(OutputDevice &rDevice)
64 : : {
65 : 2 : const Font &rFont = rDevice.GetFont();
66 [ + - ][ + - ]: 2 : return !isSymbolFont(rFont) && (STRING_LEN == rDevice.HasGlyphs(rFont, rFont.GetName()));
67 : : }
68 : :
69 : 0 : rtl::OUString makeShortRepresentativeSymbolTextForSelectedFont(OutputDevice &rDevice)
70 : : {
71 [ # # ]: 0 : const bool bOpenSymbol = isOpenSymbolFont(rDevice.GetFont());
72 : :
73 [ # # ]: 0 : if (!bOpenSymbol)
74 : : {
75 [ # # ]: 0 : FontCharMap aFontCharMap;
76 [ # # ]: 0 : bool bHasCharMap = rDevice.GetFontCharMap(aFontCharMap);
77 [ # # ]: 0 : if( bHasCharMap )
78 : : {
79 : : // use some sample characters available in the font
80 : : sal_Unicode aText[8];
81 : :
82 : : // start just above the PUA used by most symbol fonts
83 : 0 : sal_uInt32 cNewChar = 0xFF00;
84 : : #ifdef QUARTZ
85 : : // on MacOSX there are too many non-presentable symbols above the codepoint 0x0192
86 : : if( !bOpenSymbol )
87 : : cNewChar = 0x0192;
88 : : #endif
89 : :
90 : 0 : const int nMaxCount = sizeof(aText)/sizeof(*aText) - 1;
91 [ # # ]: 0 : int nSkip = aFontCharMap.GetCharCount() / nMaxCount;
92 [ # # ]: 0 : if( nSkip > 10 )
93 : 0 : nSkip = 10;
94 [ # # ]: 0 : else if( nSkip <= 0 )
95 : 0 : nSkip = 1;
96 [ # # ]: 0 : for( int i = 0; i < nMaxCount; ++i )
97 : : {
98 : 0 : sal_uInt32 cOldChar = cNewChar;
99 [ # # ]: 0 : for( int j = nSkip; --j >= 0; )
100 [ # # ]: 0 : cNewChar = aFontCharMap.GetPrevChar( cNewChar );
101 [ # # ]: 0 : if( cOldChar == cNewChar )
102 : 0 : break;
103 : 0 : aText[ i ] = static_cast<sal_Unicode>(cNewChar); // TODO: support UCS4 samples
104 : 0 : aText[ i+1 ] = 0;
105 : : }
106 : :
107 : 0 : return rtl::OUString(aText);
108 [ # # ][ # # ]: 0 : }
109 : : }
110 : :
111 : : static sal_Unicode aImplSymbolFontText[] = {
112 : : 0xF021,0xF032,0xF043,0xF054,0xF065,0xF076,0xF0B7,0xF0C8,0};
113 : : static sal_Unicode aImplStarSymbolText[] = {
114 : : 0x2706,0x2704,0x270D,0xE033,0x2211,0x2288,0};
115 [ # # ]: 0 : const sal_Unicode* pText = bOpenSymbol ? aImplStarSymbolText : aImplSymbolFontText;
116 : 0 : rtl::OUString sSampleText(pText);
117 [ # # ][ # # ]: 0 : bool bHasSampleTextGlyphs = (STRING_LEN == rDevice.HasGlyphs(rDevice.GetFont(), sSampleText));
[ # # ]
118 [ # # ]: 0 : return bHasSampleTextGlyphs ? sSampleText : rtl::OUString();
119 : : }
120 : :
121 : : //These ones are typically for use in the font dropdown box beside the
122 : : //fontname, so say things roughly like "Script/Alphabet/Name-Of-Major-Language"
123 : : //
124 : : //Here we don't always know the language of course, only the script that can be
125 : : //written with the font. Often that's one single language written in that
126 : : //script, or a handful of related languages where the name of the script is the
127 : : //same between languages, or the name in the major language is known by most
128 : : //readers of the minor languages, e.g. Yiddish is written with the HEBREW
129 : : //script as well, the vast majority of Yiddish readers will be able to read
130 : : //Hebrew as well.
131 : 0 : rtl::OUString makeShortRepresentativeTextForScript(UScriptCode eScript)
132 : : {
133 : 0 : rtl::OUString sSampleText;
134 [ # # # # : 0 : switch (eScript)
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # ]
135 : : {
136 : : case USCRIPT_GREEK:
137 : : {
138 : : const sal_Unicode aGrek[] = {
139 : : 0x0391, 0x03BB, 0x03C6, 0x03AC, 0x03B2, 0x03B7, 0x03C4, 0x03BF
140 : 0 : };
141 : 0 : sSampleText = rtl::OUString(aGrek, SAL_N_ELEMENTS(aGrek));
142 : : break;
143 : : }
144 : : case USCRIPT_HEBREW:
145 : : {
146 : : const sal_Unicode aHebr[] = {
147 : : 0x05D0, 0x05B8, 0x05DC, 0x05B6, 0x05E3, 0x05BE, 0x05D1, 0x05B5,
148 : : 0x05BC, 0x05D9, 0x05EA, 0x0020, 0x05E2, 0x05B4, 0x05D1, 0x05B0,
149 : : 0x05E8, 0x05B4, 0x05D9
150 : 0 : };
151 : 0 : sSampleText = rtl::OUString(aHebr, SAL_N_ELEMENTS(aHebr));
152 : : break;
153 : : }
154 : : case USCRIPT_ARABIC:
155 : : {
156 : : const sal_Unicode aArab[] = {
157 : : 0x0623, 0x0628, 0x062C, 0x062F, 0x064A, 0x0629, 0x0020, 0x0639,
158 : : 0x0631, 0x0628, 0x064A, 0x0629
159 : 0 : };
160 : 0 : sSampleText = rtl::OUString(aArab, SAL_N_ELEMENTS(aArab));
161 : : break;
162 : : }
163 : : case USCRIPT_DEVANAGARI:
164 : : {
165 : : const sal_Unicode aDeva[] = {
166 : : 0x0926, 0x0947, 0x0935, 0x0928, 0x093E, 0x0917, 0x0930, 0x0940
167 : 0 : };
168 : 0 : sSampleText = rtl::OUString(aDeva, SAL_N_ELEMENTS(aDeva));
169 : : break;
170 : : }
171 : : case USCRIPT_BENGALI:
172 : : {
173 : : const sal_Unicode aBeng[] = {
174 : : 0x09AC, 0x09BE, 0x0982, 0x09B2, 0x09BE, 0x0020, 0x09B2, 0x09BF,
175 : : 0x09AA, 0x09BF
176 : 0 : };
177 : 0 : sSampleText = rtl::OUString(aBeng, SAL_N_ELEMENTS(aBeng));
178 : : break;
179 : : }
180 : : case USCRIPT_GURMUKHI:
181 : : {
182 : : const sal_Unicode aGuru[] = {
183 : : 0x0A17, 0x0A41, 0x0A30, 0x0A2E, 0x0A41, 0x0A16, 0x0A40
184 : 0 : };
185 : 0 : sSampleText = rtl::OUString(aGuru, SAL_N_ELEMENTS(aGuru));
186 : : break;
187 : : }
188 : : case USCRIPT_GUJARATI:
189 : : {
190 : : const sal_Unicode aGujr[] = {
191 : : 0x0A97, 0x0AC1, 0x0A9C, 0x0AB0, 0x0ABE, 0x0AA4, 0x0aC0, 0x0020,
192 : : 0x0AB2, 0x0ABF, 0x0AAA, 0x0ABF
193 : 0 : };
194 : 0 : sSampleText = rtl::OUString(aGujr, SAL_N_ELEMENTS(aGujr));
195 : : break;
196 : : }
197 : : case USCRIPT_ORIYA:
198 : : {
199 : : const sal_Unicode aOrya[] = {
200 : : 0x0B09, 0x0B24, 0x0B4D, 0x0B15, 0x0B33, 0x0020, 0x0B32, 0x0B3F,
201 : : 0x0B2A, 0x0B3F
202 : 0 : };
203 : 0 : sSampleText = rtl::OUString(aOrya, SAL_N_ELEMENTS(aOrya));
204 : : break;
205 : : }
206 : : case USCRIPT_TAMIL:
207 : : {
208 : : const sal_Unicode aTaml[] = {
209 : : 0x0B85, 0x0BB0, 0x0BBF, 0x0B9A, 0x0BCD, 0x0B9A, 0x0BC1, 0x0BB5,
210 : : 0x0B9F, 0x0BBF
211 : 0 : };
212 : 0 : sSampleText = rtl::OUString(aTaml, SAL_N_ELEMENTS(aTaml));
213 : : break;
214 : : }
215 : : case USCRIPT_TELUGU:
216 : : {
217 : : const sal_Unicode aTelu[] = {
218 : : 0x0C24, 0x0C46, 0x0C32, 0x0C41, 0x0C17, 0x0C41
219 : 0 : };
220 : 0 : sSampleText = rtl::OUString(aTelu, SAL_N_ELEMENTS(aTelu));
221 : : break;
222 : : }
223 : : case USCRIPT_KANNADA:
224 : : {
225 : : const sal_Unicode aKnda[] = {
226 : : 0x0C95, 0x0CA8, 0x0CCD, 0x0CA8, 0x0CA1, 0x0020, 0x0CB2, 0x0CBF,
227 : : 0x0CAA, 0x0CBF
228 : 0 : };
229 : 0 : sSampleText = rtl::OUString(aKnda, SAL_N_ELEMENTS(aKnda));
230 : : break;
231 : : }
232 : : case USCRIPT_MALAYALAM:
233 : : {
234 : : const sal_Unicode aMlym[] = {
235 : : 0x0D2E, 0x0D32, 0x0D2F, 0x0D3E, 0x0D33, 0x0D32, 0x0D3F, 0x0D2A,
236 : : 0x0D3F
237 : 0 : };
238 : 0 : sSampleText = rtl::OUString(aMlym, SAL_N_ELEMENTS(aMlym));
239 : : break;
240 : : }
241 : : case USCRIPT_THAI:
242 : : {
243 : : const sal_Unicode aThai[] = {
244 : : 0x0E2D, 0x0E31, 0x0E01, 0x0E29, 0x0E23, 0x0E44, 0x0E17, 0x0E22
245 : 0 : };
246 : 0 : sSampleText = rtl::OUString(aThai, SAL_N_ELEMENTS(aThai));
247 : : break;
248 : : }
249 : : case USCRIPT_LAO:
250 : : {
251 : : const sal_Unicode aLao[] = {
252 : : 0x0EAD, 0x0EB1, 0x0E81, 0x0EAA, 0x0EAD, 0x0E99, 0x0EA5, 0x0EB2,
253 : : 0x0EA7
254 : 0 : };
255 : 0 : sSampleText = rtl::OUString(aLao, SAL_N_ELEMENTS(aLao));
256 : : break;
257 : : }
258 : : case USCRIPT_GEORGIAN:
259 : : {
260 : : const sal_Unicode aGeorgian[] = {
261 : : 0x10D3, 0x10D0, 0x10DB, 0x10EC, 0x10D4, 0x10E0, 0x10DA, 0x10DD,
262 : : 0x10D1, 0x10D0
263 : 0 : };
264 : 0 : sSampleText = rtl::OUString(aGeorgian, SAL_N_ELEMENTS(aGeorgian));
265 : : break;
266 : : }
267 : : case USCRIPT_HANGUL:
268 : : case USCRIPT_KOREAN:
269 : : {
270 : : const sal_Unicode aHang[] = {
271 : : 0xD55C, 0xAE00
272 : 0 : };
273 : 0 : sSampleText = rtl::OUString(aHang, SAL_N_ELEMENTS(aHang));
274 : : break;
275 : : }
276 : : case USCRIPT_TIBETAN:
277 : : {
278 : : const sal_Unicode aTibt[] = {
279 : : 0x0F51, 0x0F56, 0x0F74, 0x0F0B, 0x0F45, 0x0F53, 0x0F0B
280 : 0 : };
281 : 0 : sSampleText = rtl::OUString(aTibt, SAL_N_ELEMENTS(aTibt));
282 : : break;
283 : : }
284 : : case USCRIPT_SYRIAC:
285 : : {
286 : : const sal_Unicode aSyri[] = {
287 : : 0x0723, 0x071B, 0x072A, 0x0722, 0x0713, 0x0720, 0x0710
288 : 0 : };
289 : 0 : sSampleText = rtl::OUString(aSyri, SAL_N_ELEMENTS(aSyri));
290 : : break;
291 : : }
292 : : case USCRIPT_THAANA:
293 : : {
294 : : const sal_Unicode aThaa[] = {
295 : : 0x078C, 0x07A7, 0x0782, 0x07A6
296 : 0 : };
297 : 0 : sSampleText = rtl::OUString(aThaa, SAL_N_ELEMENTS(aThaa));
298 : : break;
299 : : }
300 : : case USCRIPT_SINHALA:
301 : : {
302 : : const sal_Unicode aSinh[] = {
303 : : 0x0DC1, 0x0DD4, 0x0DAF, 0x0DCA, 0x0DB0, 0x0020, 0x0DC3, 0x0DD2,
304 : : 0x0D82, 0x0DC4, 0x0DBD
305 : 0 : };
306 : 0 : sSampleText = rtl::OUString(aSinh, SAL_N_ELEMENTS(aSinh));
307 : : break;
308 : : }
309 : : case USCRIPT_MYANMAR:
310 : : {
311 : : const sal_Unicode aMymr[] = {
312 : : 0x1019, 0x103C, 0x1014, 0x103A, 0x1019, 0x102C, 0x1021, 0x1000,
313 : : 0x1039, 0x1001, 0x101B, 0x102C
314 : 0 : };
315 : 0 : sSampleText = rtl::OUString(aMymr, SAL_N_ELEMENTS(aMymr));
316 : : break;
317 : : }
318 : : case USCRIPT_ETHIOPIC:
319 : : {
320 : : const sal_Unicode aEthi[] = {
321 : : 0x130D, 0x12D5, 0x12DD
322 : 0 : };
323 : 0 : sSampleText = rtl::OUString(aEthi, SAL_N_ELEMENTS(aEthi));
324 : : break;
325 : : }
326 : : case USCRIPT_CHEROKEE:
327 : : {
328 : : const sal_Unicode aCher[] = {
329 : : 0x13D7, 0x13AA, 0x13EA, 0x13B6, 0x13D9, 0x13D7
330 : 0 : };
331 : 0 : sSampleText = rtl::OUString(aCher, SAL_N_ELEMENTS(aCher));
332 : : break;
333 : : }
334 : : case USCRIPT_KHMER:
335 : : {
336 : : const sal_Unicode aKhmr[] = {
337 : : 0x17A2, 0x1780, 0x17D2, 0x1781, 0x179A, 0x1780, 0x17D2, 0x179A,
338 : : 0x1798, 0x1781, 0x17C1, 0x1798, 0x179A, 0x1797, 0x17B6, 0x179F,
339 : : 0x17B6
340 : 0 : };
341 : 0 : sSampleText = rtl::OUString(aKhmr, SAL_N_ELEMENTS(aKhmr));
342 : : break;
343 : : }
344 : : case USCRIPT_MONGOLIAN:
345 : : {
346 : : const sal_Unicode aMongolian[] = {
347 : : 0x182A, 0x1822, 0x1834, 0x1822, 0x182D, 0x180C
348 : 0 : };
349 : 0 : sSampleText = rtl::OUString(aMongolian, SAL_N_ELEMENTS(aMongolian));
350 : : break;
351 : : }
352 : : case USCRIPT_TAGALOG:
353 : : {
354 : : const sal_Unicode aTagalog[] = {
355 : : 0x170A, 0x170A, 0x170C, 0x1712
356 : 0 : };
357 : 0 : sSampleText = rtl::OUString(aTagalog, SAL_N_ELEMENTS(aTagalog));
358 : : break;
359 : : }
360 : : case USCRIPT_NEW_TAI_LUE:
361 : : {
362 : : const sal_Unicode aTalu[] = {
363 : : 0x1991, 0x19BA, 0x199F, 0x19B9, 0x19C9
364 : 0 : };
365 : 0 : sSampleText = rtl::OUString(aTalu, SAL_N_ELEMENTS(aTalu));
366 : : break;
367 : : }
368 : : case USCRIPT_TRADITIONAL_HAN:
369 : : {
370 : : const sal_Unicode aHant[] = {
371 : : 0x7E41
372 : 0 : };
373 : 0 : sSampleText = rtl::OUString(aHant, SAL_N_ELEMENTS(aHant));
374 : : break;
375 : : }
376 : : case USCRIPT_SIMPLIFIED_HAN:
377 : : {
378 : : const sal_Unicode aHans[] = {
379 : : 0x7B80
380 : 0 : };
381 : 0 : sSampleText = rtl::OUString(aHans, SAL_N_ELEMENTS(aHans));
382 : : break;
383 : : }
384 : : case USCRIPT_HAN:
385 : : {
386 : : const sal_Unicode aSimplifiedAndTraditionalChinese[] = {
387 : : 0x7B80, 0x7E41
388 : 0 : };
389 : : sSampleText = rtl::OUString(aSimplifiedAndTraditionalChinese,
390 : 0 : SAL_N_ELEMENTS(aSimplifiedAndTraditionalChinese));
391 : : break;
392 : : }
393 : : case USCRIPT_JAPANESE:
394 : : {
395 : : const sal_Unicode aJpan[] = {
396 : : 0x65E5, 0x672C, 0x8A9E
397 : 0 : };
398 : 0 : sSampleText = rtl::OUString(aJpan, SAL_N_ELEMENTS(aJpan));
399 : : break;
400 : : }
401 : : case USCRIPT_YI:
402 : : {
403 : : const sal_Unicode aYiii[] = {
404 : : 0xA188, 0xA320, 0xA071, 0xA0B7
405 : 0 : };
406 : 0 : sSampleText = rtl::OUString(aYiii, SAL_N_ELEMENTS(aYiii));
407 : : break;
408 : : }
409 : : case USCRIPT_PHAGS_PA:
410 : : {
411 : : const sal_Unicode aPhag[] = {
412 : : 0xA84F, 0xA861, 0xA843, 0x0020, 0xA863, 0xA861, 0xA859, 0x0020,
413 : : 0xA850, 0xA85C, 0xA85E
414 : 0 : };
415 : 0 : sSampleText = rtl::OUString(aPhag, SAL_N_ELEMENTS(aPhag));
416 : : break;
417 : : }
418 : : case USCRIPT_TAI_LE:
419 : : {
420 : : const sal_Unicode aTale[] = {
421 : : 0x1956, 0x196D, 0x1970, 0x1956, 0x196C, 0x1973, 0x1951, 0x1968,
422 : : 0x1952, 0x1970
423 : 0 : };
424 : 0 : sSampleText = rtl::OUString(aTale, SAL_N_ELEMENTS(aTale));
425 : : break;
426 : : }
427 : : case USCRIPT_LATIN:
428 [ # # ]: 0 : sSampleText = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Lorem ipsum"));
429 : 0 : break;
430 : : default:
431 : 0 : break;
432 : : }
433 : 0 : return sSampleText;
434 : : }
435 : :
436 : 0 : rtl::OUString makeRepresentativeTextForScript(UScriptCode eScript)
437 : : {
438 : 0 : rtl::OUString sSampleText;
439 [ # # # # ]: 0 : switch (eScript)
440 : : {
441 : : case USCRIPT_TRADITIONAL_HAN:
442 : : case USCRIPT_SIMPLIFIED_HAN:
443 : : case USCRIPT_HAN:
444 : : {
445 : : //Three Character Classic
446 : : const sal_Unicode aZh[] = {
447 : : 0x4EBA, 0x4E4B, 0x521D, 0x0020, 0x6027, 0x672C, 0x5584
448 : 0 : };
449 : 0 : sSampleText = rtl::OUString(aZh, SAL_N_ELEMENTS(aZh));
450 : : break;
451 : : }
452 : : case USCRIPT_JAPANESE:
453 : : {
454 : : //'Beautiful Japanese'
455 : : const sal_Unicode aJa[] = {
456 : : 0x7F8E, 0x3057, 0x3044, 0x65E5, 0x672C, 0x8A9E
457 : 0 : };
458 : 0 : sSampleText = rtl::OUString(aJa, SAL_N_ELEMENTS(aJa));
459 : : break;
460 : : }
461 : : case USCRIPT_KOREAN:
462 : : case USCRIPT_HANGUL:
463 : : {
464 : : //The essential condition for...
465 : : const sal_Unicode aKo[] = {
466 : : 0xD0A4, 0xC2A4, 0xC758, 0x0020, 0xACE0, 0xC720, 0xC870,
467 : : 0xAC74, 0xC740
468 : 0 : };
469 : 0 : sSampleText = rtl::OUString(aKo, SAL_N_ELEMENTS(aKo));
470 : : break;
471 : : }
472 : : default:
473 : 0 : break;
474 : : }
475 : :
476 [ # # ]: 0 : if (sSampleText.isEmpty())
477 [ # # ]: 0 : sSampleText = makeShortRepresentativeTextForScript(eScript);
478 : 0 : return sSampleText;
479 : : }
480 : :
481 : 0 : rtl::OUString makeShortMinimalTextForScript(UScriptCode eScript)
482 : : {
483 : 0 : rtl::OUString sSampleText;
484 [ # # # ]: 0 : switch (eScript)
485 : : {
486 : : case USCRIPT_GREEK:
487 : : {
488 : : const sal_Unicode aGrek[] = {
489 : : 0x0391, 0x0392
490 : 0 : };
491 : 0 : sSampleText = rtl::OUString(aGrek, SAL_N_ELEMENTS(aGrek));
492 : : break;
493 : : }
494 : : case USCRIPT_HEBREW:
495 : : {
496 : : const sal_Unicode aHebr[] = {
497 : : 0x05D0, 0x05D1
498 : 0 : };
499 : 0 : sSampleText = rtl::OUString(aHebr, SAL_N_ELEMENTS(aHebr));
500 : : break;
501 : : }
502 : : default:
503 : 0 : break;
504 : : }
505 : 0 : return sSampleText;
506 : : }
507 : :
508 : 0 : rtl::OUString makeMinimalTextForScript(UScriptCode eScript)
509 : : {
510 : 0 : return makeShortMinimalTextForScript(eScript);
511 : : }
512 : :
513 : : //These ones are typically for use in the font preview window in format
514 : : //character
515 : : //
516 : : //There we generally know the language. Though its possible for the language to
517 : : //be "none".
518 : : //
519 : : //Currently we fall back to makeShortRepresentativeTextForScript when we don't
520 : : //have suitable strings
521 : 0 : rtl::OUString makeRepresentativeTextForLanguage(LanguageType eLang)
522 : : {
523 : 0 : rtl::OUString sRet;
524 [ # # # # : 0 : switch( eLang & LANGUAGE_MASK_PRIMARY )
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
525 : : {
526 : : case LANGUAGE_CHINESE & LANGUAGE_MASK_PRIMARY:
527 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_HAN);
528 : 0 : break;
529 : : case LANGUAGE_GREEK & LANGUAGE_MASK_PRIMARY:
530 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_GREEK);
531 : 0 : break;
532 : : case LANGUAGE_HEBREW & LANGUAGE_MASK_PRIMARY:
533 : : case LANGUAGE_YIDDISH & LANGUAGE_MASK_PRIMARY:
534 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_HEBREW);
535 : 0 : break;
536 : : case LANGUAGE_ARABIC_SAUDI_ARABIA & LANGUAGE_MASK_PRIMARY:
537 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_ARABIC);
538 : 0 : break;
539 : : case LANGUAGE_HINDI & LANGUAGE_MASK_PRIMARY:
540 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_DEVANAGARI);
541 : 0 : break;
542 : : case LANGUAGE_ASSAMESE & LANGUAGE_MASK_PRIMARY:
543 : : {
544 : : const sal_Unicode aAs[] = {
545 : : 0x0985, 0x09B8, 0x09AE, 0x09C0, 0x09AF, 0x09BC, 0x09BE,
546 : : 0x0020, 0x0986, 0x0996, 0x09F0
547 : 0 : };
548 : 0 : sRet = rtl::OUString(aAs, SAL_N_ELEMENTS(aAs));
549 : : break;
550 : : }
551 : : case LANGUAGE_BENGALI & LANGUAGE_MASK_PRIMARY:
552 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_BENGALI);
553 : 0 : break;
554 : : case LANGUAGE_PUNJABI & LANGUAGE_MASK_PRIMARY:
555 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_GURMUKHI);
556 : 0 : break;
557 : : case LANGUAGE_GUJARATI & LANGUAGE_MASK_PRIMARY:
558 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_GUJARATI);
559 : 0 : break;
560 : : case LANGUAGE_ORIYA & LANGUAGE_MASK_PRIMARY:
561 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_ORIYA);
562 : 0 : break;
563 : : case LANGUAGE_TAMIL & LANGUAGE_MASK_PRIMARY:
564 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_TAMIL);
565 : 0 : break;
566 : : case LANGUAGE_TELUGU & LANGUAGE_MASK_PRIMARY:
567 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_TELUGU);
568 : 0 : break;
569 : : case LANGUAGE_KANNADA & LANGUAGE_MASK_PRIMARY:
570 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_KANNADA);
571 : 0 : break;
572 : : case LANGUAGE_MALAYALAM & LANGUAGE_MASK_PRIMARY:
573 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_MALAYALAM);
574 : 0 : break;
575 : : case LANGUAGE_THAI & LANGUAGE_MASK_PRIMARY:
576 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_THAI);
577 : 0 : break;
578 : : case LANGUAGE_LAO & LANGUAGE_MASK_PRIMARY:
579 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_LAO);
580 : 0 : break;
581 : : case LANGUAGE_GEORGIAN & LANGUAGE_MASK_PRIMARY:
582 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_GEORGIAN);
583 : 0 : break;
584 : : case LANGUAGE_KOREAN & LANGUAGE_MASK_PRIMARY:
585 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_KOREAN);
586 : 0 : break;
587 : : case LANGUAGE_TIBETAN & LANGUAGE_MASK_PRIMARY:
588 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_TIBETAN);
589 : 0 : break;
590 : : case LANGUAGE_SYRIAC & LANGUAGE_MASK_PRIMARY:
591 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_SYRIAC);
592 : 0 : break;
593 : : case LANGUAGE_SINHALESE_SRI_LANKA & LANGUAGE_MASK_PRIMARY:
594 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_SINHALA);
595 : 0 : break;
596 : : case LANGUAGE_BURMESE & LANGUAGE_MASK_PRIMARY:
597 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_MYANMAR);
598 : 0 : break;
599 : : case LANGUAGE_AMHARIC_ETHIOPIA & LANGUAGE_MASK_PRIMARY:
600 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_ETHIOPIC);
601 : 0 : break;
602 : : case LANGUAGE_CHEROKEE_UNITED_STATES & LANGUAGE_MASK_PRIMARY:
603 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_CHEROKEE);
604 : 0 : break;
605 : : case LANGUAGE_KHMER & LANGUAGE_MASK_PRIMARY:
606 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_KHMER);
607 : 0 : break;
608 : : case LANGUAGE_MONGOLIAN & LANGUAGE_MASK_PRIMARY:
609 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_MONGOLIAN);
610 : 0 : break;
611 : : case LANGUAGE_JAPANESE & LANGUAGE_MASK_PRIMARY:
612 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_JAPANESE);
613 : 0 : break;
614 : : case LANGUAGE_YI & LANGUAGE_MASK_PRIMARY:
615 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_YI);
616 : 0 : break;
617 : : case LANGUAGE_GAELIC_IRELAND & LANGUAGE_MASK_PRIMARY:
618 : : {
619 : : const sal_Unicode aGa[] = {
620 : : 'T', 0x00E9, 'a', 'c', 's', ' ', 'S', 'a', 'm', 'p', 'l', 'a', 'c', 'h'
621 : 0 : };
622 : 0 : sRet = rtl::OUString(aGa, SAL_N_ELEMENTS(aGa));
623 : : break;
624 : : }
625 : : default:
626 : 0 : break;
627 : : }
628 : :
629 : 0 : return sRet;
630 : : }
631 : :
632 : : namespace
633 : : {
634 : : #if OSL_DEBUG_LEVEL > 2
635 : : void lcl_dump_unicode_coverage(const boost::dynamic_bitset<sal_uInt32> &rIn)
636 : : {
637 : : if (rIn[vcl::UnicodeCoverage::BASIC_LATIN])
638 : : fprintf(stderr, "BASIC_LATIN\n");
639 : : if (rIn[vcl::UnicodeCoverage::LATIN_1_SUPPLEMENT])
640 : : fprintf(stderr, "LATIN_1_SUPPLEMENT\n");
641 : : if (rIn[vcl::UnicodeCoverage::LATIN_EXTENDED_A])
642 : : fprintf(stderr, "LATIN_EXTENDED_A\n");
643 : : if (rIn[vcl::UnicodeCoverage::LATIN_EXTENDED_B])
644 : : fprintf(stderr, "LATIN_EXTENDED_B\n");
645 : : if (rIn[vcl::UnicodeCoverage::IPA_EXTENSIONS])
646 : : fprintf(stderr, "IPA_EXTENSIONS\n");
647 : : if (rIn[vcl::UnicodeCoverage::SPACING_MODIFIER_LETTERS])
648 : : fprintf(stderr, "SPACING_MODIFIER_LETTERS\n");
649 : : if (rIn[vcl::UnicodeCoverage::COMBINING_DIACRITICAL_MARKS])
650 : : fprintf(stderr, "COMBINING_DIACRITICAL_MARKS\n");
651 : : if (rIn[vcl::UnicodeCoverage::GREEK_AND_COPTIC])
652 : : fprintf(stderr, "GREEK_AND_COPTIC\n");
653 : : if (rIn[vcl::UnicodeCoverage::COPTIC])
654 : : fprintf(stderr, "COPTIC\n");
655 : : if (rIn[vcl::UnicodeCoverage::CYRILLIC])
656 : : fprintf(stderr, "CYRILLIC\n");
657 : : if (rIn[vcl::UnicodeCoverage::ARMENIAN])
658 : : fprintf(stderr, "ARMENIAN\n");
659 : : if (rIn[vcl::UnicodeCoverage::HEBREW])
660 : : fprintf(stderr, "HEBREW\n");
661 : : if (rIn[vcl::UnicodeCoverage::VAI])
662 : : fprintf(stderr, "VAI\n");
663 : : if (rIn[vcl::UnicodeCoverage::ARABIC])
664 : : fprintf(stderr, "ARABIC\n");
665 : : if (rIn[vcl::UnicodeCoverage::NKO])
666 : : fprintf(stderr, "NKO\n");
667 : : if (rIn[vcl::UnicodeCoverage::DEVANAGARI])
668 : : fprintf(stderr, "DEVANAGARI\n");
669 : : if (rIn[vcl::UnicodeCoverage::BENGALI])
670 : : fprintf(stderr, "BENGALI\n");
671 : : if (rIn[vcl::UnicodeCoverage::GURMUKHI])
672 : : fprintf(stderr, "GURMUKHI\n");
673 : : if (rIn[vcl::UnicodeCoverage::GUJARATI])
674 : : fprintf(stderr, "GUJARATI\n");
675 : : if (rIn[vcl::UnicodeCoverage::ORIYA])
676 : : fprintf(stderr, "ORIYA\n");
677 : : if (rIn[vcl::UnicodeCoverage::TAMIL])
678 : : fprintf(stderr, "TAMIL\n");
679 : : if (rIn[vcl::UnicodeCoverage::TELUGU])
680 : : fprintf(stderr, "TELUGU\n");
681 : : if (rIn[vcl::UnicodeCoverage::KANNADA])
682 : : fprintf(stderr, "KANNADA\n");
683 : : if (rIn[vcl::UnicodeCoverage::MALAYALAM])
684 : : fprintf(stderr, "MALAYALAM\n");
685 : : if (rIn[vcl::UnicodeCoverage::THAI])
686 : : fprintf(stderr, "THAI\n");
687 : : if (rIn[vcl::UnicodeCoverage::LAO])
688 : : fprintf(stderr, "LAO\n");
689 : : if (rIn[vcl::UnicodeCoverage::GEORGIAN])
690 : : fprintf(stderr, "GEORGIAN\n");
691 : : if (rIn[vcl::UnicodeCoverage::BALINESE])
692 : : fprintf(stderr, "BALINESE\n");
693 : : if (rIn[vcl::UnicodeCoverage::HANGUL_JAMO])
694 : : fprintf(stderr, "HANGUL_JAMO\n");
695 : : if (rIn[vcl::UnicodeCoverage::LATIN_EXTENDED_ADDITIONAL])
696 : : fprintf(stderr, "LATIN_EXTENDED_ADDITIONAL\n");
697 : : if (rIn[vcl::UnicodeCoverage::GREEK_EXTENDED])
698 : : fprintf(stderr, "GREEK_EXTENDED\n");
699 : : if (rIn[vcl::UnicodeCoverage::GENERAL_PUNCTUATION])
700 : : fprintf(stderr, "GENERAL_PUNCTUATION\n");
701 : : if (rIn[vcl::UnicodeCoverage::SUPERSCRIPTS_AND_SUBSCRIPTS])
702 : : fprintf(stderr, "SUPERSCRIPTS_AND_SUBSCRIPTS\n");
703 : : if (rIn[vcl::UnicodeCoverage::CURRENCY_SYMBOLS])
704 : : fprintf(stderr, "CURRENCY_SYMBOLS\n");
705 : : if (rIn[vcl::UnicodeCoverage::COMBINING_DIACRITICAL_MARKS_FOR_SYMBOLS])
706 : : fprintf(stderr, "COMBINING_DIACRITICAL_MARKS_FOR_SYMBOLS\n");
707 : : if (rIn[vcl::UnicodeCoverage::LETTERLIKE_SYMBOLS])
708 : : fprintf(stderr, "LETTERLIKE_SYMBOLS\n");
709 : : if (rIn[vcl::UnicodeCoverage::NUMBER_FORMS])
710 : : fprintf(stderr, "NUMBER_FORMS\n");
711 : : if (rIn[vcl::UnicodeCoverage::ARROWS])
712 : : fprintf(stderr, "ARROWS\n");
713 : : if (rIn[vcl::UnicodeCoverage::MATHEMATICAL_OPERATORS])
714 : : fprintf(stderr, "MATHEMATICAL_OPERATORS\n");
715 : : if (rIn[vcl::UnicodeCoverage::MISCELLANEOUS_TECHNICAL])
716 : : fprintf(stderr, "MISCELLANEOUS_TECHNICAL\n");
717 : : if (rIn[vcl::UnicodeCoverage::CONTROL_PICTURES])
718 : : fprintf(stderr, "CONTROL_PICTURES\n");
719 : : if (rIn[vcl::UnicodeCoverage::OPTICAL_CHARACTER_RECOGNITION])
720 : : fprintf(stderr, "OPTICAL_CHARACTER_RECOGNITION\n");
721 : : if (rIn[vcl::UnicodeCoverage::ENCLOSED_ALPHANUMERICS])
722 : : fprintf(stderr, "ENCLOSED_ALPHANUMERICS\n");
723 : : if (rIn[vcl::UnicodeCoverage::BOX_DRAWING])
724 : : fprintf(stderr, "BOX_DRAWING\n");
725 : : if (rIn[vcl::UnicodeCoverage::BLOCK_ELEMENTS])
726 : : fprintf(stderr, "BLOCK_ELEMENTS\n");
727 : : if (rIn[vcl::UnicodeCoverage::GEOMETRIC_SHAPES])
728 : : fprintf(stderr, "GEOMETRIC_SHAPES\n");
729 : : if (rIn[vcl::UnicodeCoverage::MISCELLANEOUS_SYMBOLS])
730 : : fprintf(stderr, "MISCELLANEOUS_SYMBOLS\n");
731 : : if (rIn[vcl::UnicodeCoverage::DINGBATS])
732 : : fprintf(stderr, "DINGBATS\n");
733 : : if (rIn[vcl::UnicodeCoverage::CJK_SYMBOLS_AND_PUNCTUATION])
734 : : fprintf(stderr, "CJK_SYMBOLS_AND_PUNCTUATION\n");
735 : : if (rIn[vcl::UnicodeCoverage::HIRAGANA])
736 : : fprintf(stderr, "HIRAGANA\n");
737 : : if (rIn[vcl::UnicodeCoverage::KATAKANA])
738 : : fprintf(stderr, "KATAKANA\n");
739 : : if (rIn[vcl::UnicodeCoverage::BOPOMOFO])
740 : : fprintf(stderr, "BOPOMOFO\n");
741 : : if (rIn[vcl::UnicodeCoverage::HANGUL_COMPATIBILITY_JAMO])
742 : : fprintf(stderr, "HANGUL_COMPATIBILITY_JAMO\n");
743 : : if (rIn[vcl::UnicodeCoverage::PHAGS_PA])
744 : : fprintf(stderr, "PHAGS_PA\n");
745 : : if (rIn[vcl::UnicodeCoverage::ENCLOSED_CJK_LETTERS_AND_MONTHS])
746 : : fprintf(stderr, "ENCLOSED_CJK_LETTERS_AND_MONTHS\n");
747 : : if (rIn[vcl::UnicodeCoverage::CJK_COMPATIBILITY])
748 : : fprintf(stderr, "CJK_COMPATIBILITY\n");
749 : : if (rIn[vcl::UnicodeCoverage::HANGUL_SYLLABLES])
750 : : fprintf(stderr, "HANGUL_SYLLABLES\n");
751 : : if (rIn[vcl::UnicodeCoverage::NONPLANE_0])
752 : : fprintf(stderr, "NONPLANE_0\n");
753 : : if (rIn[vcl::UnicodeCoverage::PHOENICIAN])
754 : : fprintf(stderr, "PHOENICIAN\n");
755 : : if (rIn[vcl::UnicodeCoverage::CJK_UNIFIED_IDEOGRAPHS])
756 : : fprintf(stderr, "CJK_UNIFIED_IDEOGRAPHS\n");
757 : : if (rIn[vcl::UnicodeCoverage::PRIVATE_USE_AREA_PLANE_0])
758 : : fprintf(stderr, "PRIVATE_USE_AREA_PLANE_0\n");
759 : : if (rIn[vcl::UnicodeCoverage::CJK_STROKES])
760 : : fprintf(stderr, "CJK_STROKES\n");
761 : : if (rIn[vcl::UnicodeCoverage::ALPHABETIC_PRESENTATION_FORMS])
762 : : fprintf(stderr, "ALPHABETIC_PRESENTATION_FORMS\n");
763 : : if (rIn[vcl::UnicodeCoverage::ARABIC_PRESENTATION_FORMS_A])
764 : : fprintf(stderr, "ARABIC_PRESENTATION_FORMS_A\n");
765 : : if (rIn[vcl::UnicodeCoverage::COMBINING_HALF_MARKS])
766 : : fprintf(stderr, "COMBINING_HALF_MARKS\n");
767 : : if (rIn[vcl::UnicodeCoverage::VERTICAL_FORMS])
768 : : fprintf(stderr, "VERTICAL_FORMS\n");
769 : : if (rIn[vcl::UnicodeCoverage::SMALL_FORM_VARIANTS])
770 : : fprintf(stderr, "SMALL_FORM_VARIANTS\n");
771 : : if (rIn[vcl::UnicodeCoverage::ARABIC_PRESENTATION_FORMS_B])
772 : : fprintf(stderr, "ARABIC_PRESENTATION_FORMS_B\n");
773 : : if (rIn[vcl::UnicodeCoverage::HALFWIDTH_AND_FULLWIDTH_FORMS])
774 : : fprintf(stderr, "HALFWIDTH_AND_FULLWIDTH_FORMS\n");
775 : : if (rIn[vcl::UnicodeCoverage::SPECIALS])
776 : : fprintf(stderr, "SPECIALS\n");
777 : : if (rIn[vcl::UnicodeCoverage::TIBETAN])
778 : : fprintf(stderr, "TIBETAN\n");
779 : : if (rIn[vcl::UnicodeCoverage::SYRIAC])
780 : : fprintf(stderr, "SYRIAC\n");
781 : : if (rIn[vcl::UnicodeCoverage::THAANA])
782 : : fprintf(stderr, "THAANA\n");
783 : : if (rIn[vcl::UnicodeCoverage::SINHALA])
784 : : fprintf(stderr, "SINHALA\n");
785 : : if (rIn[vcl::UnicodeCoverage::MYANMAR])
786 : : fprintf(stderr, "MYANMAR\n");
787 : : if (rIn[vcl::UnicodeCoverage::ETHIOPIC])
788 : : fprintf(stderr, "ETHIOPIC\n");
789 : : if (rIn[vcl::UnicodeCoverage::CHEROKEE])
790 : : fprintf(stderr, "CHEROKEE\n");
791 : : if (rIn[vcl::UnicodeCoverage::UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS])
792 : : fprintf(stderr, "UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS\n");
793 : : if (rIn[vcl::UnicodeCoverage::OGHAM])
794 : : fprintf(stderr, "OGHAM\n");
795 : : if (rIn[vcl::UnicodeCoverage::RUNIC])
796 : : fprintf(stderr, "RUNIC\n");
797 : : if (rIn[vcl::UnicodeCoverage::KHMER])
798 : : fprintf(stderr, "KHMER\n");
799 : : if (rIn[vcl::UnicodeCoverage::MONGOLIAN])
800 : : fprintf(stderr, "MONGOLIAN\n");
801 : : if (rIn[vcl::UnicodeCoverage::BRAILLE_PATTERNS])
802 : : fprintf(stderr, "BRAILLE_PATTERNS\n");
803 : : if (rIn[vcl::UnicodeCoverage::YI_SYLLABLES])
804 : : fprintf(stderr, "YI_SYLLABLES\n");
805 : : if (rIn[vcl::UnicodeCoverage::TAGALOG])
806 : : fprintf(stderr, "TAGALOG\n");
807 : : if (rIn[vcl::UnicodeCoverage::OLD_ITALIC])
808 : : fprintf(stderr, "OLD_ITALIC\n");
809 : : if (rIn[vcl::UnicodeCoverage::GOTHIC])
810 : : fprintf(stderr, "GOTHIC\n");
811 : : if (rIn[vcl::UnicodeCoverage::DESERET])
812 : : fprintf(stderr, "DESERET\n");
813 : : if (rIn[vcl::UnicodeCoverage::BYZANTINE_MUSICAL_SYMBOLS])
814 : : fprintf(stderr, "BYZANTINE_MUSICAL_SYMBOLS\n");
815 : : if (rIn[vcl::UnicodeCoverage::MATHEMATICAL_ALPHANUMERIC_SYMBOLS])
816 : : fprintf(stderr, "MATHEMATICAL_ALPHANUMERIC_SYMBOLS\n");
817 : : if (rIn[vcl::UnicodeCoverage::PRIVATE_USE_PLANE_15])
818 : : fprintf(stderr, "PRIVATE_USE_PLANE_15\n");
819 : : if (rIn[vcl::UnicodeCoverage::VARIATION_SELECTORS])
820 : : fprintf(stderr, "VARIATION_SELECTORS\n");
821 : : if (rIn[vcl::UnicodeCoverage::TAGS])
822 : : fprintf(stderr, "TAGS\n");
823 : : if (rIn[vcl::UnicodeCoverage::LIMBU])
824 : : fprintf(stderr, "LIMBU\n");
825 : : if (rIn[vcl::UnicodeCoverage::TAI_LE])
826 : : fprintf(stderr, "TAI_LE\n");
827 : : if (rIn[vcl::UnicodeCoverage::NEW_TAI_LUE])
828 : : fprintf(stderr, "NEW_TAI_LUE\n");
829 : : if (rIn[vcl::UnicodeCoverage::BUGINESE])
830 : : fprintf(stderr, "BUGINESE\n");
831 : : if (rIn[vcl::UnicodeCoverage::GLAGOLITIC])
832 : : fprintf(stderr, "GLAGOLITIC\n");
833 : : if (rIn[vcl::UnicodeCoverage::TIFINAGH])
834 : : fprintf(stderr, "TIFINAGH\n");
835 : : if (rIn[vcl::UnicodeCoverage::YIJING_HEXAGRAM_SYMBOLS])
836 : : fprintf(stderr, "YIJING_HEXAGRAM_SYMBOLS\n");
837 : : if (rIn[vcl::UnicodeCoverage::SYLOTI_NAGRI])
838 : : fprintf(stderr, "SYLOTI_NAGRI\n");
839 : : if (rIn[vcl::UnicodeCoverage::LINEAR_B_SYLLABARY])
840 : : fprintf(stderr, "LINEAR_B_SYLLABARY\n");
841 : : if (rIn[vcl::UnicodeCoverage::ANCIENT_GREEK_NUMBERS])
842 : : fprintf(stderr, "ANCIENT_GREEK_NUMBERS\n");
843 : : if (rIn[vcl::UnicodeCoverage::UGARITIC])
844 : : fprintf(stderr, "UGARITIC\n");
845 : : if (rIn[vcl::UnicodeCoverage::OLD_PERSIAN])
846 : : fprintf(stderr, "OLD_PERSIAN\n");
847 : : if (rIn[vcl::UnicodeCoverage::SHAVIAN])
848 : : fprintf(stderr, "SHAVIAN\n");
849 : : if (rIn[vcl::UnicodeCoverage::OSMANYA])
850 : : fprintf(stderr, "OSMANYA\n");
851 : : if (rIn[vcl::UnicodeCoverage::CYPRIOT_SYLLABARY])
852 : : fprintf(stderr, "CYPRIOT_SYLLABARY\n");
853 : : if (rIn[vcl::UnicodeCoverage::KHAROSHTHI])
854 : : fprintf(stderr, "KHAROSHTHI\n");
855 : : if (rIn[vcl::UnicodeCoverage::TAI_XUAN_JING_SYMBOLS])
856 : : fprintf(stderr, "TAI_XUAN_JING_SYMBOLS\n");
857 : : if (rIn[vcl::UnicodeCoverage::CUNEIFORM])
858 : : fprintf(stderr, "CUNEIFORM\n");
859 : : if (rIn[vcl::UnicodeCoverage::COUNTING_ROD_NUMERALS])
860 : : fprintf(stderr, "COUNTING_ROD_NUMERALS\n");
861 : : if (rIn[vcl::UnicodeCoverage::SUNDANESE])
862 : : fprintf(stderr, "SUNDANESE\n");
863 : : if (rIn[vcl::UnicodeCoverage::LEPCHA])
864 : : fprintf(stderr, "LEPCHA\n");
865 : : if (rIn[vcl::UnicodeCoverage::OL_CHIKI])
866 : : fprintf(stderr, "OL_CHIKI\n");
867 : : if (rIn[vcl::UnicodeCoverage::SAURASHTRA])
868 : : fprintf(stderr, "SAURASHTRA\n");
869 : : if (rIn[vcl::UnicodeCoverage::KAYAH_LI])
870 : : fprintf(stderr, "KAYAH_LI\n");
871 : : if (rIn[vcl::UnicodeCoverage::REJANG])
872 : : fprintf(stderr, "REJANG\n");
873 : : if (rIn[vcl::UnicodeCoverage::CHAM])
874 : : fprintf(stderr, "CHAM\n");
875 : : if (rIn[vcl::UnicodeCoverage::ANCIENT_SYMBOLS])
876 : : fprintf(stderr, "ANCIENT_SYMBOLS\n");
877 : : if (rIn[vcl::UnicodeCoverage::PHAISTOS_DISC])
878 : : fprintf(stderr, "PHAISTOS_DISC\n");
879 : : if (rIn[vcl::UnicodeCoverage::CARIAN])
880 : : fprintf(stderr, "CARIAN\n");
881 : : if (rIn[vcl::UnicodeCoverage::DOMINO_TILES])
882 : : fprintf(stderr, "DOMINO_TILES\n");
883 : : if (rIn[vcl::UnicodeCoverage::RESERVED1])
884 : : fprintf(stderr, "RESERVED1\n");
885 : : if (rIn[vcl::UnicodeCoverage::RESERVED2])
886 : : fprintf(stderr, "RESERVED2\n");
887 : : if (rIn[vcl::UnicodeCoverage::RESERVED3])
888 : : fprintf(stderr, "RESERVED3\n");
889 : : if (rIn[vcl::UnicodeCoverage::RESERVED4])
890 : : fprintf(stderr, "RESERVED4\n");
891 : : if (rIn[vcl::UnicodeCoverage::RESERVED5])
892 : : fprintf(stderr, "RESERVED5\n");
893 : : }
894 : :
895 : : void lcl_dump_codepage_coverage(const boost::dynamic_bitset<sal_uInt32> &rIn)
896 : : {
897 : : if (rIn[vcl::CodePageCoverage::CP1252])
898 : : fprintf(stderr, "CP1252\n");
899 : : if (rIn[vcl::CodePageCoverage::CP1250])
900 : : fprintf(stderr, "CP1250\n");
901 : : if (rIn[vcl::CodePageCoverage::CP1251])
902 : : fprintf(stderr, "CP1251\n");
903 : : if (rIn[vcl::CodePageCoverage::CP1253])
904 : : fprintf(stderr, "CP1253\n");
905 : : if (rIn[vcl::CodePageCoverage::CP1254])
906 : : fprintf(stderr, "CP1254\n");
907 : : if (rIn[vcl::CodePageCoverage::CP1255])
908 : : fprintf(stderr, "CP1255\n");
909 : : if (rIn[vcl::CodePageCoverage::CP1256])
910 : : fprintf(stderr, "CP1256\n");
911 : : if (rIn[vcl::CodePageCoverage::CP1257])
912 : : fprintf(stderr, "CP1257\n");
913 : : if (rIn[vcl::CodePageCoverage::CP1258])
914 : : fprintf(stderr, "CP1258\n");
915 : : if (rIn[vcl::CodePageCoverage::CP874])
916 : : fprintf(stderr, "CP874\n");
917 : : if (rIn[vcl::CodePageCoverage::CP932])
918 : : fprintf(stderr, "CP932\n");
919 : : if (rIn[vcl::CodePageCoverage::CP936])
920 : : fprintf(stderr, "CP936\n");
921 : : if (rIn[vcl::CodePageCoverage::CP949])
922 : : fprintf(stderr, "CP949\n");
923 : : if (rIn[vcl::CodePageCoverage::CP950])
924 : : fprintf(stderr, "CP950\n");
925 : : if (rIn[vcl::CodePageCoverage::CP1361])
926 : : fprintf(stderr, "CP1361\n");
927 : : if (rIn[vcl::CodePageCoverage::CP869])
928 : : fprintf(stderr, "CP869\n");
929 : : if (rIn[vcl::CodePageCoverage::CP866])
930 : : fprintf(stderr, "CP866\n");
931 : : if (rIn[vcl::CodePageCoverage::CP865])
932 : : fprintf(stderr, "CP865\n");
933 : : if (rIn[vcl::CodePageCoverage::CP864])
934 : : fprintf(stderr, "CP864\n");
935 : : if (rIn[vcl::CodePageCoverage::CP863])
936 : : fprintf(stderr, "CP863\n");
937 : : if (rIn[vcl::CodePageCoverage::CP862])
938 : : fprintf(stderr, "CP862\n");
939 : : if (rIn[vcl::CodePageCoverage::CP861])
940 : : fprintf(stderr, "CP861\n");
941 : : if (rIn[vcl::CodePageCoverage::CP860])
942 : : fprintf(stderr, "CP860\n");
943 : : if (rIn[vcl::CodePageCoverage::CP857])
944 : : fprintf(stderr, "CP857\n");
945 : : if (rIn[vcl::CodePageCoverage::CP855])
946 : : fprintf(stderr, "CP855\n");
947 : : if (rIn[vcl::CodePageCoverage::CP852])
948 : : fprintf(stderr, "CP852\n");
949 : : if (rIn[vcl::CodePageCoverage::CP775])
950 : : fprintf(stderr, "CP775\n");
951 : : if (rIn[vcl::CodePageCoverage::CP737])
952 : : fprintf(stderr, "CP737\n");
953 : : if (rIn[vcl::CodePageCoverage::CP780])
954 : : fprintf(stderr, "CP780\n");
955 : : if (rIn[vcl::CodePageCoverage::CP850])
956 : : fprintf(stderr, "CP850\n");
957 : : if (rIn[vcl::CodePageCoverage::CP437])
958 : : fprintf(stderr, "CP437\n");
959 : : }
960 : : #endif
961 : :
962 : 4 : boost::dynamic_bitset<sal_uInt32> getMaskByScriptType(sal_Int16 nScriptType)
963 : : {
964 [ + - ]: 4 : boost::dynamic_bitset<sal_uInt32> aMask(vcl::UnicodeCoverage::MAX_UC_ENUM);
965 [ + - ]: 4 : aMask.set();
966 : :
967 [ + + ]: 516 : for (size_t i = 0; i < vcl::UnicodeCoverage::MAX_UC_ENUM; ++i)
968 : : {
969 : : using vcl::UnicodeCoverage::UnicodeCoverageEnum;
970 [ + - ]: 512 : UScriptCode eScriptCode = otCoverageToScript(static_cast<UnicodeCoverageEnum>(i));
971 [ + - ][ + + ]: 512 : if (unicode::getScriptClassFromUScriptCode(eScriptCode) == nScriptType)
972 [ + - ]: 112 : aMask.set(i, false);
973 : : }
974 : :
975 : 4 : return aMask;
976 : : }
977 : :
978 : : //false for all bits considered "Latin" by LibreOffice
979 : 0 : boost::dynamic_bitset<sal_uInt32> getLatinMask()
980 : : {
981 [ # # ][ # # ]: 0 : static boost::dynamic_bitset<sal_uInt32> aMask(getMaskByScriptType(com::sun::star::i18n::ScriptType::LATIN));
[ # # ][ # # ]
982 : 0 : return aMask;
983 : : }
984 : :
985 : : //false for all bits considered "Asian" by LibreOffice
986 : 2 : boost::dynamic_bitset<sal_uInt32> getCJKMask()
987 : : {
988 [ + - ][ + - ]: 2 : static boost::dynamic_bitset<sal_uInt32> aMask(getMaskByScriptType(com::sun::star::i18n::ScriptType::ASIAN));
[ + - ][ # # ]
989 : 2 : return aMask;
990 : : }
991 : :
992 : : //false for all bits considered "Complex" by LibreOffice
993 : 0 : boost::dynamic_bitset<sal_uInt32> getCTLMask()
994 : : {
995 [ # # ][ # # ]: 0 : static boost::dynamic_bitset<sal_uInt32> aMask(getMaskByScriptType(com::sun::star::i18n::ScriptType::COMPLEX));
[ # # ][ # # ]
996 : 0 : return aMask;
997 : : }
998 : :
999 : : //false for all bits considered "WEAK" by LibreOffice
1000 : 2 : boost::dynamic_bitset<sal_uInt32> getWeakMask()
1001 : : {
1002 [ + - ][ + - ]: 2 : static boost::dynamic_bitset<sal_uInt32> aMask(getMaskByScriptType(com::sun::star::i18n::ScriptType::WEAK));
[ + - ][ # # ]
1003 : 2 : return aMask;
1004 : : }
1005 : :
1006 : : //Nearly every font supports some basic Latin
1007 : 2 : boost::dynamic_bitset<sal_uInt32> getCommonLatnSubsetMask()
1008 : : {
1009 [ + - ]: 2 : boost::dynamic_bitset<sal_uInt32> aMask(vcl::UnicodeCoverage::MAX_UC_ENUM);
1010 [ + - ]: 2 : aMask.set();
1011 [ + - ]: 2 : aMask.set(vcl::UnicodeCoverage::BASIC_LATIN, false);
1012 [ + - ]: 2 : aMask.set(vcl::UnicodeCoverage::LATIN_1_SUPPLEMENT, false);
1013 [ + - ]: 2 : aMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_A, false);
1014 [ + - ]: 2 : aMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_B, false);
1015 [ + - ]: 2 : aMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_ADDITIONAL, false);
1016 : 2 : return aMask;
1017 : : }
1018 : :
1019 : 2 : UScriptCode getScript(const vcl::FontCapabilities &rFontCapabilities)
1020 : : {
1021 : : using vcl::UnicodeCoverage::UnicodeCoverageEnum;
1022 : :
1023 [ + - ][ + - ]: 2 : boost::dynamic_bitset<sal_uInt32> aMasked = rFontCapabilities.maUnicodeRange & getWeakMask();
1024 : :
1025 [ - + ][ + - ]: 2 : if (aMasked.count() == 1)
1026 [ # # ][ # # ]: 0 : return otCoverageToScript(static_cast<UnicodeCoverageEnum>(aMasked.find_first()));
1027 : :
1028 [ + - ][ - + ]: 2 : if (aMasked[vcl::UnicodeCoverage::ARABIC])
1029 : : {
1030 [ # # ]: 0 : aMasked.set(vcl::UnicodeCoverage::ARABIC_PRESENTATION_FORMS_A, false);
1031 [ # # ]: 0 : aMasked.set(vcl::UnicodeCoverage::ARABIC_PRESENTATION_FORMS_B, false);
1032 [ # # ]: 0 : aMasked.set(vcl::UnicodeCoverage::NKO, false);
1033 : : //Probably strongly tuned for Arabic
1034 [ # # ][ # # ]: 0 : if (aMasked.count() == 1)
1035 : 0 : return USCRIPT_ARABIC;
1036 [ # # ][ # # ]: 0 : if (aMasked.count() == 2 && aMasked[vcl::UnicodeCoverage::SYRIAC])
[ # # ][ # # ]
[ # # ]
[ # # # # ]
1037 : 0 : return USCRIPT_SYRIAC;
1038 : : }
1039 : :
1040 [ + - ][ - + ]: 2 : if (aMasked[vcl::UnicodeCoverage::DEVANAGARI])
1041 : : {
1042 [ # # ]: 0 : aMasked.set(vcl::UnicodeCoverage::DEVANAGARI, false);
1043 : : //Probably strongly tuned for a single Indic script
1044 [ # # ][ # # ]: 0 : if (aMasked.count() == 1)
1045 [ # # ][ # # ]: 0 : return otCoverageToScript(static_cast<UnicodeCoverageEnum>(aMasked.find_first()));
1046 : : }
1047 : :
1048 [ + - ]: 2 : aMasked.set(vcl::UnicodeCoverage::GREEK_EXTENDED, false);
1049 [ + - ]: 2 : aMasked.set(vcl::UnicodeCoverage::GREEK_AND_COPTIC, false);
1050 [ + - ][ - + ]: 2 : if (aMasked.count() == 1)
1051 [ # # ][ # # ]: 0 : return otCoverageToScript(static_cast<UnicodeCoverageEnum>(aMasked.find_first()));
1052 : :
1053 [ + - ][ + - ]: 2 : if (aMasked[vcl::UnicodeCoverage::CYRILLIC])
1054 : : {
1055 : : //Probably strongly tuned for Georgian
1056 [ + - ][ + - ]: 2 : if (aMasked.count() == 2 && aMasked[vcl::UnicodeCoverage::GEORGIAN])
[ + - ][ - + ]
[ + - ]
[ - + # # ]
1057 : 0 : return USCRIPT_GEORGIAN;
1058 : : }
1059 : :
1060 [ + - ][ + - ]: 2 : aMasked &= getCJKMask();
1061 : :
1062 [ + - ]: 2 : aMasked.set(vcl::UnicodeCoverage::CYRILLIC, false);
1063 [ + - ]: 2 : aMasked.set(vcl::UnicodeCoverage::THAI, false);
1064 [ + - ]: 2 : aMasked.set(vcl::UnicodeCoverage::DESERET, false);
1065 [ + - ]: 2 : aMasked.set(vcl::UnicodeCoverage::PHAGS_PA, false);
1066 : :
1067 : : //So, possibly a CJK font
1068 [ + - ][ - + ]: 2 : if (!aMasked.count())
1069 : : {
1070 [ # # ]: 0 : boost::dynamic_bitset<sal_uInt32> aCJKCodePageMask(vcl::CodePageCoverage::MAX_CP_ENUM);
1071 [ # # ]: 0 : aCJKCodePageMask.set(vcl::CodePageCoverage::CP932);
1072 [ # # ]: 0 : aCJKCodePageMask.set(vcl::CodePageCoverage::CP936);
1073 [ # # ]: 0 : aCJKCodePageMask.set(vcl::CodePageCoverage::CP949);
1074 [ # # ]: 0 : aCJKCodePageMask.set(vcl::CodePageCoverage::CP950);
1075 [ # # ]: 0 : aCJKCodePageMask.set(vcl::CodePageCoverage::CP1361);
1076 : : boost::dynamic_bitset<sal_uInt32> aMaskedCodePage =
1077 [ # # ]: 0 : rFontCapabilities.maCodePageRange & aCJKCodePageMask;
1078 : : //fold Korean
1079 [ # # ][ # # ]: 0 : if (aMaskedCodePage[vcl::CodePageCoverage::CP1361])
1080 : : {
1081 [ # # ]: 0 : aMaskedCodePage.set(vcl::CodePageCoverage::CP949);
1082 [ # # ]: 0 : aMaskedCodePage.set(vcl::CodePageCoverage::CP1361, false);
1083 : : }
1084 : :
1085 [ # # ][ # # ]: 0 : if (aMaskedCodePage.count() == 1)
1086 : : {
1087 [ # # ][ # # ]: 0 : if (aMaskedCodePage[vcl::CodePageCoverage::CP932])
1088 : 0 : return USCRIPT_JAPANESE;
1089 [ # # ][ # # ]: 0 : if (aMaskedCodePage[vcl::CodePageCoverage::CP949])
1090 : 0 : return USCRIPT_KOREAN;
1091 [ # # ][ # # ]: 0 : if (aMaskedCodePage[vcl::CodePageCoverage::CP936])
1092 : 0 : return USCRIPT_SIMPLIFIED_HAN;
1093 [ # # ][ # # ]: 0 : if (aMaskedCodePage[vcl::CodePageCoverage::CP950])
1094 : 0 : return USCRIPT_TRADITIONAL_HAN;
1095 : : }
1096 : :
1097 [ # # ][ # # ]: 0 : if (aMaskedCodePage.count())
1098 [ # # ][ # # ]: 0 : return USCRIPT_HAN;
1099 : : }
1100 : :
1101 : 2 : return USCRIPT_COMMON;
1102 : : }
1103 : : }
1104 : :
1105 : : namespace
1106 : : {
1107 : 0 : UScriptCode attemptToDisambiguateHan(UScriptCode eScript, OutputDevice &rDevice)
1108 : : {
1109 : : //If we're a CJK font, see if we seem to be tuned for C, J or K
1110 [ # # ]: 0 : if (eScript == USCRIPT_HAN)
1111 : : {
1112 : 0 : const Font &rFont = rDevice.GetFont();
1113 : :
1114 : 0 : bool bKore = false, bJpan = false, bHant = false, bHans = false;
1115 : :
1116 : 0 : const sal_Unicode aKorean[] = { 0x3131 };
1117 : 0 : rtl::OUString sKorean(aKorean, SAL_N_ELEMENTS(aKorean));
1118 [ # # ][ # # ]: 0 : if (STRING_LEN == rDevice.HasGlyphs(rFont, sKorean))
[ # # ][ # # ]
1119 : 0 : bKore = true;
1120 : :
1121 : 0 : const sal_Unicode aJapanese[] = { 0x3007, 0x9F9D };
1122 : 0 : rtl::OUString sJapanese(aJapanese, SAL_N_ELEMENTS(aJapanese));
1123 [ # # ][ # # ]: 0 : if (STRING_LEN == rDevice.HasGlyphs(rFont, sJapanese))
[ # # ][ # # ]
1124 : 0 : bJpan = true;
1125 : :
1126 : 0 : const sal_Unicode aTraditionalChinese[] = { 0x570B };
1127 : 0 : rtl::OUString sTraditionalChinese(aTraditionalChinese, SAL_N_ELEMENTS(aTraditionalChinese));
1128 [ # # ][ # # ]: 0 : if (STRING_LEN == rDevice.HasGlyphs(rFont, sTraditionalChinese))
[ # # ][ # # ]
1129 : 0 : bHant = true;
1130 : :
1131 : 0 : const sal_Unicode aSimplifiedChinese[] = { 0x56FD };
1132 : 0 : rtl::OUString sSimplifiedChinese(aSimplifiedChinese, SAL_N_ELEMENTS(aSimplifiedChinese));
1133 [ # # ][ # # ]: 0 : if (STRING_LEN == rDevice.HasGlyphs(rFont, sSimplifiedChinese))
[ # # ][ # # ]
1134 : 0 : bHans = true;
1135 : :
1136 [ # # ][ # # ]: 0 : if (bKore && !bJpan && !bHans)
[ # # ]
1137 : 0 : eScript = USCRIPT_KOREAN;
1138 [ # # ][ # # ]: 0 : else if (bJpan && !bKore && !bHant)
[ # # ]
1139 : 0 : eScript = USCRIPT_JAPANESE;
1140 [ # # ][ # # ]: 0 : else if (bHant && !bHans && !bKore && !bJpan)
[ # # ][ # # ]
1141 : 0 : eScript = USCRIPT_TRADITIONAL_HAN;
1142 [ # # ][ # # ]: 0 : else if (bHans && !bHant && !bKore && !bJpan)
[ # # ][ # # ]
1143 : 0 : eScript = USCRIPT_SIMPLIFIED_HAN;
1144 : : //otherwise fall-through as USCRIPT_HAN and expect a combind Hant/Hans preview
1145 : : }
1146 : 0 : return eScript;
1147 : : }
1148 : : }
1149 : :
1150 : 2 : rtl::OUString makeShortRepresentativeTextForSelectedFont(OutputDevice &rDevice)
1151 : : {
1152 [ + - ]: 2 : vcl::FontCapabilities aFontCapabilities;
1153 [ + - ][ - + ]: 2 : if (!rDevice.GetFontCapabilities(aFontCapabilities))
1154 : 0 : return rtl::OUString();
1155 : :
1156 : : #if OSL_DEBUG_LEVEL > 2
1157 : : fprintf(stderr, "font is %s\n",
1158 : : rtl::OUStringToOString(rDevice.GetFont().GetName(), RTL_TEXTENCODING_UTF8).getStr());
1159 : : lcl_dump_unicode_coverage(aFontCapabilities.maUnicodeRange);
1160 : : lcl_dump_codepage_coverage(aFontCapabilities.maCodePageRange);
1161 : : #endif
1162 : :
1163 [ + - ][ + - ]: 2 : aFontCapabilities.maUnicodeRange &= getCommonLatnSubsetMask();
1164 : :
1165 : : //If this font is probably tuned to display a single non-Latin
1166 : : //script and the font name is itself in Latin, then show a small
1167 : : //chunk of representative text for that script
1168 [ + - ]: 2 : UScriptCode eScript = getScript(aFontCapabilities);
1169 [ + - ][ + - ]: 2 : if (!eScript != USCRIPT_COMMON)
1170 : 2 : return rtl::OUString();
1171 : :
1172 [ # # ]: 0 : eScript = attemptToDisambiguateHan(eScript, rDevice);
1173 : :
1174 [ # # ]: 0 : rtl::OUString sSampleText = makeShortRepresentativeTextForScript(eScript);
1175 [ # # ][ # # ]: 0 : bool bHasSampleTextGlyphs = (STRING_LEN == rDevice.HasGlyphs(rDevice.GetFont(), sSampleText));
[ # # ]
1176 [ # # ][ + - ]: 2 : return bHasSampleTextGlyphs ? sSampleText : rtl::OUString();
1177 : : }
1178 : :
1179 : 512 : UScriptCode otCoverageToScript(vcl::UnicodeCoverage::UnicodeCoverageEnum eOTCoverage)
1180 : : {
1181 : 512 : UScriptCode eRet = USCRIPT_COMMON;
1182 [ + + + + : 512 : switch (eOTCoverage)
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + - ]
1183 : : {
1184 : : case vcl::UnicodeCoverage::BASIC_LATIN:
1185 : : case vcl::UnicodeCoverage::LATIN_1_SUPPLEMENT:
1186 : : case vcl::UnicodeCoverage::LATIN_EXTENDED_A:
1187 : : case vcl::UnicodeCoverage::LATIN_EXTENDED_B:
1188 : 16 : eRet = USCRIPT_LATIN;
1189 : 16 : break;
1190 : : case vcl::UnicodeCoverage::COMBINING_DIACRITICAL_MARKS:
1191 : 4 : eRet = USCRIPT_INHERITED;
1192 : 4 : break;
1193 : : case vcl::UnicodeCoverage::GREEK_AND_COPTIC:
1194 : 4 : eRet = USCRIPT_GREEK;
1195 : 4 : break;
1196 : : case vcl::UnicodeCoverage::COPTIC:
1197 : 4 : eRet = USCRIPT_COPTIC;
1198 : 4 : break;
1199 : : case vcl::UnicodeCoverage::CYRILLIC:
1200 : 4 : eRet = USCRIPT_CYRILLIC;
1201 : 4 : break;
1202 : : case vcl::UnicodeCoverage::ARMENIAN:
1203 : 4 : eRet = USCRIPT_ARMENIAN;
1204 : 4 : break;
1205 : : case vcl::UnicodeCoverage::HEBREW:
1206 : 4 : eRet = USCRIPT_HEBREW;
1207 : 4 : break;
1208 : : case vcl::UnicodeCoverage::VAI:
1209 : 4 : eRet = USCRIPT_VAI;
1210 : 4 : break;
1211 : : case vcl::UnicodeCoverage::ARABIC:
1212 : 4 : eRet = USCRIPT_ARABIC;
1213 : 4 : break;
1214 : : case vcl::UnicodeCoverage::NKO:
1215 : 4 : eRet = USCRIPT_NKO;
1216 : 4 : break;
1217 : : case vcl::UnicodeCoverage::DEVANAGARI:
1218 : 4 : eRet = USCRIPT_DEVANAGARI;
1219 : 4 : break;
1220 : : case vcl::UnicodeCoverage::BENGALI:
1221 : 4 : eRet = USCRIPT_BENGALI;
1222 : 4 : break;
1223 : : case vcl::UnicodeCoverage::GURMUKHI:
1224 : 4 : eRet = USCRIPT_GURMUKHI;
1225 : 4 : break;
1226 : : case vcl::UnicodeCoverage::GUJARATI:
1227 : 4 : eRet = USCRIPT_GUJARATI;
1228 : 4 : break;
1229 : : case vcl::UnicodeCoverage::ORIYA:
1230 : 4 : eRet = USCRIPT_ORIYA;
1231 : 4 : break;
1232 : : case vcl::UnicodeCoverage::TAMIL:
1233 : 4 : eRet = USCRIPT_TAMIL;
1234 : 4 : break;
1235 : : case vcl::UnicodeCoverage::TELUGU:
1236 : 4 : eRet = USCRIPT_TELUGU;
1237 : 4 : break;
1238 : : case vcl::UnicodeCoverage::KANNADA:
1239 : 4 : eRet = USCRIPT_KANNADA;
1240 : 4 : break;
1241 : : case vcl::UnicodeCoverage::MALAYALAM:
1242 : 4 : eRet = USCRIPT_MALAYALAM;
1243 : 4 : break;
1244 : : case vcl::UnicodeCoverage::THAI:
1245 : 4 : eRet = USCRIPT_THAI;
1246 : 4 : break;
1247 : : case vcl::UnicodeCoverage::LAO:
1248 : 4 : eRet = USCRIPT_LAO;
1249 : 4 : break;
1250 : : case vcl::UnicodeCoverage::GEORGIAN:
1251 : 4 : eRet = USCRIPT_GEORGIAN;
1252 : 4 : break;
1253 : : case vcl::UnicodeCoverage::BALINESE:
1254 : 4 : eRet = USCRIPT_BALINESE;
1255 : 4 : break;
1256 : : case vcl::UnicodeCoverage::HANGUL_JAMO:
1257 : 4 : eRet = USCRIPT_HANGUL;
1258 : 4 : break;
1259 : : case vcl::UnicodeCoverage::LATIN_EXTENDED_ADDITIONAL:
1260 : 4 : eRet = USCRIPT_LATIN;
1261 : 4 : break;
1262 : : case vcl::UnicodeCoverage::GREEK_EXTENDED:
1263 : 4 : eRet = USCRIPT_GREEK;
1264 : 4 : break;
1265 : : case vcl::UnicodeCoverage::CURRENCY_SYMBOLS:
1266 : 4 : eRet = USCRIPT_SYMBOLS;
1267 : 4 : break;
1268 : : case vcl::UnicodeCoverage::COMBINING_DIACRITICAL_MARKS_FOR_SYMBOLS:
1269 : 4 : eRet = USCRIPT_INHERITED;
1270 : 4 : break;
1271 : : case vcl::UnicodeCoverage::LETTERLIKE_SYMBOLS:
1272 : : case vcl::UnicodeCoverage::NUMBER_FORMS:
1273 : : case vcl::UnicodeCoverage::ARROWS:
1274 : 12 : eRet = USCRIPT_SYMBOLS;
1275 : 12 : break;
1276 : : case vcl::UnicodeCoverage::MATHEMATICAL_OPERATORS:
1277 : 4 : eRet = USCRIPT_MATHEMATICAL_NOTATION;
1278 : 4 : break;
1279 : : case vcl::UnicodeCoverage::MISCELLANEOUS_TECHNICAL:
1280 : : case vcl::UnicodeCoverage::OPTICAL_CHARACTER_RECOGNITION:
1281 : : case vcl::UnicodeCoverage::BOX_DRAWING:
1282 : : case vcl::UnicodeCoverage::BLOCK_ELEMENTS:
1283 : : case vcl::UnicodeCoverage::GEOMETRIC_SHAPES:
1284 : : case vcl::UnicodeCoverage::MISCELLANEOUS_SYMBOLS:
1285 : : case vcl::UnicodeCoverage::DINGBATS:
1286 : : case vcl::UnicodeCoverage::CJK_SYMBOLS_AND_PUNCTUATION:
1287 : 32 : eRet = USCRIPT_SYMBOLS;
1288 : 32 : break;
1289 : : case vcl::UnicodeCoverage::HIRAGANA:
1290 : 4 : eRet = USCRIPT_HIRAGANA;
1291 : 4 : break;
1292 : : case vcl::UnicodeCoverage::KATAKANA:
1293 : 4 : eRet = USCRIPT_KATAKANA;
1294 : 4 : break;
1295 : : case vcl::UnicodeCoverage::BOPOMOFO:
1296 : 4 : eRet = USCRIPT_BOPOMOFO;
1297 : 4 : break;
1298 : : case vcl::UnicodeCoverage::HANGUL_COMPATIBILITY_JAMO:
1299 : 4 : eRet = USCRIPT_HANGUL;
1300 : 4 : break;
1301 : : case vcl::UnicodeCoverage::PHAGS_PA:
1302 : 4 : eRet = USCRIPT_PHAGS_PA;
1303 : 4 : break;
1304 : : case vcl::UnicodeCoverage::ENCLOSED_CJK_LETTERS_AND_MONTHS:
1305 : 4 : eRet = USCRIPT_HANGUL;
1306 : 4 : break;
1307 : : case vcl::UnicodeCoverage::CJK_COMPATIBILITY:
1308 : 4 : eRet = USCRIPT_HAN;
1309 : 4 : break;
1310 : : case vcl::UnicodeCoverage::HANGUL_SYLLABLES:
1311 : 4 : eRet = USCRIPT_HANGUL;
1312 : 4 : break;
1313 : : case vcl::UnicodeCoverage::PHOENICIAN:
1314 : 4 : eRet = USCRIPT_PHOENICIAN;
1315 : 4 : break;
1316 : : case vcl::UnicodeCoverage::CJK_UNIFIED_IDEOGRAPHS:
1317 : : case vcl::UnicodeCoverage::CJK_STROKES:
1318 : 8 : eRet = USCRIPT_HAN;
1319 : 8 : break;
1320 : : case vcl::UnicodeCoverage::ARABIC_PRESENTATION_FORMS_A:
1321 : 4 : eRet = USCRIPT_ARABIC;
1322 : 4 : break;
1323 : : case vcl::UnicodeCoverage::COMBINING_HALF_MARKS:
1324 : 4 : eRet = USCRIPT_INHERITED;
1325 : 4 : break;
1326 : : case vcl::UnicodeCoverage::ARABIC_PRESENTATION_FORMS_B:
1327 : 4 : eRet = USCRIPT_ARABIC;
1328 : 4 : break;
1329 : : case vcl::UnicodeCoverage::TIBETAN:
1330 : 4 : eRet = USCRIPT_TIBETAN;
1331 : 4 : break;
1332 : : case vcl::UnicodeCoverage::SYRIAC:
1333 : 4 : eRet = USCRIPT_SYRIAC;
1334 : 4 : break;
1335 : : case vcl::UnicodeCoverage::THAANA:
1336 : 4 : eRet = USCRIPT_THAANA;
1337 : 4 : break;
1338 : : case vcl::UnicodeCoverage::SINHALA:
1339 : 4 : eRet = USCRIPT_SINHALA;
1340 : 4 : break;
1341 : : case vcl::UnicodeCoverage::MYANMAR:
1342 : 4 : eRet = USCRIPT_MYANMAR;
1343 : 4 : break;
1344 : : case vcl::UnicodeCoverage::ETHIOPIC:
1345 : 4 : eRet = USCRIPT_ETHIOPIC;
1346 : 4 : break;
1347 : : case vcl::UnicodeCoverage::CHEROKEE:
1348 : 4 : eRet = USCRIPT_CHEROKEE;
1349 : 4 : break;
1350 : : case vcl::UnicodeCoverage::UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS:
1351 : 4 : eRet = USCRIPT_CANADIAN_ABORIGINAL;
1352 : 4 : break;
1353 : : case vcl::UnicodeCoverage::OGHAM:
1354 : 4 : eRet = USCRIPT_OGHAM;
1355 : 4 : break;
1356 : : case vcl::UnicodeCoverage::RUNIC:
1357 : 4 : eRet = USCRIPT_RUNIC;
1358 : 4 : break;
1359 : : case vcl::UnicodeCoverage::KHMER:
1360 : 4 : eRet = USCRIPT_KHMER;
1361 : 4 : break;
1362 : : case vcl::UnicodeCoverage::MONGOLIAN:
1363 : 4 : eRet = USCRIPT_MONGOLIAN;
1364 : 4 : break;
1365 : : case vcl::UnicodeCoverage::BRAILLE_PATTERNS:
1366 : 4 : eRet = USCRIPT_BRAILLE;
1367 : 4 : break;
1368 : : case vcl::UnicodeCoverage::YI_SYLLABLES:
1369 : 4 : eRet = USCRIPT_YI;
1370 : 4 : break;
1371 : : case vcl::UnicodeCoverage::TAGALOG:
1372 : 4 : eRet = USCRIPT_TAGALOG;
1373 : 4 : break;
1374 : : case vcl::UnicodeCoverage::OLD_ITALIC:
1375 : 4 : eRet = USCRIPT_OLD_ITALIC;
1376 : 4 : break;
1377 : : case vcl::UnicodeCoverage::GOTHIC:
1378 : 4 : eRet = USCRIPT_GOTHIC;
1379 : 4 : break;
1380 : : case vcl::UnicodeCoverage::DESERET:
1381 : 4 : eRet = USCRIPT_DESERET;
1382 : 4 : break;
1383 : : case vcl::UnicodeCoverage::BYZANTINE_MUSICAL_SYMBOLS:
1384 : : case vcl::UnicodeCoverage::MATHEMATICAL_ALPHANUMERIC_SYMBOLS:
1385 : : case vcl::UnicodeCoverage::PRIVATE_USE_PLANE_15:
1386 : 12 : eRet = USCRIPT_SYMBOLS;
1387 : 12 : break;
1388 : : case vcl::UnicodeCoverage::VARIATION_SELECTORS:
1389 : 4 : eRet = USCRIPT_INHERITED;
1390 : 4 : break;
1391 : : case vcl::UnicodeCoverage::TAGS:
1392 : 4 : eRet = USCRIPT_SYMBOLS;
1393 : 4 : break;
1394 : : case vcl::UnicodeCoverage::LIMBU:
1395 : 4 : eRet = USCRIPT_LIMBU;
1396 : 4 : break;
1397 : : case vcl::UnicodeCoverage::TAI_LE:
1398 : 4 : eRet = USCRIPT_TAI_LE;
1399 : 4 : break;
1400 : : case vcl::UnicodeCoverage::NEW_TAI_LUE:
1401 : 4 : eRet = USCRIPT_NEW_TAI_LUE;
1402 : 4 : break;
1403 : : case vcl::UnicodeCoverage::BUGINESE:
1404 : 4 : eRet = USCRIPT_BUGINESE;
1405 : 4 : break;
1406 : : case vcl::UnicodeCoverage::GLAGOLITIC:
1407 : 4 : eRet = USCRIPT_GLAGOLITIC;
1408 : 4 : break;
1409 : : case vcl::UnicodeCoverage::TIFINAGH:
1410 : 4 : eRet = USCRIPT_TIFINAGH;
1411 : 4 : break;
1412 : : case vcl::UnicodeCoverage::YIJING_HEXAGRAM_SYMBOLS:
1413 : 4 : eRet = USCRIPT_SYMBOLS;
1414 : 4 : break;
1415 : : case vcl::UnicodeCoverage::SYLOTI_NAGRI:
1416 : 4 : eRet = USCRIPT_SYLOTI_NAGRI;
1417 : 4 : break;
1418 : : case vcl::UnicodeCoverage::LINEAR_B_SYLLABARY:
1419 : 4 : eRet = USCRIPT_LINEAR_B;
1420 : 4 : break;
1421 : : case vcl::UnicodeCoverage::ANCIENT_GREEK_NUMBERS:
1422 : 4 : eRet = USCRIPT_GREEK;
1423 : 4 : break;
1424 : : case vcl::UnicodeCoverage::UGARITIC:
1425 : 4 : eRet = USCRIPT_UGARITIC;
1426 : 4 : break;
1427 : : case vcl::UnicodeCoverage::OLD_PERSIAN:
1428 : 4 : eRet = USCRIPT_OLD_PERSIAN;
1429 : 4 : break;
1430 : : case vcl::UnicodeCoverage::SHAVIAN:
1431 : 4 : eRet = USCRIPT_SHAVIAN;
1432 : 4 : break;
1433 : : case vcl::UnicodeCoverage::OSMANYA:
1434 : 4 : eRet = USCRIPT_OSMANYA;
1435 : 4 : break;
1436 : : case vcl::UnicodeCoverage::CYPRIOT_SYLLABARY:
1437 : 4 : eRet = USCRIPT_CYPRIOT;
1438 : 4 : break;
1439 : : case vcl::UnicodeCoverage::KHAROSHTHI:
1440 : 4 : eRet = USCRIPT_KHAROSHTHI;
1441 : 4 : break;
1442 : : case vcl::UnicodeCoverage::CUNEIFORM:
1443 : 4 : eRet = USCRIPT_CUNEIFORM;
1444 : 4 : break;
1445 : : case vcl::UnicodeCoverage::SUNDANESE:
1446 : 4 : eRet = USCRIPT_SUNDANESE;
1447 : 4 : break;
1448 : : case vcl::UnicodeCoverage::LEPCHA:
1449 : 4 : eRet = USCRIPT_LEPCHA;
1450 : 4 : break;
1451 : : case vcl::UnicodeCoverage::OL_CHIKI:
1452 : 4 : eRet = USCRIPT_OL_CHIKI;
1453 : 4 : break;
1454 : : case vcl::UnicodeCoverage::SAURASHTRA:
1455 : 4 : eRet = USCRIPT_SAURASHTRA;
1456 : 4 : break;
1457 : : case vcl::UnicodeCoverage::KAYAH_LI:
1458 : 4 : eRet = USCRIPT_KAYAH_LI;
1459 : 4 : break;
1460 : : case vcl::UnicodeCoverage::REJANG:
1461 : 4 : eRet = USCRIPT_REJANG;
1462 : 4 : break;
1463 : : case vcl::UnicodeCoverage::CHAM:
1464 : 4 : eRet = USCRIPT_CHAM;
1465 : 4 : break;
1466 : : case vcl::UnicodeCoverage::CARIAN:
1467 : 4 : eRet = USCRIPT_CARIAN;
1468 : 4 : break;
1469 : : case vcl::UnicodeCoverage::DOMINO_TILES:
1470 : : case vcl::UnicodeCoverage::TAI_XUAN_JING_SYMBOLS:
1471 : : case vcl::UnicodeCoverage::COUNTING_ROD_NUMERALS:
1472 : : case vcl::UnicodeCoverage::ANCIENT_SYMBOLS:
1473 : : case vcl::UnicodeCoverage::PHAISTOS_DISC:
1474 : 20 : eRet = USCRIPT_SYMBOLS;
1475 : 20 : break;
1476 : : case vcl::UnicodeCoverage::IPA_EXTENSIONS:
1477 : : case vcl::UnicodeCoverage::SPECIALS:
1478 : : case vcl::UnicodeCoverage::HALFWIDTH_AND_FULLWIDTH_FORMS:
1479 : : case vcl::UnicodeCoverage::VERTICAL_FORMS:
1480 : : case vcl::UnicodeCoverage::SMALL_FORM_VARIANTS:
1481 : : case vcl::UnicodeCoverage::ALPHABETIC_PRESENTATION_FORMS:
1482 : : case vcl::UnicodeCoverage::PRIVATE_USE_AREA_PLANE_0:
1483 : : case vcl::UnicodeCoverage::NONPLANE_0:
1484 : : case vcl::UnicodeCoverage::ENCLOSED_ALPHANUMERICS:
1485 : : case vcl::UnicodeCoverage::CONTROL_PICTURES:
1486 : : case vcl::UnicodeCoverage::SUPERSCRIPTS_AND_SUBSCRIPTS:
1487 : : case vcl::UnicodeCoverage::GENERAL_PUNCTUATION:
1488 : : case vcl::UnicodeCoverage::SPACING_MODIFIER_LETTERS:
1489 : : case vcl::UnicodeCoverage::RESERVED1:
1490 : : case vcl::UnicodeCoverage::RESERVED2:
1491 : : case vcl::UnicodeCoverage::RESERVED3:
1492 : : case vcl::UnicodeCoverage::RESERVED4:
1493 : : case vcl::UnicodeCoverage::RESERVED5:
1494 : : case vcl::UnicodeCoverage::MAX_UC_ENUM:
1495 : 72 : break;
1496 : : }
1497 : 512 : return eRet;
1498 : : }
1499 : :
1500 : 0 : rtl::OUString makeRepresentativeTextForFont(sal_Int16 nScriptType, const Font &rFont)
1501 : : {
1502 [ # # ][ # # ]: 0 : rtl::OUString sRet(makeRepresentativeTextForLanguage(rFont.GetLanguage()));
1503 : :
1504 [ # # ]: 0 : VirtualDevice aDevice;
1505 [ # # ][ # # ]: 0 : if (sRet.isEmpty() || (STRING_LEN != aDevice.HasGlyphs(rFont, sRet)))
[ # # ][ # # ]
[ # # ][ # # ]
[ # # # # ]
1506 : : {
1507 [ # # ]: 0 : aDevice.SetFont(rFont);
1508 [ # # ]: 0 : vcl::FontCapabilities aFontCapabilities;
1509 [ # # ][ # # ]: 0 : if (aDevice.GetFontCapabilities(aFontCapabilities))
1510 : : {
1511 : : #if OSL_DEBUG_LEVEL > 2
1512 : : lcl_dump_unicode_coverage(aFontCapabilities.maUnicodeRange);
1513 : : #endif
1514 : :
1515 [ # # ][ # # ]: 0 : aFontCapabilities.maUnicodeRange &= getWeakMask();
1516 : :
1517 [ # # ]: 0 : if (nScriptType != com::sun::star::i18n::ScriptType::ASIAN)
1518 : : {
1519 [ # # ][ # # ]: 0 : aFontCapabilities.maUnicodeRange &= getCJKMask();
1520 : : aFontCapabilities.maCodePageRange =
1521 [ # # ][ # # ]: 0 : boost::dynamic_bitset<sal_uInt32>(aFontCapabilities.maCodePageRange.size());
1522 : : }
1523 [ # # ]: 0 : if (nScriptType != com::sun::star::i18n::ScriptType::LATIN)
1524 [ # # ][ # # ]: 0 : aFontCapabilities.maUnicodeRange &= getLatinMask();
1525 [ # # ]: 0 : if (nScriptType != com::sun::star::i18n::ScriptType::COMPLEX)
1526 [ # # ][ # # ]: 0 : aFontCapabilities.maUnicodeRange &= getCTLMask();
1527 : :
1528 : : #if OSL_DEBUG_LEVEL > 2
1529 : : fprintf(stderr, "minimal\n");
1530 : : lcl_dump_unicode_coverage(aFontCapabilities.maUnicodeRange);
1531 : : lcl_dump_codepage_coverage(aFontCapabilities.maCodePageRange);
1532 : : #endif
1533 : :
1534 [ # # ]: 0 : UScriptCode eScript = getScript(aFontCapabilities);
1535 : :
1536 [ # # ]: 0 : if (nScriptType == com::sun::star::i18n::ScriptType::ASIAN)
1537 [ # # ]: 0 : eScript = attemptToDisambiguateHan(eScript, aDevice);
1538 : :
1539 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(eScript);
1540 : : }
1541 : :
1542 [ # # ]: 0 : if (sRet.isEmpty())
1543 : : {
1544 [ # # ]: 0 : if (nScriptType == com::sun::star::i18n::ScriptType::COMPLEX)
1545 : : {
1546 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_HEBREW);
1547 [ # # ][ # # ]: 0 : if (STRING_LEN != aDevice.HasGlyphs(rFont, sRet))
[ # # ][ # # ]
1548 : : {
1549 [ # # ]: 0 : sRet = makeMinimalTextForScript(USCRIPT_HEBREW);
1550 [ # # ][ # # ]: 0 : if (STRING_LEN != aDevice.HasGlyphs(rFont, sRet))
[ # # ][ # # ]
1551 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_ARABIC);
1552 : : }
1553 : : }
1554 [ # # ]: 0 : else if (nScriptType == com::sun::star::i18n::ScriptType::LATIN)
1555 [ # # ]: 0 : sRet = makeRepresentativeTextForScript(USCRIPT_LATIN);
1556 [ # # ]: 0 : }
1557 : : }
1558 : :
1559 [ # # ]: 0 : return sRet;
1560 : : }
1561 : :
1562 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|