annotate src/w32uniscribe.c @ 96343:5c8f2b7d28ae

* w32font.h (FONT_HANDLE, FONT_TEXTMETRIC): New macros. * w32term.c (x_draw_glyph_string_foreground): (x_draw_composite_glyph_string_foreground): Sync with xterm.c. Use FONT_HANDLE macro. (x_draw_glyph_string): Use FONT_TEXTMETRIC macro. * w32uniscribe.c (uniscribe_otf_capability, uniscribe_shape): (uniscribe_encode_char): Use FONT_HANDLE macro. * w32font.c (Fx_select_font): Use FONT_HANDLE macro. (w32font_text_extents): Use precast w32_font. (w32font_close): Free cached metrics. (w32font_open_internal): Allocate space for name on stack.
author Jason Rumney <jasonr@gnu.org>
date Thu, 26 Jun 2008 22:11:25 +0000
parents 2fc5aff56d81
children 9ee160a11a03
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"
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
37 #include "fontset.h"
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
38 #include "font.h"
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
39 #include "w32font.h"
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
40
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
41 struct uniscribe_font_info
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
42 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
43 struct w32font_info w32_font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
44 SCRIPT_CACHE cache;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
45 };
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 int uniscribe_available = 0;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
48
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
49 /* 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
50 extern Lisp_Object Quniscribe;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
51 extern Lisp_Object Qopentype;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
52
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
53 extern int initialized;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
54
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
55 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
56
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
57 /* EnumFontFamiliesEx callback. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
58 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
59 NEWTEXTMETRICEX *,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
60 DWORD, LPARAM));
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
61 /* Used by uniscribe_otf_capability. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
62 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
63
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
64 static int
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
65 memq_no_quit (elt, list)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
66 Lisp_Object elt, list;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
67 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
68 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
69 list = XCDR (list);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
70 return (CONSP (list));
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
71 }
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 /* Font backend interface implementation. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
75 static Lisp_Object
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
76 uniscribe_list (frame, font_spec)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
77 Lisp_Object frame, font_spec;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
78 {
96071
0f831953ffb8 Add font logging to list and match functions.
Jason Rumney <jasonr@gnu.org>
parents: 95800
diff changeset
79 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
80 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
81 return fonts;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
82 }
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 static Lisp_Object
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
85 uniscribe_match (frame, font_spec)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
86 Lisp_Object frame, font_spec;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
87 {
96071
0f831953ffb8 Add font logging to list and match functions.
Jason Rumney <jasonr@gnu.org>
parents: 95800
diff changeset
88 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
89 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
90 return entity;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
91 }
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 static Lisp_Object
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
94 uniscribe_list_family (frame)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
95 Lisp_Object frame;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
96 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
97 Lisp_Object list = Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
98 LOGFONT font_match_pattern;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
99 HDC dc;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
100 FRAME_PTR f = XFRAME (frame);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
101
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
102 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
103 /* 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
104 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
105
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
106 dc = get_frame_dc (f);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
107
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
108 EnumFontFamiliesEx (dc, &font_match_pattern,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
109 (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
110 (LPARAM) &list, 0);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
111 release_frame_dc (f, dc);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
112
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
113 return list;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
114 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
115
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
116 static Lisp_Object
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
117 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
118 FRAME_PTR f;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
119 Lisp_Object font_entity;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
120 int pixel_size;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
121 {
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
122 Lisp_Object font_object
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
123 = font_make_object (VECSIZE (struct uniscribe_font_info));
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
124 struct uniscribe_font_info *uniscribe_font
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
125 = (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
126
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
127 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
128 {
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
129 return Qnil;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
130 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
131
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
132 /* 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
133 uniscribe_font->cache = NULL;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
134 /* Mark the format as opentype */
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
135 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
136 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
137
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
138 return font_object;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
139 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
140
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
141 static void
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
142 uniscribe_close (f, font)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
143 FRAME_PTR f;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
144 struct font *font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
145 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
146 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
147 = (struct uniscribe_font_info *) font;
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 if (uniscribe_font->cache)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
150 ScriptFreeCache (&uniscribe_font->cache);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
151
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
152 w32font_close (f, 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
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
155 /* 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
156 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
157 static Lisp_Object
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
158 uniscribe_otf_capability (font)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
159 struct font *font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
160 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
161 HDC context;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
162 HFONT old_font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
163 struct frame *f;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
164 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
165 Lisp_Object features;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
166
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
167 f = XFRAME (selected_frame);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
168 context = get_frame_dc (f);
96343
5c8f2b7d28ae * w32font.h (FONT_HANDLE, FONT_TEXTMETRIC): New macros.
Jason Rumney <jasonr@gnu.org>
parents: 96327
diff changeset
169 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
170
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
171 features = otf_features (context, "GSUB");
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
172 XSETCAR (capability, features);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
173 features = otf_features (context, "GPOS");
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
174 XSETCDR (capability, features);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
175
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
176 SelectObject (context, old_font);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
177 release_frame_dc (f, context);
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 return capability;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
180 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
181
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
182 /* 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
183
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
184 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
185 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
186 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
187 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
188
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
189 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
190 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
191 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
192 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
193 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
194 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
195 static Lisp_Object
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
196 uniscribe_shape (lgstring)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
197 Lisp_Object lgstring;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
198 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
199 struct font * font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
200 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
201 EMACS_UINT nchars;
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
202 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
203 wchar_t *chars;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
204 WORD *glyphs, *clusters;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
205 SCRIPT_ITEM *items;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
206 SCRIPT_CONTROL control;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
207 SCRIPT_VISATTR *attributes;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
208 int *advances;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
209 GOFFSET *offsets;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
210 ABC overall_metrics;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
211 MAT2 transform;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
212 HDC context;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
213 HFONT old_font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
214 HRESULT result;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
215 struct frame * f;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
216
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
217 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
218 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
219
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
220 /* Get the chars from lgstring in a form we can use with uniscribe. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
221 max_glyphs = nchars = LGSTRING_LENGTH (lgstring);
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
222 done_glyphs = 0;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
223 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
224 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
225 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
226 /* 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
227 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
228 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
229 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
230 nchars = i;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
231 else
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
232 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
233 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
234
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
235 /* 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
236 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
237 max_items = 2;
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
238 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
239 bzero (&control, sizeof (control));
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 while ((result = ScriptItemize (chars, nchars, max_items, &control, NULL,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
242 items, &nitems)) == E_OUTOFMEMORY)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
243 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
244 /* 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
245 max_items++;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
246 items = (SCRIPT_ITEM *) xrealloc (items,
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
247 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
248 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
249
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
250 /* 0 = success in Microsoft's backwards world. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
251 if (result)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
252 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
253 xfree (items);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
254 return Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
255 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
256
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
257 /* 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
258 Requires that we know the surrounding context. */
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
259
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
260 f = XFRAME (selected_frame);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
261 context = get_frame_dc (f);
96343
5c8f2b7d28ae * w32font.h (FONT_HANDLE, FONT_TEXTMETRIC): New macros.
Jason Rumney <jasonr@gnu.org>
parents: 96327
diff changeset
262 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
263
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 bzero (&transform, sizeof (transform));
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
270 transform.eM11.value = 1;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
271 transform.eM22.value = 1;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
272
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
273 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
274 {
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
275 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
276 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
277
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
278 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
279 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
280 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
281 glyphs, clusters, attributes, &nglyphs);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
282 if (result == E_OUTOFMEMORY)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
283 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
284 /* Need a bigger lgstring. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
285 lgstring = Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
286 break;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
287 }
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
288 else if (result) /* Failure. */
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
289 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
290 /* 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
291 break;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
292 }
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
293 else if (items[i].a.fNoGlyphIndex)
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
294 {
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
295 /* 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
296 can't really do any meaningful shaping. */
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
297 break;
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
298 }
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
299 else
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
300 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
301 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
302 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
303 advances, offsets, &overall_metrics);
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
304 if (result == 0) /* Success. */
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
305 {
93766
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
306 int j, nclusters, from, to;
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
307
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
308 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
309 to = from;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
310
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
311 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
312 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
313 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
314 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
315 ABC char_metric;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
316
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
317 if (NILP (lglyph))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
318 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
319 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
320 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
321 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
322 LGLYPH_SET_CODE (lglyph, glyphs[j]);
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
323
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
324 /* Detect clusters, for linking codes back to characters. */
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
325 if (attributes[j].fClusterStart)
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
326 {
93766
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
327 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
328 && clusters[from] < j)
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
329 from += rtl;
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
330 if (from < 0)
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
331 from = to = 0;
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
332 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
333 from = to = nchars_in_run - 1;
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
334 else
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
335 {
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
336 int k;
93766
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
337 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
338 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
339 k += rtl)
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
340 {
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
341 if (clusters[k] > j)
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
342 {
93766
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
343 to = k - 1;
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
344 break;
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
345 }
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
346 }
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
347 }
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
348 }
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
349
93766
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
350 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
351 + from]);
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
352 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
353 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
354
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
355 /* Metrics. */
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
356 LGLYPH_SET_WIDTH (lglyph, advances[j]);
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
357 LGLYPH_SET_ASCENT (lglyph, font->ascent);
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
358 LGLYPH_SET_DESCENT (lglyph, font->descent);
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
359
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
360 result = ScriptGetGlyphABCWidth (context,
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
361 &(uniscribe_font->cache),
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
362 glyphs[j], &char_metric);
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
363
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
364 if (result == 0) /* Success. */
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
365 {
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
366 LGLYPH_SET_LBEARING (lglyph, char_metric.abcA);
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
367 LGLYPH_SET_RBEARING (lglyph, (char_metric.abcA
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
368 + char_metric.abcB));
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
369 }
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
370 else
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 LGLYPH_SET_LBEARING (lglyph, 0);
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
373 LGLYPH_SET_RBEARING (lglyph, advances[j]);
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
374 }
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
375
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
376 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
377 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
378 Lisp_Object vec;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
379 vec = Fmake_vector (make_number (3), Qnil);
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
380 ASET (vec, 0, make_number (offsets[j].du));
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
381 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
382 /* 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
383 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
384 LGLYPH_SET_ADJUSTMENT (lglyph, vec);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
385 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
386 else
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
387 LGLYPH_SET_ADJUSTMENT (lglyph, Qnil);
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
388 } }
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
389 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
390 done_glyphs += nglyphs;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
391 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
392
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
393 xfree (items);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
394 SelectObject (context, old_font);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
395 release_frame_dc (f, context);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
396
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
397 if (NILP (lgstring))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
398 return Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
399 else
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
400 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
401 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
402
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
403 /* 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
404 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
405 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
406 static unsigned
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
407 uniscribe_encode_char (font, c)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
408 struct font *font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
409 int c;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
410 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
411 wchar_t chars[1];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
412 WORD indices[1];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
413 HDC context;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
414 struct frame *f;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
415 HFONT old_font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
416 DWORD retval;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
417
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
418 /* TODO: surrogates. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
419 if (c > 0xFFFF)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
420 return FONT_INVALID_CODE;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
421
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
422 chars[0] = (wchar_t) c;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
423
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
424 /* Use selected frame until API is updated to pass the frame. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
425 f = XFRAME (selected_frame);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
426 context = get_frame_dc (f);
96343
5c8f2b7d28ae * w32font.h (FONT_HANDLE, FONT_TEXTMETRIC): New macros.
Jason Rumney <jasonr@gnu.org>
parents: 96327
diff changeset
427 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
428
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
429 retval = GetGlyphIndicesW (context, chars, 1, indices,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
430 GGI_MARK_NONEXISTING_GLYPHS);
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 SelectObject (context, old_font);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
433 release_frame_dc (f, context);
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 if (retval == 1)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
436 return indices[0] == 0xFFFF ? FONT_INVALID_CODE : indices[0];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
437 else
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
438 return FONT_INVALID_CODE;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
439 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
440
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
441 /*
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
442 Shared with w32font:
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
443 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
444 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
445 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
446 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
447 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
448 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
449 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
450
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
451 Unused:
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
452 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
453 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
454 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
455 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
456 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
457 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
458 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
459 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
460 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
461 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
462 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
463
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
464 */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
465
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
466
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
467 /* Callback function for EnumFontFamiliesEx.
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
468 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
469 lParam arg). */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
470 static int CALLBACK
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
471 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
472 list_object)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
473 ENUMLOGFONTEX *logical_font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
474 NEWTEXTMETRICEX *physical_font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
475 DWORD font_type;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
476 LPARAM list_object;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
477 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
478 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
479 Lisp_Object family;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
480
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
481 /* 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
482 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
483 return 1;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
484
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
485 /* 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
486 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
487 can make use of. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
488 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
489 && font_type != TRUETYPE_FONTTYPE)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
490 return 1;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
491
95800
67f150b4adbe (add_opentype_font_name_to_list): Skip non unicode fonts.
Jason Rumney <jasonr@gnu.org>
parents: 95743
diff changeset
492 /* 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
493 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
494 && !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
495 && !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
496 && !(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
497 return 1;
67f150b4adbe (add_opentype_font_name_to_list): Skip non unicode fonts.
Jason Rumney <jasonr@gnu.org>
parents: 95743
diff changeset
498
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
499 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
500 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
501 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
502 *list = Fcons (family, *list);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
503
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
504 return 1;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
505 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
506
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
507
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
508 /* :otf property handling.
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
509 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
510 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
511 according to the OpenType Specification. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
512
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
513 /* 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
514 #define OTF_TAG(STR) \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
515 ((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
516
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
517 #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
518 do { \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
519 BYTE temp, data[2]; \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
520 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
521 goto font_table_error; \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
522 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
523 memcpy (PTR, data, 2); \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
524 } while (0)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
525
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
526 /* 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
527 that has them reversed already. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
528 #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
529 do { \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
530 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
531 goto font_table_error; \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
532 } while (0)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
533
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
534 #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
535 do { \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
536 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
537 goto font_table_error; \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
538 STR[4] = '\0'; \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
539 } while (0)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
540
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
541 static char* NOTHING = " ";
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
542
93863
f9841841f5a5 (SNAME): Extract only symbol name.
Jason Rumney <jasonr@gnu.org>
parents: 93766
diff changeset
543 #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
544
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
545 /* 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
546 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
547 (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
548 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
549 LOGFONT *font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
550 Lisp_Object otf_spec;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
551 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
552 Lisp_Object script, lang, rest;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
553 Lisp_Object features[2];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
554 DWORD feature_tables[2];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
555 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
556 struct frame * f;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
557 HDC context;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
558 HFONT check_font, old_font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
559 DWORD table;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
560 int i, retval = 0;
93659
f606935ea4be (uniscribe_check_otf): Add GC protection before consing.
Jason Rumney <jasonr@gnu.org>
parents: 93654
diff changeset
561 struct gcpro gcpro1;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
562
93604
5476a4f5d2f2 (uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents: 93590
diff changeset
563 /* 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
564 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
565 return 0;
5476a4f5d2f2 (uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents: 93590
diff changeset
566
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
567 /* 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
568 script = XCAR (otf_spec);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
569 rest = XCDR (otf_spec);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
570
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
571 lang = XCAR (rest);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
572 rest = XCDR (rest);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
573
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
574 features[0] = XCAR (rest);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
575 rest = XCDR (rest);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
576 if (NILP (rest))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
577 features[1] = Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
578 else
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
579 features[1] = XCAR (rest);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
580
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
581 /* 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
582 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
583 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
584 default_script = OTF_TAG ("DFLT");
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
585 if (NILP (script))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
586 script_tag = default_script;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
587 else
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
588 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
589 if (!NILP (lang))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
590 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
591
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
592 /* 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
593 f = XFRAME (selected_frame);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
594 context = get_frame_dc (f);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
595 check_font = CreateFontIndirect (font);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
596 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
597
93659
f606935ea4be (uniscribe_check_otf): Add GC protection before consing.
Jason Rumney <jasonr@gnu.org>
parents: 93654
diff changeset
598 /* 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
599 marked along with it. */
f606935ea4be (uniscribe_check_otf): Add GC protection before consing.
Jason Rumney <jasonr@gnu.org>
parents: 93654
diff changeset
600 GCPRO1 (otf_spec);
f606935ea4be (uniscribe_check_otf): Add GC protection before consing.
Jason Rumney <jasonr@gnu.org>
parents: 93654
diff changeset
601
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
602 /* Scan GSUB and GPOS tables. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
603 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
604 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
605 int j, n_match_features;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
606 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
607 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
608 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
609 DWORD tbl = feature_tables[i];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
610
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
611 /* 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
612 if (NILP (features[i]))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
613 continue;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
614
93604
5476a4f5d2f2 (uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents: 93590
diff changeset
615 /* 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
616 if (!CONSP (features[i]))
5476a4f5d2f2 (uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents: 93590
diff changeset
617 goto no_support;
5476a4f5d2f2 (uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents: 93590
diff changeset
618
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
619 /* Read GPOS/GSUB header. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
620 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
621 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
622 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
623
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
624 /* Find the appropriate script table. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
625 script_table = 0;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
626 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
627 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
628 DWORD script_id;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
629 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
630 if (script_id == script_tag)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
631 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
632 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
633 break;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
634 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
635 /* 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
636 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
637 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
638 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
639 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
640 /* 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
641 does not support the script. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
642 if (!script_table)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
643 goto no_support;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
644
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
645 /* 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
646 script_table += scriptlist_table;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
647
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
648 /* Get default langsys table. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
649 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
650
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
651 /* 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
652 if (!NILP (lang))
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 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
655
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
656 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
657 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
658 DWORD lang_id;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
659 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
660 if (lang_id == lang_tag)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
661 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
662 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
663 break;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
664 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
665 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
666 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
667
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
668 if (!langsys_table)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
669 goto no_support;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
670
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
671 /* 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
672 langsys_table += script_table;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
673
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
674 /* 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
675 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
676 n_match_features = 0;
93660
96c69ebb9cfa (uniscribe_check_otf): Rearrange loop for counting features.
Jason Rumney <jasonr@gnu.org>
parents: 93659
diff changeset
677 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
678 {
93660
96c69ebb9cfa (uniscribe_check_otf): Rearrange loop for counting features.
Jason Rumney <jasonr@gnu.org>
parents: 93659
diff changeset
679 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
680 if (!NILP (feature))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
681 n_match_features++;
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
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
684 /* 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
685 if (!n_match_features)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
686 continue;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
687
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
688 /* 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
689 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
690 if (feature_index != 0xFFFF)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
691 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
692 char feature_id[5];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
693 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
694 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
695 /* 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
696 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
697 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
698 n_match_features--;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
699 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
700 /* 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
701 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
702 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
703 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
704 char feature_id[5];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
705 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
706 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
707 /* 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
708 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
709 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
710 n_match_features--;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
711 }
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 if (n_match_features > 0)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
714 goto no_support;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
715 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
716
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
717 retval = 1;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
718
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
719 no_support:
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
720 font_table_error:
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
721 /* restore graphics context. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
722 SelectObject (context, old_font);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
723 DeleteObject (check_font);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
724 release_frame_dc (f, context);
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 return retval;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
727 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
728
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
729 static Lisp_Object
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
730 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
731 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
732 Lisp_Object script_list = Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
733 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
734 DWORD tbl = OTF_TAG (table);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
735 int i, j, k;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
736
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
737 /* 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
738 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
739 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
740 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
741
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
742 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
743 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
744 char script[5], lang[5];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
745 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
746 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
747 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
748 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
749 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
750
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
751 /* 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
752 script_table += scriptlist_table;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
753
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
754 script_tag = intern (script);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
755 langsys_list = Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
756
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
757 /* Optional default lang. */
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, &langsys_table);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
759 if (langsys_table)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
760 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
761 /* 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
762 langsys_table += script_table;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
763
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
764 langsys_tag = Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
765 feature_list = Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
766 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
767 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
768 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
769 char feature[5];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
770 unsigned short index;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
771 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
772 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
773 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
774 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
775 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
776 langsys_list);
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
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
779 /* List of supported languages. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
780 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
781
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
782 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
783 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
784 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
785 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
786 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
787
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
788 /* 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
789 langsys_table += script_table;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
790
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
791 langsys_tag = intern (lang);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
792 feature_list = Qnil;
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 + 4, &feature_count);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
794 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
795 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
796 char feature[5];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
797 unsigned short index;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
798 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
799 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
800 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
801 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
802 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
803 langsys_list);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
804
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
805 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
806
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
807 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
808 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
809
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
810 return script_list;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
811
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
812 font_table_error:
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
813 return Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
814 }
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 #undef OTF_INT16_VAL
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
817 #undef OTF_TAG_VAL
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
818 #undef OTF_TAG
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 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
822 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
823 0, /* Quniscribe */
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
824 0, /* case insensitive */
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
825 w32font_get_cache,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
826 uniscribe_list,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
827 uniscribe_match,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
828 uniscribe_list_family,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
829 NULL, /* free_entity */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
830 uniscribe_open,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
831 uniscribe_close,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
832 NULL, /* prepare_face */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
833 NULL, /* done_face */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
834 w32font_has_char,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
835 uniscribe_encode_char,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
836 w32font_text_extents,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
837 w32font_draw,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
838 NULL, /* get_bitmap */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
839 NULL, /* free_bitmap */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
840 NULL, /* get_outline */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
841 NULL, /* free_outline */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
842 NULL, /* anchor_point */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
843 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
844 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
845 NULL, /* start_for_frame */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
846 NULL, /* end_for_frame */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
847 uniscribe_shape
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
848 };
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
849
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
850 /* 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
851 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
852 void
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
853 syms_of_w32uniscribe ()
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 HMODULE uniscribe;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
856
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
857 /* 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
858 if (!initialized)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
859 return;
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 /* 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
862 uniscribe = GetModuleHandle ("usp10");
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
863 if (!uniscribe)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
864 return;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
865
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
866 uniscribe_font_driver.type = Quniscribe;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
867 uniscribe_available = 1;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
868
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
869 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
870 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
871
93729
8dc921bd7171 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 93660
diff changeset
872 /* arch-tag: 9530f0e1-7471-47dd-a780-94330af87ea0
8dc921bd7171 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 93660
diff changeset
873 (do not change this comment) */