annotate src/w32font.c @ 93638:bab9812286c1

Update for cal-julian name changes.
author Glenn Morris <rgm@gnu.org>
date Fri, 04 Apr 2008 07:05:59 +0000
parents 6b92cdd67bfb
children 7fb9a5b86fa8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1 /* Font backend for the Microsoft W32 API.
91447
15ea95e2d57b Update copyright years and GPL version.
Glenn Morris <rgm@gnu.org>
parents: 91264
diff changeset
2 Copyright (C) 2007, 2008 Free Software Foundation, Inc.
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
3
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
4 This file is part of GNU Emacs.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
5
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
6 GNU Emacs is free software; you can redistribute it and/or modify
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
7 it under the terms of the GNU General Public License as published by
91447
15ea95e2d57b Update copyright years and GPL version.
Glenn Morris <rgm@gnu.org>
parents: 91264
diff changeset
8 the Free Software Foundation; either version 3, or (at your option)
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
9 any later version.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
10
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
11 GNU Emacs is distributed in the hope that it will be useful,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
14 GNU General Public License for more details.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
15
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
17 along with GNU Emacs; see the file COPYING. If not, write to
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
18 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
19 Boston, MA 02110-1301, USA. */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
20
92472
dba28a9d071a Wrap in USE_FONT_BACKEND conditional
Jason Rumney <jasonr@gnu.org>
parents: 92413
diff changeset
21 #ifdef USE_FONT_BACKEND
dba28a9d071a Wrap in USE_FONT_BACKEND conditional
Jason Rumney <jasonr@gnu.org>
parents: 92413
diff changeset
22
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
23 #include <config.h>
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
24 #include <windows.h>
92413
dc438f2fa078 Include math.h.
Juanma Barranquero <lekktu@gmail.com>
parents: 92411
diff changeset
25 #include <math.h>
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
26
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
27 #include "lisp.h"
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
28 #include "w32term.h"
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
29 #include "frame.h"
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
30 #include "dispextern.h"
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
31 #include "character.h"
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
32 #include "charset.h"
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
33 #include "fontset.h"
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
34 #include "font.h"
91208
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
35 #include "w32font.h"
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
36
91124
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
37 /* Cleartype available on Windows XP, cleartype_natural from XP SP1.
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
38 The latter does not try to fit cleartype smoothed fonts into the
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
39 same bounding box as the non-antialiased version of the font.
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
40 */
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
41 #ifndef CLEARTYPE_QUALITY
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
42 #define CLEARTYPE_QUALITY 5
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
43 #endif
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
44 #ifndef CLEARTYPE_NATURAL_QUALITY
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
45 #define CLEARTYPE_NATURAL_QUALITY 6
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
46 #endif
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
47
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
48 extern struct font_driver w32font_driver;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
49
91124
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
50 Lisp_Object Qgdi;
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
51 Lisp_Object Quniscribe;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
52 static Lisp_Object QCformat;
91260
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
53 static Lisp_Object Qmonospace, Qsansserif, Qmono, Qsans, Qsans_serif;
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
54 static Lisp_Object Qserif, Qscript, Qdecorative;
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
55 static Lisp_Object Qraster, Qoutline, Qunknown;
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
56
91124
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
57 /* antialiasing */
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
58 extern Lisp_Object QCantialias, QCotf, QClanguage; /* defined in font.c */
91124
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
59 extern Lisp_Object Qnone; /* reuse from w32fns.c */
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
60 static Lisp_Object Qstandard, Qsubpixel, Qnatural;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
61
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
62 /* scripts */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
63 static Lisp_Object Qlatin, Qgreek, Qcoptic, Qcyrillic, Qarmenian, Qhebrew;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
64 static Lisp_Object Qarabic, Qsyriac, Qnko, Qthaana, Qdevanagari, Qbengali;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
65 static Lisp_Object Qgurmukhi, Qgujarati, Qoriya, Qtamil, Qtelugu;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
66 static Lisp_Object Qkannada, Qmalayalam, Qsinhala, Qthai, Qlao;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
67 static Lisp_Object Qtibetan, Qmyanmar, Qgeorgian, Qhangul, Qethiopic;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
68 static Lisp_Object Qcherokee, Qcanadian_aboriginal, Qogham, Qrunic;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
69 static Lisp_Object Qkhmer, Qmongolian, Qsymbol, Qbraille, Qhan;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
70 static Lisp_Object Qideographic_description, Qcjk_misc, Qkana, Qbopomofo;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
71 static Lisp_Object Qkanbun, Qyi, Qbyzantine_musical_symbol;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
72 static Lisp_Object Qmusical_symbol, Qmathematical;
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
73 /* Not defined in characters.el, but referenced in fontset.el. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
74 static Lisp_Object Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot;
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
75 static Lisp_Object Qdeseret, Qglagolitic, Qgothic, Qhanunoo, Qkharoshthi;
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
76 static Lisp_Object Qlimbu, Qlinear_b, Qold_italic, Qold_persian, Qosmanya;
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
77 static Lisp_Object Qphags_pa, Qphoenician, Qshavian, Qsyloti_nagri;
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
78 static Lisp_Object Qtagalog, Qtagbanwa, Qtai_le, Qtifinagh, Qugaritic;
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
79 /* Only defined here, but useful for distinguishing IPA capable fonts. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
80 static Lisp_Object Qphonetic;
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
81
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
82 /* Font spacing symbols - defined in font.c. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
83 extern Lisp_Object Qc, Qp, Qm;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
84
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
85 static void fill_in_logfont P_ ((FRAME_PTR f, LOGFONT *logfont,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
86 Lisp_Object font_spec));
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
87
91124
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
88 static BYTE w32_antialias_type P_ ((Lisp_Object type));
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
89 static Lisp_Object lispy_antialias_type P_ ((BYTE type));
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
90
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
91 static Lisp_Object font_supported_scripts P_ ((FONTSIGNATURE * sig));
92390
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
92 static int w32font_full_name P_ ((LOGFONT * font, Lisp_Object font_obj,
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
93 int pixel_size, char *name, int nbytes));
92411
133560a77a09 (recompute_cached_metrics): Change font arg to w32font_info.
Jason Rumney <jasonr@gnu.org>
parents: 92409
diff changeset
94 static void recompute_cached_metrics P_ ((HDC dc, struct w32font_info * font));
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
95
92539
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
96 static Lisp_Object w32_registry P_ ((LONG w32_charset, DWORD font_type));
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
97
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
98 /* EnumFontFamiliesEx callbacks. */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
99 static int CALLBACK add_font_entity_to_list P_ ((ENUMLOGFONTEX *,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
100 NEWTEXTMETRICEX *,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
101 DWORD, LPARAM));
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
102 static int CALLBACK add_one_font_entity_to_list P_ ((ENUMLOGFONTEX *,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
103 NEWTEXTMETRICEX *,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
104 DWORD, LPARAM));
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
105 static int CALLBACK add_font_name_to_list P_ ((ENUMLOGFONTEX *,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
106 NEWTEXTMETRICEX *,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
107 DWORD, LPARAM));
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
108
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
109 /* struct passed in as LPARAM arg to EnumFontFamiliesEx, for keeping track
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
110 of what we really want. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
111 struct font_callback_data
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
112 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
113 /* The logfont we are matching against. EnumFontFamiliesEx only matches
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
114 face name and charset, so we need to manually match everything else
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
115 in the callback function. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
116 LOGFONT pattern;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
117 /* The original font spec or entity. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
118 Lisp_Object orig_font_spec;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
119 /* The frame the font is being loaded on. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
120 Lisp_Object frame;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
121 /* The list to add matches to. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
122 Lisp_Object list;
91208
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
123 /* Whether to match only opentype fonts. */
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
124 int opentype_only;
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
125 };
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
126
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
127 /* Handles the problem that EnumFontFamiliesEx will not return all
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
128 style variations if the font name is not specified. */
91182
bbdb7226d848 (add_font_entity_to_list): Compare only the beginning of full name.
Jason Rumney <jasonr@gnu.org>
parents: 91158
diff changeset
129 static void list_all_matching_fonts P_ ((struct font_callback_data *match));
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
130
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
131 /* From old font code in w32fns.c */
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
132 char * w32_to_x_charset P_ ((int charset, char * matching));
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
133
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
134
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
135 static int
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
136 memq_no_quit (elt, list)
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
137 Lisp_Object elt, list;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
138 {
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
139 while (CONSP (list) && ! EQ (XCAR (list), elt))
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
140 list = XCDR (list);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
141 return (CONSP (list));
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
142 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
143
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
144 /* w32 implementation of get_cache for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
145 Return a cache of font-entities on FRAME. The cache must be a
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
146 cons whose cdr part is the actual cache area. */
91208
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
147 Lisp_Object
91246
3a1805edf0b5 (w32font_get_cache): Adjust the argument type.
Kenichi Handa <handa@m17n.org>
parents: 91211
diff changeset
148 w32font_get_cache (f)
3a1805edf0b5 (w32font_get_cache): Adjust the argument type.
Kenichi Handa <handa@m17n.org>
parents: 91211
diff changeset
149 FRAME_PTR f;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
150 {
91246
3a1805edf0b5 (w32font_get_cache): Adjust the argument type.
Kenichi Handa <handa@m17n.org>
parents: 91211
diff changeset
151 struct w32_display_info *dpyinfo = FRAME_X_DISPLAY_INFO (f);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
152
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
153 return (dpyinfo->name_list_element);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
154 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
155
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
156 /* w32 implementation of list for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
157 List fonts exactly matching with FONT_SPEC on FRAME. The value
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
158 is a vector of font-entities. This is the sole API that
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
159 allocates font-entities. */
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
160 static Lisp_Object
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
161 w32font_list (frame, font_spec)
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
162 Lisp_Object frame, font_spec;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
163 {
91208
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
164 return w32font_list_internal (frame, font_spec, 0);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
165 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
166
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
167 /* w32 implementation of match for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
168 Return a font entity most closely matching with FONT_SPEC on
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
169 FRAME. The closeness is detemined by the font backend, thus
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
170 `face-font-selection-order' is ignored here. */
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
171 static Lisp_Object
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
172 w32font_match (frame, font_spec)
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
173 Lisp_Object frame, font_spec;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
174 {
91208
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
175 return w32font_match_internal (frame, font_spec, 0);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
176 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
177
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
178 /* w32 implementation of list_family for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
179 List available families. The value is a list of family names
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
180 (symbols). */
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
181 static Lisp_Object
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
182 w32font_list_family (frame)
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
183 Lisp_Object frame;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
184 {
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
185 Lisp_Object list = Qnil;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
186 LOGFONT font_match_pattern;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
187 HDC dc;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
188 FRAME_PTR f = XFRAME (frame);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
189
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
190 bzero (&font_match_pattern, sizeof (font_match_pattern));
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
191 font_match_pattern.lfCharSet = DEFAULT_CHARSET;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
192
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
193 dc = get_frame_dc (f);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
194
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
195 EnumFontFamiliesEx (dc, &font_match_pattern,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
196 (FONTENUMPROC) add_font_name_to_list,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
197 (LPARAM) &list, 0);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
198 release_frame_dc (f, dc);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
199
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
200 return list;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
201 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
202
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
203 /* w32 implementation of open for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
204 Open a font specified by FONT_ENTITY on frame F.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
205 If the font is scalable, open it with PIXEL_SIZE. */
91211
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
206 static struct font *
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
207 w32font_open (f, font_entity, pixel_size)
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
208 FRAME_PTR f;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
209 Lisp_Object font_entity;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
210 int pixel_size;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
211 {
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
212 struct w32font_info *w32_font = xmalloc (sizeof (struct w32font_info));
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
213
91211
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
214 if (w32_font == NULL)
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
215 return NULL;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
216
91211
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
217 if (!w32font_open_internal (f, font_entity, pixel_size, w32_font))
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
218 {
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
219 xfree (w32_font);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
220 return NULL;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
221 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
222
91211
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
223 return (struct font *) w32_font;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
224 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
225
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
226 /* w32 implementation of close for font_backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
227 Close FONT on frame F. */
91208
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
228 void
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
229 w32font_close (f, font)
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
230 FRAME_PTR f;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
231 struct font *font;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
232 {
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
233 if (font->font.font)
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
234 {
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
235 W32FontStruct *old_w32_font = (W32FontStruct *)font->font.font;
90933
bd1251472ab9 (w32font_close): Delete the GDI font object.
Jason Rumney <jasonr@gnu.org>
parents: 90915
diff changeset
236 DeleteObject (old_w32_font->hfont);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
237 xfree (old_w32_font);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
238 font->font.font = 0;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
239 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
240
91496
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
241 if (font->font.full_name && font->font.full_name != font->font.name)
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
242 xfree (font->font.full_name);
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
243
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
244 if (font->font.name)
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
245 xfree (font->font.name);
91496
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
246
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
247 xfree (font);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
248 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
249
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
250 /* w32 implementation of has_char for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
251 Optional.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
252 If FONT_ENTITY has a glyph for character C (Unicode code point),
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
253 return 1. If not, return 0. If a font must be opened to check
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
254 it, return -1. */
91208
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
255 int
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
256 w32font_has_char (entity, c)
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
257 Lisp_Object entity;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
258 int c;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
259 {
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
260 Lisp_Object supported_scripts, extra, script;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
261 DWORD mask;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
262
90887
aa7f1d212e78 (font_put_extra): Expose externally.
Jason Rumney <jasonr@gnu.org>
parents: 90879
diff changeset
263 extra = AREF (entity, FONT_EXTRA_INDEX);
aa7f1d212e78 (font_put_extra): Expose externally.
Jason Rumney <jasonr@gnu.org>
parents: 90879
diff changeset
264 if (!CONSP (extra))
aa7f1d212e78 (font_put_extra): Expose externally.
Jason Rumney <jasonr@gnu.org>
parents: 90879
diff changeset
265 return -1;
aa7f1d212e78 (font_put_extra): Expose externally.
Jason Rumney <jasonr@gnu.org>
parents: 90879
diff changeset
266
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
267 supported_scripts = assq_no_quit (QCscript, extra);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
268 if (!CONSP (supported_scripts))
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
269 return -1;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
270
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
271 supported_scripts = XCDR (supported_scripts);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
272
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
273 script = CHAR_TABLE_REF (Vchar_script_table, c);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
274
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
275 return (memq_no_quit (script, supported_scripts)) ? -1 : 0;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
276 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
277
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
278 /* w32 implementation of encode_char for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
279 Return a glyph code of FONT for characer C (Unicode code point).
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
280 If FONT doesn't have such a glyph, return FONT_INVALID_CODE. */
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
281 static unsigned
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
282 w32font_encode_char (font, c)
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
283 struct font *font;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
284 int c;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
285 {
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
286 struct frame *f;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
287 HDC dc;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
288 HFONT old_font;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
289 DWORD retval;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
290 GCP_RESULTSW result;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
291 wchar_t in[2];
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
292 wchar_t out[2];
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
293 int len;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
294 struct w32font_info *w32_font = (struct w32font_info *) font;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
295
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
296 /* If glyph indexing is not working for this font, just return the
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
297 unicode code-point. */
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
298 if (!w32_font->glyph_idx)
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
299 return c;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
300
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
301 if (c > 0xFFFF)
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
302 {
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
303 /* TODO: Encode as surrogate pair and lookup the glyph. */
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
304 return FONT_INVALID_CODE;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
305 }
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
306 else
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
307 {
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
308 in[0] = (wchar_t) c;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
309 len = 1;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
310 }
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
311
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
312 bzero (&result, sizeof (result));
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
313 result.lStructSize = sizeof (result);
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
314 result.lpGlyphs = out;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
315 result.nGlyphs = 2;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
316
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
317 f = XFRAME (selected_frame);
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
318
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
319 dc = get_frame_dc (f);
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
320 old_font = SelectObject (dc, ((W32FontStruct *) (font->font.font))->hfont);
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
321
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
322 retval = GetCharacterPlacementW (dc, in, len, 0, &result, 0);
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
323
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
324 SelectObject (dc, old_font);
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
325 release_frame_dc (f, dc);
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
326
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
327 if (retval)
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
328 {
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
329 if (result.nGlyphs != 1 || !result.lpGlyphs[0])
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
330 return FONT_INVALID_CODE;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
331 return result.lpGlyphs[0];
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
332 }
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
333 else
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
334 {
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
335 int i;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
336 /* Mark this font as not supporting glyph indices. This can happen
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
337 on Windows9x, and maybe with non-Truetype fonts on NT etc. */
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
338 w32_font->glyph_idx = 0;
92411
133560a77a09 (recompute_cached_metrics): Change font arg to w32font_info.
Jason Rumney <jasonr@gnu.org>
parents: 92409
diff changeset
339 recompute_cached_metrics (dc, w32_font);
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
340
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
341 return c;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
342 }
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
343 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
344
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
345 /* w32 implementation of text_extents for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
346 Perform the size computation of glyphs of FONT and fillin members
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
347 of METRICS. The glyphs are specified by their glyph codes in
91034
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
348 CODE (length NGLYPHS). Apparently metrics can be NULL, in this
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
349 case just return the overall width. */
91208
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
350 int
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
351 w32font_text_extents (font, code, nglyphs, metrics)
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
352 struct font *font;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
353 unsigned *code;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
354 int nglyphs;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
355 struct font_metrics *metrics;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
356 {
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
357 int i;
92151
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
358 HFONT old_font = NULL;
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
359 HDC dc = NULL;
91208
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
360 struct frame * f;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
361 int total_width = 0;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
362 WORD *wcode = alloca(nglyphs * sizeof (WORD));
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
363 SIZE size;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
364
91593
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
365 /* TODO: Frames can come and go, and their fonts outlive them. So we
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
366 can't cache the frame in the font structure. Use selected_frame
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
367 until the API is updated to pass in a frame. */
91260
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
368 f = XFRAME (selected_frame);
91258
5e8f33ad8f63 *** empty log message ***
Jason Rumney <jasonr@gnu.org>
parents: 91246
diff changeset
369
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
370 if (metrics)
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
371 {
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
372 GLYPHMETRICS gm;
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
373 MAT2 transform;
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
374 struct w32font_info *w32_font = (struct w32font_info *) font;
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
375
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
376 /* Set transform to the identity matrix. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
377 bzero (&transform, sizeof (transform));
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
378 transform.eM11.value = 1;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
379 transform.eM22.value = 1;
91034
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
380 metrics->width = 0;
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
381 metrics->ascent = 0;
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
382 metrics->descent = 0;
91593
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
383 metrics->lbearing = 0;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
384
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
385 for (i = 0; i < nglyphs; i++)
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
386 {
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
387 if (*(code + i) < 128)
91593
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
388 {
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
389 /* Use cached metrics for ASCII. */
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
390 struct font_metrics *char_metric
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
391 = &w32_font->ascii_metrics[*(code+i)];
91593
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
392
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
393 /* If we couldn't get metrics when caching, use fallback. */
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
394 if (char_metric->width == 0)
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
395 break;
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
396
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
397 metrics->lbearing = min (metrics->lbearing,
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
398 metrics->width + char_metric->lbearing);
91593
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
399 metrics->rbearing = max (metrics->rbearing,
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
400 metrics->width + char_metric->rbearing);
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
401 metrics->width += char_metric->width;
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
402 metrics->ascent = max (metrics->ascent, char_metric->ascent);
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
403 metrics->descent = max (metrics->descent, char_metric->descent);
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
404 }
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
405 else
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
406 {
92151
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
407 if (dc == NULL)
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
408 {
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
409 dc = get_frame_dc (f);
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
410 old_font = SelectObject (dc, ((W32FontStruct *)
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
411 (font->font.font))->hfont);
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
412 }
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
413 if (GetGlyphOutlineW (dc, *(code + i),
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
414 GGO_METRICS
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
415 | w32_font->glyph_idx
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
416 ? GGO_GLYPH_INDEX : 0,
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
417 &gm, 0, NULL, &transform) != GDI_ERROR)
92151
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
418 {
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
419 int new_val = metrics->width + gm.gmBlackBoxX
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
420 + gm.gmptGlyphOrigin.x;
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
421 metrics->rbearing = max (metrics->rbearing, new_val);
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
422 new_val = metrics->width + gm.gmptGlyphOrigin.x;
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
423 metrics->lbearing = min (metrics->lbearing, new_val);
92151
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
424 metrics->width += gm.gmCellIncX;
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
425 new_val = gm.gmBlackBoxY;
92151
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
426 metrics->ascent = max (metrics->ascent, new_val);
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
427 new_val = (gm.gmCellIncY - gm.gmptGlyphOrigin.y
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
428 - gm.gmBlackBoxY);
92151
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
429 metrics->descent = max (metrics->descent, new_val);
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
430 }
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
431 else
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
432 {
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
433 if (w32_font->glyph_idx)
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
434 {
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
435 /* Disable glyph indexing for this font, as we can't
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
436 handle the metrics. Abort this run, our recovery
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
437 strategies rely on having unicode code points here.
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
438 This will cause a glitch in display, but in practice,
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
439 any problems should be caught when initialising the
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
440 metrics cache. */
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
441 w32_font->glyph_idx = 0;
92411
133560a77a09 (recompute_cached_metrics): Change font arg to w32font_info.
Jason Rumney <jasonr@gnu.org>
parents: 92409
diff changeset
442 recompute_cached_metrics (dc, w32_font);
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
443 SelectObject (dc, old_font);
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
444 release_frame_dc (f, dc);
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
445 return 0;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
446 }
92151
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
447 /* Rely on an estimate based on the overall font metrics. */
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
448 break;
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
449 }
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
450 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
451 }
91034
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
452
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
453 /* If we got through everything, return. */
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
454 if (i == nglyphs)
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
455 {
92151
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
456 if (dc != NULL)
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
457 {
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
458 /* Restore state and release DC. */
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
459 SelectObject (dc, old_font);
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
460 release_frame_dc (f, dc);
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
461 }
91034
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
462
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
463 return metrics->width;
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
464 }
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
465 }
91034
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
466
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
467 /* For non-truetype fonts, GetGlyphOutlineW is not supported, so
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
468 fallback on other methods that will at least give some of the metric
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
469 information. */
91034
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
470 for (i = 0; i < nglyphs; i++)
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
471 {
91034
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
472 if (code[i] < 0x10000)
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
473 wcode[i] = code[i];
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
474 else
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
475 {
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
476 /* TODO: Convert to surrogate, reallocating array if needed */
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
477 wcode[i] = 0xffff;
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
478 }
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
479 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
480
92151
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
481 if (dc == NULL)
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
482 {
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
483 dc = get_frame_dc (f);
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
484 old_font = SelectObject (dc, ((W32FontStruct *)
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
485 (font->font.font))->hfont);
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
486 }
664a09af03dc (w32font_text_extents): Avoid getting HDC and selecting
Jason Rumney <jasonr@gnu.org>
parents: 91593
diff changeset
487
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
488 if (GetTextExtentPoint32W (dc, wcode, nglyphs, &size))
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
489 {
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
490 total_width = size.cx;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
491 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
492
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
493 /* On 95/98/ME, only some unicode functions are available, so fallback
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
494 on doing a dummy draw to find the total width. */
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
495 if (!total_width)
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
496 {
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
497 RECT rect;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
498 rect.top = 0; rect.bottom = font->font.height; rect.left = 0; rect.right = 1;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
499 DrawTextW (dc, wcode, nglyphs, &rect,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
500 DT_CALCRECT | DT_NOPREFIX | DT_SINGLELINE);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
501 total_width = rect.right;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
502 }
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
503
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
504 /* Give our best estimate of the metrics, based on what we know. */
91034
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
505 if (metrics)
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
506 {
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
507 metrics->width = total_width;
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
508 metrics->ascent = font->ascent;
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
509 metrics->descent = font->descent;
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
510 metrics->lbearing = 0;
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
511 metrics->rbearing = total_width
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
512 + ((struct w32font_info *) font)->metrics.tmOverhang;
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
513 }
fe9053c62d68 (w32font_text_extents): Calculate metrics for the whole string.
Jason Rumney <jasonr@gnu.org>
parents: 91030
diff changeset
514
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
515 /* Restore state and release DC. */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
516 SelectObject (dc, old_font);
91208
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
517 release_frame_dc (f, dc);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
518
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
519 return total_width;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
520 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
521
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
522 /* w32 implementation of draw for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
523 Optional.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
524 Draw glyphs between FROM and TO of S->char2b at (X Y) pixel
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
525 position of frame F with S->FACE and S->GC. If WITH_BACKGROUND
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
526 is nonzero, fill the background in advance. It is assured that
91182
bbdb7226d848 (add_font_entity_to_list): Compare only the beginning of full name.
Jason Rumney <jasonr@gnu.org>
parents: 91158
diff changeset
527 WITH_BACKGROUND is zero when (FROM > 0 || TO < S->nchars).
bbdb7226d848 (add_font_entity_to_list): Compare only the beginning of full name.
Jason Rumney <jasonr@gnu.org>
parents: 91158
diff changeset
528
bbdb7226d848 (add_font_entity_to_list): Compare only the beginning of full name.
Jason Rumney <jasonr@gnu.org>
parents: 91158
diff changeset
529 TODO: Currently this assumes that the colors and fonts are already
bbdb7226d848 (add_font_entity_to_list): Compare only the beginning of full name.
Jason Rumney <jasonr@gnu.org>
parents: 91158
diff changeset
530 set in the DC. This seems to be true now, but maybe only due to
bbdb7226d848 (add_font_entity_to_list): Compare only the beginning of full name.
Jason Rumney <jasonr@gnu.org>
parents: 91158
diff changeset
531 the old font code setting it up. It may be safer to resolve faces
bbdb7226d848 (add_font_entity_to_list): Compare only the beginning of full name.
Jason Rumney <jasonr@gnu.org>
parents: 91158
diff changeset
532 and fonts in here and set them explicitly
bbdb7226d848 (add_font_entity_to_list): Compare only the beginning of full name.
Jason Rumney <jasonr@gnu.org>
parents: 91158
diff changeset
533 */
bbdb7226d848 (add_font_entity_to_list): Compare only the beginning of full name.
Jason Rumney <jasonr@gnu.org>
parents: 91158
diff changeset
534
91208
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
535 int
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
536 w32font_draw (s, from, to, x, y, with_background)
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
537 struct glyph_string *s;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
538 int from, to, x, y, with_background;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
539 {
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
540 UINT options;
91030
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
541 HRGN orig_clip;
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
542 struct w32font_info *w32font = (struct w32font_info *) s->face->font_info;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
543
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
544 options = w32font->glyph_idx;
91030
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
545
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
546 /* Save clip region for later restoration. */
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
547 GetClipRgn(s->hdc, orig_clip);
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
548
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
549 if (s->num_clips > 0)
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
550 {
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
551 HRGN new_clip = CreateRectRgnIndirect (s->clip);
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
552
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
553 if (s->num_clips > 1)
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
554 {
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
555 HRGN clip2 = CreateRectRgnIndirect (s->clip + 1);
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
556
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
557 CombineRgn (new_clip, new_clip, clip2, RGN_OR);
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
558 DeleteObject (clip2);
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
559 }
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
560
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
561 SelectClipRgn (s->hdc, new_clip);
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
562 DeleteObject (new_clip);
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
563 }
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
564
91128
8eb56b57e4a0 (w32font_draw): Fill background manually.
Jason Rumney <jasonr@gnu.org>
parents: 91124
diff changeset
565 /* Using OPAQUE background mode can clear more background than expected
8eb56b57e4a0 (w32font_draw): Fill background manually.
Jason Rumney <jasonr@gnu.org>
parents: 91124
diff changeset
566 when Cleartype is used. Draw the background manually to avoid this. */
8eb56b57e4a0 (w32font_draw): Fill background manually.
Jason Rumney <jasonr@gnu.org>
parents: 91124
diff changeset
567 SetBkMode (s->hdc, TRANSPARENT);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
568 if (with_background)
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
569 {
90908
523a5c7f67ea (w32font_open): Don't set font_idx.
Jason Rumney <jasonr@gnu.org>
parents: 90906
diff changeset
570 HBRUSH brush;
523a5c7f67ea (w32font_open): Don't set font_idx.
Jason Rumney <jasonr@gnu.org>
parents: 90906
diff changeset
571 RECT rect;
91128
8eb56b57e4a0 (w32font_draw): Fill background manually.
Jason Rumney <jasonr@gnu.org>
parents: 91124
diff changeset
572 struct font *font = (struct font *) s->face->font_info;
90908
523a5c7f67ea (w32font_open): Don't set font_idx.
Jason Rumney <jasonr@gnu.org>
parents: 90906
diff changeset
573
523a5c7f67ea (w32font_open): Don't set font_idx.
Jason Rumney <jasonr@gnu.org>
parents: 90906
diff changeset
574 brush = CreateSolidBrush (s->gc->background);
523a5c7f67ea (w32font_open): Don't set font_idx.
Jason Rumney <jasonr@gnu.org>
parents: 90906
diff changeset
575 rect.left = x;
91128
8eb56b57e4a0 (w32font_draw): Fill background manually.
Jason Rumney <jasonr@gnu.org>
parents: 91124
diff changeset
576 rect.top = y - font->ascent;
90908
523a5c7f67ea (w32font_open): Don't set font_idx.
Jason Rumney <jasonr@gnu.org>
parents: 90906
diff changeset
577 rect.right = x + s->width;
91128
8eb56b57e4a0 (w32font_draw): Fill background manually.
Jason Rumney <jasonr@gnu.org>
parents: 91124
diff changeset
578 rect.bottom = y + font->descent;
90908
523a5c7f67ea (w32font_open): Don't set font_idx.
Jason Rumney <jasonr@gnu.org>
parents: 90906
diff changeset
579 FillRect (s->hdc, &rect, brush);
90915
9aac5aff0dda (w32font_draw): Delete brush after using it.
Jason Rumney <jasonr@gnu.org>
parents: 90908
diff changeset
580 DeleteObject (brush);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
581 }
90879
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
582
92187
b7277e09e943 (w32font_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 92151
diff changeset
583 if (s->padding_p)
b7277e09e943 (w32font_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 92151
diff changeset
584 {
b7277e09e943 (w32font_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 92151
diff changeset
585 int len = to - from, i;
b7277e09e943 (w32font_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 92151
diff changeset
586
b7277e09e943 (w32font_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 92151
diff changeset
587 for (i = 0; i < len; i++)
b7277e09e943 (w32font_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 92151
diff changeset
588 ExtTextOutW (s->hdc, x + i, y, options, NULL,
92199
8324a41d50a9 (w32font_draw): Draw one character at a time when padding.
Jason Rumney <jasonr@gnu.org>
parents: 92187
diff changeset
589 s->char2b + from + i, 1, NULL);
92187
b7277e09e943 (w32font_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 92151
diff changeset
590 }
b7277e09e943 (w32font_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 92151
diff changeset
591 else
b7277e09e943 (w32font_draw): Pay attention to s->padding_p.
Kenichi Handa <handa@m17n.org>
parents: 92151
diff changeset
592 ExtTextOutW (s->hdc, x, y, options, NULL, s->char2b + from, to - from, NULL);
91030
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
593
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
594 /* Restore clip region. */
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
595 if (s->num_clips > 0)
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
596 {
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
597 SelectClipRgn (s->hdc, orig_clip);
8be09e8e2c97 (w32font_draw): Do clipping here.
Jason Rumney <jasonr@gnu.org>
parents: 90964
diff changeset
598 }
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
599 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
600
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
601 /* w32 implementation of free_entity for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
602 Optional (if FONT_EXTRA_INDEX is not Lisp_Save_Value).
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
603 Free FONT_EXTRA_INDEX field of FONT_ENTITY.
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
604 static void
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
605 w32font_free_entity (Lisp_Object entity);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
606 */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
607
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
608 /* w32 implementation of prepare_face for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
609 Optional (if FACE->extra is not used).
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
610 Prepare FACE for displaying characters by FONT on frame F by
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
611 storing some data in FACE->extra. If successful, return 0.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
612 Otherwise, return -1.
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
613 static int
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
614 w32font_prepare_face (FRAME_PTR f, struct face *face);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
615 */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
616 /* w32 implementation of done_face for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
617 Optional.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
618 Done FACE for displaying characters by FACE->font on frame F.
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
619 static void
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
620 w32font_done_face (FRAME_PTR f, struct face *face); */
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
621
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
622 /* w32 implementation of get_bitmap for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
623 Optional.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
624 Store bitmap data for glyph-code CODE of FONT in BITMAP. It is
90915
9aac5aff0dda (w32font_draw): Delete brush after using it.
Jason Rumney <jasonr@gnu.org>
parents: 90908
diff changeset
625 intended that this method is called from the other font-driver
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
626 for actual drawing.
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
627 static int
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
628 w32font_get_bitmap (struct font *font, unsigned code,
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
629 struct font_bitmap *bitmap, int bits_per_pixel);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
630 */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
631 /* w32 implementation of free_bitmap for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
632 Optional.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
633 Free bitmap data in BITMAP.
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
634 static void
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
635 w32font_free_bitmap (struct font *font, struct font_bitmap *bitmap);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
636 */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
637 /* w32 implementation of get_outline for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
638 Optional.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
639 Return an outline data for glyph-code CODE of FONT. The format
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
640 of the outline data depends on the font-driver.
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
641 static void *
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
642 w32font_get_outline (struct font *font, unsigned code);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
643 */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
644 /* w32 implementation of free_outline for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
645 Optional.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
646 Free OUTLINE (that is obtained by the above method).
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
647 static void
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
648 w32font_free_outline (struct font *font, void *outline);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
649 */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
650 /* w32 implementation of anchor_point for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
651 Optional.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
652 Get coordinates of the INDEXth anchor point of the glyph whose
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
653 code is CODE. Store the coordinates in *X and *Y. Return 0 if
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
654 the operations was successfull. Otherwise return -1.
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
655 static int
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
656 w32font_anchor_point (struct font *font, unsigned code,
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
657 int index, int *x, int *y);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
658 */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
659 /* w32 implementation of otf_capability for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
660 Optional.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
661 Return a list describing which scripts/languages FONT
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
662 supports by which GSUB/GPOS features of OpenType tables.
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
663 static Lisp_Object
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
664 w32font_otf_capability (struct font *font);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
665 */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
666 /* w32 implementation of otf_drive for font backend.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
667 Optional.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
668 Apply FONT's OTF-FEATURES to the glyph string.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
669
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
670 FEATURES specifies which OTF features to apply in this format:
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
671 (SCRIPT LANGSYS GSUB-FEATURE GPOS-FEATURE)
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
672 See the documentation of `font-drive-otf' for the detail.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
673
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
674 This method applies the specified features to the codes in the
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
675 elements of GSTRING-IN (between FROMth and TOth). The output
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
676 codes are stored in GSTRING-OUT at the IDXth element and the
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
677 following elements.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
678
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
679 Return the number of output codes. If none of the features are
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
680 applicable to the input data, return 0. If GSTRING-OUT is too
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
681 short, return -1.
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
682 static int
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
683 w32font_otf_drive (struct font *font, Lisp_Object features,
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
684 Lisp_Object gstring_in, int from, int to,
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
685 Lisp_Object gstring_out, int idx,
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
686 int alternate_subst);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
687 */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
688
91208
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
689 /* Internal implementation of w32font_list.
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
690 Additional parameter opentype_only restricts the returned fonts to
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
691 opentype fonts, which can be used with the Uniscribe backend. */
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
692 Lisp_Object
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
693 w32font_list_internal (frame, font_spec, opentype_only)
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
694 Lisp_Object frame, font_spec;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
695 int opentype_only;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
696 {
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
697 struct font_callback_data match_data;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
698 HDC dc;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
699 FRAME_PTR f = XFRAME (frame);
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
700
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
701 match_data.orig_font_spec = font_spec;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
702 match_data.list = Qnil;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
703 match_data.frame = frame;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
704
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
705 bzero (&match_data.pattern, sizeof (LOGFONT));
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
706 fill_in_logfont (f, &match_data.pattern, font_spec);
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
707
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
708 match_data.opentype_only = opentype_only;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
709 if (opentype_only)
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
710 match_data.pattern.lfOutPrecision = OUT_OUTLINE_PRECIS;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
711
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
712 if (match_data.pattern.lfFaceName[0] == '\0')
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
713 {
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
714 /* EnumFontFamiliesEx does not take other fields into account if
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
715 font name is blank, so need to use two passes. */
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
716 list_all_matching_fonts (&match_data);
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
717 }
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
718 else
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
719 {
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
720 dc = get_frame_dc (f);
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
721
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
722 EnumFontFamiliesEx (dc, &match_data.pattern,
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
723 (FONTENUMPROC) add_font_entity_to_list,
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
724 (LPARAM) &match_data, 0);
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
725 release_frame_dc (f, dc);
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
726 }
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
727
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
728 return NILP (match_data.list) ? null_vector : Fvconcat (1, &match_data.list);
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
729 }
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
730
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
731 /* Internal implementation of w32font_match.
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
732 Additional parameter opentype_only restricts the returned fonts to
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
733 opentype fonts, which can be used with the Uniscribe backend. */
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
734 Lisp_Object
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
735 w32font_match_internal (frame, font_spec, opentype_only)
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
736 Lisp_Object frame, font_spec;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
737 int opentype_only;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
738 {
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
739 struct font_callback_data match_data;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
740 HDC dc;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
741 FRAME_PTR f = XFRAME (frame);
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
742
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
743 match_data.orig_font_spec = font_spec;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
744 match_data.frame = frame;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
745 match_data.list = Qnil;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
746
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
747 bzero (&match_data.pattern, sizeof (LOGFONT));
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
748 fill_in_logfont (f, &match_data.pattern, font_spec);
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
749
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
750 match_data.opentype_only = opentype_only;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
751 if (opentype_only)
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
752 match_data.pattern.lfOutPrecision = OUT_OUTLINE_PRECIS;
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
753
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
754 dc = get_frame_dc (f);
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
755
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
756 EnumFontFamiliesEx (dc, &match_data.pattern,
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
757 (FONTENUMPROC) add_one_font_entity_to_list,
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
758 (LPARAM) &match_data, 0);
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
759 release_frame_dc (f, dc);
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
760
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
761 return NILP (match_data.list) ? Qnil : XCAR (match_data.list);
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
762 }
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
763
91211
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
764 int
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
765 w32font_open_internal (f, font_entity, pixel_size, w32_font)
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
766 FRAME_PTR f;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
767 Lisp_Object font_entity;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
768 int pixel_size;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
769 struct w32font_info *w32_font;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
770 {
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
771 int len, size;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
772 LOGFONT logfont;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
773 HDC dc;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
774 HFONT hfont, old_font;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
775 Lisp_Object val, extra;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
776 /* For backwards compatibility. */
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
777 W32FontStruct *compat_w32_font;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
778
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
779 struct font * font = (struct font *) w32_font;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
780 if (!font)
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
781 return 0;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
782
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
783 bzero (&logfont, sizeof (logfont));
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
784 fill_in_logfont (f, &logfont, font_entity);
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
785
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
786 size = XINT (AREF (font_entity, FONT_SIZE_INDEX));
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
787 if (!size)
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
788 size = pixel_size;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
789
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
790 logfont.lfHeight = -size;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
791 hfont = CreateFontIndirect (&logfont);
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
792
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
793 if (hfont == NULL)
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
794 return 0;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
795
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
796 /* Get the metrics for this font. */
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
797 dc = get_frame_dc (f);
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
798 old_font = SelectObject (dc, hfont);
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
799
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
800 GetTextMetrics (dc, &w32_font->metrics);
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
801
92712
fb1da73bc0c4 (w32font_full_name): Use floor to round.
Jason Rumney <jasonr@gnu.org>
parents: 92539
diff changeset
802 w32_font->glyph_idx = ETO_GLYPH_INDEX;
fb1da73bc0c4 (w32font_full_name): Use floor to round.
Jason Rumney <jasonr@gnu.org>
parents: 92539
diff changeset
803
91593
3081b8f848bc * w32font.c (w32font_text_extents): Fill in lbearing metric.
Jason Rumney <jasonr@gnu.org>
parents: 91545
diff changeset
804 /* Cache ASCII metrics. */
92411
133560a77a09 (recompute_cached_metrics): Change font arg to w32font_info.
Jason Rumney <jasonr@gnu.org>
parents: 92409
diff changeset
805 recompute_cached_metrics (dc, w32_font);
133560a77a09 (recompute_cached_metrics): Change font arg to w32font_info.
Jason Rumney <jasonr@gnu.org>
parents: 92409
diff changeset
806
91211
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
807 SelectObject (dc, old_font);
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
808 release_frame_dc (f, dc);
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
809
91211
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
810 /* W32FontStruct - we should get rid of this, and use the w32font_info
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
811 struct for any W32 specific fields. font->font.font can then be hfont. */
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
812 font->font.font = xmalloc (sizeof (W32FontStruct));
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
813 compat_w32_font = (W32FontStruct *) font->font.font;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
814 bzero (compat_w32_font, sizeof (W32FontStruct));
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
815 compat_w32_font->font_type = UNICODE_FONT;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
816 /* Duplicate the text metrics. */
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
817 bcopy (&w32_font->metrics, &compat_w32_font->tm, sizeof (TEXTMETRIC));
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
818 compat_w32_font->hfont = hfont;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
819
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
820 len = strlen (logfont.lfFaceName);
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
821 font->font.name = (char *) xmalloc (len + 1);
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
822 bcopy (logfont.lfFaceName, font->font.name, len);
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
823 font->font.name[len] = '\0';
91496
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
824
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
825 {
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
826 char *name;
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
827
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
828 /* We don't know how much space we need for the full name, so start with
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
829 96 bytes and go up in steps of 32. */
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
830 len = 96;
91521
e96ff7166c81 (w32font_open_internal): Use xmalloc, xrealloc, xfree.
Jason Rumney <jasonr@gnu.org>
parents: 91496
diff changeset
831 name = xmalloc (len);
92390
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
832 while (name && w32font_full_name (&logfont, font_entity, pixel_size,
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
833 name, len) < 0)
91496
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
834 {
91521
e96ff7166c81 (w32font_open_internal): Use xmalloc, xrealloc, xfree.
Jason Rumney <jasonr@gnu.org>
parents: 91496
diff changeset
835 char *new = xrealloc (name, len += 32);
91496
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
836
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
837 if (! new)
91521
e96ff7166c81 (w32font_open_internal): Use xmalloc, xrealloc, xfree.
Jason Rumney <jasonr@gnu.org>
parents: 91496
diff changeset
838 xfree (name);
91496
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
839 name = new;
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
840 }
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
841 if (name)
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
842 font->font.full_name = name;
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
843 else
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
844 font->font.full_name = font->font.name;
d3d1ab7e6e35 (w32font_open_internal): Use font_unparse_fcname to set full_name.
Jason Rumney <jasonr@gnu.org>
parents: 91447
diff changeset
845 }
91211
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
846 font->font.charset = 0;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
847 font->font.codepage = 0;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
848 font->font.size = w32_font->metrics.tmMaxCharWidth;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
849 font->font.height = w32_font->metrics.tmHeight
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
850 + w32_font->metrics.tmExternalLeading;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
851 font->font.space_width = font->font.average_width
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
852 = w32_font->metrics.tmAveCharWidth;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
853
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
854 font->font.vertical_centering = 0;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
855 font->font.encoding_type = 0;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
856 font->font.baseline_offset = 0;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
857 font->font.relative_compose = 0;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
858 font->font.default_ascent = w32_font->metrics.tmAscent;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
859 font->font.font_encoder = NULL;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
860 font->entity = font_entity;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
861 font->pixel_size = size;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
862 font->driver = &w32font_driver;
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
863 /* Use format cached during list, as the information we have access to
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
864 here is incomplete. */
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
865 extra = AREF (font_entity, FONT_EXTRA_INDEX);
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
866 if (CONSP (extra))
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
867 {
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
868 val = assq_no_quit (QCformat, extra);
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
869 if (CONSP (val))
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
870 font->format = XCDR (val);
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
871 else
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
872 font->format = Qunknown;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
873 }
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
874 else
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
875 font->format = Qunknown;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
876
91211
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
877 font->file_name = NULL;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
878 font->encoding_charset = -1;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
879 font->repertory_charset = -1;
91545
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
880 /* TODO: do we really want the minimum width here, which could be negative? */
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
881 font->min_width = font->font.space_width;
91211
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
882 font->ascent = w32_font->metrics.tmAscent;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
883 font->descent = w32_font->metrics.tmDescent;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
884 font->scalable = w32_font->metrics.tmPitchAndFamily & TMPF_VECTOR;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
885
91545
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
886 /* Set global flag fonts_changed_p to non-zero if the font loaded
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
887 has a character with a smaller width than any other character
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
888 before, or if the font loaded has a smaller height than any other
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
889 font loaded before. If this happens, it will make a glyph matrix
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
890 reallocation necessary. */
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
891 {
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
892 struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f);
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
893 dpyinfo->n_fonts++;
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
894
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
895 if (dpyinfo->n_fonts == 1)
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
896 {
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
897 dpyinfo->smallest_font_height = font->font.height;
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
898 dpyinfo->smallest_char_width = font->min_width;
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
899 }
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
900 else
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
901 {
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
902 if (dpyinfo->smallest_font_height > font->font.height)
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
903 {
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
904 dpyinfo->smallest_font_height = font->font.height;
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
905 fonts_changed_p |= 1;
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
906 }
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
907 if (dpyinfo->smallest_char_width > font->min_width)
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
908 {
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
909 dpyinfo->smallest_char_width = font->min_width;
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
910 fonts_changed_p |= 1;
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
911 }
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
912 }
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
913 }
572ea0c7c071 (w32font_open_internal): Fill min_width with tmAveCharWidth.
Jason Rumney <jasonr@gnu.org>
parents: 91521
diff changeset
914
91211
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
915 return 1;
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
916 }
abd06276f55a (w32font_open_internal): New function.
Jason Rumney <jasonr@gnu.org>
parents: 91208
diff changeset
917
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
918 /* Callback function for EnumFontFamiliesEx.
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
919 * Adds the name of a font to a Lisp list (passed in as the lParam arg). */
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
920 static int CALLBACK
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
921 add_font_name_to_list (logical_font, physical_font, font_type, list_object)
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
922 ENUMLOGFONTEX *logical_font;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
923 NEWTEXTMETRICEX *physical_font;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
924 DWORD font_type;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
925 LPARAM list_object;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
926 {
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
927 Lisp_Object* list = (Lisp_Object *) list_object;
91070
2060802cc53f (add_font_name_to_list): Avoid vertical fonts.
Jason Rumney <jasonr@gnu.org>
parents: 91034
diff changeset
928 Lisp_Object family;
2060802cc53f (add_font_name_to_list): Avoid vertical fonts.
Jason Rumney <jasonr@gnu.org>
parents: 91034
diff changeset
929
2060802cc53f (add_font_name_to_list): Avoid vertical fonts.
Jason Rumney <jasonr@gnu.org>
parents: 91034
diff changeset
930 /* Skip vertical fonts (intended only for printing) */
2060802cc53f (add_font_name_to_list): Avoid vertical fonts.
Jason Rumney <jasonr@gnu.org>
parents: 91034
diff changeset
931 if (logical_font->elfLogFont.lfFaceName[0] == '@')
2060802cc53f (add_font_name_to_list): Avoid vertical fonts.
Jason Rumney <jasonr@gnu.org>
parents: 91034
diff changeset
932 return 1;
2060802cc53f (add_font_name_to_list): Avoid vertical fonts.
Jason Rumney <jasonr@gnu.org>
parents: 91034
diff changeset
933
2060802cc53f (add_font_name_to_list): Avoid vertical fonts.
Jason Rumney <jasonr@gnu.org>
parents: 91034
diff changeset
934 family = intern_downcase (logical_font->elfLogFont.lfFaceName,
2060802cc53f (add_font_name_to_list): Avoid vertical fonts.
Jason Rumney <jasonr@gnu.org>
parents: 91034
diff changeset
935 strlen (logical_font->elfLogFont.lfFaceName));
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
936 if (! memq_no_quit (family, *list))
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
937 *list = Fcons (family, *list);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
938
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
939 return 1;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
940 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
941
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
942 /* Convert an enumerated Windows font to an Emacs font entity. */
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
943 static Lisp_Object
91124
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
944 w32_enumfont_pattern_entity (frame, logical_font, physical_font,
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
945 font_type, requested_font, backend)
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
946 Lisp_Object frame;
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
947 ENUMLOGFONTEX *logical_font;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
948 NEWTEXTMETRICEX *physical_font;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
949 DWORD font_type;
91124
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
950 LOGFONT *requested_font;
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
951 Lisp_Object backend;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
952 {
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
953 Lisp_Object entity, tem;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
954 LOGFONT *lf = (LOGFONT*) logical_font;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
955 BYTE generic_type;
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
956 DWORD full_type = physical_font->ntmTm.ntmFlags;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
957
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
958 entity = Fmake_vector (make_number (FONT_ENTITY_MAX), Qnil);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
959
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
960 ASET (entity, FONT_TYPE_INDEX, backend);
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
961 ASET (entity, FONT_FRAME_INDEX, frame);
92539
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
962 ASET (entity, FONT_REGISTRY_INDEX, w32_registry (lf->lfCharSet, font_type));
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
963 ASET (entity, FONT_OBJLIST_INDEX, Qnil);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
964
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
965 /* Foundry is difficult to get in readable form on Windows.
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
966 But Emacs crashes if it is not set, so set it to something more
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
967 generic. Thes values make xflds compatible with Emacs 22. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
968 if (lf->lfOutPrecision == OUT_STRING_PRECIS)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
969 tem = Qraster;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
970 else if (lf->lfOutPrecision == OUT_STROKE_PRECIS)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
971 tem = Qoutline;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
972 else
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
973 tem = Qunknown;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
974
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
975 ASET (entity, FONT_FOUNDRY_INDEX, tem);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
976
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
977 /* Save the generic family in the extra info, as it is likely to be
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
978 useful to users looking for a close match. */
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
979 generic_type = physical_font->ntmTm.tmPitchAndFamily & 0xF0;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
980 if (generic_type == FF_DECORATIVE)
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
981 tem = Qdecorative;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
982 else if (generic_type == FF_MODERN)
91260
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
983 tem = Qmono;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
984 else if (generic_type == FF_ROMAN)
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
985 tem = Qserif;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
986 else if (generic_type == FF_SCRIPT)
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
987 tem = Qscript;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
988 else if (generic_type == FF_SWISS)
91260
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
989 tem = Qsans;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
990 else
91260
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
991 tem = null_string;
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
992
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
993 ASET (entity, FONT_ADSTYLE_INDEX, tem);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
994
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
995 if (physical_font->ntmTm.tmPitchAndFamily & 0x01)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
996 font_put_extra (entity, QCspacing, make_number (FONT_SPACING_PROPORTIONAL));
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
997 else
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
998 font_put_extra (entity, QCspacing, make_number (FONT_SPACING_MONO));
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
999
91124
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1000 if (requested_font->lfQuality != DEFAULT_QUALITY)
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1001 {
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1002 font_put_extra (entity, QCantialias,
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1003 lispy_antialias_type (requested_font->lfQuality));
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1004 }
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1005 ASET (entity, FONT_FAMILY_INDEX,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1006 intern_downcase (lf->lfFaceName, strlen (lf->lfFaceName)));
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1007
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1008 ASET (entity, FONT_WEIGHT_INDEX, make_number (lf->lfWeight));
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1009 ASET (entity, FONT_SLANT_INDEX, make_number (lf->lfItalic ? 200 : 100));
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1010 /* TODO: PANOSE struct has this info, but need to call GetOutlineTextMetrics
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1011 to get it. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1012 ASET (entity, FONT_WIDTH_INDEX, make_number (100));
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1013
90879
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
1014 if (font_type & RASTER_FONTTYPE)
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
1015 ASET (entity, FONT_SIZE_INDEX, make_number (physical_font->ntmTm.tmHeight));
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
1016 else
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
1017 ASET (entity, FONT_SIZE_INDEX, make_number (0));
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1018
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1019 /* Cache unicode codepoints covered by this font, as there is no other way
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1020 of getting this information easily. */
90879
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
1021 if (font_type & TRUETYPE_FONTTYPE)
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1022 {
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1023 font_put_extra (entity, QCscript,
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1024 font_supported_scripts (&physical_font->ntmFontSig));
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1025 }
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1026
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1027 /* This information is not fully available when opening fonts, so
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1028 save it here. Only Windows 2000 and later return information
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1029 about opentype and type1 fonts, so need a fallback for detecting
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1030 truetype so that this information is not any worse than we could
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1031 have obtained later. */
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1032 if (EQ (backend, Quniscribe) && (full_type & NTMFLAGS_OPENTYPE))
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1033 tem = intern ("opentype");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1034 else if (font_type & TRUETYPE_FONTTYPE)
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1035 tem = intern ("truetype");
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1036 else if (full_type & NTM_PS_OPENTYPE)
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1037 tem = intern ("postscript");
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1038 else if (full_type & NTM_TYPE1)
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1039 tem = intern ("type1");
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1040 else if (font_type & RASTER_FONTTYPE)
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1041 tem = intern ("w32bitmap");
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1042 else
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1043 tem = intern ("w32vector");
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1044
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1045 font_put_extra (entity, QCformat, tem);
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1046
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1047 return entity;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1048 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1049
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1050
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1051 /* Convert generic families to the family portion of lfPitchAndFamily. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1052 BYTE
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1053 w32_generic_family (Lisp_Object name)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1054 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1055 /* Generic families. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1056 if (EQ (name, Qmonospace) || EQ (name, Qmono))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1057 return FF_MODERN;
91260
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
1058 else if (EQ (name, Qsans) || EQ (name, Qsans_serif) || EQ (name, Qsansserif))
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1059 return FF_SWISS;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1060 else if (EQ (name, Qserif))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1061 return FF_ROMAN;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1062 else if (EQ (name, Qdecorative))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1063 return FF_DECORATIVE;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1064 else if (EQ (name, Qscript))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1065 return FF_SCRIPT;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1066 else
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1067 return FF_DONTCARE;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1068 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1069
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1070 static int
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1071 logfonts_match (font, pattern)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1072 LOGFONT *font, *pattern;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1073 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1074 /* Only check height for raster fonts. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1075 if (pattern->lfHeight && font->lfOutPrecision == OUT_STRING_PRECIS
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1076 && font->lfHeight != pattern->lfHeight)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1077 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1078
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1079 /* Have some flexibility with weights. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1080 if (pattern->lfWeight
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1081 && ((font->lfWeight < (pattern->lfWeight - 150))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1082 || font->lfWeight > (pattern->lfWeight + 150)))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1083 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1084
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1085 /* Charset and face should be OK. Italic has to be checked
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1086 against the original spec, in case we don't have any preference. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1087 return 1;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1088 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1089
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1090 static int
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1091 font_matches_spec (type, font, spec, backend, logfont)
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1092 DWORD type;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1093 NEWTEXTMETRICEX *font;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1094 Lisp_Object spec;
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1095 Lisp_Object backend;
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1096 LOGFONT *logfont;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1097 {
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1098 Lisp_Object extra, val;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1099
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1100 /* Check italic. Can't check logfonts, since it is a boolean field,
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1101 so there is no difference between "non-italic" and "don't care". */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1102 val = AREF (spec, FONT_SLANT_INDEX);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1103 if (INTEGERP (val))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1104 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1105 int slant = XINT (val);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1106 if ((slant > 150 && !font->ntmTm.tmItalic)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1107 || (slant <= 150 && font->ntmTm.tmItalic))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1108 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1109 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1110
91264
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1111 /* Check adstyle against generic family. */
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1112 val = AREF (spec, FONT_ADSTYLE_INDEX);
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1113 if (!NILP (val))
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1114 {
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1115 BYTE family = w32_generic_family (val);
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1116 if (family != FF_DONTCARE
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1117 && family != (font->ntmTm.tmPitchAndFamily & 0xF0))
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1118 return 0;
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1119 }
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1120
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1121 /* Check extra parameters. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1122 for (extra = AREF (spec, FONT_EXTRA_INDEX);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1123 CONSP (extra); extra = XCDR (extra))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1124 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1125 Lisp_Object extra_entry;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1126 extra_entry = XCAR (extra);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1127 if (CONSP (extra_entry))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1128 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1129 Lisp_Object key = XCAR (extra_entry);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1130 val = XCDR (extra_entry);
91260
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
1131 if (EQ (key, QCspacing))
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1132 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1133 int proportional;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1134 if (INTEGERP (val))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1135 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1136 int spacing = XINT (val);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1137 proportional = (spacing < FONT_SPACING_MONO);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1138 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1139 else if (EQ (val, Qp))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1140 proportional = 1;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1141 else if (EQ (val, Qc) || EQ (val, Qm))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1142 proportional = 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1143 else
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1144 return 0; /* Bad font spec. */
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1145
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1146 if ((proportional && !(font->ntmTm.tmPitchAndFamily & 0x01))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1147 || (!proportional && (font->ntmTm.tmPitchAndFamily & 0x01)))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1148 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1149 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1150 else if (EQ (key, QCscript) && SYMBOLP (val))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1151 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1152 /* Only truetype fonts will have information about what
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1153 scripts they support. This probably means the user
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1154 will have to force Emacs to use raster, postscript
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1155 or atm fonts for non-ASCII text. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1156 if (type & TRUETYPE_FONTTYPE)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1157 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1158 Lisp_Object support
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1159 = font_supported_scripts (&font->ntmFontSig);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1160 if (! memq_no_quit (val, support))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1161 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1162 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1163 else
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1164 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1165 /* Return specific matches, but play it safe. Fonts
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1166 that cover more than their charset would suggest
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1167 are likely to be truetype or opentype fonts,
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1168 covered above. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1169 if (EQ (val, Qlatin))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1170 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1171 /* Although every charset but symbol, thai and
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1172 arabic contains the basic ASCII set of latin
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1173 characters, Emacs expects much more. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1174 if (font->ntmTm.tmCharSet != ANSI_CHARSET)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1175 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1176 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1177 else if (EQ (val, Qsymbol))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1178 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1179 if (font->ntmTm.tmCharSet != SYMBOL_CHARSET)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1180 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1181 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1182 else if (EQ (val, Qcyrillic))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1183 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1184 if (font->ntmTm.tmCharSet != RUSSIAN_CHARSET)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1185 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1186 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1187 else if (EQ (val, Qgreek))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1188 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1189 if (font->ntmTm.tmCharSet != GREEK_CHARSET)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1190 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1191 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1192 else if (EQ (val, Qarabic))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1193 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1194 if (font->ntmTm.tmCharSet != ARABIC_CHARSET)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1195 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1196 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1197 else if (EQ (val, Qhebrew))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1198 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1199 if (font->ntmTm.tmCharSet != HEBREW_CHARSET)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1200 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1201 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1202 else if (EQ (val, Qthai))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1203 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1204 if (font->ntmTm.tmCharSet != THAI_CHARSET)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1205 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1206 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1207 else if (EQ (val, Qkana))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1208 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1209 if (font->ntmTm.tmCharSet != SHIFTJIS_CHARSET)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1210 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1211 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1212 else if (EQ (val, Qbopomofo))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1213 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1214 if (font->ntmTm.tmCharSet != CHINESEBIG5_CHARSET)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1215 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1216 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1217 else if (EQ (val, Qhangul))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1218 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1219 if (font->ntmTm.tmCharSet != HANGUL_CHARSET
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1220 && font->ntmTm.tmCharSet != JOHAB_CHARSET)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1221 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1222 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1223 else if (EQ (val, Qhan))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1224 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1225 if (font->ntmTm.tmCharSet != CHINESEBIG5_CHARSET
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1226 && font->ntmTm.tmCharSet != GB2312_CHARSET
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1227 && font->ntmTm.tmCharSet != HANGUL_CHARSET
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1228 && font->ntmTm.tmCharSet != JOHAB_CHARSET
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1229 && font->ntmTm.tmCharSet != SHIFTJIS_CHARSET)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1230 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1231 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1232 else
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1233 /* Other scripts unlikely to be handled by non-truetype
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1234 fonts. */
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1235 return 0;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1236 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1237 }
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1238 else if (EQ (key, QCotf) && CONSP (val))
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1239 {
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1240 /* OTF features only supported by the uniscribe backend. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1241 if (EQ (backend, Quniscribe))
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1242 {
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1243 if (!uniscribe_check_otf (logfont, val))
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1244 return 0;
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1245 }
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1246 else
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1247 return 0;
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1248 }
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1249 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1250 }
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1251 return 1;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1252 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1253
92539
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1254 static int
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1255 w32font_coverage_ok (coverage, charset)
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1256 FONTSIGNATURE * coverage;
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1257 BYTE charset;
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1258 {
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1259 DWORD subrange1 = coverage->fsUsb[1];
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1260
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1261 #define SUBRANGE1_HAN_MASK 0x08000000
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1262 #define SUBRANGE1_HANGEUL_MASK 0x01000000
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1263 #define SUBRANGE1_JAPANESE_MASK (0x00060000 | SUBRANGE1_HAN_MASK)
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1264
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1265 if (charset == GB2312_CHARSET || charset == CHINESEBIG5_CHARSET)
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1266 {
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1267 return (subrange1 & SUBRANGE1_HAN_MASK) == SUBRANGE1_HAN_MASK;
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1268 }
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1269 else if (charset == SHIFTJIS_CHARSET)
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1270 {
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1271 return (subrange1 & SUBRANGE1_JAPANESE_MASK) == SUBRANGE1_JAPANESE_MASK;
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1272 }
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1273 else if (charset == HANGEUL_CHARSET)
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1274 {
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1275 return (subrange1 & SUBRANGE1_HANGEUL_MASK) == SUBRANGE1_HANGEUL_MASK;
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1276 }
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1277
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1278 return 1;
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1279 }
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1280
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1281 /* Callback function for EnumFontFamiliesEx.
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1282 * Checks if a font matches everything we are trying to check agaist,
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1283 * and if so, adds it to a list. Both the data we are checking against
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1284 * and the list to which the fonts are added are passed in via the
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1285 * lparam argument, in the form of a font_callback_data struct. */
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1286 static int CALLBACK
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1287 add_font_entity_to_list (logical_font, physical_font, font_type, lParam)
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1288 ENUMLOGFONTEX *logical_font;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1289 NEWTEXTMETRICEX *physical_font;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1290 DWORD font_type;
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1291 LPARAM lParam;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1292 {
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1293 struct font_callback_data *match_data
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1294 = (struct font_callback_data *) lParam;
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1295 Lisp_Object backend = match_data->opentype_only ? Quniscribe : Qgdi;
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1296
91208
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
1297 if ((!match_data->opentype_only
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1298 || (physical_font->ntmTm.ntmFlags & NTMFLAGS_OPENTYPE)
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1299 || (font_type & TRUETYPE_FONTTYPE))
91208
98329725c530 Include w32font.h.
Jason Rumney <jasonr@gnu.org>
parents: 91182
diff changeset
1300 && logfonts_match (&logical_font->elfLogFont, &match_data->pattern)
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1301 && font_matches_spec (font_type, physical_font,
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1302 match_data->orig_font_spec, backend,
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1303 &logical_font->elfLogFont)
92539
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1304 && w32font_coverage_ok (&physical_font->ntmFontSig,
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1305 match_data->pattern.lfCharSet)
91264
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1306 /* Avoid substitutions involving raster fonts (eg Helv -> MS Sans Serif)
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1307 We limit this to raster fonts, because the test can catch some
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1308 genuine fonts (eg the full name of DejaVu Sans Mono Light is actually
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1309 DejaVu Sans Mono ExtraLight). Helvetica -> Arial substitution will
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1310 therefore get through this test. Since full names can be prefixed
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1311 by a foundry, we accept raster fonts if the font name is found
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1312 anywhere within the full name. */
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1313 && (logical_font->elfLogFont.lfOutPrecision != OUT_STRING_PRECIS
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1314 || strstr (logical_font->elfFullName,
9112e263c11f (logfonts_match): Don't check adstyle here.
Jason Rumney <jasonr@gnu.org>
parents: 91260
diff changeset
1315 logical_font->elfLogFont.lfFaceName)))
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1316 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1317 Lisp_Object entity
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1318 = w32_enumfont_pattern_entity (match_data->frame, logical_font,
91124
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1319 physical_font, font_type,
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1320 &match_data->pattern,
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1321 backend);
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1322 if (!NILP (entity))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1323 match_data->list = Fcons (entity, match_data->list);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1324 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1325 return 1;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1326 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1327
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1328 /* Callback function for EnumFontFamiliesEx.
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1329 * Terminates the search once we have a match. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1330 static int CALLBACK
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1331 add_one_font_entity_to_list (logical_font, physical_font, font_type, lParam)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1332 ENUMLOGFONTEX *logical_font;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1333 NEWTEXTMETRICEX *physical_font;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1334 DWORD font_type;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1335 LPARAM lParam;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1336 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1337 struct font_callback_data *match_data
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1338 = (struct font_callback_data *) lParam;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1339 add_font_entity_to_list (logical_font, physical_font, font_type, lParam);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1340
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1341 /* If we have a font in the list, terminate the search. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1342 return !NILP (match_data->list);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1343 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1344
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1345 /* Convert a Lisp font registry (symbol) to a windows charset. */
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1346 static LONG
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1347 registry_to_w32_charset (charset)
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1348 Lisp_Object charset;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1349 {
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1350 if (EQ (charset, Qiso10646_1) || EQ (charset, Qunicode_bmp)
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1351 || EQ (charset, Qunicode_sip))
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1352 return DEFAULT_CHARSET; /* UNICODE_CHARSET not defined in MingW32 */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1353 else if (EQ (charset, Qiso8859_1))
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1354 return ANSI_CHARSET;
90879
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
1355 else if (SYMBOLP (charset))
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
1356 return x_to_w32_charset (SDATA (SYMBOL_NAME (charset)));
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1357 else if (STRINGP (charset))
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1358 return x_to_w32_charset (SDATA (charset));
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1359 else
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1360 return DEFAULT_CHARSET;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1361 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1362
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1363 static Lisp_Object
92539
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1364 w32_registry (w32_charset, font_type)
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1365 LONG w32_charset;
92539
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1366 DWORD font_type;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1367 {
92539
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1368 /* If charset is defaulted, use ANSI (unicode for truetype fonts). */
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1369 if (w32_charset == DEFAULT_CHARSET)
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1370 w32_charset = ANSI_CHARSET;
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1371
d4cf72c99c2f (w32_registry): Take font_type argument. Use ANSI
Jason Rumney <jasonr@gnu.org>
parents: 92472
diff changeset
1372 if (font_type == TRUETYPE_FONTTYPE && w32_charset == ANSI_CHARSET)
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1373 return Qiso10646_1;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1374 else
90879
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
1375 {
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
1376 char * charset = w32_to_x_charset (w32_charset, NULL);
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
1377 return intern_downcase (charset, strlen(charset));
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
1378 }
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1379 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1380
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1381 /* Fill in all the available details of LOGFONT from FONT_SPEC. */
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1382 static void
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1383 fill_in_logfont (f, logfont, font_spec)
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1384 FRAME_PTR f;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1385 LOGFONT *logfont;
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1386 Lisp_Object font_spec;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1387 {
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1388 Lisp_Object tmp, extra;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1389 int dpi = FRAME_W32_DISPLAY_INFO (f)->resy;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1390
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1391 extra = AREF (font_spec, FONT_EXTRA_INDEX);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1392 /* Allow user to override dpi settings. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1393 if (CONSP (extra))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1394 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1395 tmp = assq_no_quit (QCdpi, extra);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1396 if (CONSP (tmp) && INTEGERP (XCDR (tmp)))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1397 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1398 dpi = XINT (XCDR (tmp));
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1399 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1400 else if (CONSP (tmp) && FLOATP (XCDR (tmp)))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1401 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1402 dpi = (int) (XFLOAT_DATA (XCDR (tmp)) + 0.5);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1403 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1404 }
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1405
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1406 /* Height */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1407 tmp = AREF (font_spec, FONT_SIZE_INDEX);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1408 if (INTEGERP (tmp))
90879
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
1409 logfont->lfHeight = -1 * XINT (tmp);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1410 else if (FLOATP (tmp))
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1411 logfont->lfHeight = (int) (-1.0 * dpi * XFLOAT_DATA (tmp) / 72.27 + 0.5);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1412
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1413 /* Escapement */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1414
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1415 /* Orientation */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1416
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1417 /* Weight */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1418 tmp = AREF (font_spec, FONT_WEIGHT_INDEX);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1419 if (INTEGERP (tmp))
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1420 logfont->lfWeight = XINT (tmp);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1421
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1422 /* Italic */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1423 tmp = AREF (font_spec, FONT_SLANT_INDEX);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1424 if (INTEGERP (tmp))
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1425 {
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1426 int slant = XINT (tmp);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1427 logfont->lfItalic = slant > 150 ? 1 : 0;
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1428 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1429
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1430 /* Underline */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1431
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1432 /* Strikeout */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1433
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1434 /* Charset */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1435 tmp = AREF (font_spec, FONT_REGISTRY_INDEX);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1436 if (! NILP (tmp))
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1437 logfont->lfCharSet = registry_to_w32_charset (tmp);
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1438 else
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1439 logfont->lfCharSet = DEFAULT_CHARSET;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1440
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1441 /* Out Precision */
91124
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1442
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1443 /* Clip Precision */
91124
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1444
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1445 /* Quality */
90879
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
1446 logfont->lfQuality = DEFAULT_QUALITY;
82b86c925f88 * w32font.c (w32font_open): Handle size, height and pixel_size better.
Jason Rumney <jasonr@gnu.org>
parents: 90869
diff changeset
1447
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1448 /* Generic Family and Face Name */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1449 logfont->lfPitchAndFamily = FF_DONTCARE | DEFAULT_PITCH;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1450
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1451 tmp = AREF (font_spec, FONT_FAMILY_INDEX);
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1452 if (! NILP (tmp))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1453 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1454 logfont->lfPitchAndFamily = w32_generic_family (tmp) | DEFAULT_PITCH;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1455 if ((logfont->lfPitchAndFamily & 0xF0) != FF_DONTCARE)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1456 ; /* Font name was generic, don't fill in font name. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1457 /* Font families are interned, but allow for strings also in case of
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1458 user input. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1459 else if (SYMBOLP (tmp))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1460 strncpy (logfont->lfFaceName, SDATA (SYMBOL_NAME (tmp)), LF_FACESIZE);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1461 else if (STRINGP (tmp))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1462 strncpy (logfont->lfFaceName, SDATA (tmp), LF_FACESIZE);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1463 }
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1464
91260
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
1465 tmp = AREF (font_spec, FONT_ADSTYLE_INDEX);
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
1466 if (!NILP (tmp))
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
1467 {
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
1468 /* Override generic family. */
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
1469 BYTE family = w32_generic_family (tmp);
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
1470 if (family != FF_DONTCARE)
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
1471 logfont->lfPitchAndFamily = family | DEFAULT_PITCH;
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
1472 }
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
1473
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1474 /* Process EXTRA info. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1475 for ( ; CONSP (extra); extra = XCDR (extra))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1476 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1477 tmp = XCAR (extra);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1478 if (CONSP (tmp))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1479 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1480 Lisp_Object key, val;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1481 key = XCAR (tmp), val = XCDR (tmp);
91260
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
1482 if (EQ (key, QCspacing))
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1483 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1484 /* Set pitch based on the spacing property. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1485 if (INTEGERP (val))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1486 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1487 int spacing = XINT (val);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1488 if (spacing < FONT_SPACING_MONO)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1489 logfont->lfPitchAndFamily
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1490 = logfont->lfPitchAndFamily & 0xF0 | VARIABLE_PITCH;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1491 else
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1492 logfont->lfPitchAndFamily
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1493 = logfont->lfPitchAndFamily & 0xF0 | FIXED_PITCH;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1494 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1495 else if (EQ (val, Qp))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1496 logfont->lfPitchAndFamily
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1497 = logfont->lfPitchAndFamily & 0xF0 | VARIABLE_PITCH;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1498 else if (EQ (val, Qc) || EQ (val, Qm))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1499 logfont->lfPitchAndFamily
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1500 = logfont->lfPitchAndFamily & 0xF0 | FIXED_PITCH;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1501 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1502 /* Only use QCscript if charset is not provided, or is unicode
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1503 and a single script is specified. This is rather crude,
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1504 and is only used to narrow down the fonts returned where
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1505 there is a definite match. Some scripts, such as latin, han,
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1506 cjk-misc match multiple lfCharSet values, so we can't pre-filter
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1507 them. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1508 else if (EQ (key, QCscript)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1509 && logfont->lfCharSet == DEFAULT_CHARSET
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1510 && SYMBOLP (val))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1511 {
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1512 if (EQ (val, Qgreek))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1513 logfont->lfCharSet = GREEK_CHARSET;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1514 else if (EQ (val, Qhangul))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1515 logfont->lfCharSet = HANGUL_CHARSET;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1516 else if (EQ (val, Qkana) || EQ (val, Qkanbun))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1517 logfont->lfCharSet = SHIFTJIS_CHARSET;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1518 else if (EQ (val, Qbopomofo))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1519 logfont->lfCharSet = CHINESEBIG5_CHARSET;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1520 /* GB 18030 supports tibetan, yi, mongolian,
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1521 fonts that support it should show up if we ask for
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1522 GB2312 fonts. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1523 else if (EQ (val, Qtibetan) || EQ (val, Qyi)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1524 || EQ (val, Qmongolian))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1525 logfont->lfCharSet = GB2312_CHARSET;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1526 else if (EQ (val, Qhebrew))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1527 logfont->lfCharSet = HEBREW_CHARSET;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1528 else if (EQ (val, Qarabic))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1529 logfont->lfCharSet = ARABIC_CHARSET;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1530 else if (EQ (val, Qthai))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1531 logfont->lfCharSet = THAI_CHARSET;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1532 else if (EQ (val, Qsymbol))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1533 logfont->lfCharSet = SYMBOL_CHARSET;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1534 }
91124
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1535 else if (EQ (key, QCantialias) && SYMBOLP (val))
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1536 {
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1537 logfont->lfQuality = w32_antialias_type (val);
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1538 }
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1539 }
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1540 }
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1541 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1542
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1543 static void
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1544 list_all_matching_fonts (match_data)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1545 struct font_callback_data *match_data;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1546 {
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1547 HDC dc;
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1548 Lisp_Object families = w32font_list_family (match_data->frame);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1549 struct frame *f = XFRAME (match_data->frame);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1550
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1551 dc = get_frame_dc (f);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1552
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1553 while (!NILP (families))
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1554 {
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1555 /* TODO: Use the Unicode versions of the W32 APIs, so we can
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1556 handle non-ASCII font names. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1557 char *name;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1558 Lisp_Object family = CAR (families);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1559 families = CDR (families);
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1560 if (NILP (family))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1561 continue;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1562 else if (STRINGP (family))
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1563 name = SDATA (family);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1564 else
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1565 name = SDATA (SYMBOL_NAME (family));
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1566
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1567 strncpy (match_data->pattern.lfFaceName, name, LF_FACESIZE);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1568 match_data->pattern.lfFaceName[LF_FACESIZE - 1] = '\0';
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1569
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1570 EnumFontFamiliesEx (dc, &match_data->pattern,
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1571 (FONTENUMPROC) add_font_entity_to_list,
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1572 (LPARAM) match_data, 0);
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1573 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1574
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1575 release_frame_dc (f, dc);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1576 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1577
91124
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1578 static Lisp_Object
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1579 lispy_antialias_type (type)
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1580 BYTE type;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1581 {
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1582 Lisp_Object lispy;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1583
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1584 switch (type)
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1585 {
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1586 case NONANTIALIASED_QUALITY:
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1587 lispy = Qnone;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1588 break;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1589 case ANTIALIASED_QUALITY:
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1590 lispy = Qstandard;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1591 break;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1592 case CLEARTYPE_QUALITY:
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1593 lispy = Qsubpixel;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1594 break;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1595 case CLEARTYPE_NATURAL_QUALITY:
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1596 lispy = Qnatural;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1597 break;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1598 default:
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1599 lispy = Qnil;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1600 break;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1601 }
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1602 return lispy;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1603 }
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1604
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1605 /* Convert antialiasing symbols to lfQuality */
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1606 static BYTE
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1607 w32_antialias_type (type)
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1608 Lisp_Object type;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1609 {
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1610 if (EQ (type, Qnone))
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1611 return NONANTIALIASED_QUALITY;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1612 else if (EQ (type, Qstandard))
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1613 return ANTIALIASED_QUALITY;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1614 else if (EQ (type, Qsubpixel))
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1615 return CLEARTYPE_QUALITY;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1616 else if (EQ (type, Qnatural))
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1617 return CLEARTYPE_NATURAL_QUALITY;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1618 else
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1619 return DEFAULT_QUALITY;
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1620 }
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1621
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1622 /* Return a list of all the scripts that the font supports. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1623 static Lisp_Object
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1624 font_supported_scripts (FONTSIGNATURE * sig)
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1625 {
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1626 DWORD * subranges = sig->fsUsb;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1627 Lisp_Object supported = Qnil;
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1628
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1629 /* Match a single subrange. SYM is set if bit N is set in subranges. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1630 #define SUBRANGE(n,sym) \
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1631 if (subranges[(n) / 32] & (1 << ((n) % 32))) \
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1632 supported = Fcons ((sym), supported)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1633
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1634 /* Match multiple subranges. SYM is set if any MASK bit is set in
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1635 subranges[0 - 3]. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1636 #define MASK_ANY(mask0,mask1,mask2,mask3,sym) \
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1637 if ((subranges[0] & (mask0)) || (subranges[1] & (mask1)) \
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1638 || (subranges[2] & (mask2)) || (subranges[3] & (mask3))) \
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1639 supported = Fcons ((sym), supported)
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1640
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1641 SUBRANGE (0, Qlatin);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1642 /* The following count as latin too, ASCII should be present in these fonts,
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1643 so don't need to mark them separately. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1644 /* 1: Latin-1 supplement, 2: Latin Extended A, 3: Latin Extended B. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1645 SUBRANGE (4, Qphonetic);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1646 /* 5: Spacing and tone modifiers, 6: Combining Diacriticals. */
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1647 SUBRANGE (7, Qgreek);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1648 SUBRANGE (8, Qcoptic);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1649 SUBRANGE (9, Qcyrillic);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1650 SUBRANGE (10, Qarmenian);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1651 SUBRANGE (11, Qhebrew);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1652 SUBRANGE (13, Qarabic);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1653 SUBRANGE (14, Qnko);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1654 SUBRANGE (15, Qdevanagari);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1655 SUBRANGE (16, Qbengali);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1656 SUBRANGE (17, Qgurmukhi);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1657 SUBRANGE (18, Qgujarati);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1658 SUBRANGE (19, Qoriya);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1659 SUBRANGE (20, Qtamil);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1660 SUBRANGE (21, Qtelugu);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1661 SUBRANGE (22, Qkannada);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1662 SUBRANGE (23, Qmalayalam);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1663 SUBRANGE (24, Qthai);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1664 SUBRANGE (25, Qlao);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1665 SUBRANGE (26, Qgeorgian);
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1666 SUBRANGE (27, Qbalinese);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1667 /* 28: Hangul Jamo. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1668 /* 29: Latin Extended, 30: Greek Extended, 31: Punctuation. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1669 /* 32-47: Symbols (defined below). */
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1670 SUBRANGE (48, Qcjk_misc);
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1671 /* Match either 49: katakana or 50: hiragana for kana. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1672 MASK_ANY (0, 0x00060000, 0, 0, Qkana);
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1673 SUBRANGE (51, Qbopomofo);
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1674 /* 52: Compatibility Jamo */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1675 SUBRANGE (53, Qphags_pa);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1676 /* 54: Enclosed CJK letters and months, 55: CJK Compatibility. */
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1677 SUBRANGE (56, Qhangul);
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1678 /* 57: Surrogates. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1679 SUBRANGE (58, Qphoenician);
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1680 SUBRANGE (59, Qhan); /* There are others, but this is the main one. */
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1681 SUBRANGE (59, Qideographic_description); /* Windows lumps this in. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1682 SUBRANGE (59, Qkanbun); /* And this. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1683 /* 60: Private use, 61: CJK strokes and compatibility. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1684 /* 62: Alphabetic Presentation, 63: Arabic Presentation A. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1685 /* 64: Combining half marks, 65: Vertical and CJK compatibility. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1686 /* 66: Small forms, 67: Arabic Presentation B, 68: Half and Full width. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1687 /* 69: Specials. */
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1688 SUBRANGE (70, Qtibetan);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1689 SUBRANGE (71, Qsyriac);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1690 SUBRANGE (72, Qthaana);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1691 SUBRANGE (73, Qsinhala);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1692 SUBRANGE (74, Qmyanmar);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1693 SUBRANGE (75, Qethiopic);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1694 SUBRANGE (76, Qcherokee);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1695 SUBRANGE (77, Qcanadian_aboriginal);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1696 SUBRANGE (78, Qogham);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1697 SUBRANGE (79, Qrunic);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1698 SUBRANGE (80, Qkhmer);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1699 SUBRANGE (81, Qmongolian);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1700 SUBRANGE (82, Qbraille);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1701 SUBRANGE (83, Qyi);
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1702 SUBRANGE (84, Qbuhid);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1703 SUBRANGE (84, Qhanunoo);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1704 SUBRANGE (84, Qtagalog);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1705 SUBRANGE (84, Qtagbanwa);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1706 SUBRANGE (85, Qold_italic);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1707 SUBRANGE (86, Qgothic);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1708 SUBRANGE (87, Qdeseret);
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1709 SUBRANGE (88, Qbyzantine_musical_symbol);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1710 SUBRANGE (88, Qmusical_symbol); /* Windows doesn't distinguish these. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1711 SUBRANGE (89, Qmathematical);
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1712 /* 90: Private use, 91: Variation selectors, 92: Tags. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1713 SUBRANGE (93, Qlimbu);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1714 SUBRANGE (94, Qtai_le);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1715 /* 95: New Tai Le */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1716 SUBRANGE (90, Qbuginese);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1717 SUBRANGE (97, Qglagolitic);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1718 SUBRANGE (98, Qtifinagh);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1719 /* 99: Yijing Hexagrams. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1720 SUBRANGE (100, Qsyloti_nagri);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1721 SUBRANGE (101, Qlinear_b);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1722 /* 102: Ancient Greek Numbers. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1723 SUBRANGE (103, Qugaritic);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1724 SUBRANGE (104, Qold_persian);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1725 SUBRANGE (105, Qshavian);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1726 SUBRANGE (106, Qosmanya);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1727 SUBRANGE (107, Qcypriot);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1728 SUBRANGE (108, Qkharoshthi);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1729 /* 109: Tai Xuan Jing. */
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1730 SUBRANGE (110, Qcuneiform);
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1731 /* 111: Counting Rods. */
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1732
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1733 /* There isn't really a main symbol range, so include symbol if any
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1734 relevant range is set. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1735 MASK_ANY (0x8000000, 0x0000FFFF, 0, 0, Qsymbol);
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1736
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1737 /* Missing: Tai Viet (U+AA80) and Cham (U+AA00) . */
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1738 #undef SUBRANGE
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1739 #undef MASK_ANY
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1740
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1741 return supported;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1742 }
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1743
92390
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1744 /* Generate a full name for a Windows font.
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1745 The full name is in fcname format, with weight, slant and antialiasing
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1746 specified if they are not "normal". */
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1747 static int
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1748 w32font_full_name (font, font_obj, pixel_size, name, nbytes)
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1749 LOGFONT * font;
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1750 Lisp_Object font_obj;
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1751 int pixel_size;
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1752 char *name;
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1753 int nbytes;
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1754 {
92394
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1755 int len, height, outline;
92390
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1756 char *p;
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1757 Lisp_Object antialiasing, weight = Qnil;
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1758
92394
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1759 len = strlen (font->lfFaceName);
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1760
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1761 outline = EQ (AREF (font_obj, FONT_FOUNDRY_INDEX), Qoutline);
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1762
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1763 /* Represent size of scalable fonts by point size. But use pixelsize for
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1764 raster fonts to indicate that they are exactly that size. */
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1765 if (outline)
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1766 len += 11; /* -SIZE */
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1767 else
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1768 len = strlen (font->lfFaceName) + 21;
92390
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1769
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1770 if (font->lfItalic)
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1771 len += 7; /* :italic */
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1772
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1773 if (font->lfWeight && font->lfWeight != FW_NORMAL)
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1774 {
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1775 weight = font_symbolic_weight (font_obj);
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1776 len += 8 + SBYTES (SYMBOL_NAME (weight)); /* :weight=NAME */
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1777 }
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1778
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1779 antialiasing = lispy_antialias_type (font->lfQuality);
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1780 if (! NILP (antialiasing))
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1781 len += 11 + SBYTES (SYMBOL_NAME (antialiasing)); /* :antialias=NAME */
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1782
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1783 /* Check that the buffer is big enough */
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1784 if (len > nbytes)
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1785 return -1;
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1786
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1787 p = name;
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1788 p += sprintf (p, "%s", font->lfFaceName);
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1789
92394
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1790 height = font->lfHeight ? eabs (font->lfHeight) : pixel_size;
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1791
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1792 if (height > 0)
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1793 {
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1794 if (outline)
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1795 {
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1796 float pointsize = height * 72.0 / one_w32_display_info.resy;
92712
fb1da73bc0c4 (w32font_full_name): Use floor to round.
Jason Rumney <jasonr@gnu.org>
parents: 92539
diff changeset
1797 /* Round to nearest half point. floor is used, since round is not
fb1da73bc0c4 (w32font_full_name): Use floor to round.
Jason Rumney <jasonr@gnu.org>
parents: 92539
diff changeset
1798 supported in MS library. */
fb1da73bc0c4 (w32font_full_name): Use floor to round.
Jason Rumney <jasonr@gnu.org>
parents: 92539
diff changeset
1799 pointsize = floor (pointsize * 2 + 0.5) / 2;
92394
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1800 p += sprintf (p, "-%1.1f", pointsize);
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1801 }
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1802 else
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1803 p += sprintf (p, ":pixelsize=%d", height);
7701acfc2ec5 (w32font_full_name): Report point size for scalable fonts.
Jason Rumney <jasonr@gnu.org>
parents: 92390
diff changeset
1804 }
92390
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1805
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1806 if (font->lfItalic)
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1807 p += sprintf (p, ":italic");
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1808
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1809 if (SYMBOLP (weight) && ! NILP (weight))
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1810 p += sprintf (p, ":weight=%s", SDATA (SYMBOL_NAME (weight)));
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1811
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1812 if (SYMBOLP (antialiasing) && ! NILP (antialiasing))
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1813 p += sprintf (p, ":antialias=%s", SDATA (SYMBOL_NAME (antialiasing)));
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1814
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1815 return (p - name);
9b14fb0bae09 (w32font_full_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 92199
diff changeset
1816 }
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1817
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1818
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1819 static void
92411
133560a77a09 (recompute_cached_metrics): Change font arg to w32font_info.
Jason Rumney <jasonr@gnu.org>
parents: 92409
diff changeset
1820 recompute_cached_metrics (dc, w32_font)
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1821 HDC dc;
92411
133560a77a09 (recompute_cached_metrics): Change font arg to w32font_info.
Jason Rumney <jasonr@gnu.org>
parents: 92409
diff changeset
1822 struct w32font_info *w32_font;
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1823 {
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1824 GLYPHMETRICS gm;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1825 MAT2 transform;
92411
133560a77a09 (recompute_cached_metrics): Change font arg to w32font_info.
Jason Rumney <jasonr@gnu.org>
parents: 92409
diff changeset
1826 unsigned int i;
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1827
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1828 bzero (&transform, sizeof (transform));
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1829 transform.eM11.value = 1;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1830 transform.eM22.value = 1;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1831
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1832 for (i = 0; i < 128; i++)
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1833 {
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1834 struct font_metrics* char_metric = &w32_font->ascii_metrics[i];
92411
133560a77a09 (recompute_cached_metrics): Change font arg to w32font_info.
Jason Rumney <jasonr@gnu.org>
parents: 92409
diff changeset
1835 unsigned int options = GGO_METRICS;
133560a77a09 (recompute_cached_metrics): Change font arg to w32font_info.
Jason Rumney <jasonr@gnu.org>
parents: 92409
diff changeset
1836 if (w32_font->glyph_idx)
133560a77a09 (recompute_cached_metrics): Change font arg to w32font_info.
Jason Rumney <jasonr@gnu.org>
parents: 92409
diff changeset
1837 options |= GGO_GLYPH_INDEX;
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1838
92411
133560a77a09 (recompute_cached_metrics): Change font arg to w32font_info.
Jason Rumney <jasonr@gnu.org>
parents: 92409
diff changeset
1839 if (GetGlyphOutlineW (dc, i, options, &gm, 0, NULL, &transform)
133560a77a09 (recompute_cached_metrics): Change font arg to w32font_info.
Jason Rumney <jasonr@gnu.org>
parents: 92409
diff changeset
1840 != GDI_ERROR)
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1841 {
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1842 char_metric->lbearing = gm.gmptGlyphOrigin.x;
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1843 char_metric->rbearing = gm.gmBlackBoxX + gm.gmptGlyphOrigin.x;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1844 char_metric->width = gm.gmCellIncX;
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1845 char_metric->ascent = gm.gmBlackBoxY;
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1846 char_metric->descent = (gm.gmCellIncY - gm.gmptGlyphOrigin.y
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1847 - gm.gmBlackBoxY);
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1848 }
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1849 else
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1850 char_metric->width = 0;
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1851 }
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1852 }
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1853
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1854 struct font_driver w32font_driver =
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1855 {
90964
269d87dc10d9 (Qgdi): Rename from Qw32.
Jason Rumney <jasonr@gnu.org>
parents: 90933
diff changeset
1856 0, /* Qgdi */
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1857 w32font_get_cache,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1858 w32font_list,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1859 w32font_match,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1860 w32font_list_family,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1861 NULL, /* free_entity */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1862 w32font_open,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1863 w32font_close,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1864 NULL, /* prepare_face */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1865 NULL, /* done_face */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1866 w32font_has_char,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1867 w32font_encode_char,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1868 w32font_text_extents,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1869 w32font_draw,
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1870 NULL, /* get_bitmap */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1871 NULL, /* free_bitmap */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1872 NULL, /* get_outline */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1873 NULL, /* free_outline */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1874 NULL, /* anchor_point */
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1875 NULL, /* otf_capability */
91158
5e7347695108 (w32font_driver): Add new fields.
Jason Rumney <jasonr@gnu.org>
parents: 91128
diff changeset
1876 NULL, /* otf_drive */
5e7347695108 (w32font_driver): Add new fields.
Jason Rumney <jasonr@gnu.org>
parents: 91128
diff changeset
1877 NULL, /* start_for_frame */
5e7347695108 (w32font_driver): Add new fields.
Jason Rumney <jasonr@gnu.org>
parents: 91128
diff changeset
1878 NULL, /* end_for_frame */
5e7347695108 (w32font_driver): Add new fields.
Jason Rumney <jasonr@gnu.org>
parents: 91128
diff changeset
1879 NULL /* shape */
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1880 };
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1881
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1882
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1883 /* Initialize state that does not change between invocations. This is only
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1884 called when Emacs is dumped. */
90889
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1885 void
0df73c71020b * w32font.c (QCsubranges): New symbol.
Jason Rumney <jasonr@gnu.org>
parents: 90887
diff changeset
1886 syms_of_w32font ()
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1887 {
90964
269d87dc10d9 (Qgdi): Rename from Qw32.
Jason Rumney <jasonr@gnu.org>
parents: 90933
diff changeset
1888 DEFSYM (Qgdi, "gdi");
92409
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1889 DEFSYM (Quniscribe, "uniscribe");
8171649adf8a (Quniscribe, QCformat): New symbols.
Jason Rumney <jasonr@gnu.org>
parents: 92394
diff changeset
1890 DEFSYM (QCformat, ":format");
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1891
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1892 /* Generic font families. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1893 DEFSYM (Qmonospace, "monospace");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1894 DEFSYM (Qserif, "serif");
91260
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
1895 DEFSYM (Qsansserif, "sansserif");
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1896 DEFSYM (Qscript, "script");
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1897 DEFSYM (Qdecorative, "decorative");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1898 /* Aliases. */
91260
75f89f349f70 (w32font_text_extents): Dereference selected_frame.
Jason Rumney <jasonr@gnu.org>
parents: 91259
diff changeset
1899 DEFSYM (Qsans_serif, "sans_serif");
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1900 DEFSYM (Qsans, "sans");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1901 DEFSYM (Qmono, "mono");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1902
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1903 /* Fake foundries. */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1904 DEFSYM (Qraster, "raster");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1905 DEFSYM (Qoutline, "outline");
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1906 DEFSYM (Qunknown, "unknown");
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1907
91124
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1908 /* Antialiasing. */
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1909 DEFSYM (Qstandard, "standard");
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1910 DEFSYM (Qsubpixel, "subpixel");
b656aee8436b (CLEARTYPE_QUALITY, CLEARTYPE_NATURAL_QUALITY): Define
Jason Rumney <jasonr@gnu.org>
parents: 91070
diff changeset
1911 DEFSYM (Qnatural, "natural");
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1912
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1913 /* Scripts */
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1914 DEFSYM (Qlatin, "latin");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1915 DEFSYM (Qgreek, "greek");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1916 DEFSYM (Qcoptic, "coptic");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1917 DEFSYM (Qcyrillic, "cyrillic");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1918 DEFSYM (Qarmenian, "armenian");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1919 DEFSYM (Qhebrew, "hebrew");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1920 DEFSYM (Qarabic, "arabic");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1921 DEFSYM (Qsyriac, "syriac");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1922 DEFSYM (Qnko, "nko");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1923 DEFSYM (Qthaana, "thaana");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1924 DEFSYM (Qdevanagari, "devanagari");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1925 DEFSYM (Qbengali, "bengali");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1926 DEFSYM (Qgurmukhi, "gurmukhi");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1927 DEFSYM (Qgujarati, "gujarati");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1928 DEFSYM (Qoriya, "oriya");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1929 DEFSYM (Qtamil, "tamil");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1930 DEFSYM (Qtelugu, "telugu");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1931 DEFSYM (Qkannada, "kannada");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1932 DEFSYM (Qmalayalam, "malayalam");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1933 DEFSYM (Qsinhala, "sinhala");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1934 DEFSYM (Qthai, "thai");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1935 DEFSYM (Qlao, "lao");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1936 DEFSYM (Qtibetan, "tibetan");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1937 DEFSYM (Qmyanmar, "myanmar");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1938 DEFSYM (Qgeorgian, "georgian");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1939 DEFSYM (Qhangul, "hangul");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1940 DEFSYM (Qethiopic, "ethiopic");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1941 DEFSYM (Qcherokee, "cherokee");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1942 DEFSYM (Qcanadian_aboriginal, "canadian-aboriginal");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1943 DEFSYM (Qogham, "ogham");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1944 DEFSYM (Qrunic, "runic");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1945 DEFSYM (Qkhmer, "khmer");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1946 DEFSYM (Qmongolian, "mongolian");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1947 DEFSYM (Qsymbol, "symbol");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1948 DEFSYM (Qbraille, "braille");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1949 DEFSYM (Qhan, "han");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1950 DEFSYM (Qideographic_description, "ideographic-description");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1951 DEFSYM (Qcjk_misc, "cjk-misc");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1952 DEFSYM (Qkana, "kana");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1953 DEFSYM (Qbopomofo, "bopomofo");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1954 DEFSYM (Qkanbun, "kanbun");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1955 DEFSYM (Qyi, "yi");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1956 DEFSYM (Qbyzantine_musical_symbol, "byzantine-musical-symbol");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1957 DEFSYM (Qmusical_symbol, "musical-symbol");
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1958 DEFSYM (Qmathematical, "mathematical");
93598
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1959 DEFSYM (Qphonetic, "phonetic");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1960 DEFSYM (Qbalinese, "balinese");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1961 DEFSYM (Qbuginese, "buginese");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1962 DEFSYM (Qbuhid, "buhid");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1963 DEFSYM (Qcuneiform, "cuneiform");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1964 DEFSYM (Qcypriot, "cypriot");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1965 DEFSYM (Qdeseret, "deseret");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1966 DEFSYM (Qglagolitic, "glagolitic");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1967 DEFSYM (Qgothic, "gothic");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1968 DEFSYM (Qhanunoo, "hanunoo");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1969 DEFSYM (Qkharoshthi, "kharoshthi");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1970 DEFSYM (Qlimbu, "limbu");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1971 DEFSYM (Qlinear_b, "linear_b");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1972 DEFSYM (Qold_italic, "old_italic");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1973 DEFSYM (Qold_persian, "old_persian");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1974 DEFSYM (Qosmanya, "osmanya");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1975 DEFSYM (Qphags_pa, "phags-pa");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1976 DEFSYM (Qphoenician, "phoenician");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1977 DEFSYM (Qshavian, "shavian");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1978 DEFSYM (Qsyloti_nagri, "syloti_nagri");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1979 DEFSYM (Qtagalog, "tagalog");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1980 DEFSYM (Qtagbanwa, "tagbanwa");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1981 DEFSYM (Qtai_le, "tai_le");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1982 DEFSYM (Qtifinagh, "tifinagh");
6b92cdd67bfb (Qbalinese, Qbuginese, Qbuhid, Qcuneiform, Qcypriot)
Jason Rumney <jasonr@gnu.org>
parents: 92712
diff changeset
1983 DEFSYM (Qugaritic, "ugaritic");
90906
f8694254fa1d (w32font_info): Remove subranges.
Jason Rumney <jasonr@gnu.org>
parents: 90898
diff changeset
1984
90964
269d87dc10d9 (Qgdi): Rename from Qw32.
Jason Rumney <jasonr@gnu.org>
parents: 90933
diff changeset
1985 w32font_driver.type = Qgdi;
90869
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1986 register_font_driver (&w32font_driver, NULL);
9a1ccf2dfd96 New file for w32 font backend.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
1987 }
92472
dba28a9d071a Wrap in USE_FONT_BACKEND conditional
Jason Rumney <jasonr@gnu.org>
parents: 92413
diff changeset
1988 #endif /* USE_FONT_BACKEND */
90898
4d94a4dbcf99 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90894
diff changeset
1989
4d94a4dbcf99 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90894
diff changeset
1990 /* arch-tag: 65b8a3cd-46aa-4c0d-a1f3-99e75b9c07ee
4d94a4dbcf99 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 90894
diff changeset
1991 (do not change this comment) */