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 0 : bool isOpenSymbolFont(const Font &rFont)
36 : {
37 0 : return rFont.GetName().EqualsIgnoreCaseAscii("starsymbol") ||
38 0 : rFont.GetName().EqualsIgnoreCaseAscii("opensymbol");
39 : }
40 :
41 0 : bool isSymbolFont(const Font &rFont)
42 : {
43 0 : return (rFont.GetCharSet() == RTL_TEXTENCODING_SYMBOL) ||
44 0 : rFont.GetName().EqualsIgnoreCaseAscii("cmsy10") ||
45 0 : rFont.GetName().EqualsIgnoreCaseAscii("cmex10") ||
46 0 : rFont.GetName().EqualsIgnoreCaseAscii("feta26") ||
47 0 : rFont.GetName().EqualsIgnoreCaseAscii("jsMath-cmsy10") ||
48 0 : rFont.GetName().EqualsIgnoreCaseAscii("jsMath-cmex10") ||
49 0 : rFont.GetName().EqualsIgnoreCaseAscii("msam10") ||
50 0 : rFont.GetName().EqualsIgnoreCaseAscii("msbm10") ||
51 0 : rFont.GetName().EqualsIgnoreCaseAscii("wasy10") ||
52 0 : rFont.GetName().EqualsIgnoreCaseAscii("Denemo") ||
53 0 : rFont.GetName().EqualsIgnoreCaseAscii("GlyphBasic1") ||
54 0 : rFont.GetName().EqualsIgnoreCaseAscii("GlyphBasic2") ||
55 0 : rFont.GetName().EqualsIgnoreCaseAscii("GlyphBasic3") ||
56 0 : rFont.GetName().EqualsIgnoreCaseAscii("GlyphBasic4") ||
57 0 : rFont.GetName().EqualsIgnoreCaseAscii("Letters Laughing") ||
58 0 : rFont.GetName().EqualsIgnoreCaseAscii("MusiQwik") ||
59 0 : rFont.GetName().EqualsIgnoreCaseAscii("MusiSync") ||
60 0 : isOpenSymbolFont(rFont);
61 : }
62 :
63 0 : bool canRenderNameOfSelectedFont(OutputDevice &rDevice)
64 : {
65 0 : const Font &rFont = rDevice.GetFont();
66 0 : 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 0 : boost::dynamic_bitset<sal_uInt32> getMaskByScriptType(sal_Int16 nScriptType)
963 : {
964 0 : boost::dynamic_bitset<sal_uInt32> aMask(vcl::UnicodeCoverage::MAX_UC_ENUM);
965 0 : aMask.set();
966 :
967 0 : for (size_t i = 0; i < vcl::UnicodeCoverage::MAX_UC_ENUM; ++i)
968 : {
969 : using vcl::UnicodeCoverage::UnicodeCoverageEnum;
970 0 : UScriptCode eScriptCode = otCoverageToScript(static_cast<UnicodeCoverageEnum>(i));
971 0 : if (unicode::getScriptClassFromUScriptCode(eScriptCode) == nScriptType)
972 0 : aMask.set(i, false);
973 : }
974 :
975 0 : 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 0 : boost::dynamic_bitset<sal_uInt32> getCJKMask()
987 : {
988 0 : static boost::dynamic_bitset<sal_uInt32> aMask(getMaskByScriptType(com::sun::star::i18n::ScriptType::ASIAN));
989 0 : 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 0 : boost::dynamic_bitset<sal_uInt32> getWeakMask()
1001 : {
1002 0 : static boost::dynamic_bitset<sal_uInt32> aMask(getMaskByScriptType(com::sun::star::i18n::ScriptType::WEAK));
1003 0 : return aMask;
1004 : }
1005 :
1006 : //Nearly every font supports some basic Latin
1007 0 : boost::dynamic_bitset<sal_uInt32> getCommonLatnSubsetMask()
1008 : {
1009 0 : boost::dynamic_bitset<sal_uInt32> aMask(vcl::UnicodeCoverage::MAX_UC_ENUM);
1010 0 : aMask.set();
1011 0 : aMask.set(vcl::UnicodeCoverage::BASIC_LATIN, false);
1012 0 : aMask.set(vcl::UnicodeCoverage::LATIN_1_SUPPLEMENT, false);
1013 0 : aMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_A, false);
1014 0 : aMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_B, false);
1015 0 : aMask.set(vcl::UnicodeCoverage::LATIN_EXTENDED_ADDITIONAL, false);
1016 0 : return aMask;
1017 : }
1018 :
1019 0 : UScriptCode getScript(const vcl::FontCapabilities &rFontCapabilities)
1020 : {
1021 : using vcl::UnicodeCoverage::UnicodeCoverageEnum;
1022 :
1023 0 : boost::dynamic_bitset<sal_uInt32> aMasked = rFontCapabilities.maUnicodeRange & getWeakMask();
1024 :
1025 0 : if (aMasked.count() == 1)
1026 0 : return otCoverageToScript(static_cast<UnicodeCoverageEnum>(aMasked.find_first()));
1027 :
1028 0 : 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 0 : 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 0 : aMasked.set(vcl::UnicodeCoverage::GREEK_EXTENDED, false);
1049 0 : aMasked.set(vcl::UnicodeCoverage::GREEK_AND_COPTIC, false);
1050 0 : if (aMasked.count() == 1)
1051 0 : return otCoverageToScript(static_cast<UnicodeCoverageEnum>(aMasked.find_first()));
1052 :
1053 0 : if (aMasked[vcl::UnicodeCoverage::CYRILLIC])
1054 : {
1055 : //Probably strongly tuned for Georgian
1056 0 : if (aMasked.count() == 2 && aMasked[vcl::UnicodeCoverage::GEORGIAN])
1057 0 : return USCRIPT_GEORGIAN;
1058 : }
1059 :
1060 0 : aMasked &= getCJKMask();
1061 :
1062 0 : aMasked.set(vcl::UnicodeCoverage::CYRILLIC, false);
1063 0 : aMasked.set(vcl::UnicodeCoverage::THAI, false);
1064 0 : aMasked.set(vcl::UnicodeCoverage::DESERET, false);
1065 0 : aMasked.set(vcl::UnicodeCoverage::PHAGS_PA, false);
1066 :
1067 : //So, possibly a CJK font
1068 0 : 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 0 : 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 0 : rtl::OUString makeShortRepresentativeTextForSelectedFont(OutputDevice &rDevice)
1151 : {
1152 0 : vcl::FontCapabilities aFontCapabilities;
1153 0 : 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 0 : 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 0 : UScriptCode eScript = getScript(aFontCapabilities);
1169 0 : if (!eScript != USCRIPT_COMMON)
1170 0 : 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 0 : return bHasSampleTextGlyphs ? sSampleText : rtl::OUString();
1177 : }
1178 :
1179 0 : UScriptCode otCoverageToScript(vcl::UnicodeCoverage::UnicodeCoverageEnum eOTCoverage)
1180 : {
1181 0 : UScriptCode eRet = USCRIPT_COMMON;
1182 0 : 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 0 : eRet = USCRIPT_LATIN;
1189 0 : break;
1190 : case vcl::UnicodeCoverage::COMBINING_DIACRITICAL_MARKS:
1191 0 : eRet = USCRIPT_INHERITED;
1192 0 : break;
1193 : case vcl::UnicodeCoverage::GREEK_AND_COPTIC:
1194 0 : eRet = USCRIPT_GREEK;
1195 0 : break;
1196 : case vcl::UnicodeCoverage::COPTIC:
1197 0 : eRet = USCRIPT_COPTIC;
1198 0 : break;
1199 : case vcl::UnicodeCoverage::CYRILLIC:
1200 0 : eRet = USCRIPT_CYRILLIC;
1201 0 : break;
1202 : case vcl::UnicodeCoverage::ARMENIAN:
1203 0 : eRet = USCRIPT_ARMENIAN;
1204 0 : break;
1205 : case vcl::UnicodeCoverage::HEBREW:
1206 0 : eRet = USCRIPT_HEBREW;
1207 0 : break;
1208 : case vcl::UnicodeCoverage::VAI:
1209 0 : eRet = USCRIPT_VAI;
1210 0 : break;
1211 : case vcl::UnicodeCoverage::ARABIC:
1212 0 : eRet = USCRIPT_ARABIC;
1213 0 : break;
1214 : case vcl::UnicodeCoverage::NKO:
1215 0 : eRet = USCRIPT_NKO;
1216 0 : break;
1217 : case vcl::UnicodeCoverage::DEVANAGARI:
1218 0 : eRet = USCRIPT_DEVANAGARI;
1219 0 : break;
1220 : case vcl::UnicodeCoverage::BENGALI:
1221 0 : eRet = USCRIPT_BENGALI;
1222 0 : break;
1223 : case vcl::UnicodeCoverage::GURMUKHI:
1224 0 : eRet = USCRIPT_GURMUKHI;
1225 0 : break;
1226 : case vcl::UnicodeCoverage::GUJARATI:
1227 0 : eRet = USCRIPT_GUJARATI;
1228 0 : break;
1229 : case vcl::UnicodeCoverage::ORIYA:
1230 0 : eRet = USCRIPT_ORIYA;
1231 0 : break;
1232 : case vcl::UnicodeCoverage::TAMIL:
1233 0 : eRet = USCRIPT_TAMIL;
1234 0 : break;
1235 : case vcl::UnicodeCoverage::TELUGU:
1236 0 : eRet = USCRIPT_TELUGU;
1237 0 : break;
1238 : case vcl::UnicodeCoverage::KANNADA:
1239 0 : eRet = USCRIPT_KANNADA;
1240 0 : break;
1241 : case vcl::UnicodeCoverage::MALAYALAM:
1242 0 : eRet = USCRIPT_MALAYALAM;
1243 0 : break;
1244 : case vcl::UnicodeCoverage::THAI:
1245 0 : eRet = USCRIPT_THAI;
1246 0 : break;
1247 : case vcl::UnicodeCoverage::LAO:
1248 0 : eRet = USCRIPT_LAO;
1249 0 : break;
1250 : case vcl::UnicodeCoverage::GEORGIAN:
1251 0 : eRet = USCRIPT_GEORGIAN;
1252 0 : break;
1253 : case vcl::UnicodeCoverage::BALINESE:
1254 0 : eRet = USCRIPT_BALINESE;
1255 0 : break;
1256 : case vcl::UnicodeCoverage::HANGUL_JAMO:
1257 0 : eRet = USCRIPT_HANGUL;
1258 0 : break;
1259 : case vcl::UnicodeCoverage::LATIN_EXTENDED_ADDITIONAL:
1260 0 : eRet = USCRIPT_LATIN;
1261 0 : break;
1262 : case vcl::UnicodeCoverage::GREEK_EXTENDED:
1263 0 : eRet = USCRIPT_GREEK;
1264 0 : break;
1265 : case vcl::UnicodeCoverage::CURRENCY_SYMBOLS:
1266 0 : eRet = USCRIPT_SYMBOLS;
1267 0 : break;
1268 : case vcl::UnicodeCoverage::COMBINING_DIACRITICAL_MARKS_FOR_SYMBOLS:
1269 0 : eRet = USCRIPT_INHERITED;
1270 0 : break;
1271 : case vcl::UnicodeCoverage::LETTERLIKE_SYMBOLS:
1272 : case vcl::UnicodeCoverage::NUMBER_FORMS:
1273 : case vcl::UnicodeCoverage::ARROWS:
1274 0 : eRet = USCRIPT_SYMBOLS;
1275 0 : break;
1276 : case vcl::UnicodeCoverage::MATHEMATICAL_OPERATORS:
1277 0 : eRet = USCRIPT_MATHEMATICAL_NOTATION;
1278 0 : 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 0 : eRet = USCRIPT_SYMBOLS;
1288 0 : break;
1289 : case vcl::UnicodeCoverage::HIRAGANA:
1290 0 : eRet = USCRIPT_HIRAGANA;
1291 0 : break;
1292 : case vcl::UnicodeCoverage::KATAKANA:
1293 0 : eRet = USCRIPT_KATAKANA;
1294 0 : break;
1295 : case vcl::UnicodeCoverage::BOPOMOFO:
1296 0 : eRet = USCRIPT_BOPOMOFO;
1297 0 : break;
1298 : case vcl::UnicodeCoverage::HANGUL_COMPATIBILITY_JAMO:
1299 0 : eRet = USCRIPT_HANGUL;
1300 0 : break;
1301 : case vcl::UnicodeCoverage::PHAGS_PA:
1302 0 : eRet = USCRIPT_PHAGS_PA;
1303 0 : break;
1304 : case vcl::UnicodeCoverage::ENCLOSED_CJK_LETTERS_AND_MONTHS:
1305 0 : eRet = USCRIPT_HANGUL;
1306 0 : break;
1307 : case vcl::UnicodeCoverage::CJK_COMPATIBILITY:
1308 0 : eRet = USCRIPT_HAN;
1309 0 : break;
1310 : case vcl::UnicodeCoverage::HANGUL_SYLLABLES:
1311 0 : eRet = USCRIPT_HANGUL;
1312 0 : break;
1313 : case vcl::UnicodeCoverage::PHOENICIAN:
1314 0 : eRet = USCRIPT_PHOENICIAN;
1315 0 : break;
1316 : case vcl::UnicodeCoverage::CJK_UNIFIED_IDEOGRAPHS:
1317 : case vcl::UnicodeCoverage::CJK_STROKES:
1318 0 : eRet = USCRIPT_HAN;
1319 0 : break;
1320 : case vcl::UnicodeCoverage::ARABIC_PRESENTATION_FORMS_A:
1321 0 : eRet = USCRIPT_ARABIC;
1322 0 : break;
1323 : case vcl::UnicodeCoverage::COMBINING_HALF_MARKS:
1324 0 : eRet = USCRIPT_INHERITED;
1325 0 : break;
1326 : case vcl::UnicodeCoverage::ARABIC_PRESENTATION_FORMS_B:
1327 0 : eRet = USCRIPT_ARABIC;
1328 0 : break;
1329 : case vcl::UnicodeCoverage::TIBETAN:
1330 0 : eRet = USCRIPT_TIBETAN;
1331 0 : break;
1332 : case vcl::UnicodeCoverage::SYRIAC:
1333 0 : eRet = USCRIPT_SYRIAC;
1334 0 : break;
1335 : case vcl::UnicodeCoverage::THAANA:
1336 0 : eRet = USCRIPT_THAANA;
1337 0 : break;
1338 : case vcl::UnicodeCoverage::SINHALA:
1339 0 : eRet = USCRIPT_SINHALA;
1340 0 : break;
1341 : case vcl::UnicodeCoverage::MYANMAR:
1342 0 : eRet = USCRIPT_MYANMAR;
1343 0 : break;
1344 : case vcl::UnicodeCoverage::ETHIOPIC:
1345 0 : eRet = USCRIPT_ETHIOPIC;
1346 0 : break;
1347 : case vcl::UnicodeCoverage::CHEROKEE:
1348 0 : eRet = USCRIPT_CHEROKEE;
1349 0 : break;
1350 : case vcl::UnicodeCoverage::UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS:
1351 0 : eRet = USCRIPT_CANADIAN_ABORIGINAL;
1352 0 : break;
1353 : case vcl::UnicodeCoverage::OGHAM:
1354 0 : eRet = USCRIPT_OGHAM;
1355 0 : break;
1356 : case vcl::UnicodeCoverage::RUNIC:
1357 0 : eRet = USCRIPT_RUNIC;
1358 0 : break;
1359 : case vcl::UnicodeCoverage::KHMER:
1360 0 : eRet = USCRIPT_KHMER;
1361 0 : break;
1362 : case vcl::UnicodeCoverage::MONGOLIAN:
1363 0 : eRet = USCRIPT_MONGOLIAN;
1364 0 : break;
1365 : case vcl::UnicodeCoverage::BRAILLE_PATTERNS:
1366 0 : eRet = USCRIPT_BRAILLE;
1367 0 : break;
1368 : case vcl::UnicodeCoverage::YI_SYLLABLES:
1369 0 : eRet = USCRIPT_YI;
1370 0 : break;
1371 : case vcl::UnicodeCoverage::TAGALOG:
1372 0 : eRet = USCRIPT_TAGALOG;
1373 0 : break;
1374 : case vcl::UnicodeCoverage::OLD_ITALIC:
1375 0 : eRet = USCRIPT_OLD_ITALIC;
1376 0 : break;
1377 : case vcl::UnicodeCoverage::GOTHIC:
1378 0 : eRet = USCRIPT_GOTHIC;
1379 0 : break;
1380 : case vcl::UnicodeCoverage::DESERET:
1381 0 : eRet = USCRIPT_DESERET;
1382 0 : break;
1383 : case vcl::UnicodeCoverage::BYZANTINE_MUSICAL_SYMBOLS:
1384 : case vcl::UnicodeCoverage::MATHEMATICAL_ALPHANUMERIC_SYMBOLS:
1385 : case vcl::UnicodeCoverage::PRIVATE_USE_PLANE_15:
1386 0 : eRet = USCRIPT_SYMBOLS;
1387 0 : break;
1388 : case vcl::UnicodeCoverage::VARIATION_SELECTORS:
1389 0 : eRet = USCRIPT_INHERITED;
1390 0 : break;
1391 : case vcl::UnicodeCoverage::TAGS:
1392 0 : eRet = USCRIPT_SYMBOLS;
1393 0 : break;
1394 : case vcl::UnicodeCoverage::LIMBU:
1395 0 : eRet = USCRIPT_LIMBU;
1396 0 : break;
1397 : case vcl::UnicodeCoverage::TAI_LE:
1398 0 : eRet = USCRIPT_TAI_LE;
1399 0 : break;
1400 : case vcl::UnicodeCoverage::NEW_TAI_LUE:
1401 0 : eRet = USCRIPT_NEW_TAI_LUE;
1402 0 : break;
1403 : case vcl::UnicodeCoverage::BUGINESE:
1404 0 : eRet = USCRIPT_BUGINESE;
1405 0 : break;
1406 : case vcl::UnicodeCoverage::GLAGOLITIC:
1407 0 : eRet = USCRIPT_GLAGOLITIC;
1408 0 : break;
1409 : case vcl::UnicodeCoverage::TIFINAGH:
1410 0 : eRet = USCRIPT_TIFINAGH;
1411 0 : break;
1412 : case vcl::UnicodeCoverage::YIJING_HEXAGRAM_SYMBOLS:
1413 0 : eRet = USCRIPT_SYMBOLS;
1414 0 : break;
1415 : case vcl::UnicodeCoverage::SYLOTI_NAGRI:
1416 0 : eRet = USCRIPT_SYLOTI_NAGRI;
1417 0 : break;
1418 : case vcl::UnicodeCoverage::LINEAR_B_SYLLABARY:
1419 0 : eRet = USCRIPT_LINEAR_B;
1420 0 : break;
1421 : case vcl::UnicodeCoverage::ANCIENT_GREEK_NUMBERS:
1422 0 : eRet = USCRIPT_GREEK;
1423 0 : break;
1424 : case vcl::UnicodeCoverage::UGARITIC:
1425 0 : eRet = USCRIPT_UGARITIC;
1426 0 : break;
1427 : case vcl::UnicodeCoverage::OLD_PERSIAN:
1428 0 : eRet = USCRIPT_OLD_PERSIAN;
1429 0 : break;
1430 : case vcl::UnicodeCoverage::SHAVIAN:
1431 0 : eRet = USCRIPT_SHAVIAN;
1432 0 : break;
1433 : case vcl::UnicodeCoverage::OSMANYA:
1434 0 : eRet = USCRIPT_OSMANYA;
1435 0 : break;
1436 : case vcl::UnicodeCoverage::CYPRIOT_SYLLABARY:
1437 0 : eRet = USCRIPT_CYPRIOT;
1438 0 : break;
1439 : case vcl::UnicodeCoverage::KHAROSHTHI:
1440 0 : eRet = USCRIPT_KHAROSHTHI;
1441 0 : break;
1442 : case vcl::UnicodeCoverage::CUNEIFORM:
1443 0 : eRet = USCRIPT_CUNEIFORM;
1444 0 : break;
1445 : case vcl::UnicodeCoverage::SUNDANESE:
1446 0 : eRet = USCRIPT_SUNDANESE;
1447 0 : break;
1448 : case vcl::UnicodeCoverage::LEPCHA:
1449 0 : eRet = USCRIPT_LEPCHA;
1450 0 : break;
1451 : case vcl::UnicodeCoverage::OL_CHIKI:
1452 0 : eRet = USCRIPT_OL_CHIKI;
1453 0 : break;
1454 : case vcl::UnicodeCoverage::SAURASHTRA:
1455 0 : eRet = USCRIPT_SAURASHTRA;
1456 0 : break;
1457 : case vcl::UnicodeCoverage::KAYAH_LI:
1458 0 : eRet = USCRIPT_KAYAH_LI;
1459 0 : break;
1460 : case vcl::UnicodeCoverage::REJANG:
1461 0 : eRet = USCRIPT_REJANG;
1462 0 : break;
1463 : case vcl::UnicodeCoverage::CHAM:
1464 0 : eRet = USCRIPT_CHAM;
1465 0 : break;
1466 : case vcl::UnicodeCoverage::CARIAN:
1467 0 : eRet = USCRIPT_CARIAN;
1468 0 : 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 0 : eRet = USCRIPT_SYMBOLS;
1475 0 : 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 0 : break;
1496 : }
1497 0 : 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: */
|