diff options
| author | Jason Rumney | 2008-04-03 13:10:57 +0000 |
|---|---|---|
| committer | Jason Rumney | 2008-04-03 13:10:57 +0000 |
| commit | 56df6710a9d849eb151ae865f14586f0f5ee5cef (patch) | |
| tree | 2c56b87fcb96fd07edc383dc6dd7ab2901c722d6 /src | |
| parent | 97724679a1e9271d1ff9aa642a433bb8c145a9d7 (diff) | |
| download | emacs-56df6710a9d849eb151ae865f14586f0f5ee5cef.tar.gz emacs-56df6710a9d849eb151ae865f14586f0f5ee5cef.zip | |
(Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
(Qdeseret, Qglagolitic, Qgothic, Qhanunoo, Qkharoshthi)
(Qlimbu, Qlinear_b, Qold_italic, Qold_persian, Qosmanya)
(Qphags_pa, Qphoenician, Qshavian, Qsyloti_nagri)
(Qtagalog, Qtagbanwa, Qtai_le, Qtifinagh, Qugaritic)
(Qphonetic): New symbols.
(syms_of_w32font): Initialize them.
(font_supported_scripts): Use them.
(w32font_list_family): List all charsets.
(w32font_text_extents, recompute_cached_metrics): Fix metric
calculations.
(w32_enumfont_pattern_entity): Make full_type a DWORD.
Give opentype fonts their own format.
(font_matches_spec): New arguments backend and logfont.
Handle :otf spec for uniscribe backend.
(add_font_entity_to_list): Match truetype fonts in uniscribe backend.
(fill_in_logfont): Use DEFAULT_CHARSET when charset not supplied.
Diffstat (limited to 'src')
| -rw-r--r-- | src/w32font.c | 166 |
1 files changed, 134 insertions, 32 deletions
diff --git a/src/w32font.c b/src/w32font.c index baf5e9a2ba2..4ee618085ea 100644 --- a/src/w32font.c +++ b/src/w32font.c | |||
| @@ -55,7 +55,7 @@ static Lisp_Object Qserif, Qscript, Qdecorative; | |||
| 55 | static Lisp_Object Qraster, Qoutline, Qunknown; | 55 | static Lisp_Object Qraster, Qoutline, Qunknown; |
| 56 | 56 | ||
| 57 | /* antialiasing */ | 57 | /* antialiasing */ |
| 58 | extern Lisp_Object QCantialias; /* defined in font.c */ | 58 | extern Lisp_Object QCantialias, QCotf, QClanguage; /* defined in font.c */ |
| 59 | extern Lisp_Object Qnone; /* reuse from w32fns.c */ | 59 | extern Lisp_Object Qnone; /* reuse from w32fns.c */ |
| 60 | static Lisp_Object Qstandard, Qsubpixel, Qnatural; | 60 | static Lisp_Object Qstandard, Qsubpixel, Qnatural; |
| 61 | 61 | ||
| @@ -70,6 +70,14 @@ static Lisp_Object Qkhmer, Qmongolian, Qsymbol, Qbraille, Qhan; | |||
| 70 | static Lisp_Object Qideographic_description, Qcjk_misc, Qkana, Qbopomofo; | 70 | static Lisp_Object Qideographic_description, Qcjk_misc, Qkana, Qbopomofo; |
| 71 | static Lisp_Object Qkanbun, Qyi, Qbyzantine_musical_symbol; | 71 | static Lisp_Object Qkanbun, Qyi, Qbyzantine_musical_symbol; |
| 72 | static Lisp_Object Qmusical_symbol, Qmathematical; | 72 | static Lisp_Object Qmusical_symbol, Qmathematical; |
| 73 | /* Not defined in characters.el, but referenced in fontset.el. */ | ||
| 74 | static Lisp_Object Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot; | ||
| 75 | static Lisp_Object Qdeseret, Qglagolitic, Qgothic, Qhanunoo, Qkharoshthi; | ||
| 76 | static Lisp_Object Qlimbu, Qlinear_b, Qold_italic, Qold_persian, Qosmanya; | ||
| 77 | static Lisp_Object Qphags_pa, Qphoenician, Qshavian, Qsyloti_nagri; | ||
| 78 | static Lisp_Object Qtagalog, Qtagbanwa, Qtai_le, Qtifinagh, Qugaritic; | ||
| 79 | /* Only defined here, but useful for distinguishing IPA capable fonts. */ | ||
| 80 | static Lisp_Object Qphonetic; | ||
| 73 | 81 | ||
| 74 | /* Font spacing symbols - defined in font.c. */ | 82 | /* Font spacing symbols - defined in font.c. */ |
| 75 | extern Lisp_Object Qc, Qp, Qm; | 83 | extern Lisp_Object Qc, Qp, Qm; |
| @@ -180,6 +188,7 @@ w32font_list_family (frame) | |||
| 180 | FRAME_PTR f = XFRAME (frame); | 188 | FRAME_PTR f = XFRAME (frame); |
| 181 | 189 | ||
| 182 | bzero (&font_match_pattern, sizeof (font_match_pattern)); | 190 | bzero (&font_match_pattern, sizeof (font_match_pattern)); |
| 191 | font_match_pattern.lfCharSet = DEFAULT_CHARSET; | ||
| 183 | 192 | ||
| 184 | dc = get_frame_dc (f); | 193 | dc = get_frame_dc (f); |
| 185 | 194 | ||
| @@ -385,8 +394,8 @@ w32font_text_extents (font, code, nglyphs, metrics) | |||
| 385 | if (char_metric->width == 0) | 394 | if (char_metric->width == 0) |
| 386 | break; | 395 | break; |
| 387 | 396 | ||
| 388 | metrics->lbearing = max (metrics->lbearing, | 397 | metrics->lbearing = min (metrics->lbearing, |
| 389 | char_metric->lbearing - metrics->width); | 398 | metrics->width + char_metric->lbearing); |
| 390 | metrics->rbearing = max (metrics->rbearing, | 399 | metrics->rbearing = max (metrics->rbearing, |
| 391 | metrics->width + char_metric->rbearing); | 400 | metrics->width + char_metric->rbearing); |
| 392 | metrics->width += char_metric->width; | 401 | metrics->width += char_metric->width; |
| @@ -410,12 +419,13 @@ w32font_text_extents (font, code, nglyphs, metrics) | |||
| 410 | int new_val = metrics->width + gm.gmBlackBoxX | 419 | int new_val = metrics->width + gm.gmBlackBoxX |
| 411 | + gm.gmptGlyphOrigin.x; | 420 | + gm.gmptGlyphOrigin.x; |
| 412 | metrics->rbearing = max (metrics->rbearing, new_val); | 421 | metrics->rbearing = max (metrics->rbearing, new_val); |
| 413 | new_val = -gm.gmptGlyphOrigin.x - metrics->width; | 422 | new_val = metrics->width + gm.gmptGlyphOrigin.x; |
| 414 | metrics->lbearing = max (metrics->lbearing, new_val); | 423 | metrics->lbearing = min (metrics->lbearing, new_val); |
| 415 | metrics->width += gm.gmCellIncX; | 424 | metrics->width += gm.gmCellIncX; |
| 416 | new_val = -gm.gmptGlyphOrigin.y; | 425 | new_val = gm.gmBlackBoxY; |
| 417 | metrics->ascent = max (metrics->ascent, new_val); | 426 | metrics->ascent = max (metrics->ascent, new_val); |
| 418 | new_val = gm.gmBlackBoxY + gm.gmptGlyphOrigin.y; | 427 | new_val = (gm.gmCellIncY - gm.gmptGlyphOrigin.y |
| 428 | - gm.gmBlackBoxY); | ||
| 419 | metrics->descent = max (metrics->descent, new_val); | 429 | metrics->descent = max (metrics->descent, new_val); |
| 420 | } | 430 | } |
| 421 | else | 431 | else |
| @@ -454,6 +464,9 @@ w32font_text_extents (font, code, nglyphs, metrics) | |||
| 454 | } | 464 | } |
| 455 | } | 465 | } |
| 456 | 466 | ||
| 467 | /* For non-truetype fonts, GetGlyphOutlineW is not supported, so | ||
| 468 | fallback on other methods that will at least give some of the metric | ||
| 469 | information. */ | ||
| 457 | for (i = 0; i < nglyphs; i++) | 470 | for (i = 0; i < nglyphs; i++) |
| 458 | { | 471 | { |
| 459 | if (code[i] < 0x10000) | 472 | if (code[i] < 0x10000) |
| @@ -477,6 +490,8 @@ w32font_text_extents (font, code, nglyphs, metrics) | |||
| 477 | total_width = size.cx; | 490 | total_width = size.cx; |
| 478 | } | 491 | } |
| 479 | 492 | ||
| 493 | /* On 95/98/ME, only some unicode functions are available, so fallback | ||
| 494 | on doing a dummy draw to find the total width. */ | ||
| 480 | if (!total_width) | 495 | if (!total_width) |
| 481 | { | 496 | { |
| 482 | RECT rect; | 497 | RECT rect; |
| @@ -486,6 +501,7 @@ w32font_text_extents (font, code, nglyphs, metrics) | |||
| 486 | total_width = rect.right; | 501 | total_width = rect.right; |
| 487 | } | 502 | } |
| 488 | 503 | ||
| 504 | /* Give our best estimate of the metrics, based on what we know. */ | ||
| 489 | if (metrics) | 505 | if (metrics) |
| 490 | { | 506 | { |
| 491 | metrics->width = total_width; | 507 | metrics->width = total_width; |
| @@ -937,7 +953,7 @@ w32_enumfont_pattern_entity (frame, logical_font, physical_font, | |||
| 937 | Lisp_Object entity, tem; | 953 | Lisp_Object entity, tem; |
| 938 | LOGFONT *lf = (LOGFONT*) logical_font; | 954 | LOGFONT *lf = (LOGFONT*) logical_font; |
| 939 | BYTE generic_type; | 955 | BYTE generic_type; |
| 940 | BYTE full_type = physical_font->ntmTm.ntmFlags; | 956 | DWORD full_type = physical_font->ntmTm.ntmFlags; |
| 941 | 957 | ||
| 942 | entity = Fmake_vector (make_number (FONT_ENTITY_MAX), Qnil); | 958 | entity = Fmake_vector (make_number (FONT_ENTITY_MAX), Qnil); |
| 943 | 959 | ||
| @@ -1013,12 +1029,14 @@ w32_enumfont_pattern_entity (frame, logical_font, physical_font, | |||
| 1013 | about opentype and type1 fonts, so need a fallback for detecting | 1029 | about opentype and type1 fonts, so need a fallback for detecting |
| 1014 | truetype so that this information is not any worse than we could | 1030 | truetype so that this information is not any worse than we could |
| 1015 | have obtained later. */ | 1031 | have obtained later. */ |
| 1016 | if (full_type & NTM_TT_OPENTYPE || font_type & TRUETYPE_FONTTYPE) | 1032 | if (EQ (backend, Quniscribe) && (full_type & NTMFLAGS_OPENTYPE)) |
| 1033 | tem = intern ("opentype"); | ||
| 1034 | else if (font_type & TRUETYPE_FONTTYPE) | ||
| 1017 | tem = intern ("truetype"); | 1035 | tem = intern ("truetype"); |
| 1018 | else if (full_type & NTM_TYPE1) | ||
| 1019 | tem = intern ("type1"); | ||
| 1020 | else if (full_type & NTM_PS_OPENTYPE) | 1036 | else if (full_type & NTM_PS_OPENTYPE) |
| 1021 | tem = intern ("postscript"); | 1037 | tem = intern ("postscript"); |
| 1038 | else if (full_type & NTM_TYPE1) | ||
| 1039 | tem = intern ("type1"); | ||
| 1022 | else if (font_type & RASTER_FONTTYPE) | 1040 | else if (font_type & RASTER_FONTTYPE) |
| 1023 | tem = intern ("w32bitmap"); | 1041 | tem = intern ("w32bitmap"); |
| 1024 | else | 1042 | else |
| @@ -1070,10 +1088,12 @@ logfonts_match (font, pattern) | |||
| 1070 | } | 1088 | } |
| 1071 | 1089 | ||
| 1072 | static int | 1090 | static int |
| 1073 | font_matches_spec (type, font, spec) | 1091 | font_matches_spec (type, font, spec, backend, logfont) |
| 1074 | DWORD type; | 1092 | DWORD type; |
| 1075 | NEWTEXTMETRICEX *font; | 1093 | NEWTEXTMETRICEX *font; |
| 1076 | Lisp_Object spec; | 1094 | Lisp_Object spec; |
| 1095 | Lisp_Object backend; | ||
| 1096 | LOGFONT *logfont; | ||
| 1077 | { | 1097 | { |
| 1078 | Lisp_Object extra, val; | 1098 | Lisp_Object extra, val; |
| 1079 | 1099 | ||
| @@ -1210,10 +1230,22 @@ font_matches_spec (type, font, spec) | |||
| 1210 | return 0; | 1230 | return 0; |
| 1211 | } | 1231 | } |
| 1212 | else | 1232 | else |
| 1213 | /* Other scripts unlikely to be handled. */ | 1233 | /* Other scripts unlikely to be handled by non-truetype |
| 1234 | fonts. */ | ||
| 1214 | return 0; | 1235 | return 0; |
| 1215 | } | 1236 | } |
| 1216 | } | 1237 | } |
| 1238 | else if (EQ (key, QCotf) && CONSP (val)) | ||
| 1239 | { | ||
| 1240 | /* OTF features only supported by the uniscribe backend. */ | ||
| 1241 | if (EQ (backend, Quniscribe)) | ||
| 1242 | { | ||
| 1243 | if (!uniscribe_check_otf (logfont, val)) | ||
| 1244 | return 0; | ||
| 1245 | } | ||
| 1246 | else | ||
| 1247 | return 0; | ||
| 1248 | } | ||
| 1217 | } | 1249 | } |
| 1218 | } | 1250 | } |
| 1219 | return 1; | 1251 | return 1; |
| @@ -1260,12 +1292,15 @@ add_font_entity_to_list (logical_font, physical_font, font_type, lParam) | |||
| 1260 | { | 1292 | { |
| 1261 | struct font_callback_data *match_data | 1293 | struct font_callback_data *match_data |
| 1262 | = (struct font_callback_data *) lParam; | 1294 | = (struct font_callback_data *) lParam; |
| 1295 | Lisp_Object backend = match_data->opentype_only ? Quniscribe : Qgdi; | ||
| 1263 | 1296 | ||
| 1264 | if ((!match_data->opentype_only | 1297 | if ((!match_data->opentype_only |
| 1265 | || (physical_font->ntmTm.ntmFlags & NTMFLAGS_OPENTYPE)) | 1298 | || (physical_font->ntmTm.ntmFlags & NTMFLAGS_OPENTYPE) |
| 1299 | || (font_type & TRUETYPE_FONTTYPE)) | ||
| 1266 | && logfonts_match (&logical_font->elfLogFont, &match_data->pattern) | 1300 | && logfonts_match (&logical_font->elfLogFont, &match_data->pattern) |
| 1267 | && font_matches_spec (font_type, physical_font, | 1301 | && font_matches_spec (font_type, physical_font, |
| 1268 | match_data->orig_font_spec) | 1302 | match_data->orig_font_spec, backend, |
| 1303 | &logical_font->elfLogFont) | ||
| 1269 | && w32font_coverage_ok (&physical_font->ntmFontSig, | 1304 | && w32font_coverage_ok (&physical_font->ntmFontSig, |
| 1270 | match_data->pattern.lfCharSet) | 1305 | match_data->pattern.lfCharSet) |
| 1271 | /* Avoid substitutions involving raster fonts (eg Helv -> MS Sans Serif) | 1306 | /* Avoid substitutions involving raster fonts (eg Helv -> MS Sans Serif) |
| @@ -1283,8 +1318,7 @@ add_font_entity_to_list (logical_font, physical_font, font_type, lParam) | |||
| 1283 | = w32_enumfont_pattern_entity (match_data->frame, logical_font, | 1318 | = w32_enumfont_pattern_entity (match_data->frame, logical_font, |
| 1284 | physical_font, font_type, | 1319 | physical_font, font_type, |
| 1285 | &match_data->pattern, | 1320 | &match_data->pattern, |
| 1286 | match_data->opentype_only | 1321 | backend); |
| 1287 | ? Quniscribe : Qgdi); | ||
| 1288 | if (!NILP (entity)) | 1322 | if (!NILP (entity)) |
| 1289 | match_data->list = Fcons (entity, match_data->list); | 1323 | match_data->list = Fcons (entity, match_data->list); |
| 1290 | } | 1324 | } |
| @@ -1401,6 +1435,8 @@ fill_in_logfont (f, logfont, font_spec) | |||
| 1401 | tmp = AREF (font_spec, FONT_REGISTRY_INDEX); | 1435 | tmp = AREF (font_spec, FONT_REGISTRY_INDEX); |
| 1402 | if (! NILP (tmp)) | 1436 | if (! NILP (tmp)) |
| 1403 | logfont->lfCharSet = registry_to_w32_charset (tmp); | 1437 | logfont->lfCharSet = registry_to_w32_charset (tmp); |
| 1438 | else | ||
| 1439 | logfont->lfCharSet = DEFAULT_CHARSET; | ||
| 1404 | 1440 | ||
| 1405 | /* Out Precision */ | 1441 | /* Out Precision */ |
| 1406 | 1442 | ||
| @@ -1602,8 +1638,12 @@ font_supported_scripts (FONTSIGNATURE * sig) | |||
| 1602 | || (subranges[2] & (mask2)) || (subranges[3] & (mask3))) \ | 1638 | || (subranges[2] & (mask2)) || (subranges[3] & (mask3))) \ |
| 1603 | supported = Fcons ((sym), supported) | 1639 | supported = Fcons ((sym), supported) |
| 1604 | 1640 | ||
| 1605 | SUBRANGE (0, Qlatin); /* There are many others... */ | 1641 | SUBRANGE (0, Qlatin); |
| 1606 | 1642 | /* The following count as latin too, ASCII should be present in these fonts, | |
| 1643 | so don't need to mark them separately. */ | ||
| 1644 | /* 1: Latin-1 supplement, 2: Latin Extended A, 3: Latin Extended B. */ | ||
| 1645 | SUBRANGE (4, Qphonetic); | ||
| 1646 | /* 5: Spacing and tone modifiers, 6: Combining Diacriticals. */ | ||
| 1607 | SUBRANGE (7, Qgreek); | 1647 | SUBRANGE (7, Qgreek); |
| 1608 | SUBRANGE (8, Qcoptic); | 1648 | SUBRANGE (8, Qcoptic); |
| 1609 | SUBRANGE (9, Qcyrillic); | 1649 | SUBRANGE (9, Qcyrillic); |
| @@ -1623,15 +1663,28 @@ font_supported_scripts (FONTSIGNATURE * sig) | |||
| 1623 | SUBRANGE (24, Qthai); | 1663 | SUBRANGE (24, Qthai); |
| 1624 | SUBRANGE (25, Qlao); | 1664 | SUBRANGE (25, Qlao); |
| 1625 | SUBRANGE (26, Qgeorgian); | 1665 | SUBRANGE (26, Qgeorgian); |
| 1626 | 1666 | SUBRANGE (27, Qbalinese); | |
| 1667 | /* 28: Hangul Jamo. */ | ||
| 1668 | /* 29: Latin Extended, 30: Greek Extended, 31: Punctuation. */ | ||
| 1669 | /* 32-47: Symbols (defined below). */ | ||
| 1627 | SUBRANGE (48, Qcjk_misc); | 1670 | SUBRANGE (48, Qcjk_misc); |
| 1671 | /* Match either 49: katakana or 50: hiragana for kana. */ | ||
| 1672 | MASK_ANY (0, 0x00060000, 0, 0, Qkana); | ||
| 1628 | SUBRANGE (51, Qbopomofo); | 1673 | SUBRANGE (51, Qbopomofo); |
| 1629 | SUBRANGE (54, Qkanbun); /* Is this right? */ | 1674 | /* 52: Compatibility Jamo */ |
| 1675 | SUBRANGE (53, Qphags_pa); | ||
| 1676 | /* 54: Enclosed CJK letters and months, 55: CJK Compatibility. */ | ||
| 1630 | SUBRANGE (56, Qhangul); | 1677 | SUBRANGE (56, Qhangul); |
| 1631 | 1678 | /* 57: Surrogates. */ | |
| 1679 | SUBRANGE (58, Qphoenician); | ||
| 1632 | SUBRANGE (59, Qhan); /* There are others, but this is the main one. */ | 1680 | SUBRANGE (59, Qhan); /* There are others, but this is the main one. */ |
| 1633 | SUBRANGE (59, Qideographic_description); /* Windows lumps this in */ | 1681 | SUBRANGE (59, Qideographic_description); /* Windows lumps this in. */ |
| 1634 | 1682 | SUBRANGE (59, Qkanbun); /* And this. */ | |
| 1683 | /* 60: Private use, 61: CJK strokes and compatibility. */ | ||
| 1684 | /* 62: Alphabetic Presentation, 63: Arabic Presentation A. */ | ||
| 1685 | /* 64: Combining half marks, 65: Vertical and CJK compatibility. */ | ||
| 1686 | /* 66: Small forms, 67: Arabic Presentation B, 68: Half and Full width. */ | ||
| 1687 | /* 69: Specials. */ | ||
| 1635 | SUBRANGE (70, Qtibetan); | 1688 | SUBRANGE (70, Qtibetan); |
| 1636 | SUBRANGE (71, Qsyriac); | 1689 | SUBRANGE (71, Qsyriac); |
| 1637 | SUBRANGE (72, Qthaana); | 1690 | SUBRANGE (72, Qthaana); |
| @@ -1646,19 +1699,42 @@ font_supported_scripts (FONTSIGNATURE * sig) | |||
| 1646 | SUBRANGE (81, Qmongolian); | 1699 | SUBRANGE (81, Qmongolian); |
| 1647 | SUBRANGE (82, Qbraille); | 1700 | SUBRANGE (82, Qbraille); |
| 1648 | SUBRANGE (83, Qyi); | 1701 | SUBRANGE (83, Qyi); |
| 1649 | 1702 | SUBRANGE (84, Qbuhid); | |
| 1703 | SUBRANGE (84, Qhanunoo); | ||
| 1704 | SUBRANGE (84, Qtagalog); | ||
| 1705 | SUBRANGE (84, Qtagbanwa); | ||
| 1706 | SUBRANGE (85, Qold_italic); | ||
| 1707 | SUBRANGE (86, Qgothic); | ||
| 1708 | SUBRANGE (87, Qdeseret); | ||
| 1650 | SUBRANGE (88, Qbyzantine_musical_symbol); | 1709 | SUBRANGE (88, Qbyzantine_musical_symbol); |
| 1651 | SUBRANGE (88, Qmusical_symbol); /* Windows doesn't distinguish these. */ | 1710 | SUBRANGE (88, Qmusical_symbol); /* Windows doesn't distinguish these. */ |
| 1652 | |||
| 1653 | SUBRANGE (89, Qmathematical); | 1711 | SUBRANGE (89, Qmathematical); |
| 1654 | 1712 | /* 90: Private use, 91: Variation selectors, 92: Tags. */ | |
| 1655 | /* Match either katakana or hiragana for kana. */ | 1713 | SUBRANGE (93, Qlimbu); |
| 1656 | MASK_ANY (0, 0x00060000, 0, 0, Qkana); | 1714 | SUBRANGE (94, Qtai_le); |
| 1715 | /* 95: New Tai Le */ | ||
| 1716 | SUBRANGE (90, Qbuginese); | ||
| 1717 | SUBRANGE (97, Qglagolitic); | ||
| 1718 | SUBRANGE (98, Qtifinagh); | ||
| 1719 | /* 99: Yijing Hexagrams. */ | ||
| 1720 | SUBRANGE (100, Qsyloti_nagri); | ||
| 1721 | SUBRANGE (101, Qlinear_b); | ||
| 1722 | /* 102: Ancient Greek Numbers. */ | ||
| 1723 | SUBRANGE (103, Qugaritic); | ||
| 1724 | SUBRANGE (104, Qold_persian); | ||
| 1725 | SUBRANGE (105, Qshavian); | ||
| 1726 | SUBRANGE (106, Qosmanya); | ||
| 1727 | SUBRANGE (107, Qcypriot); | ||
| 1728 | SUBRANGE (108, Qkharoshthi); | ||
| 1729 | /* 109: Tai Xuan Jing. */ | ||
| 1730 | SUBRANGE (110, Qcuneiform); | ||
| 1731 | /* 111: Counting Rods. */ | ||
| 1657 | 1732 | ||
| 1658 | /* There isn't really a main symbol range, so include symbol if any | 1733 | /* There isn't really a main symbol range, so include symbol if any |
| 1659 | relevant range is set. */ | 1734 | relevant range is set. */ |
| 1660 | MASK_ANY (0x8000000, 0x0000FFFF, 0, 0, Qsymbol); | 1735 | MASK_ANY (0x8000000, 0x0000FFFF, 0, 0, Qsymbol); |
| 1661 | 1736 | ||
| 1737 | /* Missing: Tai Viet (U+AA80) and Cham (U+AA00) . */ | ||
| 1662 | #undef SUBRANGE | 1738 | #undef SUBRANGE |
| 1663 | #undef MASK_ANY | 1739 | #undef MASK_ANY |
| 1664 | 1740 | ||
| @@ -1763,11 +1839,12 @@ recompute_cached_metrics (dc, w32_font) | |||
| 1763 | if (GetGlyphOutlineW (dc, i, options, &gm, 0, NULL, &transform) | 1839 | if (GetGlyphOutlineW (dc, i, options, &gm, 0, NULL, &transform) |
| 1764 | != GDI_ERROR) | 1840 | != GDI_ERROR) |
| 1765 | { | 1841 | { |
| 1766 | char_metric->lbearing = -gm.gmptGlyphOrigin.x; | 1842 | char_metric->lbearing = gm.gmptGlyphOrigin.x; |
| 1767 | char_metric->rbearing = gm.gmBlackBoxX + gm.gmptGlyphOrigin.x; | 1843 | char_metric->rbearing = gm.gmBlackBoxX + gm.gmptGlyphOrigin.x; |
| 1768 | char_metric->width = gm.gmCellIncX; | 1844 | char_metric->width = gm.gmCellIncX; |
| 1769 | char_metric->ascent = -gm.gmptGlyphOrigin.y; | 1845 | char_metric->ascent = gm.gmBlackBoxY; |
| 1770 | char_metric->descent = gm.gmBlackBoxY + gm.gmptGlyphOrigin.y; | 1846 | char_metric->descent = (gm.gmCellIncY - gm.gmptGlyphOrigin.y |
| 1847 | - gm.gmBlackBoxY); | ||
| 1771 | } | 1848 | } |
| 1772 | else | 1849 | else |
| 1773 | char_metric->width = 0; | 1850 | char_metric->width = 0; |
| @@ -1879,6 +1956,31 @@ syms_of_w32font () | |||
| 1879 | DEFSYM (Qbyzantine_musical_symbol, "byzantine-musical-symbol"); | 1956 | DEFSYM (Qbyzantine_musical_symbol, "byzantine-musical-symbol"); |
| 1880 | DEFSYM (Qmusical_symbol, "musical-symbol"); | 1957 | DEFSYM (Qmusical_symbol, "musical-symbol"); |
| 1881 | DEFSYM (Qmathematical, "mathematical"); | 1958 | DEFSYM (Qmathematical, "mathematical"); |
| 1959 | DEFSYM (Qphonetic, "phonetic"); | ||
| 1960 | DEFSYM (Qbalinese, "balinese"); | ||
| 1961 | DEFSYM (Qbuginese, "buginese"); | ||
| 1962 | DEFSYM (Qbuhid, "buhid"); | ||
| 1963 | DEFSYM (Qcuneiform, "cuneiform"); | ||
| 1964 | DEFSYM (Qcypriot, "cypriot"); | ||
| 1965 | DEFSYM (Qdeseret, "deseret"); | ||
| 1966 | DEFSYM (Qglagolitic, "glagolitic"); | ||
| 1967 | DEFSYM (Qgothic, "gothic"); | ||
| 1968 | DEFSYM (Qhanunoo, "hanunoo"); | ||
| 1969 | DEFSYM (Qkharoshthi, "kharoshthi"); | ||
| 1970 | DEFSYM (Qlimbu, "limbu"); | ||
| 1971 | DEFSYM (Qlinear_b, "linear_b"); | ||
| 1972 | DEFSYM (Qold_italic, "old_italic"); | ||
| 1973 | DEFSYM (Qold_persian, "old_persian"); | ||
| 1974 | DEFSYM (Qosmanya, "osmanya"); | ||
| 1975 | DEFSYM (Qphags_pa, "phags-pa"); | ||
| 1976 | DEFSYM (Qphoenician, "phoenician"); | ||
| 1977 | DEFSYM (Qshavian, "shavian"); | ||
| 1978 | DEFSYM (Qsyloti_nagri, "syloti_nagri"); | ||
| 1979 | DEFSYM (Qtagalog, "tagalog"); | ||
| 1980 | DEFSYM (Qtagbanwa, "tagbanwa"); | ||
| 1981 | DEFSYM (Qtai_le, "tai_le"); | ||
| 1982 | DEFSYM (Qtifinagh, "tifinagh"); | ||
| 1983 | DEFSYM (Qugaritic, "ugaritic"); | ||
| 1882 | 1984 | ||
| 1883 | w32font_driver.type = Qgdi; | 1985 | w32font_driver.type = Qgdi; |
| 1884 | register_font_driver (&w32font_driver, NULL); | 1986 | register_font_driver (&w32font_driver, NULL); |