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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
8dc921bd7171 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 93660
diff changeset
976 /* arch-tag: 9530f0e1-7471-47dd-a780-94330af87ea0
8dc921bd7171 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 93660
diff changeset
977 (do not change this comment) */