313 {{
SCRIPT_UNDEFINED, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
314 {
LANG_NEUTRAL, 0, 0, 0, 0,
ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
316 {{
Script_Latin, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
317 {
LANG_ENGLISH, 0, 0, 0, 0,
ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0},
319 {{
Script_CR, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
320 {
LANG_NEUTRAL, 0, 0, 0, 0,
ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
322 {{
Script_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
323 {
LANG_ENGLISH, 1, 0, 0, 0,
ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
324 0x00000000,
L"Microsoft Sans Serif"},
325 {{
Script_Control, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
326 {
LANG_ENGLISH, 0, 1, 0, 0,
ANSI_CHARSET, 1, 0, 0, 0, 0, 0, 1, 0, 0},
328 {{
Script_Punctuation, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
329 {
LANG_NEUTRAL, 0, 0, 0, 0,
ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
330 0x00000000,
L"Microsoft Sans Serif"},
331 {{
Script_Arabic, 1, 1, 0, 0, 0, 0, { 1,0,0,0,0,0,0,0,0,0,0}},
332 {
LANG_ARABIC, 0, 1, 0, 0,
ARABIC_CHARSET, 0, 0, 0, 0, 0, 0, 1, 1, 0},
334 {{
Script_Arabic_Numeric, 0, 1, 0, 0, 0, 0, { 2,0,0,0,0,0,0,0,0,0,0}},
335 {
LANG_ARABIC, 1, 1, 0, 0,
ARABIC_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0},
337 {{
Script_Hebrew, 1, 1, 0, 0, 0, 0, { 1,0,0,0,0,0,0,0,0,0,0}},
338 {
LANG_HEBREW, 0, 1, 0, 1,
HEBREW_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
340 {{
Script_Syriac, 1, 1, 0, 0, 0, 0, { 1,0,0,0,0,0,0,0,0,0,0}},
341 {
LANG_SYRIAC, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 1, 0},
343 {{
Script_Persian, 0, 1, 0, 0, 0, 0, { 2,0,0,0,0,0,0,0,0,0,0}},
344 {
LANG_PERSIAN, 1, 1, 0, 0,
ARABIC_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
346 {{
Script_Thaana, 1, 1, 0, 0, 0, 0, { 1,0,0,0,0,0,0,0,0,0,0}},
347 {
LANG_DIVEHI, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
349 {{
Script_Greek, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
350 {
LANG_GREEK, 0, 0, 0, 0,
GREEK_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
352 {{
Script_Cyrillic, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
353 {
LANG_RUSSIAN, 0, 0, 0, 0,
RUSSIAN_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
355 {{
Script_Armenian, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
356 {
LANG_ARMENIAN, 0, 0, 0, 0,
ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0},
358 {{
Script_Georgian, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
359 {
LANG_GEORGIAN, 0, 0, 0, 0,
ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0},
361 {{
Script_Sinhala, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
362 {
LANG_SINHALESE, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
364 {{
Script_Tibetan, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
365 {
LANG_TIBETAN, 0, 1, 1, 1,
DEFAULT_CHARSET, 0, 0, 1, 0, 1, 0, 0, 0, 0},
367 {{
Script_Tibetan_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
368 {
LANG_TIBETAN, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
370 {{
Script_Phags_pa, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
371 {
LANG_MONGOLIAN, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
373 {{
Script_Thai, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
374 {
LANG_THAI, 0, 1, 1, 1,
THAI_CHARSET, 0, 0, 1, 0, 1, 0, 0, 0, 1},
376 {{
Script_Thai_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
377 {
LANG_THAI, 1, 1, 0, 0,
THAI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
379 {{
Script_Lao, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
380 {
LANG_LAO, 0, 1, 1, 1,
DEFAULT_CHARSET, 0, 0, 1, 0, 1, 0, 0, 0, 0},
382 {{
Script_Lao_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
383 {
LANG_LAO, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
385 {{
Script_Devanagari, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
386 {
LANG_HINDI, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 0, 0},
388 {{
Script_Devanagari_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
389 {
LANG_HINDI, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
391 {{
Script_Bengali, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
392 {
LANG_BENGALI, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 0, 0},
394 {{
Script_Bengali_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
395 {
LANG_BENGALI, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
397 {{
Script_Bengali_Currency, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
398 {
LANG_BENGALI, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
400 {{
Script_Gurmukhi, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
401 {
LANG_PUNJABI, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 0, 0},
403 {{
Script_Gurmukhi_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
404 {
LANG_PUNJABI, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
406 {{
Script_Gujarati, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
407 {
LANG_GUJARATI, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 0, 0},
409 {{
Script_Gujarati_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
410 {
LANG_GUJARATI, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
412 {{
Script_Gujarati_Currency, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
413 {
LANG_GUJARATI, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
415 {{
Script_Oriya, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
416 {
LANG_ORIYA, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 0, 0},
418 {{
Script_Oriya_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
419 {
LANG_ORIYA, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
421 {{
Script_Tamil, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
422 {
LANG_TAMIL, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 0, 0},
424 {{
Script_Tamil_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
425 {
LANG_TAMIL, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
427 {{
Script_Telugu, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
428 {
LANG_TELUGU, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 0, 0},
430 {{
Script_Telugu_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
431 {
LANG_TELUGU, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
433 {{
Script_Kannada, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
434 {
LANG_KANNADA, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 0, 0},
436 {{
Script_Kannada_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
437 {
LANG_KANNADA, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
439 {{
Script_Malayalam, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
440 {
LANG_MALAYALAM, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 0, 0},
442 {{
Script_Malayalam_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
443 {
LANG_MALAYALAM, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
445 {{
Script_Diacritical, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
446 {
LANG_ENGLISH, 0, 1, 0, 1,
ANSI_CHARSET, 0, 0, 0, 0, 0, 1, 1, 0, 0},
448 {{
Script_Punctuation2, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
449 {
LANG_ENGLISH, 0, 0, 0, 0,
ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
451 {{
Script_Numeric2, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
452 {
LANG_ENGLISH, 1, 0, 0, 0,
ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0},
454 {{
Script_Myanmar, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
455 {0x55, 0, 1, 1, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 0, 0},
457 {{
Script_Myanmar_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
458 {0x55, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
460 {{
Script_Tai_Le, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
461 {0, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
463 {{
Script_New_Tai_Lue, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
464 {0, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
465 MS_MAKE_TAG(
't',
'a',
'l',
'u'),
L"Microsoft New Tai Lue"},
466 {{
Script_New_Tai_Lue_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
467 {0, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
468 MS_MAKE_TAG(
't',
'a',
'l',
'u'),
L"Microsoft New Tai Lue"},
469 {{
Script_Khmer, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
470 {0x53, 0, 1, 1, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 1, 0, 0, 0, 0},
472 {{
Script_Khmer_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
473 {0x53, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
475 {{
Script_CJK_Han, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
476 {
LANG_ENGLISH, 0, 0, 0, 0,
ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0},
478 {{
Script_Ideograph, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
479 {
LANG_ENGLISH, 0, 0, 0, 0,
ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0},
481 {{
Script_Bopomofo, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
482 {
LANG_ENGLISH, 0, 0, 0, 0,
ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0},
484 {{
Script_Kana, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
485 {
LANG_ENGLISH, 0, 0, 0, 0,
ANSI_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0},
487 {{
Script_Hangul, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
488 {
LANG_KOREAN, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0},
490 {{
Script_Yi, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
491 {
LANG_ENGLISH, 0, 0, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0},
493 {{
Script_Ethiopic, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
494 {0x5e, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
496 {{
Script_Ethiopic_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
497 {0x5e, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
499 {{
Script_Mongolian, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
500 {
LANG_MONGOLIAN, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
502 {{
Script_Mongolian_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
503 {
LANG_MONGOLIAN, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
505 {{
Script_Tifinagh, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
506 {0, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
508 {{
Script_NKo, 1, 1, 0, 0, 0, 0, { 1,0,0,0,0,0,0,0,0,0,0}},
509 {0, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
511 {{
Script_Vai, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
512 {0, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
514 {{
Script_Vai_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
515 {0, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
517 {{
Script_Cherokee, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
518 {0x5c, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
520 {{
Script_Canadian, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
521 {0x5d, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
523 {{
Script_Ogham, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
524 {0, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
526 {{
Script_Runic, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
527 {0, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
529 {{
Script_Braille, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
530 {
LANG_ENGLISH, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
532 {{
Script_Surrogates, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
533 {
LANG_ENGLISH, 0, 1, 0, 1,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 1, 0, 0},
535 {{
Script_Private, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
536 {0, 0, 0, 0, 0,
DEFAULT_CHARSET, 0, 1, 0, 0, 0, 0, 1, 0, 0},
538 {{
Script_Deseret, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
539 {0, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
541 {{
Script_Osmanya, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
542 {0, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
544 {{
Script_Osmanya_Numeric, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
545 {0, 1, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
547 {{
Script_MathAlpha, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
548 {0, 0, 1, 0, 0,
DEFAULT_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
550 {{
Script_Hebrew_Currency, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
551 {
LANG_HEBREW, 0, 1, 0, 0,
HEBREW_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
553 {{
Script_Vietnamese_Currency, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
554 {
LANG_VIETNAMESE, 0, 0, 0, 0,
VIETNAMESE_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
556 {{
Script_Thai_Currency, 0, 0, 0, 0, 0, 0, { 0,0,0,0,0,0,0,0,0,0,0}},
557 {
LANG_THAI, 0, 1, 0, 0,
THAI_CHARSET, 0, 0, 0, 0, 0, 0, 0, 0, 0},
611 0, 0, { (
DWORD_PTR)(__FILE__
": script_cache") }
657 SIZE_T max_capacity, new_capacity;
660 if (
count <= *capacity)
664 if (
count > max_capacity)
667 new_capacity =
max(1, *capacity);
668 while (new_capacity <
count && new_capacity <= max_capacity / 2)
670 if (new_capacity <
count)
671 new_capacity =
count;
673 new_elements =
realloc(*elements, new_capacity *
size);
676 memset( (
char *)new_elements + *capacity *
size, 0, (new_capacity - *capacity) *
size );
678 *elements = new_elements;
679 *capacity = new_capacity;
698 static const WCHAR chars[4] = {0x0020, 0x200B, 0xF71B, 0x0640};
716 else if (gi[1] != 0xFFFF)
718 else if (gi[0] != 0xFFFF)
755 if (!
block)
return 0;
799 if (*psc)
return S_OK;
813 if (!
memcmp(&sc->
lf, &lf,
sizeof(lf)))
880 if (sc != new_sc && !
memcmp(&sc->
lf, &lf,
sizeof(lf)))
882 if (sc != *psc && !
memcmp(&sc->
lf, &lf,
sizeof(lf)))
904 TRACE(
"<- %p\n", new_sc);
906 TRACE(
"<- %p\n", sc);
915 return mirror ? mirror :
ch;
993 return range->numericScript;
995 return range->punctScript;
996 return range->script;
1010 if (!
find->ascending)
1021 if (pwLogClust[0] < pwLogClust[
cChars-1])
1032 for (
k = (
ptr - pwLogClust)-1;
k >= 0 && pwLogClust[
k] ==
target;
k--)
1152 TRACE(
"%p,%p,%p\n",
hdc, psc, sfp);
1252 TRACE(
"%p, %p, %p\n", sds, sc,
ss);
1264 ss->fDigitSubstitute = 0;
1322#define Numeric_space 0x0020
1337 WORD baselayout = 0;
1344 TRACE(
"%s,%d,%d,%p,%p,%p,%p\n",
debugstr_wn(pwcInChars, cInChars), cInChars, cMaxItems,
1345 psControl, psState, pItems, pcItems);
1347 if (!pwcInChars || !cInChars || !pItems || cMaxItems < 2)
1350 if (!(scripts =
calloc(cInChars,
sizeof(*scripts))))
1353 for (
i = 0;
i < cInChars;
i++)
1362 scripts[
i] = scripts[
i-1];
1367 if ((pwcInChars[
i] == 0x964 || pwcInChars[
i] ==0x965) && last_indic !=
Script_Undefined)
1368 scripts[
i] = last_indic;
1377 if (!forceLevels && ((pwcInChars[
i] >= 0x200B && pwcInChars[
i] <= 0x200F) ||
1378 (pwcInChars[
i] >= 0x202A && pwcInChars[
i] <= 0x202E) ||
1379 (pwcInChars[
i] >= 0x2066 && pwcInChars[
i] <= 0x2069)))
1389 scripts[
i] = scripts[
i-1];
1395 for (
j =
i-1;
j >= 0 && scripts[
j] == first_script && pwcInChars[
j] !=
Numeric_space;
j--)
1405 scripts[
j] = scripts[
i];
1410 scripts[
i] = scripts[
j];
1416 for (
i = 0;
i < cInChars;
i++)
1419 if (
i > 0 && (pwcInChars[
i] ==
ZWJ || pwcInChars[
i] ==
ZWNJ || pwcInChars[
i] ==
ZWSP))
1422 if (
i+1 == cInChars)
1423 scripts[
i] = scripts[
i-1];
1426 for (
j =
i+1;
j < cInChars;
j++)
1428 if (pwcInChars[
j] !=
ZWJ && pwcInChars[
j] !=
ZWNJ
1431 scripts[
i] = scripts[
j];
1439 if (psState && psControl)
1444 if (!(overrides =
calloc(cInChars,
sizeof(*overrides))))
1447 if (!(layout_levels =
calloc(cInChars,
sizeof(*layout_levels))))
1457 if (
odd(layout_levels[0]))
1459 else for (
i = 0;
i < cInChars;
i++)
1460 if (layout_levels[
i]!=layout_levels[0])
1475 baselayout = layout_levels[0];
1476 for (
i = 0;
i < cInChars;
i++)
1479 if (
i >= cInChars && !
odd(baselevel) && !
odd(psState->
uBidiLevel) && !forceLevels)
1483 free(layout_levels);
1486 layout_levels =
NULL;
1490 if (!(strength =
calloc(cInChars,
sizeof(*strength))))
1504 for (
i = 0;
i < cInChars;
i++)
1506 if (
i > 0 &&
i < cInChars-1 &&
1508 wcschr(
L"#$%+,-./:\x2212\x2044\x00a0", pwcInChars[
i]))
1512 scripts[
i] = scripts[
i+1];
1514 strength[
i] = strength[
i-1];
1517 else if (
wcschr(
L"#$%+-/\x2212\x2044", pwcInChars[
i]))
1520 for (
j =
i+1;
j < cInChars;
j++)
1526 scripts[
i] = scripts[
j];
1528 strength[
i] = strength[
i-1];
1531 else if (pwcInChars[
i] != pwcInChars[
j])
break;
1537 for (
i = 0;
i < cInChars;
i++)
1547 if (
i > 0 && (pwcInChars[
i] ==
ZWJ || pwcInChars[
i] ==
ZWNJ || pwcInChars[
i] ==
ZWSP))
1551 strength[
i] = strength[
i-1];
1554 if (pwcInChars[
j] !=
ZWJ && pwcInChars[
j] !=
ZWNJ
1557 strength[
i] = strength[
j];
1565 for (
i = 0;
i < cInChars;
i++)
1570 for (
j =
i;
j > 0;
j--)
1576 scripts[
i] = scripts[
j];
1577 strength[
i] = strength[
j];
1586 for (
j =
i;
j < cInChars;
j++)
1592 scripts[
i] = scripts[
j];
1593 strength[
i] = strength[
j];
1607 if (
cnt == cInChars)
1610 New_Script = scripts[
cnt];
1628 layoutRTL =
odd(layout_levels[
cnt]);
1640 else if (!pItems[
index].
a.s.uBidiLevel || (overrides && overrides[
cnt]))
1642 if (pItems[
index].
a.s.uBidiLevel != baselevel)
1644 layoutRTL =
odd(baselayout);
1653 TRACE(
"New_Level=%i New_Strength=%i New_Script=%d, eScript=%d index=%d cnt=%d iCharPos=%d\n",
1660 New_Script = scripts[
cnt];
1667 New_Script = scripts[
cnt+
j];
1669 New_Script = scripts[
cnt];
1689 TRACE(
"Strength break (%i/%i)\n",
str,strength[
cnt]);
1695 TRACE(
"Script break(%i/%i)\n",pItems[
index].
a.eScript,New_Script);
1701 layoutRTL =
odd(layout_levels[
cnt]);
1708 TRACE(
"New_Level = %i, New_Strength = %i, New_Script=%d, eScript=%d\n",
levels?
levels[
cnt]:-1, strength?strength[
cnt]:
str, New_Script, pItems[
index].
a.eScript);
1711 if (
index+1 > cMaxItems)
1727 if (layout_levels[
cnt] == 0)
1730 layoutRTL = (layoutRTL ||
odd(layout_levels[
cnt]));
1738 else if (!pItems[
index].
a.s.uBidiLevel || (overrides && overrides[
cnt]))
1740 if (pItems[
index].
a.s.uBidiLevel != baselevel)
1758 if (
index + 1 > cMaxItems)
goto nomemory;
1764 if (pcItems) *pcItems =
index;
1772 free(layout_levels);
1801 return _ItemizeInternal(pwcInChars, cInChars, cMaxItems, psControl, psState, pItems, pScriptTags, pcItems);
1826 return _ItemizeInternal(pwcInChars, cInChars, cMaxItems, psControl, psState, pItems,
NULL, pcItems);
1862 defWidth = (32 * pTabdef->
iScale) / 4;
1867 for (; cTabStops>0 ; lpTabPos++, cTabStops--)
1869 int position = *lpTabPos;
1871 position = -1 * position;
1873 position = (position * pTabdef->
iScale) / 4;
1877 if( nTabOrg + position > current_x)
1882 x = (nTabOrg + position) - current_x;
1887 FIXME(
"Negative tabstop\n");
1892 if ((!cTabStops) && (defWidth > 0))
1893 x =((((current_x - nTabOrg) / defWidth)+1) * defWidth) - current_x;
1894 else if ((!cTabStops) && (defWidth < 0))
1895 FIXME(
"TODO: Negative defWidth\n");
1964 int i, num_items = cString + 1;
1969 TRACE(
"(%p,%p,%d,%d,%d,0x%lx,%d,%p,%p,%p,%p,%p,%p)\n",
1971 psControl, psState, piDx, pTabdef, pbInClass, pssa);
1975 FIXME(
"Only Unicode strings are supported\n");
1981 if (!(analysis =
calloc(1,
sizeof(*analysis))))
1997 sControl = *psControl;
2003 if (!(iString =
calloc(cString,
sizeof(*iString))))
2008 for (
i = 0;
i < cString;
i++)
2038 if (!(BidiLevel =
calloc(analysis->
numItems,
sizeof(*BidiLevel))))
2055 WORD *pwLogClust =
calloc(cChar,
sizeof(*pwLogClust));
2056 int *piAdvance =
NULL;
2059 int numGlyphsReturned;
2060 HFONT originalFont = 0x0;
2116 if (!glyphs || !piAdvance || !psva || !pGoffset)
2123 &analysis->
pItem[
i].
a, glyphs, pwLogClust, psva, &numGlyphsReturned);
2131 piAdvance, pGoffset, &analysis->
glyphs[
i].
abc);
2151 for (tabi = 0; tabi < cChar; tabi++)
2155 tab_x+=piAdvance[tabi];
2196 if (pva[glyph].fClusterStart)
2221 INT runStart, runEnd;
2223 HFONT oldFont = 0x0;
2227 TRACE(
"(%p,%d,%d,%d,%d,%d, 0x%1x, %d, %d)\n",
2228 ssa, iX, iY, iItem, cStart, cEnd, uOptions, fSelected, fDisabled);
2232 if ((cStart >= 0 && analysis->
pItem[iItem+1].
iCharPos <= cStart) ||
2264 if (cEnd >= 0 && cEnd < analysis->pItem[iItem+1].iCharPos)
2268 crc.
left = iX + off_x;
2272 if (cStart >=0 && runStart)
2276 crc.
left = iX + off_x;
2314 clust_glyph = iGlyph +
cGlyphs;
2320 while(clust_glyph < analysis->glyphs[iItem].
numGlyphs &&
2330 iY, uOptions, &crc, &analysis->
pItem[iItem].
a,
NULL, 0,
2335 TRACE(
"ScriptTextOut hr=%08lx\n",
hr);
2384 TRACE(
"(%p,%d,%d,0x%08x,%s,%d,%d,%d)\n",
2397 if (iMinSel < iMaxSel && (iMinSel > 0 || iMaxSel > 0))
2399 if (iMaxSel > 0 && iMinSel < 0)
2422 TRACE(
"(%p), %d, %d, (%p)\n", ssa, icp, fTrailing, pX);
2424 if (!ssa || !pX)
return S_FALSE;
2454 if (icp >= analysis->
pItem[
i+1].
iCharPos || icp < analysis->pItem[
i].iCharPos)
2484 TRACE(
"(%p), %d, (%p), (%p)\n", ssa, iX, piCh, piTrailing);
2486 if (!ssa || !piCh || !piTrailing)
return S_FALSE;
2495 *piTrailing =
FALSE;
2535 &analysis->
pItem[
i].
a, piCh, piTrailing);
2543 *piTrailing =
FALSE;
2567 TRACE(
"(%p)\n", pssa);
2599 int direction,
int* iCluster,
int *check_out)
2607 if (pwLogClust[
check] == clust)
2610 if (iCluster && *iCluster == -1)
2629 if (pwLogClust[0] > pwLogClust[
cChars-1])
2630 log_clust_max = pwLogClust[0];
2632 log_clust_max = pwLogClust[
cChars-1];
2634 if (glyph > log_clust_max)
2642 if (glyph > log_clust_max)
2658 const WORD *pwLogClust,
2660 const int *piAdvance,
2669 float special_size = 0.0;
2674 TRACE(
"(%d,%d,%d,%d,%p,%p,%p,%p,%p)\n",
2675 iCP, fTrailing,
cChars,
cGlyphs, pwLogClust, psva, piAdvance,
2686 int max_clust = pwLogClust[0];
2689 if (pwLogClust[
item] > max_clust)
2691 ERR(
"We do not handle non reversed clusters properly\n");
2697 iMaxPos += piAdvance[
item];
2703 if (iSpecial == -1 && (iCluster == -1 || iCluster+clust_size <=
item))
2706 int clust = pwLogClust[
item];
2717 for (glyph = clust; glyph <
cGlyphs; glyph++)
2721 iPosX += special_size;
2728 if (clust_size == 0)
2735 else if (iSpecial != -1)
2736 iPosX += special_size;
2743 if (clust_size == 0)
2747 iPosX += adv / (
float)clust_size;
2753 iPosX = iMaxPos - iPosX;
2759 TRACE(
"*piX=%d\n", *piX);
2771 if (pwLogClust[
i] == cluster_index)
2773 if (!
size && start_index)
2781 else if (
size)
break;
2811 for (glyph_start = -1, glyph_end = -1; i < cChars && i >= 0 && (glyph_start < 0 || glyph_end < 0);
i+=
direction)
2813 if (glyph_start < 0 && pwLogClust[
i] != cluster)
continue;
2814 if (pwLogClust[
i] == cluster && glyph_start < 0) glyph_start = pwLogClust[
i];
2815 if (glyph_start >= 0 && glyph_end < 0 && pwLogClust[
i] != cluster) glyph_end = pwLogClust[
i];
2825 FIXME(
"multi-glyph reversed clusters found\n");
2826 glyph_end = glyph_start + 1;
2831 for (
i = glyph_start+1;
i< glyph_end;
i++)
2833 if (psva[
i].fClusterStart)
2840 for (
advance = 0,
i = glyph_start;
i < glyph_end;
i++)
2861 const WORD *pwLogClust,
2863 const int *piAdvance,
2871 int glyph_index, cluster_index;
2874 TRACE(
"(%d,%d,%d,%p,%p,%p,%p,%p,%p)\n",
2876 psa, piCP, piTrailing);
2900 int max_clust = pwLogClust[0];
2902 if (pwLogClust[
i] > max_clust)
2904 FIXME(
"We do not handle non reversed clusters properly\n");
2912 for (glyph_index = -1, iPosX = iX; iPosX >=0 && glyph_index <
cGlyphs; iPosX -= piAdvance[glyph_index+1], glyph_index++)
2917 for (glyph_index = -1, iPosX = iX; iPosX > 0 && glyph_index <
cGlyphs; iPosX -= piAdvance[glyph_index+1], glyph_index++)
2921 TRACE(
"iPosX %i -> glyph_index %i (%i)\n", iPosX, glyph_index,
cGlyphs);
2924 if (glyph_index >= 0 && glyph_index <
cGlyphs)
2928 for (
i = 0, cluster_index = pwLogClust[0];
i <
cChars && pwLogClust[
i] <= glyph_index; cluster_index=pwLogClust[
i++])
2931 for (
i = 0, cluster_index = pwLogClust[0]; i < cChars && pwLogClust[i] >= glyph_index; cluster_index=pwLogClust[
i++])
2934 TRACE(
"cluster_index %i\n", cluster_index);
2936 if (direction < 0 && iPosX >= 0 && glyph_index != cluster_index)
2946 TRACE(
"first char index %i\n",
i);
2950 if (glyph_index != cluster_index ||
2951 (
direction > 0 &&
abs(iPosX) <= (piAdvance[glyph_index] / 2)) ||
2952 (
direction < 0 &&
abs(iPosX) >= (piAdvance[glyph_index] / 2)))
2966 for (adv = iPosX, part_index = cluster_index; part_index <= glyph_index; part_index++)
2967 adv += piAdvance[part_index];
2968 if (adv > iX) adv = iX;
2970 TRACE(
"Multi-char cluster, no snap\n");
2972 TRACE(
"advance %i divides into %f per char\n", cluster_advance, cluster_part_width);
2975 for (part_index = 0; adv >= 0; adv-=cluster_part_width, part_index++)
2977 if (part_index) part_index--;
2981 for (part_index = 0; adv > 0; adv-=cluster_part_width, part_index++)
2985 adv += cluster_part_width;
2990 TRACE(
"base_char %i part_index %i, leftover advance %f\n",
i, part_index, adv);
2998 if ((
direction > 0 &&
fabs(adv) <= (cluster_part_width / 2.0)) ||
2999 (
direction < 0 && adv &&
fabs(adv) >= (cluster_part_width / 2.0)))
3005 if ((
direction > 0 &&
abs(iPosX) <= (piAdvance[glyph_index] / 2)) ||
3006 (
direction < 0 &&
abs(iPosX) >= (piAdvance[glyph_index] / 2)))
3013 TRACE(
"Point falls outside of string\n");
3014 if (glyph_index < 0)
3032 TRACE(
"*piCP=%d\n", *piCP);
3033 TRACE(
"*piTrailing=%d\n", *piTrailing);
3085 if (!chars ||
len < 0)
3133 int cMaxGlyphs,
WORD *pwLogClust,
3142 static int once = 0;
3144 TRACE(
"(%p, %p, %p, %s, %s, %p, %p, %d, %s, %d, %d, %p, %p, %p, %p, %p )\n",
3148 cChars, cMaxGlyphs, pwLogClust, pCharProps, pwOutGlyphs, pOutGlyphProps, pcGlyphs);
3150 if (psa)
TRACE(
"psa values: %d, %d, %d, %d, %d, %d, %d\n", psa->
eScript, psa->
fRTL, psa->
fLayoutRTL,
3153 if (!pOutGlyphProps || !pcGlyphs || !pCharProps)
return E_INVALIDARG;
3157 if(!once++)
FIXME(
"Ranges not supported yet\n");
3163 if (!pwLogClust)
return E_FAIL;
3184 pwLogClust[
i] =
idx;
3195 for (
i = 0,
g = 0, cluster = 0;
i <
cChars;
i++)
3209 chInput = pwcChars[
idx];
3210 rChars[
i] = chInput;
3214 rChars[
i] = pwcChars[
idx];
3239 pwLogClust[
idx] = (
rtl)?pwLogClust[
idx+1]:pwLogClust[
idx-1];
3262 if (pwcChars[
i] == 0x0009 || pwcChars[
i] ==
ZWSP || pwcChars[
i] ==
ZWNJ || pwcChars[
i] ==
ZWJ)
3264 pwOutGlyphs[pwLogClust[
i]] = ((
ScriptCache *)*psc)->sfp.wgBlank;
3272 TRACE(
"no glyph translation\n");
3278 pwOutGlyphs[
i] = pwcChars[
idx];
3288 pwOutGlyphs[
i] = 0x20;
3295 if (pwcChars[
idx] == 0x0009 || pwcChars[
idx] == 0x000A ||
3296 pwcChars[
idx] == 0x000D || pwcChars[
idx] >= 0x001C)
3331 int cChars,
int cMaxGlyphs,
3346 if (!(glyphProps =
calloc(cMaxGlyphs,
sizeof(*glyphProps))))
3352 hr =
ScriptShapeOpenType(
hdc, psc, psa,
scriptInformation[psa->
eScript].
scriptTag, 0,
NULL,
NULL, 0, pwcChars,
cChars, cMaxGlyphs, pwLogClust, charProps, pwOutGlyphs, glyphProps, pcGlyphs);
3356 for (
i = 0;
i < *pcGlyphs;
i++)
3357 psva[
i] = glyphProps[
i].sva;
3399 int cRanges,
const WCHAR *pwcChars,
WORD *pwLogClust,
3408 static int once = 0;
3410 TRACE(
"(%p, %p, %p, %s, %s, %p, %p, %d, %s, %p, %p, %d, %p, %p, %d, %p %p %p)\n",
3414 pwLogClust, pCharProps,
cChars, pwGlyphs, pGlyphProps,
cGlyphs, piAdvance,
3419 if (!pGoffset)
return E_FAIL;
3422 if (!once++)
FIXME(
"Ranges not supported yet\n");
3434 pGoffset[
i].
du = pGoffset[
i].
dv = 0;
3436 if (pGlyphProps[
i].sva.fZeroWidth)
3439 if (piAdvance) piAdvance[
i] = 0;
3450 glyph = pwGlyphs[
i];
3490 if (piAdvance) piAdvance[
i] = abc.
abcA + abc.
abcB + abc.
abcC;
3495 if (pABC)
TRACE(
"Total for run: abcA=%d, abcB=%d, abcC=%d\n", pABC->
abcA, pABC->
abcB, pABC->
abcC);
3527 TRACE(
"(%p, %p, %p, %d, %p, %p, %p, %p, %p)\n",
hdc, psc, pwGlyphs,
cGlyphs, psva, psa,
3528 piAdvance, pGoffset, pABC);
3531 if (!pGoffset)
return E_FAIL;
3537 glyphProps[
i].sva = psva[
i];
3539 hr =
ScriptPlaceOpenType(
hdc, psc, psa,
scriptInformation[psa->
eScript].
scriptTag, 0,
NULL,
NULL, 0,
NULL,
NULL,
NULL, 0, pwGlyphs, glyphProps,
cGlyphs, piAdvance, pGoffset, pABC);
3569 TRACE(
"(%p,%p,%s,%d,0x%lx,%p)\n",
hdc, psc,
debugstr_wn(pwcInChars,
cChars),
3582 inChar = pwcInChars[
i];
3589 if (glyph == 0xffff)
3607 int iReserved,
const WORD *pwGlyphs,
int cGlyphs,
const int *piAdvance,
3608 const int *piJustify,
const GOFFSET *pGoffset)
3613 WORD *reordered_glyphs = (
WORD *)pwGlyphs;
3615 TRACE(
"(%p, %p, %d, %d, %08x, %s, %p, %p, %d, %p, %d, %p, %p, %p)\n",
3616 hdc, psc,
x,
y, fuOptions,
wine_dbgstr_rect(
lprc), psa, pwcReserved, iReserved, pwGlyphs,
cGlyphs,
3617 piAdvance, piJustify, pGoffset);
3620 if (!piAdvance || !psa || !pwGlyphs)
return E_INVALIDARG;
3624 fuOptions |= ETO_IGNORELANGUAGE;
3626 fuOptions |= ETO_GLYPH_INDEX;
3634 if (!(reordered_glyphs =
calloc(
cGlyphs,
sizeof(*reordered_glyphs))))
3641 reordered_glyphs[
i] = pwGlyphs[
cGlyphs - 1 -
i];
3648 lpDx[
i * 2] = piAdvance[orig_index];
3649 lpDx[
i * 2 + 1] = 0;
3655 x += pGoffset[orig_index].
du *
dir;
3656 y += pGoffset[orig_index].
dv;
3660 lpDx[(
i - 1) * 2] += pGoffset[orig_index].du *
dir;
3661 lpDx[(
i - 1) * 2 + 1] += pGoffset[orig_index].dv;
3663 lpDx[
i * 2] -= pGoffset[orig_index].
du *
dir;
3664 lpDx[
i * 2 + 1] -= pGoffset[orig_index].
dv;
3671 if (reordered_glyphs != pwGlyphs)
free( reordered_glyphs );
3723 TRACE(
"(%p, %p, 0x%04x, %p)\n",
hdc, psc, glyph, abc);
3768 TRACE(
"(%d, %p, %p, %p)\n", runs,
level, vistolog, logtovis);
3770 if (!
level || (!vistolog && !logtovis))
3778 for( ich = 0; ich < runs; ich++)
3789 for( ich = 0; ich < runs; ich++)
3820 TRACE(
"%p, %p\n", ssa, piDx);
3822 if (!analysis)
return S_FALSE;
3833 for (
j = 0;
j < cChar;
j++)
3841 for (
k = 0;
k < clust_size;
k++)
3869 TRACE(
"(%p)\n", ssa);
3892 TRACE(
"(%p)\n", ssa);
3894 if (!analysis)
return NULL;
3901 analysis->
sz.
cx = 0;
3911 return &analysis->
sz;
3930 TRACE(
"(%p)\n", ssa);
3932 if (!analysis)
return NULL;
3953 TRACE(
"(%p)\n", ssa);
3955 if (!analysis)
return NULL;
3978 TRACE(
"(%p)\n", ssa);
3980 if (!analysis)
return S_FALSE;
4010 const int *advances,
const WORD *log_clust,
4015 TRACE(
"(%p, %d, %d, %p, %p, %p, %p)\n",
4016 sa, nbchars, nbglyphs, advances, log_clust, sva, widths);
4018 if (
sa->fRTL && !
sa->fLogicalOrder)
4023 for (
i = 0;
i < nbchars;
i++)
4029 for (
j = 0;
j < clust_size;
j++)
4063 ABC *abc,
int *justify)
4067 FIXME(
"(%p, %d, %d, %p, %p, %p, %p, %p, %p)\n",
4068 dx, num_chars, num_glyphs, log_clust, sva,
advance,
sa, abc, justify);
4070 for (
i = 0;
i < num_chars;
i++) justify[
i] =
advance[
i];
4075 int num_glyphs,
int dx,
int min_kashida,
int *justify)
4079 FIXME(
"(%p, %p, %d, %d, %d, %p)\n", sva,
advance, num_glyphs,
dx, min_kashida, justify);
4081 for (
i = 0;
i < num_glyphs;
i++) justify[
i] =
advance[
i];
4088 if (!pScriptTags || !pcTags || cMaxTags == 0)
return E_INVALIDARG;
4097 if (!pLangSysTags || !pcTags || cMaxTags == 0)
return E_INVALIDARG;
4106 if (!pFeatureTags || !pcTags || cMaxTags == 0)
return E_INVALIDARG;
4115 FIXME(
"(%p, %p, %p, %s, %s, %s, 0x%04x, %d, %p, %p)\n",
hdc, sc,
sa,
debugstr_an((
char*)&tag_script,4),
debugstr_an((
char*)&tag_langsys,4),
4128 gbLpkPresent =
TRUE;
_STLP_MOVE_TO_STD_NAMESPACE void _STLP_CALL advance(_InputIterator &__i, _Distance __n)
static struct sockaddr_in sa
static const char * wine_dbgstr_rect(const RECT *prc)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
static void list_remove(struct list_entry *entry)
static void list_add_head(struct list_entry *head, struct list_entry *entry)
#define RegCloseKey(hKey)
void BREAK_line(const WCHAR *chars, int count, const SCRIPT_ANALYSIS *sa, SCRIPT_LOGATTR *la)
static float(WINAPI *pD2D1Tan)(float angle)
const unsigned short wine_mirror_map[1428]
LONG WINAPI RegOpenKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
static __inline const char * debugstr_an(const char *s, int n)
#define MS_MAKE_TAG(ch0, ch1, ch2, ch3)
BOOL WINAPI GetStringTypeW(DWORD type, LPCWSTR src, INT count, LPWORD chartype)
BOOL WINAPI IsValidLocale(LCID lcid, DWORD flags)
INT WINAPI GetLocaleInfoW(LCID lcid, LCTYPE lctype, LPWSTR buffer, INT len)
LCID WINAPI ConvertDefaultLocale(LCID lcid)
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
_ACRTIMP double __cdecl fabs(double)
static BOOL script_is_numeric(enum usp10_script script)
HRESULT WINAPI ScriptPlace(HDC hdc, SCRIPT_CACHE *psc, const WORD *pwGlyphs, int cGlyphs, const SCRIPT_VISATTR *psva, SCRIPT_ANALYSIS *psa, int *piAdvance, GOFFSET *pGoffset, ABC *pABC)
HRESULT WINAPI ScriptGetFontAlternateGlyphs(HDC hdc, SCRIPT_CACHE *sc, SCRIPT_ANALYSIS *sa, OPENTYPE_TAG tag_script, OPENTYPE_TAG tag_langsys, OPENTYPE_TAG tag_feature, WORD id, int size, WORD *list, int *count)
static struct list script_cache_list
HRESULT WINAPI ScriptGetFontScriptTags(HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS *psa, int cMaxTags, OPENTYPE_TAG *pScriptTags, int *pcTags)
static WORD get_cache_glyph(SCRIPT_CACHE *psc, DWORD c)
HRESULT WINAPI ScriptStringFree(SCRIPT_STRING_ANALYSIS *pssa)
HRESULT WINAPI ScriptGetFontFeatureTags(HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, OPENTYPE_TAG tagLangSys, int cMaxTags, OPENTYPE_TAG *pFeatureTags, int *pcTags)
static HRESULT SS_ItemOut(SCRIPT_STRING_ANALYSIS ssa, int iX, int iY, int iItem, int cStart, int cEnd, UINT uOptions, const RECT *prc, BOOL fSelected, BOOL fDisabled)
static BOOL is_indic(enum usp10_script script)
static int getGivenTabWidth(ScriptCache *psc, SCRIPT_TABDEF *pTabdef, int charPos, int current_x)
static enum usp10_script base_indic(enum usp10_script script)
HRESULT WINAPI ScriptApplyLogicalWidth(const int *dx, int num_chars, int num_glyphs, const WORD *log_clust, const SCRIPT_VISATTR *sva, const int *advance, const SCRIPT_ANALYSIS *sa, ABC *abc, int *justify)
const SCRIPT_LOGATTR *WINAPI ScriptString_pLogAttr(SCRIPT_STRING_ANALYSIS ssa)
HRESULT WINAPI ScriptShapeOpenType(HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, OPENTYPE_TAG tagLangSys, int *rcRangeChars, TEXTRANGE_PROPERTIES **rpRangeProperties, int cRanges, const WCHAR *pwcChars, int cChars, int cMaxGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProps, WORD *pwOutGlyphs, SCRIPT_GLYPHPROP *pOutGlyphProps, int *pcGlyphs)
BOOL usp10_array_reserve(void **elements, SIZE_T *capacity, SIZE_T count, SIZE_T size)
HRESULT WINAPI ScriptCacheGetHeight(HDC hdc, SCRIPT_CACHE *psc, LONG *height)
HRESULT WINAPI ScriptGetCMap(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcInChars, int cChars, DWORD dwFlags, WORD *pwOutGlyphs)
HRESULT WINAPI ScriptFreeCache(SCRIPT_CACHE *psc)
HRESULT WINAPI ScriptItemize(const WCHAR *pwcInChars, int cInChars, int cMaxItems, const SCRIPT_CONTROL *psControl, const SCRIPT_STATE *psState, SCRIPT_ITEM *pItems, int *pcItems)
static BYTE get_cache_pitch_family(SCRIPT_CACHE *psc)
static const struct usp10_script_range script_ranges[]
static BOOL set_cache_glyph_widths(SCRIPT_CACHE *psc, WORD glyph, ABC *abc)
HRESULT WINAPI ScriptXtoCP(int iX, int cChars, int cGlyphs, const WORD *pwLogClust, const SCRIPT_VISATTR *psva, const int *piAdvance, const SCRIPT_ANALYSIS *psa, int *piCP, int *piTrailing)
HRESULT WINAPI ScriptGetLogicalWidths(const SCRIPT_ANALYSIS *sa, int nbchars, int nbglyphs, const int *advances, const WORD *log_clust, const SCRIPT_VISATTR *sva, int *widths)
static HRESULT _ItemizeInternal(const WCHAR *pwcInChars, int cInChars, int cMaxItems, const SCRIPT_CONTROL *psControl, const SCRIPT_STATE *psState, SCRIPT_ITEM *pItems, OPENTYPE_TAG *pScriptTags, int *pcItems)
HRESULT WINAPI ScriptShape(HDC hdc, SCRIPT_CACHE *psc, const WCHAR *pwcChars, int cChars, int cMaxGlyphs, SCRIPT_ANALYSIS *psa, WORD *pwOutGlyphs, WORD *pwLogClust, SCRIPT_VISATTR *psva, int *pcGlyphs)
HRESULT WINAPI ScriptLayout(int runs, const BYTE *level, int *vistolog, int *logtovis)
static LONG get_cache_height(SCRIPT_CACHE *psc)
const scriptData scriptInformation[]
HRESULT WINAPI ScriptStringGetLogicalWidths(SCRIPT_STRING_ANALYSIS ssa, int *piDx)
static void get_cache_font_properties(SCRIPT_FONTPROPERTIES *sfp, ScriptCache *sc)
HRESULT WINAPI ScriptStringAnalyse(HDC hdc, const void *pString, int cString, int cGlyphs, int iCharset, DWORD dwFlags, int iReqWidth, SCRIPT_CONTROL *psControl, SCRIPT_STATE *psState, const int *piDx, SCRIPT_TABDEF *pTabdef, const BYTE *pbInClass, SCRIPT_STRING_ANALYSIS *pssa)
static int get_cluster_size(const WORD *pwLogClust, int cChars, int item, int direction, int *iCluster, int *check_out)
HRESULT WINAPI ScriptStringOut(SCRIPT_STRING_ANALYSIS ssa, int iX, int iY, UINT uOptions, const RECT *prc, int iMinSel, int iMaxSel, BOOL fDisabled)
static BOOL requires_fallback(HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS *psa, const WCHAR *pwcInChars, int cChars)
static int get_cluster_advance(const int *piAdvance, const SCRIPT_VISATTR *psva, const WORD *pwLogClust, int cGlyphs, int cChars, int cluster, int direction)
HRESULT WINAPI ScriptGetFontProperties(HDC hdc, SCRIPT_CACHE *psc, SCRIPT_FONTPROPERTIES *sfp)
static CRITICAL_SECTION cs_script_cache
static HRESULT init_script_cache(const HDC hdc, SCRIPT_CACHE *psc)
HRESULT WINAPI ScriptPlaceOpenType(HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, OPENTYPE_TAG tagLangSys, int *rcRangeChars, TEXTRANGE_PROPERTIES **rpRangeProperties, int cRanges, const WCHAR *pwcChars, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProps, int cChars, const WORD *pwGlyphs, const SCRIPT_GLYPHPROP *pGlyphProps, int cGlyphs, int *piAdvance, GOFFSET *pGoffset, ABC *pABC)
const SIZE *WINAPI ScriptString_pSize(SCRIPT_STRING_ANALYSIS ssa)
static BOOL get_cache_glyph_widths(SCRIPT_CACHE *psc, WORD glyph, ABC *abc)
static int get_glyph_cluster_advance(const int *piAdvance, const SCRIPT_VISATTR *pva, const WORD *pwLogClust, int cGlyphs, int cChars, int glyph, int direction)
static enum usp10_script get_char_script(const WCHAR *str, unsigned int index, unsigned int end, unsigned int *consumed)
static DWORD decode_surrogate_pair(const WCHAR *str, unsigned int index, unsigned int end)
HRESULT WINAPI ScriptGetProperties(const SCRIPT_PROPERTIES ***props, int *num)
static void find_fallback_font(enum usp10_script scriptid, WCHAR *FaceName)
HRESULT WINAPI ScriptStringGetOrder(SCRIPT_STRING_ANALYSIS ssa, UINT *order)
HRESULT WINAPI ScriptStringValidate(SCRIPT_STRING_ANALYSIS ssa)
HRESULT WINAPI ScriptItemizeOpenType(const WCHAR *pwcInChars, int cInChars, int cMaxItems, const SCRIPT_CONTROL *psControl, const SCRIPT_STATE *psState, SCRIPT_ITEM *pItems, OPENTYPE_TAG *pScriptTags, int *pcItems)
const int *WINAPI ScriptString_pcOutChars(SCRIPT_STRING_ANALYSIS ssa)
HRESULT WINAPI ScriptStringXtoCP(SCRIPT_STRING_ANALYSIS ssa, int iX, int *piCh, int *piTrailing)
HRESULT WINAPI ScriptStringCPtoX(SCRIPT_STRING_ANALYSIS ssa, int icp, BOOL fTrailing, int *pX)
int USP10_FindGlyphInLogClust(const WORD *pwLogClust, int cChars, WORD target)
static int __cdecl usp10_compare_script_range(const void *key, const void *value)
HRESULT WINAPI ScriptApplyDigitSubstitution(const SCRIPT_DIGITSUBSTITUTE *sds, SCRIPT_CONTROL *sc, SCRIPT_STATE *ss)
static CRITICAL_SECTION_DEBUG cs_script_cache_dbg
HRESULT WINAPI ScriptRecordDigitSubstitution(LCID locale, SCRIPT_DIGITSUBSTITUTE *sds)
static BOOL does_glyph_start_cluster(const SCRIPT_VISATTR *pva, const WORD *pwLogClust, int cChars, int glyph, int direction)
static int __cdecl compare_FindGlyph(const void *a, const void *b)
HRESULT WINAPI ScriptIsComplex(const WCHAR *chars, int len, DWORD flag)
HRESULT WINAPI ScriptGetFontLanguageTags(HDC hdc, SCRIPT_CACHE *psc, SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, int cMaxTags, OPENTYPE_TAG *pLangSysTags, int *pcTags)
static WORD set_cache_glyph(SCRIPT_CACHE *psc, WCHAR c, WORD glyph)
static WCHAR mirror_char(WCHAR ch)
HRESULT WINAPI ScriptCPtoX(int iCP, BOOL fTrailing, int cChars, int cGlyphs, const WORD *pwLogClust, const SCRIPT_VISATTR *psva, const int *piAdvance, const SCRIPT_ANALYSIS *psa, int *piX)
HRESULT WINAPI ScriptBreak(const WCHAR *chars, int count, const SCRIPT_ANALYSIS *sa, SCRIPT_LOGATTR *la)
HRESULT WINAPI ScriptJustify(const SCRIPT_VISATTR *sva, const int *advance, int num_glyphs, int dx, int min_kashida, int *justify)
static BOOL get_cluster_data(const WORD *pwLogClust, int cChars, int cluster_index, int *cluster_size, int *start_index)
static const SCRIPT_PROPERTIES * script_props[]
HRESULT WINAPI ScriptGetGlyphABCWidth(HDC hdc, SCRIPT_CACHE *psc, WORD glyph, ABC *abc)
@ SCRIPT_STRING_ANALYSIS_FLAGS_SIZE
@ SCRIPT_STRING_ANALYSIS_FLAGS_INVALID
static BOOL set_cache_font_properties(const HDC hdc, ScriptCache *sc)
HRESULT WINAPI ScriptTextOut(const HDC hdc, SCRIPT_CACHE *psc, int x, int y, UINT fuOptions, const RECT *lprc, const SCRIPT_ANALYSIS *psa, const WCHAR *pwcReserved, int iReserved, const WORD *pwGlyphs, int cGlyphs, const int *piAdvance, const int *piJustify, const GOFFSET *pGoffset)
#define check(expected, result)
static const uint32_t k[]
#define GLYPH_BLOCK_SHIFT
static unsigned short get_table_entry_16(const unsigned short *table, WCHAR ch)
@ SCRIPT_JUSTIFY_CHARACTER
GLint GLint GLint GLint GLint x
GLuint GLuint GLsizei count
GLint GLint GLsizei GLsizei height
GLuint GLuint GLsizei GLenum type
GLint GLint GLint GLint GLint GLint y
GLint GLint GLsizei width
GLuint GLuint GLsizei GLenum const GLvoid * indices
GLenum const GLvoid GLbitfield GLsizei numGlyphs
GLboolean GLboolean GLboolean b
GLuint GLdouble GLdouble GLint GLint order
GLboolean GLboolean GLboolean GLboolean a
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean flag
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
#define memcpy(s1, s2, n)
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
#define LOCALE_USER_DEFAULT
#define COLOR_HIGHLIGHTTEXT
_In_ int _Inout_ LPRECT lprc
VOID WINAPI LpkPresent(VOID)
#define LANGIDFROMLCID(l)
#define LIST_FOR_EACH_ENTRY(elem, list, type, field)
WORD * glyphs[GLYPH_MAX/GLYPH_BLOCK_SIZE]
WCHAR lfFaceName[LF_FACESIZE]
LoadedLanguage * languages
LoadedLanguage default_language
SCRIPT_FONTPROPERTIES sfp
ABC * widths[GLYPH_MAX/GLYPH_BLOCK_SIZE]
CacheGlyphPage * page[NUM_PAGES]
SCRIPT_LOGATTR * logattrs
LIST_ENTRY ProcessLocksList
DWORD TraditionalDigitLanguage
DWORD NationalDigitLanguage
enum usp10_script numericScript
enum usp10_script punctScript
PSYMCRYPT_PARALLEL_HASH_OPERATION next
#define SCRIPT_DIGITSUBSTITUTE_TRADITIONAL
#define SCRIPT_DIGITSUBSTITUTE_NONE
#define SCRIPT_DIGITSUBSTITUTE_CONTEXT
#define SCRIPT_DIGITSUBSTITUTE_NATIONAL
@ Script_Gurmukhi_Numeric
@ Script_Devanagari_Numeric
@ Script_Malayalam_Numeric
@ Script_Vietnamese_Currency
@ Script_Mongolian_Numeric
@ Script_Gujarati_Numeric
@ Script_Bengali_Currency
@ Script_New_Tai_Lue_Numeric
@ Script_Gujarati_Currency
@ Script_Ethiopic_Numeric
static const WCHAR props[]
int BIDI_ReorderL2vLevel(int level, int *pIndices, const BYTE *plevel, int cch, BOOL fReverse)
int BIDI_ReorderV2lLevel(int level, int *pIndices, const BYTE *plevel, int cch, BOOL fReverse)
BOOL BIDI_DetermineLevels(const WCHAR *lpString, unsigned int uCount, const SCRIPT_STATE *s, const SCRIPT_CONTROL *c, WORD *lpOutLevels, WORD *lpOutOverrides)
BOOL BIDI_GetStrengths(const WCHAR *string, unsigned int count, const SCRIPT_CONTROL *c, WORD *strength)
DWORD OpenType_CMAP_GetGlyphIndex(HDC hdc, ScriptCache *psc, DWORD utf32c, WORD *glyph_index, DWORD flags)
void SHAPE_ApplyDefaultOpentypeFeatures(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WORD *pwOutGlyphs, INT *pcGlyphs, INT cMaxGlyphs, INT cChars, WORD *pwLogClust)
void SHAPE_CharGlyphProp(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WCHAR *pwcChars, const INT cChars, const WORD *pwGlyphs, const INT cGlyphs, WORD *pwLogClust, SCRIPT_CHARPROP *pCharProp, SCRIPT_GLYPHPROP *pGlyphProp)
HRESULT SHAPE_ContextualShaping(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, WCHAR *pwcChars, INT cChars, WORD *pwOutGlyphs, INT *pcGlyphs, INT cMaxGlyphs, WORD *pwLogClust)
void SHAPE_ApplyOpenTypePositions(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, const WORD *pwGlyphs, INT cGlyphs, int *piAdvance, GOFFSET *pGoffset)
HRESULT SHAPE_CheckFontForRequiredFeatures(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa)
HRESULT SHAPE_GetFontLanguageTags(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, int cMaxTags, OPENTYPE_TAG *pLangSysTags, int *pcTags)
HRESULT SHAPE_GetFontFeatureTags(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, OPENTYPE_TAG tagScript, OPENTYPE_TAG tagLangSys, int cMaxTags, OPENTYPE_TAG *pFeatureTags, int *pcTags)
HRESULT SHAPE_GetFontScriptTags(HDC hdc, ScriptCache *psc, SCRIPT_ANALYSIS *psa, int cMaxTags, OPENTYPE_TAG *pScriptTags, int *pcTags)
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
_In_ FONTOBJ _In_ ULONG _In_ ULONG cGlyphs
#define NtUserGetSysColor(A)
#define NtGdiGetGlyphIndicesW(A, B, C, D, E)
#define NtGdiGetFontData(A, B, C, D, E)
int WINAPI GetBkMode(_In_ HDC)
BOOL WINAPI GetTextMetricsW(_In_ HDC, _Out_ LPTEXTMETRICW)
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
BOOL WINAPI GetCharWidthI(_In_ HDC hdc, _In_ UINT giFirst, _In_ UINT cgi, _In_reads_opt_(cgi) LPWORD pgi, _Out_writes_(cgi) LPINT piWidths)
COLORREF WINAPI SetBkColor(_In_ HDC, _In_ COLORREF)
COLORREF WINAPI GetTextColor(_In_ HDC)
HGDIOBJ WINAPI GetCurrentObject(_In_ HDC, _In_ UINT)
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
COLORREF WINAPI GetBkColor(_In_ HDC)
BOOL WINAPI ExtTextOutW(_In_ HDC hdc, _In_ int x, _In_ int y, _In_ UINT options, _In_opt_ const RECT *lprect, _In_reads_opt_(c) LPCWSTR lpString, _In_ UINT c, _In_reads_opt_(c) const INT *lpDx)
BOOL WINAPI GetCharABCWidthsI(_In_ HDC hdc, _In_ UINT giFirst, _In_ UINT cgi, _In_reads_opt_(cgi) LPWORD pgi, _Out_writes_(cgi) LPABC pabc)
UINT WINAPI GetOutlineTextMetricsW(_In_ HDC hdc, _In_ UINT cjCopy, _Out_writes_bytes_opt_(cjCopy) LPOUTLINETEXTMETRICW potm)
#define VIETNAMESE_CHARSET
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
int WINAPI SetBkMode(_In_ HDC, _In_ int)
COLORREF WINAPI SetTextColor(_In_ HDC, _In_ COLORREF)
BOOL WINAPI GetCharWidth32W(_In_ HDC hdc, _In_ UINT iFirst, _In_ UINT iLast, _Out_writes_(iLast+1 - iFirst) LPINT lpBuffer)
#define GGI_MARK_NONEXISTING_GLYPHS
BOOL WINAPI GetCharABCWidthsW(_In_ HDC hdc, _In_ UINT wFirst, _In_ UINT wLast, _Out_writes_(wLast - wFirst+1) LPABC lpABC)
#define IS_SURROGATE_PAIR(high, low)
#define HKEY_CURRENT_USER
static unsigned int block