1 /* Font backend for the Microsoft W32 API.
2 Copyright (C) 2007, 2008 Free Software Foundation, Inc.
4 This file is part of GNU Emacs.
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.
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.
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/>. */
28 #include "dispextern.h"
29 #include "character.h"
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.
39 #ifndef CLEARTYPE_QUALITY
40 #define CLEARTYPE_QUALITY 5
42 #ifndef CLEARTYPE_NATURAL_QUALITY
43 #define CLEARTYPE_NATURAL_QUALITY 6
46 /* VIETNAMESE_CHARSET and JOHAB_CHARSET are not defined in some versions
48 #ifndef VIETNAMESE_CHARSET
49 #define VIETNAMESE_CHARSET 163
52 #define JOHAB_CHARSET 130
55 extern struct font_driver w32font_driver
;
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
;
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
;
70 static Lisp_Object Qja
, Qko
, Qzh
;
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
;
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
;
103 /* Associative list linking character set strings to Windows codepages. */
104 static Lisp_Object Vw32_charset_info_alist
;
106 /* Font spacing symbols - defined in font.c. */
107 extern Lisp_Object Qc
, Qp
, Qm
;
109 static void fill_in_logfont
P_ ((FRAME_PTR
, LOGFONT
*, Lisp_Object
));
111 static BYTE w32_antialias_type
P_ ((Lisp_Object
));
112 static Lisp_Object lispy_antialias_type
P_ ((BYTE
));
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
*));
120 static Lisp_Object w32_registry
P_ ((LONG
, DWORD
));
122 /* EnumFontFamiliesEx callbacks. */
123 static int CALLBACK add_font_entity_to_list
P_ ((ENUMLOGFONTEX
*,
126 static int CALLBACK add_one_font_entity_to_list
P_ ((ENUMLOGFONTEX
*,
129 static int CALLBACK add_font_name_to_list
P_ ((ENUMLOGFONTEX
*,
133 /* struct passed in as LPARAM arg to EnumFontFamiliesEx, for keeping track
134 of what we really want. */
135 struct font_callback_data
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. */
141 /* The original font spec or entity. */
142 Lisp_Object orig_font_spec
;
143 /* The frame the font is being loaded on. */
145 /* The list to add matches to. */
147 /* Whether to match only opentype fonts. */
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
*));
157 memq_no_quit (elt
, list
)
158 Lisp_Object elt
, list
;
160 while (CONSP (list
) && ! EQ (XCAR (list
), elt
))
162 return (CONSP (list
));
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. */
169 w32font_get_cache (f
)
172 struct w32_display_info
*dpyinfo
= FRAME_X_DISPLAY_INFO (f
);
174 return (dpyinfo
->name_list_element
);
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. */
182 w32font_list (frame
, font_spec
)
183 Lisp_Object frame
, font_spec
;
185 Lisp_Object fonts
= w32font_list_internal (frame
, font_spec
, 0);
186 font_add_log ("w32font-list", font_spec
, fonts
);
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. */
195 w32font_match (frame
, font_spec
)
196 Lisp_Object frame
, font_spec
;
198 Lisp_Object entity
= w32font_match_internal (frame
, font_spec
, 0);
199 font_add_log ("w32font-match", font_spec
, entity
);
203 /* w32 implementation of list_family for font backend.
204 List available families. The value is a list of family names
207 w32font_list_family (frame
)
210 Lisp_Object list
= Qnil
;
211 LOGFONT font_match_pattern
;
213 FRAME_PTR f
= XFRAME (frame
);
215 bzero (&font_match_pattern
, sizeof (font_match_pattern
));
216 font_match_pattern
.lfCharSet
= DEFAULT_CHARSET
;
218 dc
= get_frame_dc (f
);
220 EnumFontFamiliesEx (dc
, &font_match_pattern
,
221 (FONTENUMPROC
) add_font_name_to_list
,
223 release_frame_dc (f
, dc
);
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. */
232 w32font_open (f
, font_entity
, pixel_size
)
234 Lisp_Object font_entity
;
237 Lisp_Object font_object
;
239 font_object
= font_make_object (VECSIZE (struct w32font_info
),
240 font_entity
, pixel_size
);
242 if (!w32font_open_internal (f
, font_entity
, pixel_size
, font_object
))
250 /* w32 implementation of close for font_backend.
251 Close FONT on frame F. */
253 w32font_close (f
, font
)
258 struct w32font_info
*w32_font
= (struct w32font_info
*) font
;
260 /* Delete the GDI font object. */
261 DeleteObject (w32_font
->hfont
);
263 /* Free all the cached metrics. */
264 if (w32_font
->cached_metrics
)
266 for (i
= 0; i
< w32_font
->n_cache_blocks
; i
++)
268 if (w32_font
->cached_metrics
[i
])
269 xfree (w32_font
->cached_metrics
[i
]);
271 xfree (w32_font
->cached_metrics
);
272 w32_font
->cached_metrics
= NULL
;
276 /* w32 implementation of has_char for font backend.
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
282 w32font_has_char (entity
, c
)
286 Lisp_Object supported_scripts
, extra
, script
;
289 extra
= AREF (entity
, FONT_EXTRA_INDEX
);
293 supported_scripts
= assq_no_quit (QCscript
, extra
);
294 if (!CONSP (supported_scripts
))
297 supported_scripts
= XCDR (supported_scripts
);
299 script
= CHAR_TABLE_REF (Vchar_script_table
, c
);
301 return (memq_no_quit (script
, supported_scripts
)) ? -1 : 0;
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. */
308 w32font_encode_char (font
, c
)
320 struct w32font_info
*w32_font
= (struct w32font_info
*) font
;
322 /* If glyph indexing is not working for this font, just return the
323 unicode code-point. */
324 if (!w32_font
->glyph_idx
)
329 /* TODO: Encode as surrogate pair and lookup the glyph. */
330 return FONT_INVALID_CODE
;
338 bzero (&result
, sizeof (result
));
339 result
.lStructSize
= sizeof (result
);
340 result
.lpGlyphs
= out
;
343 f
= XFRAME (selected_frame
);
345 dc
= get_frame_dc (f
);
346 old_font
= SelectObject (dc
, w32_font
->hfont
);
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);
353 SelectObject (dc
, old_font
);
354 release_frame_dc (f
, dc
);
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];
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
);
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. */
385 w32font_text_extents (font
, code
, nglyphs
, metrics
)
389 struct font_metrics
*metrics
;
392 HFONT old_font
= NULL
;
399 struct w32font_info
*w32_font
= (struct w32font_info
*) font
;
403 bzero (metrics
, sizeof (struct font_metrics
));
404 metrics
->ascent
= font
->ascent
;
405 metrics
->descent
= font
->descent
;
407 for (i
= 0; i
< nglyphs
; i
++)
409 struct w32_metric_cache
*char_metric
;
410 int block
= *(code
+ i
) / CACHE_BLOCKSIZE
;
411 int pos_in_block
= *(code
+ i
) % CACHE_BLOCKSIZE
;
413 if (block
>= w32_font
->n_cache_blocks
)
415 if (!w32_font
->cached_metrics
)
416 w32_font
->cached_metrics
417 = xmalloc ((block
+ 1)
418 * sizeof (struct w32_cached_metric
*));
420 w32_font
->cached_metrics
421 = xrealloc (w32_font
->cached_metrics
,
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;
430 if (!w32_font
->cached_metrics
[block
])
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
));
438 char_metric
= w32_font
->cached_metrics
[block
] + pos_in_block
;
440 if (char_metric
->status
== W32METRIC_NO_ATTEMPT
)
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
);
450 dc
= get_frame_dc (f
);
451 old_font
= SelectObject (dc
, w32_font
->hfont
);
453 compute_metrics (dc
, w32_font
, *(code
+ i
), char_metric
);
456 if (char_metric
->status
== W32METRIC_SUCCESS
)
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
;
465 /* If we couldn't get metrics for a char,
466 use alternative method. */
469 /* If we got through everything, return. */
474 /* Restore state and release DC. */
475 SelectObject (dc
, old_font
);
476 release_frame_dc (f
, dc
);
479 return metrics
->width
;
483 /* For non-truetype fonts, GetGlyphOutlineW is not supported, so
484 fallback on other methods that will at least give some of the metric
487 wcode
= alloca (nglyphs
* sizeof (WORD
));
488 for (i
= 0; i
< nglyphs
; i
++)
490 if (code
[i
] < 0x10000)
494 /* TODO: Convert to surrogate, reallocating array if needed */
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
505 f
= XFRAME (selected_frame
);
507 dc
= get_frame_dc (f
);
508 old_font
= SelectObject (dc
, w32_font
->hfont
);
511 if (GetTextExtentPoint32W (dc
, wcode
, nglyphs
, &size
))
513 total_width
= size
.cx
;
516 /* On 95/98/ME, only some unicode functions are available, so fallback
517 on doing a dummy draw to find the total width. */
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
;
527 /* Give our best estimate of the metrics, based on what we know. */
530 metrics
->width
= total_width
- w32_font
->metrics
.tmOverhang
;
531 metrics
->lbearing
= 0;
532 metrics
->rbearing
= total_width
;
535 /* Restore state and release DC. */
536 SelectObject (dc
, old_font
);
537 release_frame_dc (f
, dc
);
542 /* w32 implementation of draw for font backend.
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).
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
556 w32font_draw (s
, from
, to
, x
, y
, with_background
)
557 struct glyph_string
*s
;
558 int from
, to
, x
, y
, with_background
;
562 struct w32font_info
*w32font
= (struct w32font_info
*) s
->font
;
564 options
= w32font
->glyph_idx
;
566 /* Save clip region for later restoration. */
567 GetClipRgn(s
->hdc
, orig_clip
);
569 if (s
->num_clips
> 0)
571 HRGN new_clip
= CreateRectRgnIndirect (s
->clip
);
573 if (s
->num_clips
> 1)
575 HRGN clip2
= CreateRectRgnIndirect (s
->clip
+ 1);
577 CombineRgn (new_clip
, new_clip
, clip2
, RGN_OR
);
578 DeleteObject (clip2
);
581 SelectClipRgn (s
->hdc
, new_clip
);
582 DeleteObject (new_clip
);
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
);
592 struct font
*font
= s
->font
;
594 brush
= CreateSolidBrush (s
->gc
->background
);
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
);
605 int len
= to
- from
, i
;
607 for (i
= 0; i
< len
; i
++)
608 ExtTextOutW (s
->hdc
, x
+ i
, y
, options
, NULL
,
609 s
->char2b
+ from
+ i
, 1, NULL
);
612 ExtTextOutW (s
->hdc
, x
, y
, options
, NULL
, s
->char2b
+ from
, to
- from
, NULL
);
614 /* Restore clip region. */
615 if (s
->num_clips
> 0)
617 SelectClipRgn (s
->hdc
, orig_clip
);
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.
625 w32font_free_entity (Lisp_Object entity);
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.
634 w32font_prepare_face (FRAME_PTR f, struct face *face);
636 /* w32 implementation of done_face for font backend.
638 Done FACE for displaying characters by FACE->font on frame F.
640 w32font_done_face (FRAME_PTR f, struct face *face); */
642 /* w32 implementation of get_bitmap for font backend.
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
648 w32font_get_bitmap (struct font *font, unsigned code,
649 struct font_bitmap *bitmap, int bits_per_pixel);
651 /* w32 implementation of free_bitmap for font backend.
653 Free bitmap data in BITMAP.
655 w32font_free_bitmap (struct font *font, struct font_bitmap *bitmap);
657 /* w32 implementation of get_outline for font backend.
659 Return an outline data for glyph-code CODE of FONT. The format
660 of the outline data depends on the font-driver.
662 w32font_get_outline (struct font *font, unsigned code);
664 /* w32 implementation of free_outline for font backend.
666 Free OUTLINE (that is obtained by the above method).
668 w32font_free_outline (struct font *font, void *outline);
670 /* w32 implementation of anchor_point for font backend.
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.
676 w32font_anchor_point (struct font *font, unsigned code,
677 int index, int *x, int *y);
679 /* w32 implementation of otf_capability for font backend.
681 Return a list describing which scripts/languages FONT
682 supports by which GSUB/GPOS features of OpenType tables.
684 w32font_otf_capability (struct font *font);
686 /* w32 implementation of otf_drive for font backend.
688 Apply FONT's OTF-FEATURES to the glyph string.
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.
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
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
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);
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. */
713 w32font_list_internal (frame
, font_spec
, opentype_only
)
714 Lisp_Object frame
, font_spec
;
717 struct font_callback_data match_data
;
719 FRAME_PTR f
= XFRAME (frame
);
721 match_data
.orig_font_spec
= font_spec
;
722 match_data
.list
= Qnil
;
723 match_data
.frame
= frame
;
725 bzero (&match_data
.pattern
, sizeof (LOGFONT
));
726 fill_in_logfont (f
, &match_data
.pattern
, font_spec
);
728 match_data
.opentype_only
= opentype_only
;
730 match_data
.pattern
.lfOutPrecision
= OUT_OUTLINE_PRECIS
;
732 if (match_data
.pattern
.lfFaceName
[0] == '\0')
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
);
740 dc
= get_frame_dc (f
);
742 EnumFontFamiliesEx (dc
, &match_data
.pattern
,
743 (FONTENUMPROC
) add_font_entity_to_list
,
744 (LPARAM
) &match_data
, 0);
745 release_frame_dc (f
, dc
);
748 return NILP (match_data
.list
) ? Qnil
: match_data
.list
;
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. */
755 w32font_match_internal (frame
, font_spec
, opentype_only
)
756 Lisp_Object frame
, font_spec
;
759 struct font_callback_data match_data
;
761 FRAME_PTR f
= XFRAME (frame
);
763 match_data
.orig_font_spec
= font_spec
;
764 match_data
.frame
= frame
;
765 match_data
.list
= Qnil
;
767 bzero (&match_data
.pattern
, sizeof (LOGFONT
));
768 fill_in_logfont (f
, &match_data
.pattern
, font_spec
);
770 match_data
.opentype_only
= opentype_only
;
772 match_data
.pattern
.lfOutPrecision
= OUT_OUTLINE_PRECIS
;
774 dc
= get_frame_dc (f
);
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
);
781 return NILP (match_data
.list
) ? Qnil
: XCAR (match_data
.list
);
785 w32font_open_internal (f
, font_entity
, pixel_size
, font_object
)
787 Lisp_Object font_entity
;
789 Lisp_Object font_object
;
794 HFONT hfont
, old_font
;
795 Lisp_Object val
, extra
;
796 struct w32font_info
*w32_font
;
798 OUTLINETEXTMETRIC
* metrics
= NULL
;
800 w32_font
= (struct w32font_info
*) XFONT_OBJECT (font_object
);
801 font
= (struct font
*) w32_font
;
806 bzero (&logfont
, sizeof (logfont
));
807 fill_in_logfont (f
, &logfont
, font_entity
);
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
;
815 size
= XINT (AREF (font_entity
, FONT_SIZE_INDEX
));
819 logfont
.lfHeight
= -size
;
820 hfont
= CreateFontIndirect (&logfont
);
825 /* Get the metrics for this font. */
826 dc
= get_frame_dc (f
);
827 old_font
= SelectObject (dc
, hfont
);
829 /* Try getting the outline metrics (only works for truetype fonts). */
830 len
= GetOutlineTextMetrics (dc
, 0, NULL
);
833 metrics
= (OUTLINETEXTMETRIC
*) alloca (len
);
834 if (GetOutlineTextMetrics (dc
, len
, metrics
))
835 bcopy (&metrics
->otmTextMetrics
, &w32_font
->metrics
,
836 sizeof (TEXTMETRIC
));
840 /* If it supports outline metrics, it should support Glyph Indices. */
841 w32_font
->glyph_idx
= ETO_GLYPH_INDEX
;
846 GetTextMetrics (dc
, &w32_font
->metrics
);
847 w32_font
->glyph_idx
= 0;
850 w32_font
->cached_metrics
= NULL
;
851 w32_font
->n_cache_blocks
= 0;
853 SelectObject (dc
, old_font
);
854 release_frame_dc (f
, dc
);
856 w32_font
->hfont
= hfont
;
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. */
865 while (name
&& w32font_full_name (&logfont
, font_entity
, pixel_size
,
872 font
->props
[FONT_FULLNAME_INDEX
]
873 = make_unibyte_string (name
, strlen (name
));
875 font
->props
[FONT_FULLNAME_INDEX
] =
876 make_unibyte_string (logfont
.lfFaceName
, len
);
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
;
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
);
897 val
= assq_no_quit (QCformat
, extra
);
899 font
->props
[FONT_FORMAT_INDEX
] = XCDR (val
);
901 font
->props
[FONT_FORMAT_INDEX
] = Qunknown
;
904 font
->props
[FONT_FORMAT_INDEX
] = Qunknown
;
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
;
916 font
->underline_thickness
= metrics
->otmsUnderscoreSize
;
917 font
->underline_position
= -metrics
->otmsUnderscorePosition
;
921 font
->underline_thickness
= 0;
922 font
->underline_position
= -1;
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
);
934 /* Callback function for EnumFontFamiliesEx.
935 * Adds the name of a font to a Lisp list (passed in as the lParam arg). */
937 add_font_name_to_list (logical_font
, physical_font
, font_type
, list_object
)
938 ENUMLOGFONTEX
*logical_font
;
939 NEWTEXTMETRICEX
*physical_font
;
943 Lisp_Object
* list
= (Lisp_Object
*) list_object
;
946 /* Skip vertical fonts (intended only for printing) */
947 if (logical_font
->elfLogFont
.lfFaceName
[0] == '@')
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
);
958 static int w32_decode_weight
P_ ((int));
959 static int w32_encode_weight
P_ ((int));
961 /* Convert an enumerated Windows font to an Emacs font entity. */
963 w32_enumfont_pattern_entity (frame
, logical_font
, physical_font
,
964 font_type
, requested_font
, backend
)
966 ENUMLOGFONTEX
*logical_font
;
967 NEWTEXTMETRICEX
*physical_font
;
969 LOGFONT
*requested_font
;
972 Lisp_Object entity
, tem
;
973 LOGFONT
*lf
= (LOGFONT
*) logical_font
;
975 DWORD full_type
= physical_font
->ntmTm
.ntmFlags
;
977 entity
= font_make_entity ();
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
);
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
)
988 else if (lf
->lfOutPrecision
== OUT_STROKE_PRECIS
)
993 ASET (entity
, FONT_FOUNDRY_INDEX
, tem
);
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
)
1000 else if (generic_type
== FF_MODERN
)
1002 else if (generic_type
== FF_ROMAN
)
1004 else if (generic_type
== FF_SCRIPT
)
1006 else if (generic_type
== FF_SWISS
)
1011 ASET (entity
, FONT_ADSTYLE_INDEX
, tem
);
1013 if (physical_font
->ntmTm
.tmPitchAndFamily
& 0x01)
1014 ASET (entity
, FONT_SPACING_INDEX
, make_number (FONT_SPACING_PROPORTIONAL
));
1016 ASET (entity
, FONT_SPACING_INDEX
, make_number (FONT_SPACING_CHARCELL
));
1018 if (requested_font
->lfQuality
!= DEFAULT_QUALITY
)
1020 font_put_extra (entity
, QCantialias
,
1021 lispy_antialias_type (requested_font
->lfQuality
));
1023 ASET (entity
, FONT_FAMILY_INDEX
,
1024 font_intern_prop (lf
->lfFaceName
, strlen (lf
->lfFaceName
), 1));
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
1032 FONT_SET_STYLE (entity
, FONT_WIDTH_INDEX
, make_number (100));
1034 if (font_type
& RASTER_FONTTYPE
)
1035 ASET (entity
, FONT_SIZE_INDEX
, make_number (physical_font
->ntmTm
.tmHeight
));
1037 ASET (entity
, FONT_SIZE_INDEX
, make_number (0));
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
)
1043 tem
= font_supported_scripts (&physical_font
->ntmFontSig
);
1045 font_put_extra (entity
, QCscript
, tem
);
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");
1064 tem
= intern ("w32vector");
1066 font_put_extra (entity
, QCformat
, tem
);
1072 /* Convert generic families to the family portion of lfPitchAndFamily. */
1074 w32_generic_family (Lisp_Object name
)
1076 /* Generic families. */
1077 if (EQ (name
, Qmonospace
) || EQ (name
, Qmono
))
1079 else if (EQ (name
, Qsans
) || EQ (name
, Qsans_serif
) || EQ (name
, Qsansserif
))
1081 else if (EQ (name
, Qserif
))
1083 else if (EQ (name
, Qdecorative
))
1084 return FF_DECORATIVE
;
1085 else if (EQ (name
, Qscript
))
1092 logfonts_match (font
, pattern
)
1093 LOGFONT
*font
, *pattern
;
1095 /* Only check height for raster fonts. */
1096 if (pattern
->lfHeight
&& font
->lfOutPrecision
== OUT_STRING_PRECIS
1097 && font
->lfHeight
!= pattern
->lfHeight
)
1100 /* Have some flexibility with weights. */
1101 if (pattern
->lfWeight
1102 && ((font
->lfWeight
< (pattern
->lfWeight
- 150))
1103 || font
->lfWeight
> (pattern
->lfWeight
+ 150)))
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. */
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))
1117 font_matches_spec (type
, font
, spec
, backend
, logfont
)
1119 NEWTEXTMETRICEX
*font
;
1121 Lisp_Object backend
;
1124 Lisp_Object extra
, val
;
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". */
1129 int slant
= FONT_SLANT_NUMERIC (spec
);
1132 && ((slant
> 150 && !font
->ntmTm
.tmItalic
)
1133 || (slant
<= 150 && font
->ntmTm
.tmItalic
)))
1137 /* Check adstyle against generic family. */
1138 val
= AREF (spec
, FONT_ADSTYLE_INDEX
);
1141 BYTE family
= w32_generic_family (val
);
1142 if (family
!= FF_DONTCARE
1143 && family
!= (font
->ntmTm
.tmPitchAndFamily
& 0xF0))
1148 val
= AREF (spec
, FONT_SPACING_INDEX
);
1151 int spacing
= XINT (val
);
1152 int proportional
= (spacing
< FONT_SPACING_MONO
);
1154 if ((proportional
&& !(font
->ntmTm
.tmPitchAndFamily
& 0x01))
1155 || (!proportional
&& (font
->ntmTm
.tmPitchAndFamily
& 0x01)))
1159 /* Check extra parameters. */
1160 for (extra
= AREF (spec
, FONT_EXTRA_INDEX
);
1161 CONSP (extra
); extra
= XCDR (extra
))
1163 Lisp_Object extra_entry
;
1164 extra_entry
= XCAR (extra
);
1165 if (CONSP (extra_entry
))
1167 Lisp_Object key
= XCAR (extra_entry
);
1169 val
= XCDR (extra_entry
);
1170 if (EQ (key
, QCscript
) && SYMBOLP (val
))
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
)
1179 = font_supported_scripts (&font
->ntmFontSig
);
1180 if (! memq_no_quit (val
, support
))
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,
1189 if (EQ (val
, Qlatin
))
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
)
1197 else if (EQ (val
, Qsymbol
))
1199 if (font
->ntmTm
.tmCharSet
!= SYMBOL_CHARSET
)
1202 else if (EQ (val
, Qcyrillic
))
1204 if (font
->ntmTm
.tmCharSet
!= RUSSIAN_CHARSET
)
1207 else if (EQ (val
, Qgreek
))
1209 if (font
->ntmTm
.tmCharSet
!= GREEK_CHARSET
)
1212 else if (EQ (val
, Qarabic
))
1214 if (font
->ntmTm
.tmCharSet
!= ARABIC_CHARSET
)
1217 else if (EQ (val
, Qhebrew
))
1219 if (font
->ntmTm
.tmCharSet
!= HEBREW_CHARSET
)
1222 else if (EQ (val
, Qthai
))
1224 if (font
->ntmTm
.tmCharSet
!= THAI_CHARSET
)
1227 else if (EQ (val
, Qkana
))
1229 if (font
->ntmTm
.tmCharSet
!= SHIFTJIS_CHARSET
)
1232 else if (EQ (val
, Qbopomofo
))
1234 if (font
->ntmTm
.tmCharSet
!= CHINESEBIG5_CHARSET
)
1237 else if (EQ (val
, Qhangul
))
1239 if (font
->ntmTm
.tmCharSet
!= HANGUL_CHARSET
1240 && font
->ntmTm
.tmCharSet
!= JOHAB_CHARSET
)
1243 else if (EQ (val
, Qhan
))
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
)
1253 /* Other scripts unlikely to be handled by non-truetype
1258 else if (EQ (key
, QClang
) && SYMBOLP (val
))
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. */
1267 if (!(font
->ntmFontSig
.fsCsb
[0] & CSB_JAPANESE
))
1270 else if (EQ (val
, Qko
))
1272 if (!(font
->ntmFontSig
.fsCsb
[0] & CSB_KOREAN
))
1275 else if (EQ (val
, Qzh
))
1277 if (!(font
->ntmFontSig
.fsCsb
[0] & CSB_CHINESE
))
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. */
1290 else if (EQ (key
, QCotf
) && CONSP (val
))
1292 /* OTF features only supported by the uniscribe backend. */
1293 if (EQ (backend
, Quniscribe
))
1295 if (!uniscribe_check_otf (logfont
, val
))
1307 w32font_coverage_ok (coverage
, charset
)
1308 FONTSIGNATURE
* coverage
;
1311 DWORD subrange1
= coverage
->fsUsb
[1];
1313 #define SUBRANGE1_HAN_MASK 0x08000000
1314 #define SUBRANGE1_HANGEUL_MASK 0x01000000
1315 #define SUBRANGE1_JAPANESE_MASK (0x00060000 | SUBRANGE1_HAN_MASK)
1317 if (charset
== GB2312_CHARSET
|| charset
== CHINESEBIG5_CHARSET
)
1319 return (subrange1
& SUBRANGE1_HAN_MASK
) == SUBRANGE1_HAN_MASK
;
1321 else if (charset
== SHIFTJIS_CHARSET
)
1323 return (subrange1
& SUBRANGE1_JAPANESE_MASK
) == SUBRANGE1_JAPANESE_MASK
;
1325 else if (charset
== HANGEUL_CHARSET
)
1327 return (subrange1
& SUBRANGE1_HANGEUL_MASK
) == SUBRANGE1_HANGEUL_MASK
;
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. */
1339 add_font_entity_to_list (logical_font
, physical_font
, font_type
, lParam
)
1340 ENUMLOGFONTEX
*logical_font
;
1341 NEWTEXTMETRICEX
*physical_font
;
1345 struct font_callback_data
*match_data
1346 = (struct font_callback_data
*) lParam
;
1347 Lisp_Object backend
= match_data
->opentype_only
? Quniscribe
: Qgdi
;
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
)))
1376 = w32_enumfont_pattern_entity (match_data
->frame
, logical_font
,
1377 physical_font
, font_type
,
1378 &match_data
->pattern
,
1382 Lisp_Object spec_charset
= AREF (match_data
->orig_font_spec
,
1383 FONT_REGISTRY_INDEX
);
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
)
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
)
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
);
1410 match_data
->list
= Fcons (entity
, match_data
->list
);
1412 /* If no registry specified, duplicate iso8859-1 truetype fonts
1414 if (NILP (spec_charset
)
1415 && font_type
== TRUETYPE_FONTTYPE
1416 && logical_font
->elfLogFont
.lfCharSet
== ANSI_CHARSET
)
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
);
1427 /* Callback function for EnumFontFamiliesEx.
1428 * Terminates the search once we have a match. */
1430 add_one_font_entity_to_list (logical_font
, physical_font
, font_type
, lParam
)
1431 ENUMLOGFONTEX
*logical_font
;
1432 NEWTEXTMETRICEX
*physical_font
;
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
);
1440 /* If we have a font in the list, terminate the search. */
1441 return !NILP (match_data
->list
);
1444 /* Old function to convert from x to w32 charset, from w32fns.c. */
1446 x_to_w32_charset (lpcs
)
1449 Lisp_Object this_entry
, w32_charset
;
1451 int len
= strlen (lpcs
);
1453 /* Support "*-#nnn" format for unknown charsets. */
1454 if (strncmp (lpcs
, "*-#", 3) == 0)
1455 return atoi (lpcs
+ 3);
1457 /* All Windows fonts qualify as unicode. */
1458 if (!strncmp (lpcs
, "iso10646", 8))
1459 return DEFAULT_CHARSET
;
1461 /* Handle wildcards by ignoring them; eg. treat "big5*-*" as "big5". */
1462 charset
= alloca (len
+ 1);
1463 strcpy (charset
, lpcs
);
1464 lpcs
= strchr (charset
, '*');
1468 /* Look through w32-charset-info-alist for the character set.
1469 Format of each entry is
1470 (CHARSET_NAME . (WINDOWS_CHARSET . CODEPAGE)).
1472 this_entry
= Fassoc (build_string (charset
), Vw32_charset_info_alist
);
1474 if (NILP (this_entry
))
1476 /* At startup, we want iso8859-1 fonts to come up properly. */
1477 if (xstrcasecmp (charset
, "iso8859-1") == 0)
1478 return ANSI_CHARSET
;
1480 return DEFAULT_CHARSET
;
1483 w32_charset
= Fcar (Fcdr (this_entry
));
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
))
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
))
1523 return DEFAULT_CHARSET
;
1527 /* Convert a Lisp font registry (symbol) to a windows charset. */
1529 registry_to_w32_charset (charset
)
1530 Lisp_Object charset
;
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
)));
1540 return DEFAULT_CHARSET
;
1543 /* Old function to convert from w32 to x charset, from w32fns.c. */
1545 w32_to_x_charset (fncharset
, matching
)
1549 static char buf
[32];
1550 Lisp_Object charset_type
;
1555 /* If fully specified, accept it as it is. Otherwise use a
1557 char *wildcard
= strchr (matching
, '*');
1560 else if (strchr (matching
, '-'))
1563 match_len
= strlen (matching
);
1569 /* Handle startup case of w32-charset-info-alist not
1570 being set up yet. */
1571 if (NILP (Vw32_charset_info_alist
))
1573 charset_type
= Qw32_charset_ansi
;
1575 case DEFAULT_CHARSET
:
1576 charset_type
= Qw32_charset_default
;
1578 case SYMBOL_CHARSET
:
1579 charset_type
= Qw32_charset_symbol
;
1581 case SHIFTJIS_CHARSET
:
1582 charset_type
= Qw32_charset_shiftjis
;
1584 case HANGEUL_CHARSET
:
1585 charset_type
= Qw32_charset_hangeul
;
1587 case GB2312_CHARSET
:
1588 charset_type
= Qw32_charset_gb2312
;
1590 case CHINESEBIG5_CHARSET
:
1591 charset_type
= Qw32_charset_chinesebig5
;
1594 charset_type
= Qw32_charset_oem
;
1596 case EASTEUROPE_CHARSET
:
1597 charset_type
= Qw32_charset_easteurope
;
1599 case TURKISH_CHARSET
:
1600 charset_type
= Qw32_charset_turkish
;
1602 case BALTIC_CHARSET
:
1603 charset_type
= Qw32_charset_baltic
;
1605 case RUSSIAN_CHARSET
:
1606 charset_type
= Qw32_charset_russian
;
1608 case ARABIC_CHARSET
:
1609 charset_type
= Qw32_charset_arabic
;
1612 charset_type
= Qw32_charset_greek
;
1614 case HEBREW_CHARSET
:
1615 charset_type
= Qw32_charset_hebrew
;
1617 case VIETNAMESE_CHARSET
:
1618 charset_type
= Qw32_charset_vietnamese
;
1621 charset_type
= Qw32_charset_thai
;
1624 charset_type
= Qw32_charset_mac
;
1627 charset_type
= Qw32_charset_johab
;
1631 /* Encode numerical value of unknown charset. */
1632 sprintf (buf
, "*-#%u", fncharset
);
1638 char * best_match
= NULL
;
1639 int matching_found
= 0;
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.
1645 Format of each entry is
1646 (CHARSET_NAME . (WINDOWS_CHARSET . CODEPAGE)).
1648 for (rest
= Vw32_charset_info_alist
; CONSP (rest
); rest
= XCDR (rest
))
1651 Lisp_Object w32_charset
;
1652 Lisp_Object codepage
;
1654 Lisp_Object this_entry
= XCAR (rest
);
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
))))
1662 x_charset
= SDATA (XCAR (this_entry
));
1663 w32_charset
= XCAR (XCDR (this_entry
));
1664 codepage
= XCDR (XCDR (this_entry
));
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
))))
1672 /* If we don't have a match already, then this is the
1676 best_match
= x_charset
;
1677 if (matching
&& !strnicmp (x_charset
, matching
, match_len
))
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
))
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
))
1690 best_match
= x_charset
;
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
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)
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
;
1716 /* If no match, encode the numeric value. */
1719 sprintf (buf
, "*-#%u", fncharset
);
1723 strncpy (buf
, best_match
, 31);
1724 /* If the charset is not fully specified, put -0 on the end. */
1725 if (!strchr (best_match
, '-'))
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. */
1733 strcpy (buf
+ pos
, "-0");
1741 w32_registry (w32_charset
, font_type
)
1747 /* If charset is defaulted, charset is unicode or unknown, depending on
1749 if (w32_charset
== DEFAULT_CHARSET
)
1750 return font_type
== TRUETYPE_FONTTYPE
? Qiso10646_1
: Qunknown
;
1752 charset
= w32_to_x_charset (w32_charset
, NULL
);
1753 return font_intern_prop (charset
, strlen(charset
), 1);
1757 w32_decode_weight (fnweight
)
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;
1772 w32_encode_weight (n
)
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
;
1786 /* Convert a Windows font weight into one of the weights supported
1787 by fontconfig (see font.c:font_parse_fcname). */
1789 w32_to_fc_weight (n
)
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");
1799 /* Fill in all the available details of LOGFONT from FONT_SPEC. */
1801 fill_in_logfont (f
, logfont
, font_spec
)
1804 Lisp_Object font_spec
;
1806 Lisp_Object tmp
, extra
;
1807 int dpi
= FRAME_W32_DISPLAY_INFO (f
)->resy
;
1809 tmp
= AREF (font_spec
, FONT_DPI_INDEX
);
1814 else if (FLOATP (tmp
))
1816 dpi
= (int) (XFLOAT_DATA (tmp
) + 0.5);
1820 tmp
= AREF (font_spec
, FONT_SIZE_INDEX
);
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);
1831 tmp
= AREF (font_spec
, FONT_WEIGHT_INDEX
);
1833 logfont
->lfWeight
= w32_encode_weight (FONT_WEIGHT_NUMERIC (font_spec
));
1836 tmp
= AREF (font_spec
, FONT_SLANT_INDEX
);
1839 int slant
= FONT_SLANT_NUMERIC (font_spec
);
1840 logfont
->lfItalic
= slant
> 150 ? 1 : 0;
1848 tmp
= AREF (font_spec
, FONT_REGISTRY_INDEX
);
1850 logfont
->lfCharSet
= registry_to_w32_charset (tmp
);
1852 logfont
->lfCharSet
= DEFAULT_CHARSET
;
1856 /* Clip Precision */
1859 logfont
->lfQuality
= DEFAULT_QUALITY
;
1861 /* Generic Family and Face Name */
1862 logfont
->lfPitchAndFamily
= FF_DONTCARE
| DEFAULT_PITCH
;
1864 tmp
= AREF (font_spec
, FONT_FAMILY_INDEX
);
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
1872 else if (SYMBOLP (tmp
))
1873 strncpy (logfont
->lfFaceName
, SDATA (SYMBOL_NAME (tmp
)), LF_FACESIZE
);
1876 tmp
= AREF (font_spec
, FONT_ADSTYLE_INDEX
);
1879 /* Override generic family. */
1880 BYTE family
= w32_generic_family (tmp
);
1881 if (family
!= FF_DONTCARE
)
1882 logfont
->lfPitchAndFamily
= family
| DEFAULT_PITCH
;
1886 /* Set pitch based on the spacing property. */
1887 tmp
= AREF (font_spec
, FONT_SPACING_INDEX
);
1890 int spacing
= XINT (tmp
);
1891 if (spacing
< FONT_SPACING_MONO
)
1892 logfont
->lfPitchAndFamily
1893 = logfont
->lfPitchAndFamily
& 0xF0 | VARIABLE_PITCH
;
1895 logfont
->lfPitchAndFamily
1896 = logfont
->lfPitchAndFamily
& 0xF0 | FIXED_PITCH
;
1899 /* Process EXTRA info. */
1900 for (extra
= AREF (font_spec
, FONT_EXTRA_INDEX
);
1901 CONSP (extra
); extra
= XCDR (extra
))
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
1914 if (EQ (key
, QCscript
)
1915 && logfont
->lfCharSet
== DEFAULT_CHARSET
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
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
;
1941 else if (EQ (key
, QCantialias
) && SYMBOLP (val
))
1943 logfont
->lfQuality
= w32_antialias_type (val
);
1950 list_all_matching_fonts (match_data
)
1951 struct font_callback_data
*match_data
;
1954 Lisp_Object families
= w32font_list_family (match_data
->frame
);
1955 struct frame
*f
= XFRAME (match_data
->frame
);
1957 dc
= get_frame_dc (f
);
1959 while (!NILP (families
))
1961 /* TODO: Use the Unicode versions of the W32 APIs, so we can
1962 handle non-ASCII font names. */
1964 Lisp_Object family
= CAR (families
);
1965 families
= CDR (families
);
1968 else if (SYMBOLP (family
))
1969 name
= SDATA (SYMBOL_NAME (family
));
1973 strncpy (match_data
->pattern
.lfFaceName
, name
, LF_FACESIZE
);
1974 match_data
->pattern
.lfFaceName
[LF_FACESIZE
- 1] = '\0';
1976 EnumFontFamiliesEx (dc
, &match_data
->pattern
,
1977 (FONTENUMPROC
) add_font_entity_to_list
,
1978 (LPARAM
) match_data
, 0);
1981 release_frame_dc (f
, dc
);
1985 lispy_antialias_type (type
)
1992 case NONANTIALIASED_QUALITY
:
1995 case ANTIALIASED_QUALITY
:
1998 case CLEARTYPE_QUALITY
:
2001 case CLEARTYPE_NATURAL_QUALITY
:
2011 /* Convert antialiasing symbols to lfQuality */
2013 w32_antialias_type (type
)
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
;
2025 return DEFAULT_QUALITY
;
2028 /* Return a list of all the scripts that the font supports. */
2030 font_supported_scripts (FONTSIGNATURE
* sig
)
2032 DWORD
* subranges
= sig
->fsUsb
;
2033 Lisp_Object supported
= Qnil
;
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)
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)
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. */
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
);
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. */
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
);
2143 /* Missing: Tai Viet (U+AA80) and Cham (U+AA00) . */
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". */
2154 w32font_full_name (font
, font_obj
, pixel_size
, name
, nbytes
)
2156 Lisp_Object font_obj
;
2161 int len
, height
, outline
;
2163 Lisp_Object antialiasing
, weight
= Qnil
;
2165 len
= strlen (font
->lfFaceName
);
2167 outline
= EQ (AREF (font_obj
, FONT_FOUNDRY_INDEX
), Qoutline
);
2169 /* Represent size of scalable fonts by point size. But use pixelsize for
2170 raster fonts to indicate that they are exactly that size. */
2172 len
+= 11; /* -SIZE */
2177 len
+= 7; /* :italic */
2179 if (font
->lfWeight
&& font
->lfWeight
!= FW_NORMAL
)
2181 weight
= w32_to_fc_weight (font
->lfWeight
);
2182 len
+= 1 + SBYTES (SYMBOL_NAME (weight
)); /* :WEIGHT */
2185 antialiasing
= lispy_antialias_type (font
->lfQuality
);
2186 if (! NILP (antialiasing
))
2187 len
+= 11 + SBYTES (SYMBOL_NAME (antialiasing
)); /* :antialias=NAME */
2189 /* Check that the buffer is big enough */
2194 p
+= sprintf (p
, "%s", font
->lfFaceName
);
2196 height
= font
->lfHeight
? eabs (font
->lfHeight
) : pixel_size
;
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
);
2209 p
+= sprintf (p
, ":pixelsize=%d", height
);
2212 if (SYMBOLP (weight
) && ! NILP (weight
))
2213 p
+= sprintf (p
, ":%s", SDATA (SYMBOL_NAME (weight
)));
2216 p
+= sprintf (p
, ":italic");
2218 if (SYMBOLP (antialiasing
) && ! NILP (antialiasing
))
2219 p
+= sprintf (p
, ":antialias=%s", SDATA (SYMBOL_NAME (antialiasing
)));
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
)
2238 Lisp_Object weight
= Qnil
;
2240 len
= strlen (font
->lfFaceName
) + 2;
2241 height
= pointsize
/ 10;
2242 while (height
/= 10)
2249 len
+= 7; /* :italic */
2250 if (font
->lfWeight
&& font
->lfWeight
!= FW_NORMAL
)
2252 weight
= w32_to_fc_weight (font
->lfWeight
);
2253 len
+= SBYTES (SYMBOL_NAME (weight
)) + 1;
2259 p
+= sprintf (p
, "%s-%d", font
->lfFaceName
, pointsize
/ 10);
2261 p
+= sprintf (p
, ".%d", pointsize
% 10);
2263 if (SYMBOLP (weight
) && !NILP (weight
))
2264 p
+= sprintf (p
, ":%s", SDATA (SYMBOL_NAME (weight
)));
2267 p
+= sprintf (p
, ":italic");
2269 return (p
- fcname
);
2273 compute_metrics (dc
, w32_font
, code
, metrics
)
2275 struct w32font_info
*w32_font
;
2277 struct w32_metric_cache
*metrics
;
2281 unsigned int options
= GGO_METRICS
;
2283 if (w32_font
->glyph_idx
)
2284 options
|= GGO_GLYPH_INDEX
;
2286 bzero (&transform
, sizeof (transform
));
2287 transform
.eM11
.value
= 1;
2288 transform
.eM22
.value
= 1;
2290 if (GetGlyphOutlineW (dc
, code
, options
, &gm
, 0, NULL
, &transform
)
2293 metrics
->lbearing
= gm
.gmptGlyphOrigin
.x
;
2294 metrics
->rbearing
= gm
.gmptGlyphOrigin
.x
+ gm
.gmBlackBoxX
;
2295 metrics
->width
= gm
.gmCellIncX
;
2296 metrics
->status
= W32METRIC_SUCCESS
;
2298 else if (w32_font
->glyph_idx
)
2300 /* Can't use glyph indexes after all.
2301 Avoid it in future, and clear any metrics that were based on
2303 w32_font
->glyph_idx
= 0;
2304 clear_cached_metrics (w32_font
);
2307 metrics
->status
= W32METRIC_FAIL
;
2311 clear_cached_metrics (w32_font
)
2312 struct w32font_info
*w32_font
;
2315 for (i
= 0; i
< w32_font
->n_cache_blocks
; i
++)
2317 if (w32_font
->cached_metrics
[i
])
2318 bzero (w32_font
->cached_metrics
[i
],
2319 CACHE_BLOCKSIZE
* sizeof (struct font_metrics
));
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.
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
;
2333 FRAME_PTR f
= check_x_frame (frame
);
2341 bzero (&cf
, sizeof (cf
));
2342 bzero (&lf
, sizeof (lf
));
2344 cf
.lStructSize
= sizeof (cf
);
2345 cf
.hwndOwner
= FRAME_W32_WINDOW (f
);
2346 cf
.Flags
= CF_FORCEFONTEXIST
| CF_SCREENFONTS
| CF_NOVERTFONTS
;
2348 /* Unless include_proportional is non-nil, limit the selection to
2349 monospaced fonts. */
2350 if (NILP (include_proportional
))
2351 cf
.Flags
|= CF_FIXEDPITCHONLY
;
2355 /* Initialize as much of the font details as we can from the current
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
))
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
;
2370 SelectObject (hdc
, oldobj
);
2371 ReleaseDC (FRAME_W32_WINDOW (f
), hdc
);
2373 if (!ChooseFont (&cf
)
2374 || logfont_to_fcname (&lf
, cf
.iPointSize
, buf
, 100) < 0)
2377 return build_string (buf
);
2380 struct font_driver w32font_driver
=
2383 0, /* case insensitive */
2387 w32font_list_family
,
2388 NULL
, /* free_entity */
2391 NULL
, /* prepare_face */
2392 NULL
, /* done_face */
2394 w32font_encode_char
,
2395 w32font_text_extents
,
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 */
2410 /* Initialize state that does not change between invocations. This is only
2411 called when Emacs is dumped. */
2415 DEFSYM (Qgdi
, "gdi");
2416 DEFSYM (Quniscribe
, "uniscribe");
2417 DEFSYM (QCformat
, ":format");
2419 /* Generic font families. */
2420 DEFSYM (Qmonospace
, "monospace");
2421 DEFSYM (Qserif
, "serif");
2422 DEFSYM (Qsansserif
, "sansserif");
2423 DEFSYM (Qscript
, "script");
2424 DEFSYM (Qdecorative
, "decorative");
2426 DEFSYM (Qsans_serif
, "sans_serif");
2427 DEFSYM (Qsans
, "sans");
2428 DEFSYM (Qmono
, "mono");
2430 /* Fake foundries. */
2431 DEFSYM (Qraster
, "raster");
2432 DEFSYM (Qoutline
, "outline");
2433 DEFSYM (Qunknown
, "unknown");
2436 DEFSYM (Qstandard
, "standard");
2437 DEFSYM (Qsubpixel
, "subpixel");
2438 DEFSYM (Qnatural
, "natural");
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");
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");
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:
2523 (CHARSET_NAME . (WINDOWS_CHARSET . CODEPAGE))
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:
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,
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
;
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");
2562 defsubr (&Sx_select_font
);
2564 w32font_driver
.type
= Qgdi
;
2565 register_font_driver (&w32font_driver
, NULL
);
2568 /* arch-tag: 65b8a3cd-46aa-4c0d-a1f3-99e75b9c07ee
2569 (do not change this comment) */