]> code.delx.au - gnu-emacs/blob - src/w32font.c
(w32font_open): Adjust it for the change of
[gnu-emacs] / src / w32font.c
1 /* Font backend for the Microsoft W32 API.
2 Copyright (C) 2007, 2008 Free Software Foundation, Inc.
3
4 This file is part of GNU Emacs.
5
6 GNU Emacs is free software: you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation, either version 3 of the License, or
9 (at your option) any later version.
10
11 GNU Emacs is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
18
19 #include <config.h>
20 #include <windows.h>
21 #include <math.h>
22 #include <ctype.h>
23 #include <commdlg.h>
24
25 #include "lisp.h"
26 #include "w32term.h"
27 #include "frame.h"
28 #include "dispextern.h"
29 #include "character.h"
30 #include "charset.h"
31 #include "fontset.h"
32 #include "font.h"
33 #include "w32font.h"
34
35 /* Cleartype available on Windows XP, cleartype_natural from XP SP1.
36 The latter does not try to fit cleartype smoothed fonts into the
37 same bounding box as the non-antialiased version of the font.
38 */
39 #ifndef CLEARTYPE_QUALITY
40 #define CLEARTYPE_QUALITY 5
41 #endif
42 #ifndef CLEARTYPE_NATURAL_QUALITY
43 #define CLEARTYPE_NATURAL_QUALITY 6
44 #endif
45
46 /* VIETNAMESE_CHARSET and JOHAB_CHARSET are not defined in some versions
47 of MSVC headers. */
48 #ifndef VIETNAMESE_CHARSET
49 #define VIETNAMESE_CHARSET 163
50 #endif
51 #ifndef JOHAB_CHARSET
52 #define JOHAB_CHARSET 130
53 #endif
54
55 extern struct font_driver w32font_driver;
56
57 Lisp_Object Qgdi;
58 Lisp_Object Quniscribe;
59 static Lisp_Object QCformat;
60 static Lisp_Object Qmonospace, Qsansserif, Qmono, Qsans, Qsans_serif;
61 static Lisp_Object Qserif, Qscript, Qdecorative;
62 static Lisp_Object Qraster, Qoutline, Qunknown;
63
64 /* antialiasing */
65 extern Lisp_Object QCantialias, QCotf, QClang; /* defined in font.c */
66 extern Lisp_Object Qnone; /* reuse from w32fns.c */
67 static Lisp_Object Qstandard, Qsubpixel, Qnatural;
68
69 /* languages */
70 static Lisp_Object Qja, Qko, Qzh;
71
72 /* scripts */
73 static Lisp_Object Qlatin, Qgreek, Qcoptic, Qcyrillic, Qarmenian, Qhebrew;
74 static Lisp_Object Qarabic, Qsyriac, Qnko, Qthaana, Qdevanagari, Qbengali;
75 static Lisp_Object Qgurmukhi, Qgujarati, Qoriya, Qtamil, Qtelugu;
76 static Lisp_Object Qkannada, Qmalayalam, Qsinhala, Qthai, Qlao;
77 static Lisp_Object Qtibetan, Qmyanmar, Qgeorgian, Qhangul, Qethiopic;
78 static Lisp_Object Qcherokee, Qcanadian_aboriginal, Qogham, Qrunic;
79 static Lisp_Object Qkhmer, Qmongolian, Qsymbol, Qbraille, Qhan;
80 static Lisp_Object Qideographic_description, Qcjk_misc, Qkana, Qbopomofo;
81 static Lisp_Object Qkanbun, Qyi, Qbyzantine_musical_symbol;
82 static Lisp_Object Qmusical_symbol, Qmathematical;
83 /* Not defined in characters.el, but referenced in fontset.el. */
84 static Lisp_Object Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot;
85 static Lisp_Object Qdeseret, Qglagolitic, Qgothic, Qhanunoo, Qkharoshthi;
86 static Lisp_Object Qlimbu, Qlinear_b, Qold_italic, Qold_persian, Qosmanya;
87 static Lisp_Object Qphags_pa, Qphoenician, Qshavian, Qsyloti_nagri;
88 static Lisp_Object Qtagalog, Qtagbanwa, Qtai_le, Qtifinagh, Qugaritic;
89 /* Only defined here, but useful for distinguishing IPA capable fonts. */
90 static Lisp_Object Qphonetic;
91
92 /* W32 charsets: for use in Vw32_charset_info_alist. */
93 static Lisp_Object Qw32_charset_ansi, Qw32_charset_default;
94 static Lisp_Object Qw32_charset_symbol, Qw32_charset_shiftjis;
95 static Lisp_Object Qw32_charset_hangeul, Qw32_charset_gb2312;
96 static Lisp_Object Qw32_charset_chinesebig5, Qw32_charset_oem;
97 static Lisp_Object Qw32_charset_easteurope, Qw32_charset_turkish;
98 static Lisp_Object Qw32_charset_baltic, Qw32_charset_russian;
99 static Lisp_Object Qw32_charset_arabic, Qw32_charset_greek;
100 static Lisp_Object Qw32_charset_hebrew, Qw32_charset_vietnamese;
101 static Lisp_Object Qw32_charset_thai, Qw32_charset_johab, Qw32_charset_mac;
102
103 /* Associative list linking character set strings to Windows codepages. */
104 static Lisp_Object Vw32_charset_info_alist;
105
106 /* Font spacing symbols - defined in font.c. */
107 extern Lisp_Object Qc, Qp, Qm;
108
109 static void fill_in_logfont P_ ((FRAME_PTR, LOGFONT *, Lisp_Object));
110
111 static BYTE w32_antialias_type P_ ((Lisp_Object));
112 static Lisp_Object lispy_antialias_type P_ ((BYTE));
113
114 static Lisp_Object font_supported_scripts P_ ((FONTSIGNATURE *));
115 static int w32font_full_name P_ ((LOGFONT *, Lisp_Object, int, char *, int));
116 static void compute_metrics P_ ((HDC, struct w32font_info *, unsigned int,
117 struct w32_metric_cache *));
118 static void clear_cached_metrics P_ ((struct w32font_info *));
119
120 static Lisp_Object w32_registry P_ ((LONG, DWORD));
121
122 /* EnumFontFamiliesEx callbacks. */
123 static int CALLBACK add_font_entity_to_list P_ ((ENUMLOGFONTEX *,
124 NEWTEXTMETRICEX *,
125 DWORD, LPARAM));
126 static int CALLBACK add_one_font_entity_to_list P_ ((ENUMLOGFONTEX *,
127 NEWTEXTMETRICEX *,
128 DWORD, LPARAM));
129 static int CALLBACK add_font_name_to_list P_ ((ENUMLOGFONTEX *,
130 NEWTEXTMETRICEX *,
131 DWORD, LPARAM));
132
133 /* struct passed in as LPARAM arg to EnumFontFamiliesEx, for keeping track
134 of what we really want. */
135 struct font_callback_data
136 {
137 /* The logfont we are matching against. EnumFontFamiliesEx only matches
138 face name and charset, so we need to manually match everything else
139 in the callback function. */
140 LOGFONT pattern;
141 /* The original font spec or entity. */
142 Lisp_Object orig_font_spec;
143 /* The frame the font is being loaded on. */
144 Lisp_Object frame;
145 /* The list to add matches to. */
146 Lisp_Object list;
147 /* Whether to match only opentype fonts. */
148 int opentype_only;
149 };
150
151 /* Handles the problem that EnumFontFamiliesEx will not return all
152 style variations if the font name is not specified. */
153 static void list_all_matching_fonts P_ ((struct font_callback_data *));
154
155
156 static int
157 memq_no_quit (elt, list)
158 Lisp_Object elt, list;
159 {
160 while (CONSP (list) && ! EQ (XCAR (list), elt))
161 list = XCDR (list);
162 return (CONSP (list));
163 }
164
165 /* w32 implementation of get_cache for font backend.
166 Return a cache of font-entities on FRAME. The cache must be a
167 cons whose cdr part is the actual cache area. */
168 Lisp_Object
169 w32font_get_cache (f)
170 FRAME_PTR f;
171 {
172 struct w32_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
173
174 return (dpyinfo->name_list_element);
175 }
176
177 /* w32 implementation of list for font backend.
178 List fonts exactly matching with FONT_SPEC on FRAME. The value
179 is a vector of font-entities. This is the sole API that
180 allocates font-entities. */
181 static Lisp_Object
182 w32font_list (frame, font_spec)
183 Lisp_Object frame, font_spec;
184 {
185 Lisp_Object fonts = w32font_list_internal (frame, font_spec, 0);
186 font_add_log ("w32font-list", font_spec, fonts);
187 return fonts;
188 }
189
190 /* w32 implementation of match for font backend.
191 Return a font entity most closely matching with FONT_SPEC on
192 FRAME. The closeness is detemined by the font backend, thus
193 `face-font-selection-order' is ignored here. */
194 static Lisp_Object
195 w32font_match (frame, font_spec)
196 Lisp_Object frame, font_spec;
197 {
198 Lisp_Object entity = w32font_match_internal (frame, font_spec, 0);
199 font_add_log ("w32font-match", font_spec, entity);
200 return entity;
201 }
202
203 /* w32 implementation of list_family for font backend.
204 List available families. The value is a list of family names
205 (symbols). */
206 static Lisp_Object
207 w32font_list_family (frame)
208 Lisp_Object frame;
209 {
210 Lisp_Object list = Qnil;
211 LOGFONT font_match_pattern;
212 HDC dc;
213 FRAME_PTR f = XFRAME (frame);
214
215 bzero (&font_match_pattern, sizeof (font_match_pattern));
216 font_match_pattern.lfCharSet = DEFAULT_CHARSET;
217
218 dc = get_frame_dc (f);
219
220 EnumFontFamiliesEx (dc, &font_match_pattern,
221 (FONTENUMPROC) add_font_name_to_list,
222 (LPARAM) &list, 0);
223 release_frame_dc (f, dc);
224
225 return list;
226 }
227
228 /* w32 implementation of open for font backend.
229 Open a font specified by FONT_ENTITY on frame F.
230 If the font is scalable, open it with PIXEL_SIZE. */
231 static Lisp_Object
232 w32font_open (f, font_entity, pixel_size)
233 FRAME_PTR f;
234 Lisp_Object font_entity;
235 int pixel_size;
236 {
237 Lisp_Object font_object;
238
239 font_object = font_make_object (VECSIZE (struct w32font_info),
240 font_entity, pixel_size);
241
242 if (!w32font_open_internal (f, font_entity, pixel_size, font_object))
243 {
244 return Qnil;
245 }
246
247 return font_object;
248 }
249
250 /* w32 implementation of close for font_backend.
251 Close FONT on frame F. */
252 void
253 w32font_close (f, font)
254 FRAME_PTR f;
255 struct font *font;
256 {
257 int i;
258 struct w32font_info *w32_font = (struct w32font_info *) font;
259
260 /* Delete the GDI font object. */
261 DeleteObject (w32_font->hfont);
262
263 /* Free all the cached metrics. */
264 if (w32_font->cached_metrics)
265 {
266 for (i = 0; i < w32_font->n_cache_blocks; i++)
267 {
268 if (w32_font->cached_metrics[i])
269 xfree (w32_font->cached_metrics[i]);
270 }
271 xfree (w32_font->cached_metrics);
272 w32_font->cached_metrics = NULL;
273 }
274 }
275
276 /* w32 implementation of has_char for font backend.
277 Optional.
278 If FONT_ENTITY has a glyph for character C (Unicode code point),
279 return 1. If not, return 0. If a font must be opened to check
280 it, return -1. */
281 int
282 w32font_has_char (entity, c)
283 Lisp_Object entity;
284 int c;
285 {
286 Lisp_Object supported_scripts, extra, script;
287 DWORD mask;
288
289 extra = AREF (entity, FONT_EXTRA_INDEX);
290 if (!CONSP (extra))
291 return -1;
292
293 supported_scripts = assq_no_quit (QCscript, extra);
294 if (!CONSP (supported_scripts))
295 return -1;
296
297 supported_scripts = XCDR (supported_scripts);
298
299 script = CHAR_TABLE_REF (Vchar_script_table, c);
300
301 return (memq_no_quit (script, supported_scripts)) ? -1 : 0;
302 }
303
304 /* w32 implementation of encode_char for font backend.
305 Return a glyph code of FONT for characer C (Unicode code point).
306 If FONT doesn't have such a glyph, return FONT_INVALID_CODE. */
307 static unsigned
308 w32font_encode_char (font, c)
309 struct font *font;
310 int c;
311 {
312 struct frame *f;
313 HDC dc;
314 HFONT old_font;
315 DWORD retval;
316 GCP_RESULTSW result;
317 wchar_t in[2];
318 wchar_t out[2];
319 int len;
320 struct w32font_info *w32_font = (struct w32font_info *) font;
321
322 /* If glyph indexing is not working for this font, just return the
323 unicode code-point. */
324 if (!w32_font->glyph_idx)
325 return c;
326
327 if (c > 0xFFFF)
328 {
329 /* TODO: Encode as surrogate pair and lookup the glyph. */
330 return FONT_INVALID_CODE;
331 }
332 else
333 {
334 in[0] = (wchar_t) c;
335 len = 1;
336 }
337
338 bzero (&result, sizeof (result));
339 result.lStructSize = sizeof (result);
340 result.lpGlyphs = out;
341 result.nGlyphs = 2;
342
343 f = XFRAME (selected_frame);
344
345 dc = get_frame_dc (f);
346 old_font = SelectObject (dc, w32_font->hfont);
347
348 /* GetCharacterPlacement is used here rather than GetGlyphIndices because
349 it is supported on Windows NT 4 and 9x/ME. But it cannot reliably report
350 missing glyphs, see below for workaround. */
351 retval = GetCharacterPlacementW (dc, in, len, 0, &result, 0);
352
353 SelectObject (dc, old_font);
354 release_frame_dc (f, dc);
355
356 if (retval)
357 {
358 if (result.nGlyphs != 1 || !result.lpGlyphs[0]
359 /* GetCharacterPlacementW seems to return 3, which seems to be
360 the space glyph in most/all truetype fonts, instead of 0
361 for unsupported glyphs. */
362 || (result.lpGlyphs[0] == 3 && !iswspace (in[0])))
363 return FONT_INVALID_CODE;
364 return result.lpGlyphs[0];
365 }
366 else
367 {
368 int i;
369 /* Mark this font as not supporting glyph indices. This can happen
370 on Windows9x, and maybe with non-Truetype fonts on NT etc. */
371 w32_font->glyph_idx = 0;
372 /* Clear metrics cache. */
373 clear_cached_metrics (w32_font);
374
375 return c;
376 }
377 }
378
379 /* w32 implementation of text_extents for font backend.
380 Perform the size computation of glyphs of FONT and fillin members
381 of METRICS. The glyphs are specified by their glyph codes in
382 CODE (length NGLYPHS). Apparently metrics can be NULL, in this
383 case just return the overall width. */
384 int
385 w32font_text_extents (font, code, nglyphs, metrics)
386 struct font *font;
387 unsigned *code;
388 int nglyphs;
389 struct font_metrics *metrics;
390 {
391 int i;
392 HFONT old_font = NULL;
393 HDC dc = NULL;
394 struct frame * f;
395 int total_width = 0;
396 WORD *wcode = NULL;
397 SIZE size;
398
399 struct w32font_info *w32_font = (struct w32font_info *) font;
400
401 if (metrics)
402 {
403 bzero (metrics, sizeof (struct font_metrics));
404 metrics->ascent = font->ascent;
405 metrics->descent = font->descent;
406
407 for (i = 0; i < nglyphs; i++)
408 {
409 struct w32_metric_cache *char_metric;
410 int block = *(code + i) / CACHE_BLOCKSIZE;
411 int pos_in_block = *(code + i) % CACHE_BLOCKSIZE;
412
413 if (block >= w32_font->n_cache_blocks)
414 {
415 if (!w32_font->cached_metrics)
416 w32_font->cached_metrics
417 = xmalloc ((block + 1)
418 * sizeof (struct w32_cached_metric *));
419 else
420 w32_font->cached_metrics
421 = xrealloc (w32_font->cached_metrics,
422 (block + 1)
423 * sizeof (struct w32_cached_metric *));
424 bzero (w32_font->cached_metrics + w32_font->n_cache_blocks,
425 ((block + 1 - w32_font->n_cache_blocks)
426 * sizeof (struct w32_cached_metric *)));
427 w32_font->n_cache_blocks = block + 1;
428 }
429
430 if (!w32_font->cached_metrics[block])
431 {
432 w32_font->cached_metrics[block]
433 = xmalloc (CACHE_BLOCKSIZE * sizeof (struct font_metrics));
434 bzero (w32_font->cached_metrics[block],
435 CACHE_BLOCKSIZE * sizeof (struct font_metrics));
436 }
437
438 char_metric = w32_font->cached_metrics[block] + pos_in_block;
439
440 if (char_metric->status == W32METRIC_NO_ATTEMPT)
441 {
442 if (dc == NULL)
443 {
444 /* TODO: Frames can come and go, and their fonts
445 outlive them. So we can't cache the frame in the
446 font structure. Use selected_frame until the API
447 is updated to pass in a frame. */
448 f = XFRAME (selected_frame);
449
450 dc = get_frame_dc (f);
451 old_font = SelectObject (dc, w32_font->hfont);
452 }
453 compute_metrics (dc, w32_font, *(code + i), char_metric);
454 }
455
456 if (char_metric->status == W32METRIC_SUCCESS)
457 {
458 metrics->lbearing = min (metrics->lbearing,
459 metrics->width + char_metric->lbearing);
460 metrics->rbearing = max (metrics->rbearing,
461 metrics->width + char_metric->rbearing);
462 metrics->width += char_metric->width;
463 }
464 else
465 /* If we couldn't get metrics for a char,
466 use alternative method. */
467 break;
468 }
469 /* If we got through everything, return. */
470 if (i == nglyphs)
471 {
472 if (dc != NULL)
473 {
474 /* Restore state and release DC. */
475 SelectObject (dc, old_font);
476 release_frame_dc (f, dc);
477 }
478
479 return metrics->width;
480 }
481 }
482
483 /* For non-truetype fonts, GetGlyphOutlineW is not supported, so
484 fallback on other methods that will at least give some of the metric
485 information. */
486 if (!wcode) {
487 wcode = alloca (nglyphs * sizeof (WORD));
488 for (i = 0; i < nglyphs; i++)
489 {
490 if (code[i] < 0x10000)
491 wcode[i] = code[i];
492 else
493 {
494 /* TODO: Convert to surrogate, reallocating array if needed */
495 wcode[i] = 0xffff;
496 }
497 }
498 }
499 if (dc == NULL)
500 {
501 /* TODO: Frames can come and go, and their fonts outlive
502 them. So we can't cache the frame in the font structure. Use
503 selected_frame until the API is updated to pass in a
504 frame. */
505 f = XFRAME (selected_frame);
506
507 dc = get_frame_dc (f);
508 old_font = SelectObject (dc, w32_font->hfont);
509 }
510
511 if (GetTextExtentPoint32W (dc, wcode, nglyphs, &size))
512 {
513 total_width = size.cx;
514 }
515
516 /* On 95/98/ME, only some unicode functions are available, so fallback
517 on doing a dummy draw to find the total width. */
518 if (!total_width)
519 {
520 RECT rect;
521 rect.top = 0; rect.bottom = font->height; rect.left = 0; rect.right = 1;
522 DrawTextW (dc, wcode, nglyphs, &rect,
523 DT_CALCRECT | DT_NOPREFIX | DT_SINGLELINE);
524 total_width = rect.right;
525 }
526
527 /* Give our best estimate of the metrics, based on what we know. */
528 if (metrics)
529 {
530 metrics->width = total_width - w32_font->metrics.tmOverhang;
531 metrics->lbearing = 0;
532 metrics->rbearing = total_width;
533 }
534
535 /* Restore state and release DC. */
536 SelectObject (dc, old_font);
537 release_frame_dc (f, dc);
538
539 return total_width;
540 }
541
542 /* w32 implementation of draw for font backend.
543 Optional.
544 Draw glyphs between FROM and TO of S->char2b at (X Y) pixel
545 position of frame F with S->FACE and S->GC. If WITH_BACKGROUND
546 is nonzero, fill the background in advance. It is assured that
547 WITH_BACKGROUND is zero when (FROM > 0 || TO < S->nchars).
548
549 TODO: Currently this assumes that the colors and fonts are already
550 set in the DC. This seems to be true now, but maybe only due to
551 the old font code setting it up. It may be safer to resolve faces
552 and fonts in here and set them explicitly
553 */
554
555 int
556 w32font_draw (s, from, to, x, y, with_background)
557 struct glyph_string *s;
558 int from, to, x, y, with_background;
559 {
560 UINT options;
561 HRGN orig_clip;
562 struct w32font_info *w32font = (struct w32font_info *) s->font;
563
564 options = w32font->glyph_idx;
565
566 /* Save clip region for later restoration. */
567 GetClipRgn(s->hdc, orig_clip);
568
569 if (s->num_clips > 0)
570 {
571 HRGN new_clip = CreateRectRgnIndirect (s->clip);
572
573 if (s->num_clips > 1)
574 {
575 HRGN clip2 = CreateRectRgnIndirect (s->clip + 1);
576
577 CombineRgn (new_clip, new_clip, clip2, RGN_OR);
578 DeleteObject (clip2);
579 }
580
581 SelectClipRgn (s->hdc, new_clip);
582 DeleteObject (new_clip);
583 }
584
585 /* Using OPAQUE background mode can clear more background than expected
586 when Cleartype is used. Draw the background manually to avoid this. */
587 SetBkMode (s->hdc, TRANSPARENT);
588 if (with_background)
589 {
590 HBRUSH brush;
591 RECT rect;
592 struct font *font = s->font;
593
594 brush = CreateSolidBrush (s->gc->background);
595 rect.left = x;
596 rect.top = y - font->ascent;
597 rect.right = x + s->width;
598 rect.bottom = y + font->descent;
599 FillRect (s->hdc, &rect, brush);
600 DeleteObject (brush);
601 }
602
603 if (s->padding_p)
604 {
605 int len = to - from, i;
606
607 for (i = 0; i < len; i++)
608 ExtTextOutW (s->hdc, x + i, y, options, NULL,
609 s->char2b + from + i, 1, NULL);
610 }
611 else
612 ExtTextOutW (s->hdc, x, y, options, NULL, s->char2b + from, to - from, NULL);
613
614 /* Restore clip region. */
615 if (s->num_clips > 0)
616 {
617 SelectClipRgn (s->hdc, orig_clip);
618 }
619 }
620
621 /* w32 implementation of free_entity for font backend.
622 Optional (if FONT_EXTRA_INDEX is not Lisp_Save_Value).
623 Free FONT_EXTRA_INDEX field of FONT_ENTITY.
624 static void
625 w32font_free_entity (Lisp_Object entity);
626 */
627
628 /* w32 implementation of prepare_face for font backend.
629 Optional (if FACE->extra is not used).
630 Prepare FACE for displaying characters by FONT on frame F by
631 storing some data in FACE->extra. If successful, return 0.
632 Otherwise, return -1.
633 static int
634 w32font_prepare_face (FRAME_PTR f, struct face *face);
635 */
636 /* w32 implementation of done_face for font backend.
637 Optional.
638 Done FACE for displaying characters by FACE->font on frame F.
639 static void
640 w32font_done_face (FRAME_PTR f, struct face *face); */
641
642 /* w32 implementation of get_bitmap for font backend.
643 Optional.
644 Store bitmap data for glyph-code CODE of FONT in BITMAP. It is
645 intended that this method is called from the other font-driver
646 for actual drawing.
647 static int
648 w32font_get_bitmap (struct font *font, unsigned code,
649 struct font_bitmap *bitmap, int bits_per_pixel);
650 */
651 /* w32 implementation of free_bitmap for font backend.
652 Optional.
653 Free bitmap data in BITMAP.
654 static void
655 w32font_free_bitmap (struct font *font, struct font_bitmap *bitmap);
656 */
657 /* w32 implementation of get_outline for font backend.
658 Optional.
659 Return an outline data for glyph-code CODE of FONT. The format
660 of the outline data depends on the font-driver.
661 static void *
662 w32font_get_outline (struct font *font, unsigned code);
663 */
664 /* w32 implementation of free_outline for font backend.
665 Optional.
666 Free OUTLINE (that is obtained by the above method).
667 static void
668 w32font_free_outline (struct font *font, void *outline);
669 */
670 /* w32 implementation of anchor_point for font backend.
671 Optional.
672 Get coordinates of the INDEXth anchor point of the glyph whose
673 code is CODE. Store the coordinates in *X and *Y. Return 0 if
674 the operations was successfull. Otherwise return -1.
675 static int
676 w32font_anchor_point (struct font *font, unsigned code,
677 int index, int *x, int *y);
678 */
679 /* w32 implementation of otf_capability for font backend.
680 Optional.
681 Return a list describing which scripts/languages FONT
682 supports by which GSUB/GPOS features of OpenType tables.
683 static Lisp_Object
684 w32font_otf_capability (struct font *font);
685 */
686 /* w32 implementation of otf_drive for font backend.
687 Optional.
688 Apply FONT's OTF-FEATURES to the glyph string.
689
690 FEATURES specifies which OTF features to apply in this format:
691 (SCRIPT LANGSYS GSUB-FEATURE GPOS-FEATURE)
692 See the documentation of `font-drive-otf' for the detail.
693
694 This method applies the specified features to the codes in the
695 elements of GSTRING-IN (between FROMth and TOth). The output
696 codes are stored in GSTRING-OUT at the IDXth element and the
697 following elements.
698
699 Return the number of output codes. If none of the features are
700 applicable to the input data, return 0. If GSTRING-OUT is too
701 short, return -1.
702 static int
703 w32font_otf_drive (struct font *font, Lisp_Object features,
704 Lisp_Object gstring_in, int from, int to,
705 Lisp_Object gstring_out, int idx,
706 int alternate_subst);
707 */
708
709 /* Internal implementation of w32font_list.
710 Additional parameter opentype_only restricts the returned fonts to
711 opentype fonts, which can be used with the Uniscribe backend. */
712 Lisp_Object
713 w32font_list_internal (frame, font_spec, opentype_only)
714 Lisp_Object frame, font_spec;
715 int opentype_only;
716 {
717 struct font_callback_data match_data;
718 HDC dc;
719 FRAME_PTR f = XFRAME (frame);
720
721 match_data.orig_font_spec = font_spec;
722 match_data.list = Qnil;
723 match_data.frame = frame;
724
725 bzero (&match_data.pattern, sizeof (LOGFONT));
726 fill_in_logfont (f, &match_data.pattern, font_spec);
727
728 match_data.opentype_only = opentype_only;
729 if (opentype_only)
730 match_data.pattern.lfOutPrecision = OUT_OUTLINE_PRECIS;
731
732 if (match_data.pattern.lfFaceName[0] == '\0')
733 {
734 /* EnumFontFamiliesEx does not take other fields into account if
735 font name is blank, so need to use two passes. */
736 list_all_matching_fonts (&match_data);
737 }
738 else
739 {
740 dc = get_frame_dc (f);
741
742 EnumFontFamiliesEx (dc, &match_data.pattern,
743 (FONTENUMPROC) add_font_entity_to_list,
744 (LPARAM) &match_data, 0);
745 release_frame_dc (f, dc);
746 }
747
748 return NILP (match_data.list) ? Qnil : match_data.list;
749 }
750
751 /* Internal implementation of w32font_match.
752 Additional parameter opentype_only restricts the returned fonts to
753 opentype fonts, which can be used with the Uniscribe backend. */
754 Lisp_Object
755 w32font_match_internal (frame, font_spec, opentype_only)
756 Lisp_Object frame, font_spec;
757 int opentype_only;
758 {
759 struct font_callback_data match_data;
760 HDC dc;
761 FRAME_PTR f = XFRAME (frame);
762
763 match_data.orig_font_spec = font_spec;
764 match_data.frame = frame;
765 match_data.list = Qnil;
766
767 bzero (&match_data.pattern, sizeof (LOGFONT));
768 fill_in_logfont (f, &match_data.pattern, font_spec);
769
770 match_data.opentype_only = opentype_only;
771 if (opentype_only)
772 match_data.pattern.lfOutPrecision = OUT_OUTLINE_PRECIS;
773
774 dc = get_frame_dc (f);
775
776 EnumFontFamiliesEx (dc, &match_data.pattern,
777 (FONTENUMPROC) add_one_font_entity_to_list,
778 (LPARAM) &match_data, 0);
779 release_frame_dc (f, dc);
780
781 return NILP (match_data.list) ? Qnil : XCAR (match_data.list);
782 }
783
784 int
785 w32font_open_internal (f, font_entity, pixel_size, font_object)
786 FRAME_PTR f;
787 Lisp_Object font_entity;
788 int pixel_size;
789 Lisp_Object font_object;
790 {
791 int len, size, i;
792 LOGFONT logfont;
793 HDC dc;
794 HFONT hfont, old_font;
795 Lisp_Object val, extra;
796 struct w32font_info *w32_font;
797 struct font * font;
798 OUTLINETEXTMETRIC* metrics = NULL;
799
800 w32_font = (struct w32font_info *) XFONT_OBJECT (font_object);
801 font = (struct font *) w32_font;
802
803 if (!font)
804 return 0;
805
806 bzero (&logfont, sizeof (logfont));
807 fill_in_logfont (f, &logfont, font_entity);
808
809 /* Prefer truetype fonts, to avoid known problems with type1 fonts, and
810 limitations in bitmap fonts. */
811 val = AREF (font_entity, FONT_FOUNDRY_INDEX);
812 if (!EQ (val, Qraster))
813 logfont.lfOutPrecision = OUT_TT_PRECIS;
814
815 size = XINT (AREF (font_entity, FONT_SIZE_INDEX));
816 if (!size)
817 size = pixel_size;
818
819 logfont.lfHeight = -size;
820 hfont = CreateFontIndirect (&logfont);
821
822 if (hfont == NULL)
823 return 0;
824
825 /* Get the metrics for this font. */
826 dc = get_frame_dc (f);
827 old_font = SelectObject (dc, hfont);
828
829 /* Try getting the outline metrics (only works for truetype fonts). */
830 len = GetOutlineTextMetrics (dc, 0, NULL);
831 if (len)
832 {
833 metrics = (OUTLINETEXTMETRIC *) alloca (len);
834 if (GetOutlineTextMetrics (dc, len, metrics))
835 bcopy (&metrics->otmTextMetrics, &w32_font->metrics,
836 sizeof (TEXTMETRIC));
837 else
838 metrics = NULL;
839
840 /* If it supports outline metrics, it should support Glyph Indices. */
841 w32_font->glyph_idx = ETO_GLYPH_INDEX;
842 }
843
844 if (!metrics)
845 {
846 GetTextMetrics (dc, &w32_font->metrics);
847 w32_font->glyph_idx = 0;
848 }
849
850 w32_font->cached_metrics = NULL;
851 w32_font->n_cache_blocks = 0;
852
853 SelectObject (dc, old_font);
854 release_frame_dc (f, dc);
855
856 w32_font->hfont = hfont;
857
858 {
859 char *name;
860
861 /* We don't know how much space we need for the full name, so start with
862 96 bytes and go up in steps of 32. */
863 len = 96;
864 name = alloca (len);
865 while (name && w32font_full_name (&logfont, font_entity, pixel_size,
866 name, len) < 0)
867 {
868 len += 32;
869 name = alloca (len);
870 }
871 if (name)
872 font->props[FONT_FULLNAME_INDEX]
873 = make_unibyte_string (name, strlen (name));
874 else
875 font->props[FONT_FULLNAME_INDEX] =
876 make_unibyte_string (logfont.lfFaceName, len);
877 }
878
879 font->max_width = w32_font->metrics.tmMaxCharWidth;
880 font->height = w32_font->metrics.tmHeight
881 + w32_font->metrics.tmExternalLeading;
882 font->space_width = font->average_width = w32_font->metrics.tmAveCharWidth;
883
884 font->vertical_centering = 0;
885 font->encoding_type = 0;
886 font->baseline_offset = 0;
887 font->relative_compose = 0;
888 font->default_ascent = w32_font->metrics.tmAscent;
889 font->font_encoder = NULL;
890 font->pixel_size = size;
891 font->driver = &w32font_driver;
892 /* Use format cached during list, as the information we have access to
893 here is incomplete. */
894 extra = AREF (font_entity, FONT_EXTRA_INDEX);
895 if (CONSP (extra))
896 {
897 val = assq_no_quit (QCformat, extra);
898 if (CONSP (val))
899 font->props[FONT_FORMAT_INDEX] = XCDR (val);
900 else
901 font->props[FONT_FORMAT_INDEX] = Qunknown;
902 }
903 else
904 font->props[FONT_FORMAT_INDEX] = Qunknown;
905
906 font->props[FONT_FILE_INDEX] = Qnil;
907 font->encoding_charset = -1;
908 font->repertory_charset = -1;
909 /* TODO: do we really want the minimum width here, which could be negative? */
910 font->min_width = font->space_width;
911 font->ascent = w32_font->metrics.tmAscent;
912 font->descent = w32_font->metrics.tmDescent;
913
914 if (metrics)
915 {
916 font->underline_thickness = metrics->otmsUnderscoreSize;
917 font->underline_position = -metrics->otmsUnderscorePosition;
918 }
919 else
920 {
921 font->underline_thickness = 0;
922 font->underline_position = -1;
923 }
924
925 /* For temporary compatibility with legacy code that expects the
926 name to be usable in x-list-fonts. Eventually we expect to change
927 x-list-fonts and other places that use fonts so that this can be
928 an fcname or similar. */
929 font->props[FONT_NAME_INDEX] = Ffont_xlfd_name (font_object, Qnil);
930
931 return 1;
932 }
933
934 /* Callback function for EnumFontFamiliesEx.
935 * Adds the name of a font to a Lisp list (passed in as the lParam arg). */
936 static int CALLBACK
937 add_font_name_to_list (logical_font, physical_font, font_type, list_object)
938 ENUMLOGFONTEX *logical_font;
939 NEWTEXTMETRICEX *physical_font;
940 DWORD font_type;
941 LPARAM list_object;
942 {
943 Lisp_Object* list = (Lisp_Object *) list_object;
944 Lisp_Object family;
945
946 /* Skip vertical fonts (intended only for printing) */
947 if (logical_font->elfLogFont.lfFaceName[0] == '@')
948 return 1;
949
950 family = font_intern_prop (logical_font->elfLogFont.lfFaceName,
951 strlen (logical_font->elfLogFont.lfFaceName), 1);
952 if (! memq_no_quit (family, *list))
953 *list = Fcons (family, *list);
954
955 return 1;
956 }
957
958 static int w32_decode_weight P_ ((int));
959 static int w32_encode_weight P_ ((int));
960
961 /* Convert an enumerated Windows font to an Emacs font entity. */
962 static Lisp_Object
963 w32_enumfont_pattern_entity (frame, logical_font, physical_font,
964 font_type, requested_font, backend)
965 Lisp_Object frame;
966 ENUMLOGFONTEX *logical_font;
967 NEWTEXTMETRICEX *physical_font;
968 DWORD font_type;
969 LOGFONT *requested_font;
970 Lisp_Object backend;
971 {
972 Lisp_Object entity, tem;
973 LOGFONT *lf = (LOGFONT*) logical_font;
974 BYTE generic_type;
975 DWORD full_type = physical_font->ntmTm.ntmFlags;
976
977 entity = font_make_entity ();
978
979 ASET (entity, FONT_TYPE_INDEX, backend);
980 ASET (entity, FONT_REGISTRY_INDEX, w32_registry (lf->lfCharSet, font_type));
981 ASET (entity, FONT_OBJLIST_INDEX, Qnil);
982
983 /* Foundry is difficult to get in readable form on Windows.
984 But Emacs crashes if it is not set, so set it to something more
985 generic. These values make xlfds compatible with Emacs 22. */
986 if (lf->lfOutPrecision == OUT_STRING_PRECIS)
987 tem = Qraster;
988 else if (lf->lfOutPrecision == OUT_STROKE_PRECIS)
989 tem = Qoutline;
990 else
991 tem = Qunknown;
992
993 ASET (entity, FONT_FOUNDRY_INDEX, tem);
994
995 /* Save the generic family in the extra info, as it is likely to be
996 useful to users looking for a close match. */
997 generic_type = physical_font->ntmTm.tmPitchAndFamily & 0xF0;
998 if (generic_type == FF_DECORATIVE)
999 tem = Qdecorative;
1000 else if (generic_type == FF_MODERN)
1001 tem = Qmono;
1002 else if (generic_type == FF_ROMAN)
1003 tem = Qserif;
1004 else if (generic_type == FF_SCRIPT)
1005 tem = Qscript;
1006 else if (generic_type == FF_SWISS)
1007 tem = Qsans;
1008 else
1009 tem = Qnil;
1010
1011 ASET (entity, FONT_ADSTYLE_INDEX, tem);
1012
1013 if (physical_font->ntmTm.tmPitchAndFamily & 0x01)
1014 ASET (entity, FONT_SPACING_INDEX, make_number (FONT_SPACING_PROPORTIONAL));
1015 else
1016 ASET (entity, FONT_SPACING_INDEX, make_number (FONT_SPACING_CHARCELL));
1017
1018 if (requested_font->lfQuality != DEFAULT_QUALITY)
1019 {
1020 font_put_extra (entity, QCantialias,
1021 lispy_antialias_type (requested_font->lfQuality));
1022 }
1023 ASET (entity, FONT_FAMILY_INDEX,
1024 font_intern_prop (lf->lfFaceName, strlen (lf->lfFaceName), 1));
1025
1026 FONT_SET_STYLE (entity, FONT_WEIGHT_INDEX,
1027 make_number (w32_decode_weight (lf->lfWeight)));
1028 FONT_SET_STYLE (entity, FONT_SLANT_INDEX,
1029 make_number (lf->lfItalic ? 200 : 100));
1030 /* TODO: PANOSE struct has this info, but need to call GetOutlineTextMetrics
1031 to get it. */
1032 FONT_SET_STYLE (entity, FONT_WIDTH_INDEX, make_number (100));
1033
1034 if (font_type & RASTER_FONTTYPE)
1035 ASET (entity, FONT_SIZE_INDEX, make_number (physical_font->ntmTm.tmHeight));
1036 else
1037 ASET (entity, FONT_SIZE_INDEX, make_number (0));
1038
1039 /* Cache unicode codepoints covered by this font, as there is no other way
1040 of getting this information easily. */
1041 if (font_type & TRUETYPE_FONTTYPE)
1042 {
1043 tem = font_supported_scripts (&physical_font->ntmFontSig);
1044 if (!NILP (tem))
1045 font_put_extra (entity, QCscript, tem);
1046 }
1047
1048 /* This information is not fully available when opening fonts, so
1049 save it here. Only Windows 2000 and later return information
1050 about opentype and type1 fonts, so need a fallback for detecting
1051 truetype so that this information is not any worse than we could
1052 have obtained later. */
1053 if (EQ (backend, Quniscribe) && (full_type & NTMFLAGS_OPENTYPE))
1054 tem = intern ("opentype");
1055 else if (font_type & TRUETYPE_FONTTYPE)
1056 tem = intern ("truetype");
1057 else if (full_type & NTM_PS_OPENTYPE)
1058 tem = intern ("postscript");
1059 else if (full_type & NTM_TYPE1)
1060 tem = intern ("type1");
1061 else if (font_type & RASTER_FONTTYPE)
1062 tem = intern ("w32bitmap");
1063 else
1064 tem = intern ("w32vector");
1065
1066 font_put_extra (entity, QCformat, tem);
1067
1068 return entity;
1069 }
1070
1071
1072 /* Convert generic families to the family portion of lfPitchAndFamily. */
1073 BYTE
1074 w32_generic_family (Lisp_Object name)
1075 {
1076 /* Generic families. */
1077 if (EQ (name, Qmonospace) || EQ (name, Qmono))
1078 return FF_MODERN;
1079 else if (EQ (name, Qsans) || EQ (name, Qsans_serif) || EQ (name, Qsansserif))
1080 return FF_SWISS;
1081 else if (EQ (name, Qserif))
1082 return FF_ROMAN;
1083 else if (EQ (name, Qdecorative))
1084 return FF_DECORATIVE;
1085 else if (EQ (name, Qscript))
1086 return FF_SCRIPT;
1087 else
1088 return FF_DONTCARE;
1089 }
1090
1091 static int
1092 logfonts_match (font, pattern)
1093 LOGFONT *font, *pattern;
1094 {
1095 /* Only check height for raster fonts. */
1096 if (pattern->lfHeight && font->lfOutPrecision == OUT_STRING_PRECIS
1097 && font->lfHeight != pattern->lfHeight)
1098 return 0;
1099
1100 /* Have some flexibility with weights. */
1101 if (pattern->lfWeight
1102 && ((font->lfWeight < (pattern->lfWeight - 150))
1103 || font->lfWeight > (pattern->lfWeight + 150)))
1104 return 0;
1105
1106 /* Charset and face should be OK. Italic has to be checked
1107 against the original spec, in case we don't have any preference. */
1108 return 1;
1109 }
1110
1111 /* Codepage Bitfields in FONTSIGNATURE struct. */
1112 #define CSB_JAPANESE (1 << 17)
1113 #define CSB_KOREAN ((1 << 19) | (1 << 21))
1114 #define CSB_CHINESE ((1 << 18) | (1 << 20))
1115
1116 static int
1117 font_matches_spec (type, font, spec, backend, logfont)
1118 DWORD type;
1119 NEWTEXTMETRICEX *font;
1120 Lisp_Object spec;
1121 Lisp_Object backend;
1122 LOGFONT *logfont;
1123 {
1124 Lisp_Object extra, val;
1125
1126 /* Check italic. Can't check logfonts, since it is a boolean field,
1127 so there is no difference between "non-italic" and "don't care". */
1128 {
1129 int slant = FONT_SLANT_NUMERIC (spec);
1130
1131 if (slant >= 0
1132 && ((slant > 150 && !font->ntmTm.tmItalic)
1133 || (slant <= 150 && font->ntmTm.tmItalic)))
1134 return 0;
1135 }
1136
1137 /* Check adstyle against generic family. */
1138 val = AREF (spec, FONT_ADSTYLE_INDEX);
1139 if (!NILP (val))
1140 {
1141 BYTE family = w32_generic_family (val);
1142 if (family != FF_DONTCARE
1143 && family != (font->ntmTm.tmPitchAndFamily & 0xF0))
1144 return 0;
1145 }
1146
1147 /* Check spacing */
1148 val = AREF (spec, FONT_SPACING_INDEX);
1149 if (INTEGERP (val))
1150 {
1151 int spacing = XINT (val);
1152 int proportional = (spacing < FONT_SPACING_MONO);
1153
1154 if ((proportional && !(font->ntmTm.tmPitchAndFamily & 0x01))
1155 || (!proportional && (font->ntmTm.tmPitchAndFamily & 0x01)))
1156 return 0;
1157 }
1158
1159 /* Check extra parameters. */
1160 for (extra = AREF (spec, FONT_EXTRA_INDEX);
1161 CONSP (extra); extra = XCDR (extra))
1162 {
1163 Lisp_Object extra_entry;
1164 extra_entry = XCAR (extra);
1165 if (CONSP (extra_entry))
1166 {
1167 Lisp_Object key = XCAR (extra_entry);
1168
1169 val = XCDR (extra_entry);
1170 if (EQ (key, QCscript) && SYMBOLP (val))
1171 {
1172 /* Only truetype fonts will have information about what
1173 scripts they support. This probably means the user
1174 will have to force Emacs to use raster, postscript
1175 or atm fonts for non-ASCII text. */
1176 if (type & TRUETYPE_FONTTYPE)
1177 {
1178 Lisp_Object support
1179 = font_supported_scripts (&font->ntmFontSig);
1180 if (! memq_no_quit (val, support))
1181 return 0;
1182 }
1183 else
1184 {
1185 /* Return specific matches, but play it safe. Fonts
1186 that cover more than their charset would suggest
1187 are likely to be truetype or opentype fonts,
1188 covered above. */
1189 if (EQ (val, Qlatin))
1190 {
1191 /* Although every charset but symbol, thai and
1192 arabic contains the basic ASCII set of latin
1193 characters, Emacs expects much more. */
1194 if (font->ntmTm.tmCharSet != ANSI_CHARSET)
1195 return 0;
1196 }
1197 else if (EQ (val, Qsymbol))
1198 {
1199 if (font->ntmTm.tmCharSet != SYMBOL_CHARSET)
1200 return 0;
1201 }
1202 else if (EQ (val, Qcyrillic))
1203 {
1204 if (font->ntmTm.tmCharSet != RUSSIAN_CHARSET)
1205 return 0;
1206 }
1207 else if (EQ (val, Qgreek))
1208 {
1209 if (font->ntmTm.tmCharSet != GREEK_CHARSET)
1210 return 0;
1211 }
1212 else if (EQ (val, Qarabic))
1213 {
1214 if (font->ntmTm.tmCharSet != ARABIC_CHARSET)
1215 return 0;
1216 }
1217 else if (EQ (val, Qhebrew))
1218 {
1219 if (font->ntmTm.tmCharSet != HEBREW_CHARSET)
1220 return 0;
1221 }
1222 else if (EQ (val, Qthai))
1223 {
1224 if (font->ntmTm.tmCharSet != THAI_CHARSET)
1225 return 0;
1226 }
1227 else if (EQ (val, Qkana))
1228 {
1229 if (font->ntmTm.tmCharSet != SHIFTJIS_CHARSET)
1230 return 0;
1231 }
1232 else if (EQ (val, Qbopomofo))
1233 {
1234 if (font->ntmTm.tmCharSet != CHINESEBIG5_CHARSET)
1235 return 0;
1236 }
1237 else if (EQ (val, Qhangul))
1238 {
1239 if (font->ntmTm.tmCharSet != HANGUL_CHARSET
1240 && font->ntmTm.tmCharSet != JOHAB_CHARSET)
1241 return 0;
1242 }
1243 else if (EQ (val, Qhan))
1244 {
1245 if (font->ntmTm.tmCharSet != CHINESEBIG5_CHARSET
1246 && font->ntmTm.tmCharSet != GB2312_CHARSET
1247 && font->ntmTm.tmCharSet != HANGUL_CHARSET
1248 && font->ntmTm.tmCharSet != JOHAB_CHARSET
1249 && font->ntmTm.tmCharSet != SHIFTJIS_CHARSET)
1250 return 0;
1251 }
1252 else
1253 /* Other scripts unlikely to be handled by non-truetype
1254 fonts. */
1255 return 0;
1256 }
1257 }
1258 else if (EQ (key, QClang) && SYMBOLP (val))
1259 {
1260 /* Just handle the CJK languages here, as the lang
1261 parameter is used to select a font with appropriate
1262 glyphs in the cjk unified ideographs block. Other fonts
1263 support for a language can be solely determined by
1264 its character coverage. */
1265 if (EQ (val, Qja))
1266 {
1267 if (!(font->ntmFontSig.fsCsb[0] & CSB_JAPANESE))
1268 return 0;
1269 }
1270 else if (EQ (val, Qko))
1271 {
1272 if (!(font->ntmFontSig.fsCsb[0] & CSB_KOREAN))
1273 return 0;
1274 }
1275 else if (EQ (val, Qzh))
1276 {
1277 if (!(font->ntmFontSig.fsCsb[0] & CSB_CHINESE))
1278 return 0;
1279 }
1280 else
1281 /* Any other language, we don't recognize it. Only the above
1282 currently appear in fontset.el, so it isn't worth
1283 creating a mapping table of codepages/scripts to languages
1284 or opening the font to see if there are any language tags
1285 in it that the W32 API does not expose. Fontset
1286 spec should have a fallback, as some backends do
1287 not recognize language at all. */
1288 return 0;
1289 }
1290 else if (EQ (key, QCotf) && CONSP (val))
1291 {
1292 /* OTF features only supported by the uniscribe backend. */
1293 if (EQ (backend, Quniscribe))
1294 {
1295 if (!uniscribe_check_otf (logfont, val))
1296 return 0;
1297 }
1298 else
1299 return 0;
1300 }
1301 }
1302 }
1303 return 1;
1304 }
1305
1306 static int
1307 w32font_coverage_ok (coverage, charset)
1308 FONTSIGNATURE * coverage;
1309 BYTE charset;
1310 {
1311 DWORD subrange1 = coverage->fsUsb[1];
1312
1313 #define SUBRANGE1_HAN_MASK 0x08000000
1314 #define SUBRANGE1_HANGEUL_MASK 0x01000000
1315 #define SUBRANGE1_JAPANESE_MASK (0x00060000 | SUBRANGE1_HAN_MASK)
1316
1317 if (charset == GB2312_CHARSET || charset == CHINESEBIG5_CHARSET)
1318 {
1319 return (subrange1 & SUBRANGE1_HAN_MASK) == SUBRANGE1_HAN_MASK;
1320 }
1321 else if (charset == SHIFTJIS_CHARSET)
1322 {
1323 return (subrange1 & SUBRANGE1_JAPANESE_MASK) == SUBRANGE1_JAPANESE_MASK;
1324 }
1325 else if (charset == HANGEUL_CHARSET)
1326 {
1327 return (subrange1 & SUBRANGE1_HANGEUL_MASK) == SUBRANGE1_HANGEUL_MASK;
1328 }
1329
1330 return 1;
1331 }
1332
1333 /* Callback function for EnumFontFamiliesEx.
1334 * Checks if a font matches everything we are trying to check agaist,
1335 * and if so, adds it to a list. Both the data we are checking against
1336 * and the list to which the fonts are added are passed in via the
1337 * lparam argument, in the form of a font_callback_data struct. */
1338 static int CALLBACK
1339 add_font_entity_to_list (logical_font, physical_font, font_type, lParam)
1340 ENUMLOGFONTEX *logical_font;
1341 NEWTEXTMETRICEX *physical_font;
1342 DWORD font_type;
1343 LPARAM lParam;
1344 {
1345 struct font_callback_data *match_data
1346 = (struct font_callback_data *) lParam;
1347 Lisp_Object backend = match_data->opentype_only ? Quniscribe : Qgdi;
1348
1349 if ((!match_data->opentype_only
1350 || (((physical_font->ntmTm.ntmFlags & NTMFLAGS_OPENTYPE)
1351 || (font_type & TRUETYPE_FONTTYPE))
1352 /* For the uniscribe backend, only consider fonts that claim
1353 to cover at least some part of Unicode. */
1354 && (physical_font->ntmFontSig.fsUsb[3]
1355 || physical_font->ntmFontSig.fsUsb[2]
1356 || physical_font->ntmFontSig.fsUsb[1]
1357 || (physical_font->ntmFontSig.fsUsb[0] & 0x3fffffff))))
1358 && logfonts_match (&logical_font->elfLogFont, &match_data->pattern)
1359 && font_matches_spec (font_type, physical_font,
1360 match_data->orig_font_spec, backend,
1361 &logical_font->elfLogFont)
1362 && w32font_coverage_ok (&physical_font->ntmFontSig,
1363 match_data->pattern.lfCharSet)
1364 /* Avoid substitutions involving raster fonts (eg Helv -> MS Sans Serif)
1365 We limit this to raster fonts, because the test can catch some
1366 genuine fonts (eg the full name of DejaVu Sans Mono Light is actually
1367 DejaVu Sans Mono ExtraLight). Helvetica -> Arial substitution will
1368 therefore get through this test. Since full names can be prefixed
1369 by a foundry, we accept raster fonts if the font name is found
1370 anywhere within the full name. */
1371 && (logical_font->elfLogFont.lfOutPrecision != OUT_STRING_PRECIS
1372 || strstr (logical_font->elfFullName,
1373 logical_font->elfLogFont.lfFaceName)))
1374 {
1375 Lisp_Object entity
1376 = w32_enumfont_pattern_entity (match_data->frame, logical_font,
1377 physical_font, font_type,
1378 &match_data->pattern,
1379 backend);
1380 if (!NILP (entity))
1381 {
1382 Lisp_Object spec_charset = AREF (match_data->orig_font_spec,
1383 FONT_REGISTRY_INDEX);
1384
1385 /* If registry was specified as iso10646-1, only report
1386 ANSI and DEFAULT charsets, as most unicode fonts will
1387 contain one of those plus others. */
1388 if ((EQ (spec_charset, Qiso10646_1)
1389 || EQ (spec_charset, Qunicode_bmp)
1390 || EQ (spec_charset, Qunicode_sip))
1391 && logical_font->elfLogFont.lfCharSet != DEFAULT_CHARSET
1392 && logical_font->elfLogFont.lfCharSet != ANSI_CHARSET)
1393 return 1;
1394 /* If registry was specified, but did not map to a windows
1395 charset, only report fonts that have unknown charsets.
1396 This will still report fonts that don't match, but at
1397 least it eliminates known definite mismatches. */
1398 else if (!NILP (spec_charset)
1399 && !EQ (spec_charset, Qiso10646_1)
1400 && !EQ (spec_charset, Qunicode_bmp)
1401 && !EQ (spec_charset, Qunicode_sip)
1402 && match_data->pattern.lfCharSet == DEFAULT_CHARSET
1403 && logical_font->elfLogFont.lfCharSet != DEFAULT_CHARSET)
1404 return 1;
1405
1406 /* If registry was specified, ensure it is reported as the same. */
1407 if (!NILP (spec_charset))
1408 ASET (entity, FONT_REGISTRY_INDEX, spec_charset);
1409
1410 match_data->list = Fcons (entity, match_data->list);
1411
1412 /* If no registry specified, duplicate iso8859-1 truetype fonts
1413 as iso10646-1. */
1414 if (NILP (spec_charset)
1415 && font_type == TRUETYPE_FONTTYPE
1416 && logical_font->elfLogFont.lfCharSet == ANSI_CHARSET)
1417 {
1418 Lisp_Object tem = Fcopy_font_spec (entity);
1419 ASET (tem, FONT_REGISTRY_INDEX, Qiso10646_1);
1420 match_data->list = Fcons (tem, match_data->list);
1421 }
1422 }
1423 }
1424 return 1;
1425 }
1426
1427 /* Callback function for EnumFontFamiliesEx.
1428 * Terminates the search once we have a match. */
1429 static int CALLBACK
1430 add_one_font_entity_to_list (logical_font, physical_font, font_type, lParam)
1431 ENUMLOGFONTEX *logical_font;
1432 NEWTEXTMETRICEX *physical_font;
1433 DWORD font_type;
1434 LPARAM lParam;
1435 {
1436 struct font_callback_data *match_data
1437 = (struct font_callback_data *) lParam;
1438 add_font_entity_to_list (logical_font, physical_font, font_type, lParam);
1439
1440 /* If we have a font in the list, terminate the search. */
1441 return !NILP (match_data->list);
1442 }
1443
1444 /* Old function to convert from x to w32 charset, from w32fns.c. */
1445 static LONG
1446 x_to_w32_charset (lpcs)
1447 char * lpcs;
1448 {
1449 Lisp_Object this_entry, w32_charset;
1450 char *charset;
1451 int len = strlen (lpcs);
1452
1453 /* Support "*-#nnn" format for unknown charsets. */
1454 if (strncmp (lpcs, "*-#", 3) == 0)
1455 return atoi (lpcs + 3);
1456
1457 /* All Windows fonts qualify as unicode. */
1458 if (!strncmp (lpcs, "iso10646", 8))
1459 return DEFAULT_CHARSET;
1460
1461 /* Handle wildcards by ignoring them; eg. treat "big5*-*" as "big5". */
1462 charset = alloca (len + 1);
1463 strcpy (charset, lpcs);
1464 lpcs = strchr (charset, '*');
1465 if (lpcs)
1466 *lpcs = '\0';
1467
1468 /* Look through w32-charset-info-alist for the character set.
1469 Format of each entry is
1470 (CHARSET_NAME . (WINDOWS_CHARSET . CODEPAGE)).
1471 */
1472 this_entry = Fassoc (build_string (charset), Vw32_charset_info_alist);
1473
1474 if (NILP (this_entry))
1475 {
1476 /* At startup, we want iso8859-1 fonts to come up properly. */
1477 if (xstrcasecmp (charset, "iso8859-1") == 0)
1478 return ANSI_CHARSET;
1479 else
1480 return DEFAULT_CHARSET;
1481 }
1482
1483 w32_charset = Fcar (Fcdr (this_entry));
1484
1485 /* Translate Lisp symbol to number. */
1486 if (EQ (w32_charset, Qw32_charset_ansi))
1487 return ANSI_CHARSET;
1488 if (EQ (w32_charset, Qw32_charset_symbol))
1489 return SYMBOL_CHARSET;
1490 if (EQ (w32_charset, Qw32_charset_shiftjis))
1491 return SHIFTJIS_CHARSET;
1492 if (EQ (w32_charset, Qw32_charset_hangeul))
1493 return HANGEUL_CHARSET;
1494 if (EQ (w32_charset, Qw32_charset_chinesebig5))
1495 return CHINESEBIG5_CHARSET;
1496 if (EQ (w32_charset, Qw32_charset_gb2312))
1497 return GB2312_CHARSET;
1498 if (EQ (w32_charset, Qw32_charset_oem))
1499 return OEM_CHARSET;
1500 if (EQ (w32_charset, Qw32_charset_johab))
1501 return JOHAB_CHARSET;
1502 if (EQ (w32_charset, Qw32_charset_easteurope))
1503 return EASTEUROPE_CHARSET;
1504 if (EQ (w32_charset, Qw32_charset_turkish))
1505 return TURKISH_CHARSET;
1506 if (EQ (w32_charset, Qw32_charset_baltic))
1507 return BALTIC_CHARSET;
1508 if (EQ (w32_charset, Qw32_charset_russian))
1509 return RUSSIAN_CHARSET;
1510 if (EQ (w32_charset, Qw32_charset_arabic))
1511 return ARABIC_CHARSET;
1512 if (EQ (w32_charset, Qw32_charset_greek))
1513 return GREEK_CHARSET;
1514 if (EQ (w32_charset, Qw32_charset_hebrew))
1515 return HEBREW_CHARSET;
1516 if (EQ (w32_charset, Qw32_charset_vietnamese))
1517 return VIETNAMESE_CHARSET;
1518 if (EQ (w32_charset, Qw32_charset_thai))
1519 return THAI_CHARSET;
1520 if (EQ (w32_charset, Qw32_charset_mac))
1521 return MAC_CHARSET;
1522
1523 return DEFAULT_CHARSET;
1524 }
1525
1526
1527 /* Convert a Lisp font registry (symbol) to a windows charset. */
1528 static LONG
1529 registry_to_w32_charset (charset)
1530 Lisp_Object charset;
1531 {
1532 if (EQ (charset, Qiso10646_1) || EQ (charset, Qunicode_bmp)
1533 || EQ (charset, Qunicode_sip))
1534 return DEFAULT_CHARSET; /* UNICODE_CHARSET not defined in MingW32 */
1535 else if (EQ (charset, Qiso8859_1))
1536 return ANSI_CHARSET;
1537 else if (SYMBOLP (charset))
1538 return x_to_w32_charset (SDATA (SYMBOL_NAME (charset)));
1539 else
1540 return DEFAULT_CHARSET;
1541 }
1542
1543 /* Old function to convert from w32 to x charset, from w32fns.c. */
1544 static char *
1545 w32_to_x_charset (fncharset, matching)
1546 int fncharset;
1547 char *matching;
1548 {
1549 static char buf[32];
1550 Lisp_Object charset_type;
1551 int match_len = 0;
1552
1553 if (matching)
1554 {
1555 /* If fully specified, accept it as it is. Otherwise use a
1556 substring match. */
1557 char *wildcard = strchr (matching, '*');
1558 if (wildcard)
1559 *wildcard = '\0';
1560 else if (strchr (matching, '-'))
1561 return matching;
1562
1563 match_len = strlen (matching);
1564 }
1565
1566 switch (fncharset)
1567 {
1568 case ANSI_CHARSET:
1569 /* Handle startup case of w32-charset-info-alist not
1570 being set up yet. */
1571 if (NILP (Vw32_charset_info_alist))
1572 return "iso8859-1";
1573 charset_type = Qw32_charset_ansi;
1574 break;
1575 case DEFAULT_CHARSET:
1576 charset_type = Qw32_charset_default;
1577 break;
1578 case SYMBOL_CHARSET:
1579 charset_type = Qw32_charset_symbol;
1580 break;
1581 case SHIFTJIS_CHARSET:
1582 charset_type = Qw32_charset_shiftjis;
1583 break;
1584 case HANGEUL_CHARSET:
1585 charset_type = Qw32_charset_hangeul;
1586 break;
1587 case GB2312_CHARSET:
1588 charset_type = Qw32_charset_gb2312;
1589 break;
1590 case CHINESEBIG5_CHARSET:
1591 charset_type = Qw32_charset_chinesebig5;
1592 break;
1593 case OEM_CHARSET:
1594 charset_type = Qw32_charset_oem;
1595 break;
1596 case EASTEUROPE_CHARSET:
1597 charset_type = Qw32_charset_easteurope;
1598 break;
1599 case TURKISH_CHARSET:
1600 charset_type = Qw32_charset_turkish;
1601 break;
1602 case BALTIC_CHARSET:
1603 charset_type = Qw32_charset_baltic;
1604 break;
1605 case RUSSIAN_CHARSET:
1606 charset_type = Qw32_charset_russian;
1607 break;
1608 case ARABIC_CHARSET:
1609 charset_type = Qw32_charset_arabic;
1610 break;
1611 case GREEK_CHARSET:
1612 charset_type = Qw32_charset_greek;
1613 break;
1614 case HEBREW_CHARSET:
1615 charset_type = Qw32_charset_hebrew;
1616 break;
1617 case VIETNAMESE_CHARSET:
1618 charset_type = Qw32_charset_vietnamese;
1619 break;
1620 case THAI_CHARSET:
1621 charset_type = Qw32_charset_thai;
1622 break;
1623 case MAC_CHARSET:
1624 charset_type = Qw32_charset_mac;
1625 break;
1626 case JOHAB_CHARSET:
1627 charset_type = Qw32_charset_johab;
1628 break;
1629
1630 default:
1631 /* Encode numerical value of unknown charset. */
1632 sprintf (buf, "*-#%u", fncharset);
1633 return buf;
1634 }
1635
1636 {
1637 Lisp_Object rest;
1638 char * best_match = NULL;
1639 int matching_found = 0;
1640
1641 /* Look through w32-charset-info-alist for the character set.
1642 Prefer ISO codepages, and prefer lower numbers in the ISO
1643 range. Only return charsets for codepages which are installed.
1644
1645 Format of each entry is
1646 (CHARSET_NAME . (WINDOWS_CHARSET . CODEPAGE)).
1647 */
1648 for (rest = Vw32_charset_info_alist; CONSP (rest); rest = XCDR (rest))
1649 {
1650 char * x_charset;
1651 Lisp_Object w32_charset;
1652 Lisp_Object codepage;
1653
1654 Lisp_Object this_entry = XCAR (rest);
1655
1656 /* Skip invalid entries in alist. */
1657 if (!CONSP (this_entry) || !STRINGP (XCAR (this_entry))
1658 || !CONSP (XCDR (this_entry))
1659 || !SYMBOLP (XCAR (XCDR (this_entry))))
1660 continue;
1661
1662 x_charset = SDATA (XCAR (this_entry));
1663 w32_charset = XCAR (XCDR (this_entry));
1664 codepage = XCDR (XCDR (this_entry));
1665
1666 /* Look for Same charset and a valid codepage (or non-int
1667 which means ignore). */
1668 if (EQ (w32_charset, charset_type)
1669 && (!INTEGERP (codepage) || XINT (codepage) == CP_DEFAULT
1670 || IsValidCodePage (XINT (codepage))))
1671 {
1672 /* If we don't have a match already, then this is the
1673 best. */
1674 if (!best_match)
1675 {
1676 best_match = x_charset;
1677 if (matching && !strnicmp (x_charset, matching, match_len))
1678 matching_found = 1;
1679 }
1680 /* If we already found a match for MATCHING, then
1681 only consider other matches. */
1682 else if (matching_found
1683 && strnicmp (x_charset, matching, match_len))
1684 continue;
1685 /* If this matches what we want, and the best so far doesn't,
1686 then this is better. */
1687 else if (!matching_found && matching
1688 && !strnicmp (x_charset, matching, match_len))
1689 {
1690 best_match = x_charset;
1691 matching_found = 1;
1692 }
1693 /* If this is fully specified, and the best so far isn't,
1694 then this is better. */
1695 else if ((!strchr (best_match, '-') && strchr (x_charset, '-'))
1696 /* If this is an ISO codepage, and the best so far isn't,
1697 then this is better, but only if it fully specifies the
1698 encoding. */
1699 || (strnicmp (best_match, "iso", 3) != 0
1700 && strnicmp (x_charset, "iso", 3) == 0
1701 && strchr (x_charset, '-')))
1702 best_match = x_charset;
1703 /* If both are ISO8859 codepages, choose the one with the
1704 lowest number in the encoding field. */
1705 else if (strnicmp (best_match, "iso8859-", 8) == 0
1706 && strnicmp (x_charset, "iso8859-", 8) == 0)
1707 {
1708 int best_enc = atoi (best_match + 8);
1709 int this_enc = atoi (x_charset + 8);
1710 if (this_enc > 0 && this_enc < best_enc)
1711 best_match = x_charset;
1712 }
1713 }
1714 }
1715
1716 /* If no match, encode the numeric value. */
1717 if (!best_match)
1718 {
1719 sprintf (buf, "*-#%u", fncharset);
1720 return buf;
1721 }
1722
1723 strncpy (buf, best_match, 31);
1724 /* If the charset is not fully specified, put -0 on the end. */
1725 if (!strchr (best_match, '-'))
1726 {
1727 int pos = strlen (best_match);
1728 /* Charset specifiers shouldn't be very long. If it is a made
1729 up one, truncating it should not do any harm since it isn't
1730 recognized anyway. */
1731 if (pos > 29)
1732 pos = 29;
1733 strcpy (buf + pos, "-0");
1734 }
1735 buf[31] = '\0';
1736 return buf;
1737 }
1738 }
1739
1740 static Lisp_Object
1741 w32_registry (w32_charset, font_type)
1742 LONG w32_charset;
1743 DWORD font_type;
1744 {
1745 char *charset;
1746
1747 /* If charset is defaulted, charset is unicode or unknown, depending on
1748 font type. */
1749 if (w32_charset == DEFAULT_CHARSET)
1750 return font_type == TRUETYPE_FONTTYPE ? Qiso10646_1 : Qunknown;
1751
1752 charset = w32_to_x_charset (w32_charset, NULL);
1753 return font_intern_prop (charset, strlen(charset), 1);
1754 }
1755
1756 static int
1757 w32_decode_weight (fnweight)
1758 int fnweight;
1759 {
1760 if (fnweight >= FW_HEAVY) return 210;
1761 if (fnweight >= FW_EXTRABOLD) return 205;
1762 if (fnweight >= FW_BOLD) return 200;
1763 if (fnweight >= FW_SEMIBOLD) return 180;
1764 if (fnweight >= FW_NORMAL) return 100;
1765 if (fnweight >= FW_LIGHT) return 50;
1766 if (fnweight >= FW_EXTRALIGHT) return 40;
1767 if (fnweight > FW_THIN) return 20;
1768 return 0;
1769 }
1770
1771 static int
1772 w32_encode_weight (n)
1773 int n;
1774 {
1775 if (n >= 210) return FW_HEAVY;
1776 if (n >= 205) return FW_EXTRABOLD;
1777 if (n >= 200) return FW_BOLD;
1778 if (n >= 180) return FW_SEMIBOLD;
1779 if (n >= 100) return FW_NORMAL;
1780 if (n >= 50) return FW_LIGHT;
1781 if (n >= 40) return FW_EXTRALIGHT;
1782 if (n >= 20) return FW_THIN;
1783 return 0;
1784 }
1785
1786 /* Convert a Windows font weight into one of the weights supported
1787 by fontconfig (see font.c:font_parse_fcname). */
1788 static Lisp_Object
1789 w32_to_fc_weight (n)
1790 int n;
1791 {
1792 if (n >= FW_EXTRABOLD) return intern ("black");
1793 if (n >= FW_BOLD) return intern ("bold");
1794 if (n >= FW_SEMIBOLD) return intern ("demibold");
1795 if (n >= FW_NORMAL) return intern ("medium");
1796 return intern ("light");
1797 }
1798
1799 /* Fill in all the available details of LOGFONT from FONT_SPEC. */
1800 static void
1801 fill_in_logfont (f, logfont, font_spec)
1802 FRAME_PTR f;
1803 LOGFONT *logfont;
1804 Lisp_Object font_spec;
1805 {
1806 Lisp_Object tmp, extra;
1807 int dpi = FRAME_W32_DISPLAY_INFO (f)->resy;
1808
1809 tmp = AREF (font_spec, FONT_DPI_INDEX);
1810 if (INTEGERP (tmp))
1811 {
1812 dpi = XINT (tmp);
1813 }
1814 else if (FLOATP (tmp))
1815 {
1816 dpi = (int) (XFLOAT_DATA (tmp) + 0.5);
1817 }
1818
1819 /* Height */
1820 tmp = AREF (font_spec, FONT_SIZE_INDEX);
1821 if (INTEGERP (tmp))
1822 logfont->lfHeight = -1 * XINT (tmp);
1823 else if (FLOATP (tmp))
1824 logfont->lfHeight = (int) (-1.0 * dpi * XFLOAT_DATA (tmp) / 72.27 + 0.5);
1825
1826 /* Escapement */
1827
1828 /* Orientation */
1829
1830 /* Weight */
1831 tmp = AREF (font_spec, FONT_WEIGHT_INDEX);
1832 if (INTEGERP (tmp))
1833 logfont->lfWeight = w32_encode_weight (FONT_WEIGHT_NUMERIC (font_spec));
1834
1835 /* Italic */
1836 tmp = AREF (font_spec, FONT_SLANT_INDEX);
1837 if (INTEGERP (tmp))
1838 {
1839 int slant = FONT_SLANT_NUMERIC (font_spec);
1840 logfont->lfItalic = slant > 150 ? 1 : 0;
1841 }
1842
1843 /* Underline */
1844
1845 /* Strikeout */
1846
1847 /* Charset */
1848 tmp = AREF (font_spec, FONT_REGISTRY_INDEX);
1849 if (! NILP (tmp))
1850 logfont->lfCharSet = registry_to_w32_charset (tmp);
1851 else
1852 logfont->lfCharSet = DEFAULT_CHARSET;
1853
1854 /* Out Precision */
1855
1856 /* Clip Precision */
1857
1858 /* Quality */
1859 logfont->lfQuality = DEFAULT_QUALITY;
1860
1861 /* Generic Family and Face Name */
1862 logfont->lfPitchAndFamily = FF_DONTCARE | DEFAULT_PITCH;
1863
1864 tmp = AREF (font_spec, FONT_FAMILY_INDEX);
1865 if (! NILP (tmp))
1866 {
1867 logfont->lfPitchAndFamily = w32_generic_family (tmp) | DEFAULT_PITCH;
1868 if ((logfont->lfPitchAndFamily & 0xF0) != FF_DONTCARE)
1869 ; /* Font name was generic, don't fill in font name. */
1870 /* Font families are interned, but allow for strings also in case of
1871 user input. */
1872 else if (SYMBOLP (tmp))
1873 strncpy (logfont->lfFaceName, SDATA (SYMBOL_NAME (tmp)), LF_FACESIZE);
1874 }
1875
1876 tmp = AREF (font_spec, FONT_ADSTYLE_INDEX);
1877 if (!NILP (tmp))
1878 {
1879 /* Override generic family. */
1880 BYTE family = w32_generic_family (tmp);
1881 if (family != FF_DONTCARE)
1882 logfont->lfPitchAndFamily = family | DEFAULT_PITCH;
1883 }
1884
1885
1886 /* Set pitch based on the spacing property. */
1887 tmp = AREF (font_spec, FONT_SPACING_INDEX);
1888 if (INTEGERP (tmp))
1889 {
1890 int spacing = XINT (tmp);
1891 if (spacing < FONT_SPACING_MONO)
1892 logfont->lfPitchAndFamily
1893 = logfont->lfPitchAndFamily & 0xF0 | VARIABLE_PITCH;
1894 else
1895 logfont->lfPitchAndFamily
1896 = logfont->lfPitchAndFamily & 0xF0 | FIXED_PITCH;
1897 }
1898
1899 /* Process EXTRA info. */
1900 for (extra = AREF (font_spec, FONT_EXTRA_INDEX);
1901 CONSP (extra); extra = XCDR (extra))
1902 {
1903 tmp = XCAR (extra);
1904 if (CONSP (tmp))
1905 {
1906 Lisp_Object key, val;
1907 key = XCAR (tmp), val = XCDR (tmp);
1908 /* Only use QCscript if charset is not provided, or is unicode
1909 and a single script is specified. This is rather crude,
1910 and is only used to narrow down the fonts returned where
1911 there is a definite match. Some scripts, such as latin, han,
1912 cjk-misc match multiple lfCharSet values, so we can't pre-filter
1913 them. */
1914 if (EQ (key, QCscript)
1915 && logfont->lfCharSet == DEFAULT_CHARSET
1916 && SYMBOLP (val))
1917 {
1918 if (EQ (val, Qgreek))
1919 logfont->lfCharSet = GREEK_CHARSET;
1920 else if (EQ (val, Qhangul))
1921 logfont->lfCharSet = HANGUL_CHARSET;
1922 else if (EQ (val, Qkana) || EQ (val, Qkanbun))
1923 logfont->lfCharSet = SHIFTJIS_CHARSET;
1924 else if (EQ (val, Qbopomofo))
1925 logfont->lfCharSet = CHINESEBIG5_CHARSET;
1926 /* GB 18030 supports tibetan, yi, mongolian,
1927 fonts that support it should show up if we ask for
1928 GB2312 fonts. */
1929 else if (EQ (val, Qtibetan) || EQ (val, Qyi)
1930 || EQ (val, Qmongolian))
1931 logfont->lfCharSet = GB2312_CHARSET;
1932 else if (EQ (val, Qhebrew))
1933 logfont->lfCharSet = HEBREW_CHARSET;
1934 else if (EQ (val, Qarabic))
1935 logfont->lfCharSet = ARABIC_CHARSET;
1936 else if (EQ (val, Qthai))
1937 logfont->lfCharSet = THAI_CHARSET;
1938 else if (EQ (val, Qsymbol))
1939 logfont->lfCharSet = SYMBOL_CHARSET;
1940 }
1941 else if (EQ (key, QCantialias) && SYMBOLP (val))
1942 {
1943 logfont->lfQuality = w32_antialias_type (val);
1944 }
1945 }
1946 }
1947 }
1948
1949 static void
1950 list_all_matching_fonts (match_data)
1951 struct font_callback_data *match_data;
1952 {
1953 HDC dc;
1954 Lisp_Object families = w32font_list_family (match_data->frame);
1955 struct frame *f = XFRAME (match_data->frame);
1956
1957 dc = get_frame_dc (f);
1958
1959 while (!NILP (families))
1960 {
1961 /* TODO: Use the Unicode versions of the W32 APIs, so we can
1962 handle non-ASCII font names. */
1963 char *name;
1964 Lisp_Object family = CAR (families);
1965 families = CDR (families);
1966 if (NILP (family))
1967 continue;
1968 else if (SYMBOLP (family))
1969 name = SDATA (SYMBOL_NAME (family));
1970 else
1971 continue;
1972
1973 strncpy (match_data->pattern.lfFaceName, name, LF_FACESIZE);
1974 match_data->pattern.lfFaceName[LF_FACESIZE - 1] = '\0';
1975
1976 EnumFontFamiliesEx (dc, &match_data->pattern,
1977 (FONTENUMPROC) add_font_entity_to_list,
1978 (LPARAM) match_data, 0);
1979 }
1980
1981 release_frame_dc (f, dc);
1982 }
1983
1984 static Lisp_Object
1985 lispy_antialias_type (type)
1986 BYTE type;
1987 {
1988 Lisp_Object lispy;
1989
1990 switch (type)
1991 {
1992 case NONANTIALIASED_QUALITY:
1993 lispy = Qnone;
1994 break;
1995 case ANTIALIASED_QUALITY:
1996 lispy = Qstandard;
1997 break;
1998 case CLEARTYPE_QUALITY:
1999 lispy = Qsubpixel;
2000 break;
2001 case CLEARTYPE_NATURAL_QUALITY:
2002 lispy = Qnatural;
2003 break;
2004 default:
2005 lispy = Qnil;
2006 break;
2007 }
2008 return lispy;
2009 }
2010
2011 /* Convert antialiasing symbols to lfQuality */
2012 static BYTE
2013 w32_antialias_type (type)
2014 Lisp_Object type;
2015 {
2016 if (EQ (type, Qnone))
2017 return NONANTIALIASED_QUALITY;
2018 else if (EQ (type, Qstandard))
2019 return ANTIALIASED_QUALITY;
2020 else if (EQ (type, Qsubpixel))
2021 return CLEARTYPE_QUALITY;
2022 else if (EQ (type, Qnatural))
2023 return CLEARTYPE_NATURAL_QUALITY;
2024 else
2025 return DEFAULT_QUALITY;
2026 }
2027
2028 /* Return a list of all the scripts that the font supports. */
2029 static Lisp_Object
2030 font_supported_scripts (FONTSIGNATURE * sig)
2031 {
2032 DWORD * subranges = sig->fsUsb;
2033 Lisp_Object supported = Qnil;
2034
2035 /* Match a single subrange. SYM is set if bit N is set in subranges. */
2036 #define SUBRANGE(n,sym) \
2037 if (subranges[(n) / 32] & (1 << ((n) % 32))) \
2038 supported = Fcons ((sym), supported)
2039
2040 /* Match multiple subranges. SYM is set if any MASK bit is set in
2041 subranges[0 - 3]. */
2042 #define MASK_ANY(mask0,mask1,mask2,mask3,sym) \
2043 if ((subranges[0] & (mask0)) || (subranges[1] & (mask1)) \
2044 || (subranges[2] & (mask2)) || (subranges[3] & (mask3))) \
2045 supported = Fcons ((sym), supported)
2046
2047 SUBRANGE (0, Qlatin);
2048 /* The following count as latin too, ASCII should be present in these fonts,
2049 so don't need to mark them separately. */
2050 /* 1: Latin-1 supplement, 2: Latin Extended A, 3: Latin Extended B. */
2051 SUBRANGE (4, Qphonetic);
2052 /* 5: Spacing and tone modifiers, 6: Combining Diacriticals. */
2053 SUBRANGE (7, Qgreek);
2054 SUBRANGE (8, Qcoptic);
2055 SUBRANGE (9, Qcyrillic);
2056 SUBRANGE (10, Qarmenian);
2057 SUBRANGE (11, Qhebrew);
2058 SUBRANGE (13, Qarabic);
2059 SUBRANGE (14, Qnko);
2060 SUBRANGE (15, Qdevanagari);
2061 SUBRANGE (16, Qbengali);
2062 SUBRANGE (17, Qgurmukhi);
2063 SUBRANGE (18, Qgujarati);
2064 SUBRANGE (19, Qoriya);
2065 SUBRANGE (20, Qtamil);
2066 SUBRANGE (21, Qtelugu);
2067 SUBRANGE (22, Qkannada);
2068 SUBRANGE (23, Qmalayalam);
2069 SUBRANGE (24, Qthai);
2070 SUBRANGE (25, Qlao);
2071 SUBRANGE (26, Qgeorgian);
2072 SUBRANGE (27, Qbalinese);
2073 /* 28: Hangul Jamo. */
2074 /* 29: Latin Extended, 30: Greek Extended, 31: Punctuation. */
2075 /* 32-47: Symbols (defined below). */
2076 SUBRANGE (48, Qcjk_misc);
2077 /* Match either 49: katakana or 50: hiragana for kana. */
2078 MASK_ANY (0, 0x00060000, 0, 0, Qkana);
2079 SUBRANGE (51, Qbopomofo);
2080 /* 52: Compatibility Jamo */
2081 SUBRANGE (53, Qphags_pa);
2082 /* 54: Enclosed CJK letters and months, 55: CJK Compatibility. */
2083 SUBRANGE (56, Qhangul);
2084 /* 57: Surrogates. */
2085 SUBRANGE (58, Qphoenician);
2086 SUBRANGE (59, Qhan); /* There are others, but this is the main one. */
2087 SUBRANGE (59, Qideographic_description); /* Windows lumps this in. */
2088 SUBRANGE (59, Qkanbun); /* And this. */
2089 /* 60: Private use, 61: CJK strokes and compatibility. */
2090 /* 62: Alphabetic Presentation, 63: Arabic Presentation A. */
2091 /* 64: Combining half marks, 65: Vertical and CJK compatibility. */
2092 /* 66: Small forms, 67: Arabic Presentation B, 68: Half and Full width. */
2093 /* 69: Specials. */
2094 SUBRANGE (70, Qtibetan);
2095 SUBRANGE (71, Qsyriac);
2096 SUBRANGE (72, Qthaana);
2097 SUBRANGE (73, Qsinhala);
2098 SUBRANGE (74, Qmyanmar);
2099 SUBRANGE (75, Qethiopic);
2100 SUBRANGE (76, Qcherokee);
2101 SUBRANGE (77, Qcanadian_aboriginal);
2102 SUBRANGE (78, Qogham);
2103 SUBRANGE (79, Qrunic);
2104 SUBRANGE (80, Qkhmer);
2105 SUBRANGE (81, Qmongolian);
2106 SUBRANGE (82, Qbraille);
2107 SUBRANGE (83, Qyi);
2108 SUBRANGE (84, Qbuhid);
2109 SUBRANGE (84, Qhanunoo);
2110 SUBRANGE (84, Qtagalog);
2111 SUBRANGE (84, Qtagbanwa);
2112 SUBRANGE (85, Qold_italic);
2113 SUBRANGE (86, Qgothic);
2114 SUBRANGE (87, Qdeseret);
2115 SUBRANGE (88, Qbyzantine_musical_symbol);
2116 SUBRANGE (88, Qmusical_symbol); /* Windows doesn't distinguish these. */
2117 SUBRANGE (89, Qmathematical);
2118 /* 90: Private use, 91: Variation selectors, 92: Tags. */
2119 SUBRANGE (93, Qlimbu);
2120 SUBRANGE (94, Qtai_le);
2121 /* 95: New Tai Le */
2122 SUBRANGE (90, Qbuginese);
2123 SUBRANGE (97, Qglagolitic);
2124 SUBRANGE (98, Qtifinagh);
2125 /* 99: Yijing Hexagrams. */
2126 SUBRANGE (100, Qsyloti_nagri);
2127 SUBRANGE (101, Qlinear_b);
2128 /* 102: Ancient Greek Numbers. */
2129 SUBRANGE (103, Qugaritic);
2130 SUBRANGE (104, Qold_persian);
2131 SUBRANGE (105, Qshavian);
2132 SUBRANGE (106, Qosmanya);
2133 SUBRANGE (107, Qcypriot);
2134 SUBRANGE (108, Qkharoshthi);
2135 /* 109: Tai Xuan Jing. */
2136 SUBRANGE (110, Qcuneiform);
2137 /* 111: Counting Rods. */
2138
2139 /* There isn't really a main symbol range, so include symbol if any
2140 relevant range is set. */
2141 MASK_ANY (0x8000000, 0x0000FFFF, 0, 0, Qsymbol);
2142
2143 /* Missing: Tai Viet (U+AA80) and Cham (U+AA00) . */
2144 #undef SUBRANGE
2145 #undef MASK_ANY
2146
2147 return supported;
2148 }
2149
2150 /* Generate a full name for a Windows font.
2151 The full name is in fcname format, with weight, slant and antialiasing
2152 specified if they are not "normal". */
2153 static int
2154 w32font_full_name (font, font_obj, pixel_size, name, nbytes)
2155 LOGFONT * font;
2156 Lisp_Object font_obj;
2157 int pixel_size;
2158 char *name;
2159 int nbytes;
2160 {
2161 int len, height, outline;
2162 char *p;
2163 Lisp_Object antialiasing, weight = Qnil;
2164
2165 len = strlen (font->lfFaceName);
2166
2167 outline = EQ (AREF (font_obj, FONT_FOUNDRY_INDEX), Qoutline);
2168
2169 /* Represent size of scalable fonts by point size. But use pixelsize for
2170 raster fonts to indicate that they are exactly that size. */
2171 if (outline)
2172 len += 11; /* -SIZE */
2173 else
2174 len += 21;
2175
2176 if (font->lfItalic)
2177 len += 7; /* :italic */
2178
2179 if (font->lfWeight && font->lfWeight != FW_NORMAL)
2180 {
2181 weight = w32_to_fc_weight (font->lfWeight);
2182 len += 1 + SBYTES (SYMBOL_NAME (weight)); /* :WEIGHT */
2183 }
2184
2185 antialiasing = lispy_antialias_type (font->lfQuality);
2186 if (! NILP (antialiasing))
2187 len += 11 + SBYTES (SYMBOL_NAME (antialiasing)); /* :antialias=NAME */
2188
2189 /* Check that the buffer is big enough */
2190 if (len > nbytes)
2191 return -1;
2192
2193 p = name;
2194 p += sprintf (p, "%s", font->lfFaceName);
2195
2196 height = font->lfHeight ? eabs (font->lfHeight) : pixel_size;
2197
2198 if (height > 0)
2199 {
2200 if (outline)
2201 {
2202 float pointsize = height * 72.0 / one_w32_display_info.resy;
2203 /* Round to nearest half point. floor is used, since round is not
2204 supported in MS library. */
2205 pointsize = floor (pointsize * 2 + 0.5) / 2;
2206 p += sprintf (p, "-%1.1f", pointsize);
2207 }
2208 else
2209 p += sprintf (p, ":pixelsize=%d", height);
2210 }
2211
2212 if (SYMBOLP (weight) && ! NILP (weight))
2213 p += sprintf (p, ":%s", SDATA (SYMBOL_NAME (weight)));
2214
2215 if (font->lfItalic)
2216 p += sprintf (p, ":italic");
2217
2218 if (SYMBOLP (antialiasing) && ! NILP (antialiasing))
2219 p += sprintf (p, ":antialias=%s", SDATA (SYMBOL_NAME (antialiasing)));
2220
2221 return (p - name);
2222 }
2223
2224 /* Convert a logfont and point size into a fontconfig style font name.
2225 POINTSIZE is in tenths of points.
2226 If SIZE indicates the size of buffer FCNAME, into which the font name
2227 is written. If the buffer is not large enough to contain the name,
2228 the function returns -1, otherwise it returns the number of bytes
2229 written to FCNAME. */
2230 static int logfont_to_fcname(font, pointsize, fcname, size)
2231 LOGFONT* font;
2232 int pointsize;
2233 char *fcname;
2234 int size;
2235 {
2236 int len, height;
2237 char *p = fcname;
2238 Lisp_Object weight = Qnil;
2239
2240 len = strlen (font->lfFaceName) + 2;
2241 height = pointsize / 10;
2242 while (height /= 10)
2243 len++;
2244
2245 if (pointsize % 10)
2246 len += 2;
2247
2248 if (font->lfItalic)
2249 len += 7; /* :italic */
2250 if (font->lfWeight && font->lfWeight != FW_NORMAL)
2251 {
2252 weight = w32_to_fc_weight (font->lfWeight);
2253 len += SBYTES (SYMBOL_NAME (weight)) + 1;
2254 }
2255
2256 if (len > size)
2257 return -1;
2258
2259 p += sprintf (p, "%s-%d", font->lfFaceName, pointsize / 10);
2260 if (pointsize % 10)
2261 p += sprintf (p, ".%d", pointsize % 10);
2262
2263 if (SYMBOLP (weight) && !NILP (weight))
2264 p += sprintf (p, ":%s", SDATA (SYMBOL_NAME (weight)));
2265
2266 if (font->lfItalic)
2267 p += sprintf (p, ":italic");
2268
2269 return (p - fcname);
2270 }
2271
2272 static void
2273 compute_metrics (dc, w32_font, code, metrics)
2274 HDC dc;
2275 struct w32font_info *w32_font;
2276 unsigned int code;
2277 struct w32_metric_cache *metrics;
2278 {
2279 GLYPHMETRICS gm;
2280 MAT2 transform;
2281 unsigned int options = GGO_METRICS;
2282
2283 if (w32_font->glyph_idx)
2284 options |= GGO_GLYPH_INDEX;
2285
2286 bzero (&transform, sizeof (transform));
2287 transform.eM11.value = 1;
2288 transform.eM22.value = 1;
2289
2290 if (GetGlyphOutlineW (dc, code, options, &gm, 0, NULL, &transform)
2291 != GDI_ERROR)
2292 {
2293 metrics->lbearing = gm.gmptGlyphOrigin.x;
2294 metrics->rbearing = gm.gmptGlyphOrigin.x + gm.gmBlackBoxX;
2295 metrics->width = gm.gmCellIncX;
2296 metrics->status = W32METRIC_SUCCESS;
2297 }
2298 else if (w32_font->glyph_idx)
2299 {
2300 /* Can't use glyph indexes after all.
2301 Avoid it in future, and clear any metrics that were based on
2302 glyph indexes. */
2303 w32_font->glyph_idx = 0;
2304 clear_cached_metrics (w32_font);
2305 }
2306 else
2307 metrics->status = W32METRIC_FAIL;
2308 }
2309
2310 static void
2311 clear_cached_metrics (w32_font)
2312 struct w32font_info *w32_font;
2313 {
2314 int i;
2315 for (i = 0; i < w32_font->n_cache_blocks; i++)
2316 {
2317 if (w32_font->cached_metrics[i])
2318 bzero (w32_font->cached_metrics[i],
2319 CACHE_BLOCKSIZE * sizeof (struct font_metrics));
2320 }
2321 }
2322
2323 DEFUN ("x-select-font", Fx_select_font, Sx_select_font, 0, 2, 0,
2324 doc: /* Read a font name using a W32 font selection dialog.
2325 Return fontconfig style font string corresponding to the selection.
2326
2327 If FRAME is omitted or nil, it defaults to the selected frame.
2328 If INCLUDE-PROPORTIONAL is non-nil, include proportional fonts
2329 in the font selection dialog. */)
2330 (frame, include_proportional)
2331 Lisp_Object frame, include_proportional;
2332 {
2333 FRAME_PTR f = check_x_frame (frame);
2334 CHOOSEFONT cf;
2335 LOGFONT lf;
2336 TEXTMETRIC tm;
2337 HDC hdc;
2338 HANDLE oldobj;
2339 char buf[100];
2340
2341 bzero (&cf, sizeof (cf));
2342 bzero (&lf, sizeof (lf));
2343
2344 cf.lStructSize = sizeof (cf);
2345 cf.hwndOwner = FRAME_W32_WINDOW (f);
2346 cf.Flags = CF_FORCEFONTEXIST | CF_SCREENFONTS | CF_NOVERTFONTS;
2347
2348 /* Unless include_proportional is non-nil, limit the selection to
2349 monospaced fonts. */
2350 if (NILP (include_proportional))
2351 cf.Flags |= CF_FIXEDPITCHONLY;
2352
2353 cf.lpLogFont = &lf;
2354
2355 /* Initialize as much of the font details as we can from the current
2356 default font. */
2357 hdc = GetDC (FRAME_W32_WINDOW (f));
2358 oldobj = SelectObject (hdc, FONT_HANDLE (FRAME_FONT (f)));
2359 GetTextFace (hdc, LF_FACESIZE, lf.lfFaceName);
2360 if (GetTextMetrics (hdc, &tm))
2361 {
2362 lf.lfHeight = tm.tmInternalLeading - tm.tmHeight;
2363 lf.lfWeight = tm.tmWeight;
2364 lf.lfItalic = tm.tmItalic;
2365 lf.lfUnderline = tm.tmUnderlined;
2366 lf.lfStrikeOut = tm.tmStruckOut;
2367 lf.lfCharSet = tm.tmCharSet;
2368 cf.Flags |= CF_INITTOLOGFONTSTRUCT;
2369 }
2370 SelectObject (hdc, oldobj);
2371 ReleaseDC (FRAME_W32_WINDOW (f), hdc);
2372
2373 if (!ChooseFont (&cf)
2374 || logfont_to_fcname (&lf, cf.iPointSize, buf, 100) < 0)
2375 return Qnil;
2376
2377 return build_string (buf);
2378 }
2379
2380 struct font_driver w32font_driver =
2381 {
2382 0, /* Qgdi */
2383 0, /* case insensitive */
2384 w32font_get_cache,
2385 w32font_list,
2386 w32font_match,
2387 w32font_list_family,
2388 NULL, /* free_entity */
2389 w32font_open,
2390 w32font_close,
2391 NULL, /* prepare_face */
2392 NULL, /* done_face */
2393 w32font_has_char,
2394 w32font_encode_char,
2395 w32font_text_extents,
2396 w32font_draw,
2397 NULL, /* get_bitmap */
2398 NULL, /* free_bitmap */
2399 NULL, /* get_outline */
2400 NULL, /* free_outline */
2401 NULL, /* anchor_point */
2402 NULL, /* otf_capability */
2403 NULL, /* otf_drive */
2404 NULL, /* start_for_frame */
2405 NULL, /* end_for_frame */
2406 NULL /* shape */
2407 };
2408
2409
2410 /* Initialize state that does not change between invocations. This is only
2411 called when Emacs is dumped. */
2412 void
2413 syms_of_w32font ()
2414 {
2415 DEFSYM (Qgdi, "gdi");
2416 DEFSYM (Quniscribe, "uniscribe");
2417 DEFSYM (QCformat, ":format");
2418
2419 /* Generic font families. */
2420 DEFSYM (Qmonospace, "monospace");
2421 DEFSYM (Qserif, "serif");
2422 DEFSYM (Qsansserif, "sansserif");
2423 DEFSYM (Qscript, "script");
2424 DEFSYM (Qdecorative, "decorative");
2425 /* Aliases. */
2426 DEFSYM (Qsans_serif, "sans_serif");
2427 DEFSYM (Qsans, "sans");
2428 DEFSYM (Qmono, "mono");
2429
2430 /* Fake foundries. */
2431 DEFSYM (Qraster, "raster");
2432 DEFSYM (Qoutline, "outline");
2433 DEFSYM (Qunknown, "unknown");
2434
2435 /* Antialiasing. */
2436 DEFSYM (Qstandard, "standard");
2437 DEFSYM (Qsubpixel, "subpixel");
2438 DEFSYM (Qnatural, "natural");
2439
2440 /* Languages */
2441 DEFSYM (Qja, "ja");
2442 DEFSYM (Qko, "ko");
2443 DEFSYM (Qzh, "zh");
2444
2445 /* Scripts */
2446 DEFSYM (Qlatin, "latin");
2447 DEFSYM (Qgreek, "greek");
2448 DEFSYM (Qcoptic, "coptic");
2449 DEFSYM (Qcyrillic, "cyrillic");
2450 DEFSYM (Qarmenian, "armenian");
2451 DEFSYM (Qhebrew, "hebrew");
2452 DEFSYM (Qarabic, "arabic");
2453 DEFSYM (Qsyriac, "syriac");
2454 DEFSYM (Qnko, "nko");
2455 DEFSYM (Qthaana, "thaana");
2456 DEFSYM (Qdevanagari, "devanagari");
2457 DEFSYM (Qbengali, "bengali");
2458 DEFSYM (Qgurmukhi, "gurmukhi");
2459 DEFSYM (Qgujarati, "gujarati");
2460 DEFSYM (Qoriya, "oriya");
2461 DEFSYM (Qtamil, "tamil");
2462 DEFSYM (Qtelugu, "telugu");
2463 DEFSYM (Qkannada, "kannada");
2464 DEFSYM (Qmalayalam, "malayalam");
2465 DEFSYM (Qsinhala, "sinhala");
2466 DEFSYM (Qthai, "thai");
2467 DEFSYM (Qlao, "lao");
2468 DEFSYM (Qtibetan, "tibetan");
2469 DEFSYM (Qmyanmar, "myanmar");
2470 DEFSYM (Qgeorgian, "georgian");
2471 DEFSYM (Qhangul, "hangul");
2472 DEFSYM (Qethiopic, "ethiopic");
2473 DEFSYM (Qcherokee, "cherokee");
2474 DEFSYM (Qcanadian_aboriginal, "canadian-aboriginal");
2475 DEFSYM (Qogham, "ogham");
2476 DEFSYM (Qrunic, "runic");
2477 DEFSYM (Qkhmer, "khmer");
2478 DEFSYM (Qmongolian, "mongolian");
2479 DEFSYM (Qsymbol, "symbol");
2480 DEFSYM (Qbraille, "braille");
2481 DEFSYM (Qhan, "han");
2482 DEFSYM (Qideographic_description, "ideographic-description");
2483 DEFSYM (Qcjk_misc, "cjk-misc");
2484 DEFSYM (Qkana, "kana");
2485 DEFSYM (Qbopomofo, "bopomofo");
2486 DEFSYM (Qkanbun, "kanbun");
2487 DEFSYM (Qyi, "yi");
2488 DEFSYM (Qbyzantine_musical_symbol, "byzantine-musical-symbol");
2489 DEFSYM (Qmusical_symbol, "musical-symbol");
2490 DEFSYM (Qmathematical, "mathematical");
2491 DEFSYM (Qphonetic, "phonetic");
2492 DEFSYM (Qbalinese, "balinese");
2493 DEFSYM (Qbuginese, "buginese");
2494 DEFSYM (Qbuhid, "buhid");
2495 DEFSYM (Qcuneiform, "cuneiform");
2496 DEFSYM (Qcypriot, "cypriot");
2497 DEFSYM (Qdeseret, "deseret");
2498 DEFSYM (Qglagolitic, "glagolitic");
2499 DEFSYM (Qgothic, "gothic");
2500 DEFSYM (Qhanunoo, "hanunoo");
2501 DEFSYM (Qkharoshthi, "kharoshthi");
2502 DEFSYM (Qlimbu, "limbu");
2503 DEFSYM (Qlinear_b, "linear_b");
2504 DEFSYM (Qold_italic, "old_italic");
2505 DEFSYM (Qold_persian, "old_persian");
2506 DEFSYM (Qosmanya, "osmanya");
2507 DEFSYM (Qphags_pa, "phags-pa");
2508 DEFSYM (Qphoenician, "phoenician");
2509 DEFSYM (Qshavian, "shavian");
2510 DEFSYM (Qsyloti_nagri, "syloti_nagri");
2511 DEFSYM (Qtagalog, "tagalog");
2512 DEFSYM (Qtagbanwa, "tagbanwa");
2513 DEFSYM (Qtai_le, "tai_le");
2514 DEFSYM (Qtifinagh, "tifinagh");
2515 DEFSYM (Qugaritic, "ugaritic");
2516
2517 /* W32 font encodings. */
2518 DEFVAR_LISP ("w32-charset-info-alist",
2519 &Vw32_charset_info_alist,
2520 doc: /* Alist linking Emacs character sets to Windows fonts and codepages.
2521 Each entry should be of the form:
2522
2523 (CHARSET_NAME . (WINDOWS_CHARSET . CODEPAGE))
2524
2525 where CHARSET_NAME is a string used in font names to identify the charset,
2526 WINDOWS_CHARSET is a symbol that can be one of:
2527
2528 w32-charset-ansi, w32-charset-default, w32-charset-symbol,
2529 w32-charset-shiftjis, w32-charset-hangeul, w32-charset-gb2312,
2530 w32-charset-chinesebig5, w32-charset-johab, w32-charset-hebrew,
2531 w32-charset-arabic, w32-charset-greek, w32-charset-turkish,
2532 w32-charset-vietnamese, w32-charset-thai, w32-charset-easteurope,
2533 w32-charset-russian, w32-charset-mac, w32-charset-baltic,
2534 or w32-charset-oem.
2535
2536 CODEPAGE should be an integer specifying the codepage that should be used
2537 to display the character set, t to do no translation and output as Unicode,
2538 or nil to do no translation and output as 8 bit (or multibyte on far-east
2539 versions of Windows) characters. */);
2540 Vw32_charset_info_alist = Qnil;
2541
2542 DEFSYM (Qw32_charset_ansi, "w32-charset-ansi");
2543 DEFSYM (Qw32_charset_symbol, "w32-charset-symbol");
2544 DEFSYM (Qw32_charset_default, "w32-charset-default");
2545 DEFSYM (Qw32_charset_shiftjis, "w32-charset-shiftjis");
2546 DEFSYM (Qw32_charset_hangeul, "w32-charset-hangeul");
2547 DEFSYM (Qw32_charset_chinesebig5, "w32-charset-chinesebig5");
2548 DEFSYM (Qw32_charset_gb2312, "w32-charset-gb2312");
2549 DEFSYM (Qw32_charset_oem, "w32-charset-oem");
2550 DEFSYM (Qw32_charset_johab, "w32-charset-johab");
2551 DEFSYM (Qw32_charset_easteurope, "w32-charset-easteurope");
2552 DEFSYM (Qw32_charset_turkish, "w32-charset-turkish");
2553 DEFSYM (Qw32_charset_baltic, "w32-charset-baltic");
2554 DEFSYM (Qw32_charset_russian, "w32-charset-russian");
2555 DEFSYM (Qw32_charset_arabic, "w32-charset-arabic");
2556 DEFSYM (Qw32_charset_greek, "w32-charset-greek");
2557 DEFSYM (Qw32_charset_hebrew, "w32-charset-hebrew");
2558 DEFSYM (Qw32_charset_vietnamese, "w32-charset-vietnamese");
2559 DEFSYM (Qw32_charset_thai, "w32-charset-thai");
2560 DEFSYM (Qw32_charset_mac, "w32-charset-mac");
2561
2562 defsubr (&Sx_select_font);
2563
2564 w32font_driver.type = Qgdi;
2565 register_font_driver (&w32font_driver, NULL);
2566 }
2567
2568 /* arch-tag: 65b8a3cd-46aa-4c0d-a1f3-99e75b9c07ee
2569 (do not change this comment) */