Mercurial > emacs
annotate src/w32uniscribe.c @ 99492:ee792794d888
(isearch-search-fun): Compare the length of the
current search string with the length of the string from the
previous search state to detect the situation when the user
adds or removes characters in the search string.
Use word-search-forward-lax and word-search-backward-lax in this
case, and otherwise word-search-forward and word-search-backward.
author | Juri Linkov <juri@jurta.org> |
---|---|
date | Tue, 11 Nov 2008 19:43:09 +0000 |
parents | 111763d689bf |
children | 6a28cc2ace8a |
rev | line source |
---|---|
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
1 /* Font backend for the Microsoft W32 Uniscribe API. |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
2 Copyright (C) 2008 Free Software Foundation, Inc. |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
3 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
4 This file is part of GNU Emacs. |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
5 |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94911
diff
changeset
|
6 GNU Emacs is free software: you can redistribute it and/or modify |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
7 it under the terms of the GNU General Public License as published by |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94911
diff
changeset
|
8 the Free Software Foundation, either version 3 of the License, or |
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94911
diff
changeset
|
9 (at your option) any later version. |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
10 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
11 GNU Emacs is distributed in the hope that it will be useful, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
12 but WITHOUT ANY WARRANTY; without even the implied warranty of |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
14 GNU General Public License for more details. |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
15 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
16 You should have received a copy of the GNU General Public License |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94911
diff
changeset
|
17 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
18 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
19 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
20 #include <config.h> |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
21 /* Override API version - Uniscribe is only available as standard since |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
22 Windows 2000, though most users of older systems will have it |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
23 since it installs with Internet Explorer 5.0 and other software. |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
24 We only enable the feature if it is available, so there is no chance |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
25 of calling non-existant functions. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
26 #undef _WIN32_WINNT |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
27 #define _WIN32_WINNT 0x500 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
28 #include <windows.h> |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
29 #include <usp10.h> |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
30 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
31 #include "lisp.h" |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
32 #include "w32term.h" |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
33 #include "frame.h" |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
34 #include "dispextern.h" |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
35 #include "character.h" |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
36 #include "charset.h" |
97832
e33a2e6c1dab
(struct uniscribe_font_info): Include composite.h.
Kenichi Handa <handa@m17n.org>
parents:
97135
diff
changeset
|
37 #include "composite.h" |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
38 #include "fontset.h" |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
39 #include "font.h" |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
40 #include "w32font.h" |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
41 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
42 struct uniscribe_font_info |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
43 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
44 struct w32font_info w32_font; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
45 SCRIPT_CACHE cache; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
46 }; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
47 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
48 int uniscribe_available = 0; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
49 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
50 /* Defined in w32font.c, since it is required there as well. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
51 extern Lisp_Object Quniscribe; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
52 extern Lisp_Object Qopentype; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
53 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
54 extern int initialized; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
55 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
56 extern struct font_driver uniscribe_font_driver; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
57 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
58 /* EnumFontFamiliesEx callback. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
59 static int CALLBACK add_opentype_font_name_to_list P_ ((ENUMLOGFONTEX *, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
60 NEWTEXTMETRICEX *, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
61 DWORD, LPARAM)); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
62 /* Used by uniscribe_otf_capability. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
63 static Lisp_Object otf_features (HDC context, char *table); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
64 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
65 static int |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
66 memq_no_quit (elt, list) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
67 Lisp_Object elt, list; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
68 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
69 while (CONSP (list) && ! EQ (XCAR (list), elt)) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
70 list = XCDR (list); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
71 return (CONSP (list)); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
72 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
73 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
74 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
75 /* Font backend interface implementation. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
76 static Lisp_Object |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
77 uniscribe_list (frame, font_spec) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
78 Lisp_Object frame, font_spec; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
79 { |
96071
0f831953ffb8
Add font logging to list and match functions.
Jason Rumney <jasonr@gnu.org>
parents:
95800
diff
changeset
|
80 Lisp_Object fonts = w32font_list_internal (frame, font_spec, 1); |
0f831953ffb8
Add font logging to list and match functions.
Jason Rumney <jasonr@gnu.org>
parents:
95800
diff
changeset
|
81 font_add_log ("uniscribe-list", font_spec, fonts); |
0f831953ffb8
Add font logging to list and match functions.
Jason Rumney <jasonr@gnu.org>
parents:
95800
diff
changeset
|
82 return fonts; |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
83 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
84 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
85 static Lisp_Object |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
86 uniscribe_match (frame, font_spec) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
87 Lisp_Object frame, font_spec; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
88 { |
96071
0f831953ffb8
Add font logging to list and match functions.
Jason Rumney <jasonr@gnu.org>
parents:
95800
diff
changeset
|
89 Lisp_Object entity = w32font_match_internal (frame, font_spec, 1); |
0f831953ffb8
Add font logging to list and match functions.
Jason Rumney <jasonr@gnu.org>
parents:
95800
diff
changeset
|
90 font_add_log ("uniscribe-match", font_spec, entity); |
0f831953ffb8
Add font logging to list and match functions.
Jason Rumney <jasonr@gnu.org>
parents:
95800
diff
changeset
|
91 return entity; |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
92 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
93 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
94 static Lisp_Object |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
95 uniscribe_list_family (frame) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
96 Lisp_Object frame; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
97 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
98 Lisp_Object list = Qnil; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
99 LOGFONT font_match_pattern; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
100 HDC dc; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
101 FRAME_PTR f = XFRAME (frame); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
102 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
103 bzero (&font_match_pattern, sizeof (font_match_pattern)); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
104 /* Limit enumerated fonts to outline fonts to save time. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
105 font_match_pattern.lfOutPrecision = OUT_OUTLINE_PRECIS; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
106 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
107 dc = get_frame_dc (f); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
108 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
109 EnumFontFamiliesEx (dc, &font_match_pattern, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
110 (FONTENUMPROC) add_opentype_font_name_to_list, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
111 (LPARAM) &list, 0); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
112 release_frame_dc (f, dc); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
113 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
114 return list; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
115 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
116 |
94911
f29483946da4
Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents:
93863
diff
changeset
|
117 static Lisp_Object |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
118 uniscribe_open (f, font_entity, pixel_size) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
119 FRAME_PTR f; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
120 Lisp_Object font_entity; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
121 int pixel_size; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
122 { |
94911
f29483946da4
Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents:
93863
diff
changeset
|
123 Lisp_Object font_object |
96564
9ee160a11a03
(uniscribe_open): Adjust it for the change of
Kenichi Handa <handa@m17n.org>
parents:
96343
diff
changeset
|
124 = font_make_object (VECSIZE (struct uniscribe_font_info), |
9ee160a11a03
(uniscribe_open): Adjust it for the change of
Kenichi Handa <handa@m17n.org>
parents:
96343
diff
changeset
|
125 font_entity, pixel_size); |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
126 struct uniscribe_font_info *uniscribe_font |
94911
f29483946da4
Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents:
93863
diff
changeset
|
127 = (struct uniscribe_font_info *) XFONT_OBJECT (font_object); |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
128 |
96937
7f7286fdbf06
* w32font.c (w32font_open): Set font type to gdi.
Jason Rumney <jasonr@gnu.org>
parents:
96564
diff
changeset
|
129 ASET (font_object, FONT_TYPE_INDEX, Quniscribe); |
7f7286fdbf06
* w32font.c (w32font_open): Set font type to gdi.
Jason Rumney <jasonr@gnu.org>
parents:
96564
diff
changeset
|
130 |
94911
f29483946da4
Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents:
93863
diff
changeset
|
131 if (!w32font_open_internal (f, font_entity, pixel_size, font_object)) |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
132 { |
94911
f29483946da4
Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents:
93863
diff
changeset
|
133 return Qnil; |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
134 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
135 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
136 /* Initialize the cache for this font. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
137 uniscribe_font->cache = NULL; |
97025
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
138 |
97135
09abb4487286
* w32font.h (struct w32font_info): Use unicode version of textmetrics.
Jason Rumney <jasonr@gnu.org>
parents:
97112
diff
changeset
|
139 /* Uniscribe backend uses glyph indices. */ |
09abb4487286
* w32font.h (struct w32font_info): Use unicode version of textmetrics.
Jason Rumney <jasonr@gnu.org>
parents:
97112
diff
changeset
|
140 uniscribe_font->w32_font.glyph_idx = ETO_GLYPH_INDEX; |
09abb4487286
* w32font.h (struct w32font_info): Use unicode version of textmetrics.
Jason Rumney <jasonr@gnu.org>
parents:
97112
diff
changeset
|
141 |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
142 /* Mark the format as opentype */ |
94911
f29483946da4
Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents:
93863
diff
changeset
|
143 uniscribe_font->w32_font.font.props[FONT_FORMAT_INDEX] = Qopentype; |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
144 uniscribe_font->w32_font.font.driver = &uniscribe_font_driver; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
145 |
94911
f29483946da4
Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents:
93863
diff
changeset
|
146 return font_object; |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
147 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
148 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
149 static void |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
150 uniscribe_close (f, font) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
151 FRAME_PTR f; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
152 struct font *font; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
153 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
154 struct uniscribe_font_info *uniscribe_font |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
155 = (struct uniscribe_font_info *) font; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
156 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
157 if (uniscribe_font->cache) |
97025
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
158 ScriptFreeCache (&(uniscribe_font->cache)); |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
159 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
160 w32font_close (f, font); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
161 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
162 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
163 /* Return a list describing which scripts/languages FONT supports by |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
164 which GSUB/GPOS features of OpenType tables. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
165 static Lisp_Object |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
166 uniscribe_otf_capability (font) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
167 struct font *font; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
168 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
169 HDC context; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
170 HFONT old_font; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
171 struct frame *f; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
172 Lisp_Object capability = Fcons (Qnil, Qnil); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
173 Lisp_Object features; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
174 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
175 f = XFRAME (selected_frame); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
176 context = get_frame_dc (f); |
96343
5c8f2b7d28ae
* w32font.h (FONT_HANDLE, FONT_TEXTMETRIC): New macros.
Jason Rumney <jasonr@gnu.org>
parents:
96327
diff
changeset
|
177 old_font = SelectObject (context, FONT_HANDLE(font)); |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
178 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
179 features = otf_features (context, "GSUB"); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
180 XSETCAR (capability, features); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
181 features = otf_features (context, "GPOS"); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
182 XSETCDR (capability, features); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
183 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
184 SelectObject (context, old_font); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
185 release_frame_dc (f, context); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
186 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
187 return capability; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
188 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
189 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
190 /* Uniscribe implementation of shape for font backend. |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
191 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
192 Shape text in LGSTRING. See the docstring of `font-make-gstring' |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
193 for the format of LGSTRING. If the (N+1)th element of LGSTRING |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
194 is nil, input of shaping is from the 1st to (N)th elements. In |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
195 each input glyph, FROM, TO, CHAR, and CODE are already set. |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
196 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
197 This function updates all fields of the input glyphs. If the |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
198 output glyphs (M) are more than the input glyphs (N), (N+1)th |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
199 through (M)th elements of LGSTRING are updated possibly by making |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
200 a new glyph object and storing it in LGSTRING. If (M) is greater |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
201 than the length of LGSTRING, nil should be return. In that case, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
202 this function is called again with the larger LGSTRING. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
203 static Lisp_Object |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
204 uniscribe_shape (lgstring) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
205 Lisp_Object lgstring; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
206 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
207 struct font * font; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
208 struct uniscribe_font_info * uniscribe_font; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
209 EMACS_UINT nchars; |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
210 int nitems, max_items, i, max_glyphs, done_glyphs; |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
211 wchar_t *chars; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
212 WORD *glyphs, *clusters; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
213 SCRIPT_ITEM *items; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
214 SCRIPT_VISATTR *attributes; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
215 int *advances; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
216 GOFFSET *offsets; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
217 ABC overall_metrics; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
218 HRESULT result; |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
219 struct frame * f = NULL; |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
220 HDC context = NULL; |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
221 HFONT old_font = NULL; |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
222 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
223 CHECK_FONT_GET_OBJECT (LGSTRING_FONT (lgstring), font); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
224 uniscribe_font = (struct uniscribe_font_info *) font; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
225 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
226 /* Get the chars from lgstring in a form we can use with uniscribe. */ |
97832
e33a2e6c1dab
(struct uniscribe_font_info): Include composite.h.
Kenichi Handa <handa@m17n.org>
parents:
97135
diff
changeset
|
227 max_glyphs = nchars = LGSTRING_GLYPH_LEN (lgstring); |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
228 done_glyphs = 0; |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
229 chars = (wchar_t *) alloca (nchars * sizeof (wchar_t)); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
230 for (i = 0; i < nchars; i++) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
231 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
232 /* lgstring can be bigger than the number of characters in it, in |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
233 the case where more glyphs are required to display those characters. |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
234 If that is the case, note the real number of characters. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
235 if (NILP (LGSTRING_GLYPH (lgstring, i))) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
236 nchars = i; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
237 else |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
238 chars[i] = LGLYPH_CHAR (LGSTRING_GLYPH (lgstring, i)); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
239 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
240 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
241 /* First we need to break up the glyph string into runs of glyphs that |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
242 can be treated together. First try a single run. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
243 max_items = 2; |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
244 items = (SCRIPT_ITEM *) xmalloc (sizeof (SCRIPT_ITEM) * max_items + 1); |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
245 |
97025
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
246 while ((result = ScriptItemize (chars, nchars, max_items, NULL, NULL, |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
247 items, &nitems)) == E_OUTOFMEMORY) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
248 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
249 /* If that wasn't enough, keep trying with one more run. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
250 max_items++; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
251 items = (SCRIPT_ITEM *) xrealloc (items, |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
252 sizeof (SCRIPT_ITEM) * max_items + 1); |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
253 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
254 |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
255 if (FAILED (result)) |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
256 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
257 xfree (items); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
258 return Qnil; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
259 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
260 |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
261 /* TODO: When we get BIDI support, we need to call ScriptLayout here. |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
262 Requires that we know the surrounding context. */ |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
263 |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
264 glyphs = alloca (max_glyphs * sizeof (WORD)); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
265 clusters = alloca (nchars * sizeof (WORD)); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
266 attributes = alloca (max_glyphs * sizeof (SCRIPT_VISATTR)); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
267 advances = alloca (max_glyphs * sizeof (int)); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
268 offsets = alloca (max_glyphs * sizeof (GOFFSET)); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
269 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
270 for (i = 0; i < nitems; i++) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
271 { |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
272 int nglyphs, nchars_in_run, rtl = items[i].a.fRTL ? -1 : 1; |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
273 nchars_in_run = items[i+1].iCharPos - items[i].iCharPos; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
274 |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
275 /* Context may be NULL here, in which case the cache should be |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
276 used without needing to select the font. */ |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
277 result = ScriptShape (context, &(uniscribe_font->cache), |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
278 chars + items[i].iCharPos, nchars_in_run, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
279 max_glyphs - done_glyphs, &(items[i].a), |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
280 glyphs, clusters, attributes, &nglyphs); |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
281 |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
282 if (result == E_PENDING && !context) |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
283 { |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
284 /* This assumes the selected frame is on the same display as the |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
285 one we are drawing. It would be better for the frame to be |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
286 passed in. */ |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
287 f = XFRAME (selected_frame); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
288 context = get_frame_dc (f); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
289 old_font = SelectObject (context, FONT_HANDLE(font)); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
290 |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
291 result = ScriptShape (context, &(uniscribe_font->cache), |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
292 chars + items[i].iCharPos, nchars_in_run, |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
293 max_glyphs - done_glyphs, &(items[i].a), |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
294 glyphs, clusters, attributes, &nglyphs); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
295 } |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
296 |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
297 if (result == E_OUTOFMEMORY) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
298 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
299 /* Need a bigger lgstring. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
300 lgstring = Qnil; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
301 break; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
302 } |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
303 else if (FAILED (result)) |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
304 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
305 /* Can't shape this run - return results so far if any. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
306 break; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
307 } |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
308 else if (items[i].a.fNoGlyphIndex) |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
309 { |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
310 /* Glyph indices not supported by this font (or OS), means we |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
311 can't really do any meaningful shaping. */ |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
312 break; |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
313 } |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
314 else |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
315 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
316 result = ScriptPlace (context, &(uniscribe_font->cache), |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
317 glyphs, nglyphs, attributes, &(items[i].a), |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
318 advances, offsets, &overall_metrics); |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
319 if (result == E_PENDING && !context) |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
320 { |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
321 /* Cache not complete... */ |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
322 f = XFRAME (selected_frame); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
323 context = get_frame_dc (f); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
324 old_font = SelectObject (context, FONT_HANDLE(font)); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
325 |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
326 result = ScriptPlace (context, &(uniscribe_font->cache), |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
327 glyphs, nglyphs, attributes, &(items[i].a), |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
328 advances, offsets, &overall_metrics); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
329 } |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
330 if (SUCCEEDED (result)) |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
331 { |
93766
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
332 int j, nclusters, from, to; |
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
333 |
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
334 from = rtl > 0 ? 0 : nchars_in_run - 1; |
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
335 to = from; |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
336 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
337 for (j = 0; j < nglyphs; j++) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
338 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
339 int lglyph_index = j + done_glyphs; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
340 Lisp_Object lglyph = LGSTRING_GLYPH (lgstring, lglyph_index); |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
341 ABC char_metric; |
97848
d1e61da65cce
(uniscribe_shape): Shut up compiler warning in LGLYPH_SET_CODE.
Eli Zaretskii <eliz@gnu.org>
parents:
97832
diff
changeset
|
342 unsigned gl; |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
343 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
344 if (NILP (lglyph)) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
345 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
346 lglyph = Fmake_vector (make_number (LGLYPH_SIZE), Qnil); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
347 LGSTRING_SET_GLYPH (lgstring, lglyph_index, lglyph); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
348 } |
97848
d1e61da65cce
(uniscribe_shape): Shut up compiler warning in LGLYPH_SET_CODE.
Eli Zaretskii <eliz@gnu.org>
parents:
97832
diff
changeset
|
349 /* Copy to a 32-bit data type to shut up the |
d1e61da65cce
(uniscribe_shape): Shut up compiler warning in LGLYPH_SET_CODE.
Eli Zaretskii <eliz@gnu.org>
parents:
97832
diff
changeset
|
350 compiler warning in LGLYPH_SET_CODE about |
d1e61da65cce
(uniscribe_shape): Shut up compiler warning in LGLYPH_SET_CODE.
Eli Zaretskii <eliz@gnu.org>
parents:
97832
diff
changeset
|
351 comparison being always false. */ |
d1e61da65cce
(uniscribe_shape): Shut up compiler warning in LGLYPH_SET_CODE.
Eli Zaretskii <eliz@gnu.org>
parents:
97832
diff
changeset
|
352 gl = glyphs[j]; |
d1e61da65cce
(uniscribe_shape): Shut up compiler warning in LGLYPH_SET_CODE.
Eli Zaretskii <eliz@gnu.org>
parents:
97832
diff
changeset
|
353 LGLYPH_SET_CODE (lglyph, gl); |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
354 |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
355 /* Detect clusters, for linking codes back to characters. */ |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
356 if (attributes[j].fClusterStart) |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
357 { |
93766
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
358 while (from >= 0 && from < nchars_in_run |
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
359 && clusters[from] < j) |
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
360 from += rtl; |
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
361 if (from < 0) |
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
362 from = to = 0; |
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
363 else if (from >= nchars_in_run) |
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
364 from = to = nchars_in_run - 1; |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
365 else |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
366 { |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
367 int k; |
93766
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
368 to = rtl > 0 ? nchars_in_run - 1 : 0; |
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
369 for (k = from + rtl; k >= 0 && k < nchars_in_run; |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
370 k += rtl) |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
371 { |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
372 if (clusters[k] > j) |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
373 { |
93766
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
374 to = k - 1; |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
375 break; |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
376 } |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
377 } |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
378 } |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
379 } |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
380 |
93766
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
381 LGLYPH_SET_CHAR (lglyph, chars[items[i].iCharPos |
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
382 + from]); |
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
383 LGLYPH_SET_FROM (lglyph, items[i].iCharPos + from); |
2382df5e230a
(uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents:
93762
diff
changeset
|
384 LGLYPH_SET_TO (lglyph, items[i].iCharPos + to); |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
385 |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
386 /* Metrics. */ |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
387 LGLYPH_SET_WIDTH (lglyph, advances[j]); |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
388 LGLYPH_SET_ASCENT (lglyph, font->ascent); |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
389 LGLYPH_SET_DESCENT (lglyph, font->descent); |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
390 |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
391 result = ScriptGetGlyphABCWidth (context, |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
392 &(uniscribe_font->cache), |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
393 glyphs[j], &char_metric); |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
394 if (result == E_PENDING && !context) |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
395 { |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
396 /* Cache incomplete... */ |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
397 f = XFRAME (selected_frame); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
398 context = get_frame_dc (f); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
399 old_font = SelectObject (context, FONT_HANDLE(font)); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
400 result = ScriptGetGlyphABCWidth (context, |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
401 &(uniscribe_font->cache), |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
402 glyphs[j], &char_metric); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
403 } |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
404 |
97025
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
405 if (SUCCEEDED (result)) |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
406 { |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
407 LGLYPH_SET_LBEARING (lglyph, char_metric.abcA); |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
408 LGLYPH_SET_RBEARING (lglyph, (char_metric.abcA |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
409 + char_metric.abcB)); |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
410 } |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
411 else |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
412 { |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
413 LGLYPH_SET_LBEARING (lglyph, 0); |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
414 LGLYPH_SET_RBEARING (lglyph, advances[j]); |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
415 } |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
416 |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
417 if (offsets[j].du || offsets[j].dv) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
418 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
419 Lisp_Object vec; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
420 vec = Fmake_vector (make_number (3), Qnil); |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
421 ASET (vec, 0, make_number (offsets[j].du)); |
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
422 ASET (vec, 1, make_number (offsets[j].dv)); |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
423 /* Based on what ftfont.c does... */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
424 ASET (vec, 2, make_number (advances[j])); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
425 LGLYPH_SET_ADJUSTMENT (lglyph, vec); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
426 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
427 else |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
428 LGLYPH_SET_ADJUSTMENT (lglyph, Qnil); |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
429 } |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
430 } |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
431 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
432 done_glyphs += nglyphs; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
433 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
434 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
435 xfree (items); |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
436 |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
437 if (context) |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
438 { |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
439 SelectObject (context, old_font); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
440 release_frame_dc (f, context); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
441 } |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
442 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
443 if (NILP (lgstring)) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
444 return Qnil; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
445 else |
93762
46d39c0f7bf9
(uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
93729
diff
changeset
|
446 return make_number (done_glyphs); |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
447 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
448 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
449 /* Uniscribe implementation of encode_char for font backend. |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
450 Return a glyph code of FONT for characer C (Unicode code point). |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
451 If FONT doesn't have such a glyph, return FONT_INVALID_CODE. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
452 static unsigned |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
453 uniscribe_encode_char (font, c) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
454 struct font *font; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
455 int c; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
456 { |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
457 HDC context = NULL; |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
458 struct frame *f = NULL; |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
459 HFONT old_font = NULL; |
97025
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
460 unsigned code = FONT_INVALID_CODE; |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
461 wchar_t ch[2]; |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
462 int len; |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
463 SCRIPT_ITEM* items; |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
464 int nitems; |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
465 struct uniscribe_font_info *uniscribe_font |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
466 = (struct uniscribe_font_info *)font; |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
467 |
97025
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
468 if (c < 0x10000) |
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
469 { |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
470 ch[0] = (wchar_t) c; |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
471 len = 1; |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
472 } |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
473 else |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
474 { |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
475 DWORD surrogate = c - 0x10000; |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
476 |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
477 /* High surrogate: U+D800 - U+DBFF. */ |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
478 ch[0] = 0xD800 + ((surrogate >> 10) & 0x03FF); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
479 /* Low surrogate: U+DC00 - U+DFFF. */ |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
480 ch[1] = 0xDC00 + (surrogate & 0x03FF); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
481 len = 2; |
97025
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
482 } |
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
483 |
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
484 /* Non BMP characters must be handled by the uniscribe shaping |
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
485 engine as GDI functions (except blindly displaying lines of |
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
486 unicode text) and the promising looking ScriptGetCMap do not |
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
487 convert surrogate pairs to glyph indexes correctly. */ |
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
488 { |
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
489 items = (SCRIPT_ITEM *) alloca (sizeof (SCRIPT_ITEM) * 2 + 1); |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
490 if (SUCCEEDED (ScriptItemize (ch, len, 2, NULL, NULL, items, &nitems))) |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
491 { |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
492 HRESULT result; |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
493 /* Some Indic characters result in more than 1 glyph. */ |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
494 WORD glyphs[1], clusters[1]; |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
495 SCRIPT_VISATTR attrs[1]; |
97025
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
496 int nglyphs; |
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
497 |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
498 result = ScriptShape (context, &(uniscribe_font->cache), |
97112
25e89f1f3bf6
(uniscribe_encode_char): Fix glyph buffer size.
Jason Rumney <jasonr@gnu.org>
parents:
97086
diff
changeset
|
499 ch, len, 1, &(items[0].a), |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
500 glyphs, clusters, attrs, &nglyphs); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
501 |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
502 if (result == E_PENDING) |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
503 { |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
504 /* Use selected frame until API is updated to pass |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
505 the frame. */ |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
506 f = XFRAME (selected_frame); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
507 context = get_frame_dc (f); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
508 old_font = SelectObject (context, FONT_HANDLE(font)); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
509 result = ScriptShape (context, &(uniscribe_font->cache), |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
510 ch, len, 2, &(items[0].a), |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
511 glyphs, clusters, attrs, &nglyphs); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
512 } |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
513 |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
514 if (SUCCEEDED (result) && nglyphs == 1) |
97025
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
515 { |
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
516 code = glyphs[0]; |
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
517 } |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
518 else if (SUCCEEDED (result) || result == E_OUTOFMEMORY) |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
519 { |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
520 /* This character produces zero or more than one glyph |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
521 when shaped. But we still need the return from here |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
522 to be valid for the shaping engine to be invoked |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
523 later. */ |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
524 result = ScriptGetCMap (context, &(uniscribe_font->cache), |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
525 ch, len, 0, glyphs); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
526 if (SUCCEEDED (result)) |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
527 return glyphs[0]; |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
528 else |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
529 return 0; /* notdef - enough in some cases to get the script |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
530 engine working, but not others... */ |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
531 } |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
532 } |
97025
e72be8a4fdb8
(uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents:
97004
diff
changeset
|
533 } |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
534 if (context) |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
535 { |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
536 SelectObject (context, old_font); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
537 release_frame_dc (f, context); |
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
538 } |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
539 |
97086
c38003f850b5
(uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents:
97025
diff
changeset
|
540 return code; |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
541 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
542 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
543 /* |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
544 Shared with w32font: |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
545 Lisp_Object uniscribe_get_cache (Lisp_Object frame); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
546 void uniscribe_free_entity (Lisp_Object font_entity); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
547 int uniscribe_has_char (Lisp_Object entity, int c); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
548 int uniscribe_text_extents (struct font *font, unsigned *code, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
549 int nglyphs, struct font_metrics *metrics); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
550 int uniscribe_draw (struct glyph_string *s, int from, int to, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
551 int x, int y, int with_background); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
552 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
553 Unused: |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
554 int uniscribe_prepare_face (FRAME_PTR f, struct face *face); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
555 void uniscribe_done_face (FRAME_PTR f, struct face *face); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
556 int uniscribe_get_bitmap (struct font *font, unsigned code, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
557 struct font_bitmap *bitmap, int bits_per_pixel); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
558 void uniscribe_free_bitmap (struct font *font, struct font_bitmap *bitmap); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
559 void * uniscribe_get_outline (struct font *font, unsigned code); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
560 void uniscribe_free_outline (struct font *font, void *outline); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
561 int uniscribe_anchor_point (struct font *font, unsigned code, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
562 int index, int *x, int *y); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
563 int uniscribe_start_for_frame (FRAME_PTR f); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
564 int uniscribe_end_for_frame (FRAME_PTR f); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
565 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
566 */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
567 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
568 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
569 /* Callback function for EnumFontFamiliesEx. |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
570 Adds the name of opentype fonts to a Lisp list (passed in as the |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
571 lParam arg). */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
572 static int CALLBACK |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
573 add_opentype_font_name_to_list (logical_font, physical_font, font_type, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
574 list_object) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
575 ENUMLOGFONTEX *logical_font; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
576 NEWTEXTMETRICEX *physical_font; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
577 DWORD font_type; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
578 LPARAM list_object; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
579 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
580 Lisp_Object* list = (Lisp_Object *) list_object; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
581 Lisp_Object family; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
582 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
583 /* Skip vertical fonts (intended only for printing) */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
584 if (logical_font->elfLogFont.lfFaceName[0] == '@') |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
585 return 1; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
586 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
587 /* Skip non opentype fonts. Count old truetype fonts as opentype, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
588 as some of them do contain GPOS and GSUB data that Uniscribe |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
589 can make use of. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
590 if (!(physical_font->ntmTm.ntmFlags & NTMFLAGS_OPENTYPE) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
591 && font_type != TRUETYPE_FONTTYPE) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
592 return 1; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
593 |
95800
67f150b4adbe
(add_opentype_font_name_to_list): Skip non unicode fonts.
Jason Rumney <jasonr@gnu.org>
parents:
95743
diff
changeset
|
594 /* Skip fonts that have no unicode coverage. */ |
67f150b4adbe
(add_opentype_font_name_to_list): Skip non unicode fonts.
Jason Rumney <jasonr@gnu.org>
parents:
95743
diff
changeset
|
595 if (!physical_font->ntmFontSig.fsUsb[3] |
67f150b4adbe
(add_opentype_font_name_to_list): Skip non unicode fonts.
Jason Rumney <jasonr@gnu.org>
parents:
95743
diff
changeset
|
596 && !physical_font->ntmFontSig.fsUsb[2] |
67f150b4adbe
(add_opentype_font_name_to_list): Skip non unicode fonts.
Jason Rumney <jasonr@gnu.org>
parents:
95743
diff
changeset
|
597 && !physical_font->ntmFontSig.fsUsb[1] |
67f150b4adbe
(add_opentype_font_name_to_list): Skip non unicode fonts.
Jason Rumney <jasonr@gnu.org>
parents:
95743
diff
changeset
|
598 && !(physical_font->ntmFontSig.fsUsb[0] & 0x3fffffff)) |
67f150b4adbe
(add_opentype_font_name_to_list): Skip non unicode fonts.
Jason Rumney <jasonr@gnu.org>
parents:
95743
diff
changeset
|
599 return 1; |
67f150b4adbe
(add_opentype_font_name_to_list): Skip non unicode fonts.
Jason Rumney <jasonr@gnu.org>
parents:
95743
diff
changeset
|
600 |
94911
f29483946da4
Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents:
93863
diff
changeset
|
601 family = font_intern_prop (logical_font->elfLogFont.lfFaceName, |
95743
9fcb5d4baf9b
(add_opentype_font_name_to_list): Adjusted for
Kenichi Handa <handa@m17n.org>
parents:
94963
diff
changeset
|
602 strlen (logical_font->elfLogFont.lfFaceName), 1); |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
603 if (! memq_no_quit (family, *list)) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
604 *list = Fcons (family, *list); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
605 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
606 return 1; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
607 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
608 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
609 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
610 /* :otf property handling. |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
611 Since the necessary Uniscribe APIs for getting font tag information |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
612 are only available in Vista, we need to parse the font data directly |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
613 according to the OpenType Specification. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
614 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
615 /* Push into DWORD backwards to cope with endianness. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
616 #define OTF_TAG(STR) \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
617 ((STR[3] << 24) | (STR[2] << 16) | (STR[1] << 8) | STR[0]) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
618 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
619 #define OTF_INT16_VAL(TABLE, OFFSET, PTR) \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
620 do { \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
621 BYTE temp, data[2]; \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
622 if (GetFontData (context, TABLE, OFFSET, data, 2) != 2) \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
623 goto font_table_error; \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
624 temp = data[0], data[0] = data[1], data[1] = temp; \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
625 memcpy (PTR, data, 2); \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
626 } while (0) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
627 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
628 /* Do not reverse the bytes, because we will compare with a OTF_TAG value |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
629 that has them reversed already. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
630 #define OTF_DWORDTAG_VAL(TABLE, OFFSET, PTR) \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
631 do { \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
632 if (GetFontData (context, TABLE, OFFSET, PTR, 4) != 4) \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
633 goto font_table_error; \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
634 } while (0) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
635 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
636 #define OTF_TAG_VAL(TABLE, OFFSET, STR) \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
637 do { \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
638 if (GetFontData (context, TABLE, OFFSET, STR, 4) != 4) \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
639 goto font_table_error; \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
640 STR[4] = '\0'; \ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
641 } while (0) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
642 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
643 static char* NOTHING = " "; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
644 |
93863
f9841841f5a5
(SNAME): Extract only symbol name.
Jason Rumney <jasonr@gnu.org>
parents:
93766
diff
changeset
|
645 #define SNAME(VAL) SDATA (SYMBOL_NAME (VAL)) |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
646 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
647 /* Check if font supports the otf script/language/features specified. |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
648 OTF_SPEC is in the format |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
649 (script lang [(gsub_feature ...)|nil] [(gpos_feature ...)]?) */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
650 int uniscribe_check_otf (font, otf_spec) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
651 LOGFONT *font; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
652 Lisp_Object otf_spec; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
653 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
654 Lisp_Object script, lang, rest; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
655 Lisp_Object features[2]; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
656 DWORD feature_tables[2]; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
657 DWORD script_tag, default_script, lang_tag = 0; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
658 struct frame * f; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
659 HDC context; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
660 HFONT check_font, old_font; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
661 DWORD table; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
662 int i, retval = 0; |
93659
f606935ea4be
(uniscribe_check_otf): Add GC protection before consing.
Jason Rumney <jasonr@gnu.org>
parents:
93654
diff
changeset
|
663 struct gcpro gcpro1; |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
664 |
93604
5476a4f5d2f2
(uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents:
93590
diff
changeset
|
665 /* Check the spec is in the right format. */ |
93654
566bfd5b644d
(uniscribe_check_otf): Fix last change.
Jason Rumney <jasonr@gnu.org>
parents:
93604
diff
changeset
|
666 if (!CONSP (otf_spec) || Flength (otf_spec) < 3) |
93604
5476a4f5d2f2
(uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents:
93590
diff
changeset
|
667 return 0; |
5476a4f5d2f2
(uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents:
93590
diff
changeset
|
668 |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
669 /* Break otf_spec into its components. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
670 script = XCAR (otf_spec); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
671 rest = XCDR (otf_spec); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
672 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
673 lang = XCAR (rest); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
674 rest = XCDR (rest); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
675 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
676 features[0] = XCAR (rest); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
677 rest = XCDR (rest); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
678 if (NILP (rest)) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
679 features[1] = Qnil; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
680 else |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
681 features[1] = XCAR (rest); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
682 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
683 /* Set up tags we will use in the search. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
684 feature_tables[0] = OTF_TAG ("GSUB"); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
685 feature_tables[1] = OTF_TAG ("GPOS"); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
686 default_script = OTF_TAG ("DFLT"); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
687 if (NILP (script)) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
688 script_tag = default_script; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
689 else |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
690 script_tag = OTF_TAG (SNAME (script)); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
691 if (!NILP (lang)) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
692 lang_tag = OTF_TAG (SNAME (lang)); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
693 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
694 /* Set up graphics context so we can use the font. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
695 f = XFRAME (selected_frame); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
696 context = get_frame_dc (f); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
697 check_font = CreateFontIndirect (font); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
698 old_font = SelectObject (context, check_font); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
699 |
93659
f606935ea4be
(uniscribe_check_otf): Add GC protection before consing.
Jason Rumney <jasonr@gnu.org>
parents:
93654
diff
changeset
|
700 /* Everything else is contained within otf_spec so should get |
f606935ea4be
(uniscribe_check_otf): Add GC protection before consing.
Jason Rumney <jasonr@gnu.org>
parents:
93654
diff
changeset
|
701 marked along with it. */ |
f606935ea4be
(uniscribe_check_otf): Add GC protection before consing.
Jason Rumney <jasonr@gnu.org>
parents:
93654
diff
changeset
|
702 GCPRO1 (otf_spec); |
f606935ea4be
(uniscribe_check_otf): Add GC protection before consing.
Jason Rumney <jasonr@gnu.org>
parents:
93654
diff
changeset
|
703 |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
704 /* Scan GSUB and GPOS tables. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
705 for (i = 0; i < 2; i++) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
706 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
707 int j, n_match_features; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
708 unsigned short scriptlist_table, feature_table, n_scripts; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
709 unsigned short script_table, langsys_table, n_langs; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
710 unsigned short feature_index, n_features; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
711 DWORD tbl = feature_tables[i]; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
712 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
713 /* Skip if no features requested from this table. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
714 if (NILP (features[i])) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
715 continue; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
716 |
93604
5476a4f5d2f2
(uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents:
93590
diff
changeset
|
717 /* If features is not a cons, this font spec is messed up. */ |
5476a4f5d2f2
(uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents:
93590
diff
changeset
|
718 if (!CONSP (features[i])) |
5476a4f5d2f2
(uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents:
93590
diff
changeset
|
719 goto no_support; |
5476a4f5d2f2
(uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents:
93590
diff
changeset
|
720 |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
721 /* Read GPOS/GSUB header. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
722 OTF_INT16_VAL (tbl, 4, &scriptlist_table); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
723 OTF_INT16_VAL (tbl, 6, &feature_table); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
724 OTF_INT16_VAL (tbl, scriptlist_table, &n_scripts); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
725 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
726 /* Find the appropriate script table. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
727 script_table = 0; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
728 for (j = 0; j < n_scripts; j++) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
729 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
730 DWORD script_id; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
731 OTF_DWORDTAG_VAL (tbl, scriptlist_table + 2 + j * 6, &script_id); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
732 if (script_id == script_tag) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
733 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
734 OTF_INT16_VAL (tbl, scriptlist_table + 6 + j * 6, &script_table); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
735 break; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
736 } |
97858
111763d689bf
(uniscribe_check_otf): Don't fallback on DFLT script.
Jason Rumney <jasonr@gnu.org>
parents:
97848
diff
changeset
|
737 #if 0 /* Causes false positives. */ |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
738 /* If there is a DFLT script defined in the font, use it |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
739 if the specified script is not found. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
740 else if (script_id == default_script) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
741 OTF_INT16_VAL (tbl, scriptlist_table + 6 + j * 6, &script_table); |
97858
111763d689bf
(uniscribe_check_otf): Don't fallback on DFLT script.
Jason Rumney <jasonr@gnu.org>
parents:
97848
diff
changeset
|
742 #endif |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
743 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
744 /* If no specific or default script table was found, then this font |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
745 does not support the script. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
746 if (!script_table) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
747 goto no_support; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
748 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
749 /* Offset is from beginning of scriptlist_table. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
750 script_table += scriptlist_table; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
751 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
752 /* Get default langsys table. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
753 OTF_INT16_VAL (tbl, script_table, &langsys_table); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
754 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
755 /* If lang was specified, see if font contains a specific entry. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
756 if (!NILP (lang)) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
757 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
758 OTF_INT16_VAL (tbl, script_table + 2, &n_langs); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
759 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
760 for (j = 0; j < n_langs; j++) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
761 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
762 DWORD lang_id; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
763 OTF_DWORDTAG_VAL (tbl, script_table + 4 + j * 6, &lang_id); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
764 if (lang_id == lang_tag) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
765 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
766 OTF_INT16_VAL (tbl, script_table + 8 + j * 6, &langsys_table); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
767 break; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
768 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
769 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
770 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
771 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
772 if (!langsys_table) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
773 goto no_support; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
774 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
775 /* Offset is from beginning of script table. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
776 langsys_table += script_table; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
777 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
778 /* Check the features. Features may contain nil according to |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
779 documentation in font_prop_validate_otf, so count them. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
780 n_match_features = 0; |
93660
96c69ebb9cfa
(uniscribe_check_otf): Rearrange loop for counting features.
Jason Rumney <jasonr@gnu.org>
parents:
93659
diff
changeset
|
781 for (rest = features[i]; CONSP (rest); rest = XCDR (rest)) |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
782 { |
93660
96c69ebb9cfa
(uniscribe_check_otf): Rearrange loop for counting features.
Jason Rumney <jasonr@gnu.org>
parents:
93659
diff
changeset
|
783 Lisp_Object feature = XCAR (rest); |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
784 if (!NILP (feature)) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
785 n_match_features++; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
786 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
787 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
788 /* If there are no features to check, skip checking. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
789 if (!n_match_features) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
790 continue; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
791 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
792 /* First check required feature (if any). */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
793 OTF_INT16_VAL (tbl, langsys_table + 2, &feature_index); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
794 if (feature_index != 0xFFFF) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
795 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
796 char feature_id[5]; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
797 OTF_TAG_VAL (tbl, feature_table + 2 + feature_index * 6, feature_id); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
798 OTF_TAG_VAL (tbl, feature_table + 2 + feature_index * 6, feature_id); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
799 /* Assume no duplicates in the font table. This allows us to mark |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
800 the features off by simply decrementing a counter. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
801 if (!NILP (Fmemq (intern (feature_id), features[i]))) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
802 n_match_features--; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
803 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
804 /* Now check all the other features. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
805 OTF_INT16_VAL (tbl, langsys_table + 4, &n_features); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
806 for (j = 0; j < n_features; j++) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
807 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
808 char feature_id[5]; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
809 OTF_INT16_VAL (tbl, langsys_table + 6 + j * 2, &feature_index); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
810 OTF_TAG_VAL (tbl, feature_table + 2 + feature_index * 6, feature_id); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
811 /* Assume no duplicates in the font table. This allows us to mark |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
812 the features off by simply decrementing a counter. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
813 if (!NILP (Fmemq (intern (feature_id), features[i]))) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
814 n_match_features--; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
815 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
816 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
817 if (n_match_features > 0) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
818 goto no_support; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
819 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
820 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
821 retval = 1; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
822 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
823 no_support: |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
824 font_table_error: |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
825 /* restore graphics context. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
826 SelectObject (context, old_font); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
827 DeleteObject (check_font); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
828 release_frame_dc (f, context); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
829 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
830 return retval; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
831 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
832 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
833 static Lisp_Object |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
834 otf_features (HDC context, char *table) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
835 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
836 Lisp_Object script_list = Qnil; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
837 unsigned short scriptlist_table, n_scripts, feature_table; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
838 DWORD tbl = OTF_TAG (table); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
839 int i, j, k; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
840 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
841 /* Look for scripts in the table. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
842 OTF_INT16_VAL (tbl, 4, &scriptlist_table); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
843 OTF_INT16_VAL (tbl, 6, &feature_table); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
844 OTF_INT16_VAL (tbl, scriptlist_table, &n_scripts); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
845 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
846 for (i = 0; i < n_scripts; i++) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
847 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
848 char script[5], lang[5]; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
849 unsigned short script_table, lang_count, langsys_table, feature_count; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
850 Lisp_Object script_tag, langsys_list, langsys_tag, feature_list; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
851 unsigned short record_offset = scriptlist_table + 2 + i * 6; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
852 OTF_TAG_VAL (tbl, record_offset, script); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
853 OTF_INT16_VAL (tbl, record_offset + 4, &script_table); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
854 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
855 /* Offset is from beginning of script table. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
856 script_table += scriptlist_table; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
857 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
858 script_tag = intern (script); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
859 langsys_list = Qnil; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
860 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
861 /* Optional default lang. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
862 OTF_INT16_VAL (tbl, script_table, &langsys_table); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
863 if (langsys_table) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
864 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
865 /* Offset is from beginning of script table. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
866 langsys_table += script_table; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
867 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
868 langsys_tag = Qnil; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
869 feature_list = Qnil; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
870 OTF_INT16_VAL (tbl, langsys_table + 4, &feature_count); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
871 for (k = 0; k < feature_count; k++) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
872 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
873 char feature[5]; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
874 unsigned short index; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
875 OTF_INT16_VAL (tbl, langsys_table + 6 + k * 2, &index); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
876 OTF_TAG_VAL (tbl, feature_table + 2 + index * 6, feature); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
877 feature_list = Fcons (intern (feature), feature_list); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
878 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
879 langsys_list = Fcons (Fcons (langsys_tag, feature_list), |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
880 langsys_list); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
881 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
882 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
883 /* List of supported languages. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
884 OTF_INT16_VAL (tbl, script_table + 2, &lang_count); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
885 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
886 for (j = 0; j < lang_count; j++) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
887 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
888 record_offset = script_table + 4 + j * 6; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
889 OTF_TAG_VAL (tbl, record_offset, lang); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
890 OTF_INT16_VAL (tbl, record_offset + 4, &langsys_table); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
891 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
892 /* Offset is from beginning of script table. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
893 langsys_table += script_table; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
894 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
895 langsys_tag = intern (lang); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
896 feature_list = Qnil; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
897 OTF_INT16_VAL (tbl, langsys_table + 4, &feature_count); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
898 for (k = 0; k < feature_count; k++) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
899 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
900 char feature[5]; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
901 unsigned short index; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
902 OTF_INT16_VAL (tbl, langsys_table + 6 + k * 2, &index); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
903 OTF_TAG_VAL (tbl, feature_table + 2 + index * 6, feature); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
904 feature_list = Fcons (intern (feature), feature_list); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
905 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
906 langsys_list = Fcons (Fcons (langsys_tag, feature_list), |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
907 langsys_list); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
908 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
909 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
910 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
911 script_list = Fcons (Fcons (script_tag, langsys_list), script_list); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
912 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
913 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
914 return script_list; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
915 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
916 font_table_error: |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
917 return Qnil; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
918 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
919 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
920 #undef OTF_INT16_VAL |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
921 #undef OTF_TAG_VAL |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
922 #undef OTF_TAG |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
923 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
924 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
925 struct font_driver uniscribe_font_driver = |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
926 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
927 0, /* Quniscribe */ |
94911
f29483946da4
Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents:
93863
diff
changeset
|
928 0, /* case insensitive */ |
93590
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
929 w32font_get_cache, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
930 uniscribe_list, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
931 uniscribe_match, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
932 uniscribe_list_family, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
933 NULL, /* free_entity */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
934 uniscribe_open, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
935 uniscribe_close, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
936 NULL, /* prepare_face */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
937 NULL, /* done_face */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
938 w32font_has_char, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
939 uniscribe_encode_char, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
940 w32font_text_extents, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
941 w32font_draw, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
942 NULL, /* get_bitmap */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
943 NULL, /* free_bitmap */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
944 NULL, /* get_outline */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
945 NULL, /* free_outline */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
946 NULL, /* anchor_point */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
947 uniscribe_otf_capability, /* Defined so (font-get FONTOBJ :otf) works. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
948 NULL, /* otf_drive - use shape instead. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
949 NULL, /* start_for_frame */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
950 NULL, /* end_for_frame */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
951 uniscribe_shape |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
952 }; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
953 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
954 /* Note that this should be called at every startup, not just when dumping, |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
955 as it needs to test for the existence of the Uniscribe library. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
956 void |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
957 syms_of_w32uniscribe () |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
958 { |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
959 HMODULE uniscribe; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
960 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
961 /* Don't init uniscribe when dumping */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
962 if (!initialized) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
963 return; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
964 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
965 /* Don't register if uniscribe is not available. */ |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
966 uniscribe = GetModuleHandle ("usp10"); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
967 if (!uniscribe) |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
968 return; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
969 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
970 uniscribe_font_driver.type = Quniscribe; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
971 uniscribe_available = 1; |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
972 |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
973 register_font_driver (&uniscribe_font_driver, NULL); |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
974 } |
57eed2a0d99f
Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff
changeset
|
975 |
93729 | 976 /* arch-tag: 9530f0e1-7471-47dd-a780-94330af87ea0 |
977 (do not change this comment) */ |