aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJason Rumney2008-04-03 13:10:57 +0000
committerJason Rumney2008-04-03 13:10:57 +0000
commit56df6710a9d849eb151ae865f14586f0f5ee5cef (patch)
tree2c56b87fcb96fd07edc383dc6dd7ab2901c722d6 /src
parent97724679a1e9271d1ff9aa642a433bb8c145a9d7 (diff)
downloademacs-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.c166
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;
55static Lisp_Object Qraster, Qoutline, Qunknown; 55static Lisp_Object Qraster, Qoutline, Qunknown;
56 56
57/* antialiasing */ 57/* antialiasing */
58extern Lisp_Object QCantialias; /* defined in font.c */ 58extern Lisp_Object QCantialias, QCotf, QClanguage; /* defined in font.c */
59extern Lisp_Object Qnone; /* reuse from w32fns.c */ 59extern Lisp_Object Qnone; /* reuse from w32fns.c */
60static Lisp_Object Qstandard, Qsubpixel, Qnatural; 60static Lisp_Object Qstandard, Qsubpixel, Qnatural;
61 61
@@ -70,6 +70,14 @@ static Lisp_Object Qkhmer, Qmongolian, Qsymbol, Qbraille, Qhan;
70static Lisp_Object Qideographic_description, Qcjk_misc, Qkana, Qbopomofo; 70static Lisp_Object Qideographic_description, Qcjk_misc, Qkana, Qbopomofo;
71static Lisp_Object Qkanbun, Qyi, Qbyzantine_musical_symbol; 71static Lisp_Object Qkanbun, Qyi, Qbyzantine_musical_symbol;
72static Lisp_Object Qmusical_symbol, Qmathematical; 72static Lisp_Object Qmusical_symbol, Qmathematical;
73/* Not defined in characters.el, but referenced in fontset.el. */
74static Lisp_Object Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot;
75static Lisp_Object Qdeseret, Qglagolitic, Qgothic, Qhanunoo, Qkharoshthi;
76static Lisp_Object Qlimbu, Qlinear_b, Qold_italic, Qold_persian, Qosmanya;
77static Lisp_Object Qphags_pa, Qphoenician, Qshavian, Qsyloti_nagri;
78static Lisp_Object Qtagalog, Qtagbanwa, Qtai_le, Qtifinagh, Qugaritic;
79/* Only defined here, but useful for distinguishing IPA capable fonts. */
80static Lisp_Object Qphonetic;
73 81
74/* Font spacing symbols - defined in font.c. */ 82/* Font spacing symbols - defined in font.c. */
75extern Lisp_Object Qc, Qp, Qm; 83extern 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
1072static int 1090static int
1073font_matches_spec (type, font, spec) 1091font_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);