annotate src/w32uniscribe.c @ 110035:619b4d494232

Use with-silent-modifications. * lisp/composite.el (save-buffer-state): Delete, unused. * lisp/font-lock.el (save-buffer-state): Use with-silent-modifications. (font-lock-default-fontify-region): Use with-syntax-table. * lisp/jit-lock.el (with-buffer-unmodified): Remove. (with-buffer-prepared-for-jit-lock): Use with-silent-modifications.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Mon, 30 Aug 2010 15:57:42 +0200
parents 750db9f3e6d8
children 6d74afef6e68
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.
106815
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 105669
diff changeset
2 Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc.
93590
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
106837
855f55740303 Fix typos in comments.
Juanma Barranquero <lekktu@gmail.com>
parents: 106815
diff changeset
25 of calling non-existent functions. */
93590
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>
105669
68dd71358159 * alloc.c: Do not define struct catchtag.
Dan Nicolaescu <dann@ics.uci.edu>
parents: 103544
diff changeset
30 #include <setjmp.h>
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
31
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
32 #include "lisp.h"
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
33 #include "w32term.h"
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
34 #include "frame.h"
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
35 #include "dispextern.h"
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
36 #include "character.h"
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
37 #include "charset.h"
97832
e33a2e6c1dab (struct uniscribe_font_info): Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 97135
diff changeset
38 #include "composite.h"
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
39 #include "fontset.h"
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
40 #include "font.h"
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
41 #include "w32font.h"
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 uniscribe_font_info
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
44 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
45 struct w32font_info w32_font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
46 SCRIPT_CACHE cache;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
47 };
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
48
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
49 int uniscribe_available = 0;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
50
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
51 /* 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
52 extern Lisp_Object Quniscribe;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
53 extern Lisp_Object Qopentype;
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 int initialized;
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 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
58
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
59 /* EnumFontFamiliesEx callback. */
109100
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 107246
diff changeset
60 static int CALLBACK add_opentype_font_name_to_list (ENUMLOGFONTEX *,
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 107246
diff changeset
61 NEWTEXTMETRICEX *,
2bc9a0c04c87 Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents: 107246
diff changeset
62 DWORD, LPARAM);
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
63 /* Used by uniscribe_otf_capability. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
64 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
65
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
66 static int
109152
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
67 memq_no_quit (Lisp_Object elt, Lisp_Object list)
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
68 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
69 while (CONSP (list) && ! EQ (XCAR (list), elt))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
70 list = XCDR (list);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
71 return (CONSP (list));
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
72 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
73
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
74
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
75 /* Font backend interface implementation. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
76 static Lisp_Object
109152
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
77 uniscribe_list (Lisp_Object frame, Lisp_Object font_spec)
93590
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);
103544
53abe6fc7e48 Change font_add_log to FONT_ADD_LOG.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
80 FONT_ADD_LOG ("uniscribe-list", font_spec, fonts);
96071
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
109152
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
85 uniscribe_match (Lisp_Object frame, Lisp_Object font_spec)
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
86 {
96071
0f831953ffb8 Add font logging to list and match functions.
Jason Rumney <jasonr@gnu.org>
parents: 95800
diff changeset
87 Lisp_Object entity = w32font_match_internal (frame, font_spec, 1);
103544
53abe6fc7e48 Change font_add_log to FONT_ADD_LOG.
Kenichi Handa <handa@m17n.org>
parents: 100951
diff changeset
88 FONT_ADD_LOG ("uniscribe-match", font_spec, entity);
96071
0f831953ffb8 Add font logging to list and match functions.
Jason Rumney <jasonr@gnu.org>
parents: 95800
diff changeset
89 return entity;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
90 }
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 static Lisp_Object
109152
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
93 uniscribe_list_family (Lisp_Object frame)
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
94 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
95 Lisp_Object list = Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
96 LOGFONT font_match_pattern;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
97 HDC dc;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
98 FRAME_PTR f = XFRAME (frame);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
99
109165
750db9f3e6d8 Replace bcopy, bzero, bcmp by memcpy, memmove, memset, memcmp
Andreas Schwab <schwab@linux-m68k.org>
parents: 109160
diff changeset
100 memset (&font_match_pattern, 0, sizeof (font_match_pattern));
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
101 /* 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
102 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
103
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
104 dc = get_frame_dc (f);
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 EnumFontFamiliesEx (dc, &font_match_pattern,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
107 (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
108 (LPARAM) &list, 0);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
109 release_frame_dc (f, dc);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
110
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
111 return list;
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
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
114 static Lisp_Object
109152
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
115 uniscribe_open (FRAME_PTR f, Lisp_Object font_entity, int pixel_size)
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
116 {
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
117 Lisp_Object font_object
96564
9ee160a11a03 (uniscribe_open): Adjust it for the change of
Kenichi Handa <handa@m17n.org>
parents: 96343
diff changeset
118 = font_make_object (VECSIZE (struct uniscribe_font_info),
9ee160a11a03 (uniscribe_open): Adjust it for the change of
Kenichi Handa <handa@m17n.org>
parents: 96343
diff changeset
119 font_entity, pixel_size);
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
120 struct uniscribe_font_info *uniscribe_font
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
121 = (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
122
96937
7f7286fdbf06 * w32font.c (w32font_open): Set font type to gdi.
Jason Rumney <jasonr@gnu.org>
parents: 96564
diff changeset
123 ASET (font_object, FONT_TYPE_INDEX, Quniscribe);
7f7286fdbf06 * w32font.c (w32font_open): Set font type to gdi.
Jason Rumney <jasonr@gnu.org>
parents: 96564
diff changeset
124
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
125 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
126 {
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
127 return Qnil;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
128 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
129
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
130 /* 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
131 uniscribe_font->cache = NULL;
97025
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
132
97135
09abb4487286 * w32font.h (struct w32font_info): Use unicode version of textmetrics.
Jason Rumney <jasonr@gnu.org>
parents: 97112
diff changeset
133 /* Uniscribe backend uses glyph indices. */
09abb4487286 * w32font.h (struct w32font_info): Use unicode version of textmetrics.
Jason Rumney <jasonr@gnu.org>
parents: 97112
diff changeset
134 uniscribe_font->w32_font.glyph_idx = ETO_GLYPH_INDEX;
09abb4487286 * w32font.h (struct w32font_info): Use unicode version of textmetrics.
Jason Rumney <jasonr@gnu.org>
parents: 97112
diff changeset
135
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
136 /* Mark the format as opentype */
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
137 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
138 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
139
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
140 return font_object;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
141 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
142
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
143 static void
109152
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
144 uniscribe_close (FRAME_PTR f, struct font *font)
93590
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)
97025
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
150 ScriptFreeCache (&(uniscribe_font->cache));
93590
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
109152
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
158 uniscribe_otf_capability (struct font *font)
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
159 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
160 HDC context;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
161 HFONT old_font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
162 struct frame *f;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
163 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
164 Lisp_Object features;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
165
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
166 f = XFRAME (selected_frame);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
167 context = get_frame_dc (f);
109160
f8660b83cdbf Fix whitespace to follow coding guidelines.
Juanma Barranquero <lekktu@gmail.com>
parents: 109152
diff changeset
168 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
169
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
170 features = otf_features (context, "GSUB");
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
171 XSETCAR (capability, features);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
172 features = otf_features (context, "GPOS");
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
173 XSETCDR (capability, features);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
174
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
175 SelectObject (context, old_font);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
176 release_frame_dc (f, context);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
177
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
178 return capability;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
179 }
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 /* 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
182
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
183 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
184 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
185 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
186 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
187
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
188 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
189 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
190 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
191 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
192 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
193 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
194 static Lisp_Object
109152
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
195 uniscribe_shape (Lisp_Object lgstring)
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
196 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
197 struct font * font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
198 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
199 EMACS_UINT nchars;
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
200 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
201 wchar_t *chars;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
202 WORD *glyphs, *clusters;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
203 SCRIPT_ITEM *items;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
204 SCRIPT_VISATTR *attributes;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
205 int *advances;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
206 GOFFSET *offsets;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
207 ABC overall_metrics;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
208 HRESULT result;
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
209 struct frame * f = NULL;
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
210 HDC context = NULL;
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
211 HFONT old_font = NULL;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
212
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
213 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
214 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
215
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
216 /* Get the chars from lgstring in a form we can use with uniscribe. */
97832
e33a2e6c1dab (struct uniscribe_font_info): Include composite.h.
Kenichi Handa <handa@m17n.org>
parents: 97135
diff changeset
217 max_glyphs = nchars = LGSTRING_GLYPH_LEN (lgstring);
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
218 done_glyphs = 0;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
219 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
220 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
221 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
222 /* 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
223 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
224 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
225 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
226 nchars = i;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
227 else
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
228 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
229 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
230
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
231 /* 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
232 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
233 max_items = 2;
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
234 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
235
97025
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
236 while ((result = ScriptItemize (chars, nchars, max_items, NULL, NULL,
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
237 items, &nitems)) == E_OUTOFMEMORY)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
238 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
239 /* 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
240 max_items++;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
241 items = (SCRIPT_ITEM *) xrealloc (items,
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
242 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
243 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
244
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
245 if (FAILED (result))
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
246 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
247 xfree (items);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
248 return Qnil;
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
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
251 /* 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
252 Requires that we know the surrounding context. */
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
253
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
254 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
255 clusters = alloca (nchars * sizeof (WORD));
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
256 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
257 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
258 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
259
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
260 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
261 {
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
262 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
263 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
264
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
265 /* Context may be NULL here, in which case the cache should be
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
266 used without needing to select the font. */
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
267 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
268 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
269 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
270 glyphs, clusters, attributes, &nglyphs);
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
271
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
272 if (result == E_PENDING && !context)
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
273 {
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
274 /* This assumes the selected frame is on the same display as the
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
275 one we are drawing. It would be better for the frame to be
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
276 passed in. */
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
277 f = XFRAME (selected_frame);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
278 context = get_frame_dc (f);
109160
f8660b83cdbf Fix whitespace to follow coding guidelines.
Juanma Barranquero <lekktu@gmail.com>
parents: 109152
diff changeset
279 old_font = SelectObject (context, FONT_HANDLE (font));
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
280
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
281 result = ScriptShape (context, &(uniscribe_font->cache),
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
282 chars + items[i].iCharPos, nchars_in_run,
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
283 max_glyphs - done_glyphs, &(items[i].a),
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
284 glyphs, clusters, attributes, &nglyphs);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
285 }
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
286
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
287 if (result == E_OUTOFMEMORY)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
288 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
289 /* Need a bigger lgstring. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
290 lgstring = Qnil;
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 }
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
293 else if (FAILED (result))
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
294 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
295 /* 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
296 break;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
297 }
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
298 else if (items[i].a.fNoGlyphIndex)
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
299 {
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
300 /* 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
301 can't really do any meaningful shaping. */
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
302 break;
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
303 }
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
304 else
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
305 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
306 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
307 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
308 advances, offsets, &overall_metrics);
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
309 if (result == E_PENDING && !context)
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
310 {
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
311 /* Cache not complete... */
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
312 f = XFRAME (selected_frame);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
313 context = get_frame_dc (f);
109160
f8660b83cdbf Fix whitespace to follow coding guidelines.
Juanma Barranquero <lekktu@gmail.com>
parents: 109152
diff changeset
314 old_font = SelectObject (context, FONT_HANDLE (font));
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
315
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
316 result = ScriptPlace (context, &(uniscribe_font->cache),
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
317 glyphs, nglyphs, attributes, &(items[i].a),
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
318 advances, offsets, &overall_metrics);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
319 }
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
320 if (SUCCEEDED (result))
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
321 {
93766
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
322 int j, nclusters, from, to;
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
323
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
324 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
325 to = from;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
326
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
327 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
328 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
329 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
330 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
331 ABC char_metric;
97848
d1e61da65cce (uniscribe_shape): Shut up compiler warning in LGLYPH_SET_CODE.
Eli Zaretskii <eliz@gnu.org>
parents: 97832
diff changeset
332 unsigned gl;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
333
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
334 if (NILP (lglyph))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
335 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
336 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
337 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
338 }
97848
d1e61da65cce (uniscribe_shape): Shut up compiler warning in LGLYPH_SET_CODE.
Eli Zaretskii <eliz@gnu.org>
parents: 97832
diff changeset
339 /* Copy to a 32-bit data type to shut up the
d1e61da65cce (uniscribe_shape): Shut up compiler warning in LGLYPH_SET_CODE.
Eli Zaretskii <eliz@gnu.org>
parents: 97832
diff changeset
340 compiler warning in LGLYPH_SET_CODE about
d1e61da65cce (uniscribe_shape): Shut up compiler warning in LGLYPH_SET_CODE.
Eli Zaretskii <eliz@gnu.org>
parents: 97832
diff changeset
341 comparison being always false. */
d1e61da65cce (uniscribe_shape): Shut up compiler warning in LGLYPH_SET_CODE.
Eli Zaretskii <eliz@gnu.org>
parents: 97832
diff changeset
342 gl = glyphs[j];
d1e61da65cce (uniscribe_shape): Shut up compiler warning in LGLYPH_SET_CODE.
Eli Zaretskii <eliz@gnu.org>
parents: 97832
diff changeset
343 LGLYPH_SET_CODE (lglyph, gl);
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
344
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
345 /* Detect clusters, for linking codes back to characters. */
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
346 if (attributes[j].fClusterStart)
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
347 {
93766
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
348 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
349 && clusters[from] < j)
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
350 from += rtl;
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
351 if (from < 0)
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
352 from = to = 0;
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
353 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
354 from = to = nchars_in_run - 1;
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
355 else
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
356 {
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
357 int k;
93766
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
358 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
359 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
360 k += rtl)
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
361 {
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
362 if (clusters[k] > j)
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
363 {
93766
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
364 to = k - 1;
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
365 break;
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
366 }
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
367 }
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
368 }
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
93766
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
371 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
372 + from]);
2382df5e230a (uniscribe_shape): Map char at FROM to current glyph.
Jason Rumney <jasonr@gnu.org>
parents: 93762
diff changeset
373 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
374 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
375
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
376 /* Metrics. */
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
377 LGLYPH_SET_WIDTH (lglyph, advances[j]);
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
378 LGLYPH_SET_ASCENT (lglyph, font->ascent);
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
379 LGLYPH_SET_DESCENT (lglyph, font->descent);
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
380
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
381 result = ScriptGetGlyphABCWidth (context,
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
382 &(uniscribe_font->cache),
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
383 glyphs[j], &char_metric);
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
384 if (result == E_PENDING && !context)
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
385 {
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
386 /* Cache incomplete... */
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
387 f = XFRAME (selected_frame);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
388 context = get_frame_dc (f);
109160
f8660b83cdbf Fix whitespace to follow coding guidelines.
Juanma Barranquero <lekktu@gmail.com>
parents: 109152
diff changeset
389 old_font = SelectObject (context, FONT_HANDLE (font));
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
390 result = ScriptGetGlyphABCWidth (context,
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
391 &(uniscribe_font->cache),
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
392 glyphs[j], &char_metric);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
393 }
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
394
97025
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
395 if (SUCCEEDED (result))
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
396 {
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
397 LGLYPH_SET_LBEARING (lglyph, char_metric.abcA);
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
398 LGLYPH_SET_RBEARING (lglyph, (char_metric.abcA
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
399 + char_metric.abcB));
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
400 }
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
401 else
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
402 {
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
403 LGLYPH_SET_LBEARING (lglyph, 0);
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
404 LGLYPH_SET_RBEARING (lglyph, advances[j]);
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
405 }
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
406
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
407 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
408 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
409 Lisp_Object vec;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
410 vec = Fmake_vector (make_number (3), Qnil);
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
411 ASET (vec, 0, make_number (offsets[j].du));
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
412 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
413 /* 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
414 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
415 LGLYPH_SET_ADJUSTMENT (lglyph, vec);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
416 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
417 else
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
418 LGLYPH_SET_ADJUSTMENT (lglyph, Qnil);
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
419 }
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
420 }
93590
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 done_glyphs += nglyphs;
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
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
425 xfree (items);
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
426
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
427 if (context)
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
428 {
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
429 SelectObject (context, old_font);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
430 release_frame_dc (f, context);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
431 }
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
432
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
433 if (NILP (lgstring))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
434 return Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
435 else
93762
46d39c0f7bf9 (uniscribe_shape): Increase items buffer size.
Jason Rumney <jasonr@gnu.org>
parents: 93729
diff changeset
436 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
437 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
438
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
439 /* 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
440 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
441 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
442 static unsigned
109152
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
443 uniscribe_encode_char (struct font *font, int c)
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
444 {
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
445 HDC context = NULL;
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
446 struct frame *f = NULL;
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
447 HFONT old_font = NULL;
97025
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
448 unsigned code = FONT_INVALID_CODE;
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
449 wchar_t ch[2];
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
450 int len;
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
451 SCRIPT_ITEM* items;
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
452 int nitems;
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
453 struct uniscribe_font_info *uniscribe_font
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
454 = (struct uniscribe_font_info *)font;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
455
97025
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
456 if (c < 0x10000)
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
457 {
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
458 ch[0] = (wchar_t) c;
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
459 len = 1;
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
460 }
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
461 else
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
462 {
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
463 DWORD surrogate = c - 0x10000;
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
464
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
465 /* High surrogate: U+D800 - U+DBFF. */
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
466 ch[0] = 0xD800 + ((surrogate >> 10) & 0x03FF);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
467 /* Low surrogate: U+DC00 - U+DFFF. */
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
468 ch[1] = 0xDC00 + (surrogate & 0x03FF);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
469 len = 2;
97025
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
470 }
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
471
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
472 /* Non BMP characters must be handled by the uniscribe shaping
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
473 engine as GDI functions (except blindly displaying lines of
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
474 unicode text) and the promising looking ScriptGetCMap do not
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
475 convert surrogate pairs to glyph indexes correctly. */
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
476 {
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
477 items = (SCRIPT_ITEM *) alloca (sizeof (SCRIPT_ITEM) * 2 + 1);
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
478 if (SUCCEEDED (ScriptItemize (ch, len, 2, NULL, NULL, items, &nitems)))
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
479 {
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
480 HRESULT result;
100357
92ff8ff0a655 (uniscribe_encode_char): Increase glyph buffer size for surrogates.
Jason Rumney <jasonr@gnu.org>
parents: 99853
diff changeset
481 /* Surrogates seem to need 2 here, even though only one glyph is
92ff8ff0a655 (uniscribe_encode_char): Increase glyph buffer size for surrogates.
Jason Rumney <jasonr@gnu.org>
parents: 99853
diff changeset
482 returned. Indic characters can also produce 2 or more glyphs for
92ff8ff0a655 (uniscribe_encode_char): Increase glyph buffer size for surrogates.
Jason Rumney <jasonr@gnu.org>
parents: 99853
diff changeset
483 a single code point, but they need to use uniscribe_shape
92ff8ff0a655 (uniscribe_encode_char): Increase glyph buffer size for surrogates.
Jason Rumney <jasonr@gnu.org>
parents: 99853
diff changeset
484 above for correct display. */
92ff8ff0a655 (uniscribe_encode_char): Increase glyph buffer size for surrogates.
Jason Rumney <jasonr@gnu.org>
parents: 99853
diff changeset
485 WORD glyphs[2], clusters[2];
92ff8ff0a655 (uniscribe_encode_char): Increase glyph buffer size for surrogates.
Jason Rumney <jasonr@gnu.org>
parents: 99853
diff changeset
486 SCRIPT_VISATTR attrs[2];
97025
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
487 int nglyphs;
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
488
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
489 result = ScriptShape (context, &(uniscribe_font->cache),
100357
92ff8ff0a655 (uniscribe_encode_char): Increase glyph buffer size for surrogates.
Jason Rumney <jasonr@gnu.org>
parents: 99853
diff changeset
490 ch, len, 2, &(items[0].a),
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
491 glyphs, clusters, attrs, &nglyphs);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
492
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
493 if (result == E_PENDING)
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
494 {
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
495 /* Use selected frame until API is updated to pass
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
496 the frame. */
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
497 f = XFRAME (selected_frame);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
498 context = get_frame_dc (f);
109160
f8660b83cdbf Fix whitespace to follow coding guidelines.
Juanma Barranquero <lekktu@gmail.com>
parents: 109152
diff changeset
499 old_font = SelectObject (context, FONT_HANDLE (font));
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
500 result = ScriptShape (context, &(uniscribe_font->cache),
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
501 ch, len, 2, &(items[0].a),
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
502 glyphs, clusters, attrs, &nglyphs);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
503 }
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
504
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
505 if (SUCCEEDED (result) && nglyphs == 1)
97025
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
506 {
100627
4159567b77d7 (uniscribe_encode_char): Return FONT_INVALID_CHAR
Jason Rumney <jasonr@gnu.org>
parents: 100409
diff changeset
507 /* Some fonts return .notdef glyphs instead of failing.
4159567b77d7 (uniscribe_encode_char): Return FONT_INVALID_CHAR
Jason Rumney <jasonr@gnu.org>
parents: 100409
diff changeset
508 (Truetype spec reserves glyph code 0 for .notdef) */
4159567b77d7 (uniscribe_encode_char): Return FONT_INVALID_CHAR
Jason Rumney <jasonr@gnu.org>
parents: 100409
diff changeset
509 if (glyphs[0])
4159567b77d7 (uniscribe_encode_char): Return FONT_INVALID_CHAR
Jason Rumney <jasonr@gnu.org>
parents: 100409
diff changeset
510 code = glyphs[0];
97025
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
511 }
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
512 else if (SUCCEEDED (result) || result == E_OUTOFMEMORY)
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
513 {
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
514 /* This character produces zero or more than one glyph
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
515 when shaped. But we still need the return from here
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
516 to be valid for the shaping engine to be invoked
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
517 later. */
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
518 result = ScriptGetCMap (context, &(uniscribe_font->cache),
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
519 ch, len, 0, glyphs);
100627
4159567b77d7 (uniscribe_encode_char): Return FONT_INVALID_CHAR
Jason Rumney <jasonr@gnu.org>
parents: 100409
diff changeset
520 if (SUCCEEDED (result) && glyphs[0])
99853
6a28cc2ace8a (uniscribe_encode_char): Ensure context is restored before returning.
Jason Rumney <jasonr@gnu.org>
parents: 97858
diff changeset
521 code = glyphs[0];
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
522 }
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
523 }
97025
e72be8a4fdb8 (uniscribe_shape): Pass NULL for control arg to ScriptItemize. Clean
Jason Rumney <jasonr@gnu.org>
parents: 97004
diff changeset
524 }
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
525 if (context)
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
526 {
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
527 SelectObject (context, old_font);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
528 release_frame_dc (f, context);
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
529 }
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
530
97086
c38003f850b5 (uniscribe_shape): Avoid using context if cache
Jason Rumney <jasonr@gnu.org>
parents: 97025
diff changeset
531 return code;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
532 }
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 /*
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
535 Shared with w32font:
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
536 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
537 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
538 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
539 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
540 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
541 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
542 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
543
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
544 Unused:
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
545 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
546 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
547 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
548 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
549 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
550 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
551 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
552 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
553 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
554 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
555 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
556
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
557 */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
558
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
559
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
560 /* Callback function for EnumFontFamiliesEx.
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
561 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
562 lParam arg). */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
563 static int CALLBACK
109152
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
564 add_opentype_font_name_to_list (ENUMLOGFONTEX *logical_font,
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
565 NEWTEXTMETRICEX *physical_font,
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
566 DWORD font_type, LPARAM list_object)
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
567 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
568 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
569 Lisp_Object family;
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 /* 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
572 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
573 return 1;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
574
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
575 /* 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
576 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
577 can make use of. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
578 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
579 && font_type != TRUETYPE_FONTTYPE)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
580 return 1;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
581
95800
67f150b4adbe (add_opentype_font_name_to_list): Skip non unicode fonts.
Jason Rumney <jasonr@gnu.org>
parents: 95743
diff changeset
582 /* 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
583 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
584 && !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
585 && !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
586 && !(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
587 return 1;
67f150b4adbe (add_opentype_font_name_to_list): Skip non unicode fonts.
Jason Rumney <jasonr@gnu.org>
parents: 95743
diff changeset
588
100409
4be3711ceff9 * w32font.c (intern_font_name): New function.
Jason Rumney <jasonr@gnu.org>
parents: 100357
diff changeset
589 family = intern_font_name (logical_font->elfLogFont.lfFaceName);
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
590 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
591 *list = Fcons (family, *list);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
592
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
593 return 1;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
594 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
595
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
596
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
597 /* :otf property handling.
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
598 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
599 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
600 according to the OpenType Specification. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
601
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
602 /* 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
603 #define OTF_TAG(STR) \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
604 ((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
605
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
606 #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
607 do { \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
608 BYTE temp, data[2]; \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
609 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
610 goto font_table_error; \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
611 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
612 memcpy (PTR, data, 2); \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
613 } while (0)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
614
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
615 /* 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
616 that has them reversed already. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
617 #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
618 do { \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
619 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
620 goto font_table_error; \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
621 } while (0)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
622
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
623 #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
624 do { \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
625 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
626 goto font_table_error; \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
627 STR[4] = '\0'; \
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
628 } while (0)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
629
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
630 static char* NOTHING = " ";
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
631
93863
f9841841f5a5 (SNAME): Extract only symbol name.
Jason Rumney <jasonr@gnu.org>
parents: 93766
diff changeset
632 #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
633
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
634 /* 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
635 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
636 (script lang [(gsub_feature ...)|nil] [(gpos_feature ...)]?) */
109152
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
637 int
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
638 uniscribe_check_otf (LOGFONT *font, Lisp_Object otf_spec)
93590
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 Lisp_Object script, lang, rest;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
641 Lisp_Object features[2];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
642 DWORD feature_tables[2];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
643 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
644 struct frame * f;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
645 HDC context;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
646 HFONT check_font, old_font;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
647 DWORD table;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
648 int i, retval = 0;
93659
f606935ea4be (uniscribe_check_otf): Add GC protection before consing.
Jason Rumney <jasonr@gnu.org>
parents: 93654
diff changeset
649 struct gcpro gcpro1;
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
650
93604
5476a4f5d2f2 (uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents: 93590
diff changeset
651 /* Check the spec is in the right format. */
107246
4cce9795bfd4 * w32uniscribe.c (uniscribe_check_otf): Fix length check.
Andreas Schwab <schwab@linux-m68k.org>
parents: 106837
diff changeset
652 if (!CONSP (otf_spec) || XINT (Flength (otf_spec)) < 3)
93604
5476a4f5d2f2 (uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents: 93590
diff changeset
653 return 0;
5476a4f5d2f2 (uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents: 93590
diff changeset
654
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
655 /* 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
656 script = XCAR (otf_spec);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
657 rest = XCDR (otf_spec);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
658
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
659 lang = XCAR (rest);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
660 rest = XCDR (rest);
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 features[0] = XCAR (rest);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
663 rest = XCDR (rest);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
664 if (NILP (rest))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
665 features[1] = Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
666 else
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
667 features[1] = XCAR (rest);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
668
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
669 /* 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
670 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
671 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
672 default_script = OTF_TAG ("DFLT");
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
673 if (NILP (script))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
674 script_tag = default_script;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
675 else
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
676 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
677 if (!NILP (lang))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
678 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
679
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
680 /* 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
681 f = XFRAME (selected_frame);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
682 context = get_frame_dc (f);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
683 check_font = CreateFontIndirect (font);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
684 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
685
93659
f606935ea4be (uniscribe_check_otf): Add GC protection before consing.
Jason Rumney <jasonr@gnu.org>
parents: 93654
diff changeset
686 /* 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
687 marked along with it. */
f606935ea4be (uniscribe_check_otf): Add GC protection before consing.
Jason Rumney <jasonr@gnu.org>
parents: 93654
diff changeset
688 GCPRO1 (otf_spec);
f606935ea4be (uniscribe_check_otf): Add GC protection before consing.
Jason Rumney <jasonr@gnu.org>
parents: 93654
diff changeset
689
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
690 /* Scan GSUB and GPOS tables. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
691 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
692 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
693 int j, n_match_features;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
694 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
695 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
696 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
697 DWORD tbl = feature_tables[i];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
698
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
699 /* 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
700 if (NILP (features[i]))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
701 continue;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
702
93604
5476a4f5d2f2 (uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents: 93590
diff changeset
703 /* 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
704 if (!CONSP (features[i]))
5476a4f5d2f2 (uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents: 93590
diff changeset
705 goto no_support;
5476a4f5d2f2 (uniscribe_check_otf): Sanity check otf_spec.
Jason Rumney <jasonr@gnu.org>
parents: 93590
diff changeset
706
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
707 /* Read GPOS/GSUB header. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
708 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
709 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
710 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
711
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
712 /* Find the appropriate script table. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
713 script_table = 0;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
714 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
715 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
716 DWORD script_id;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
717 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
718 if (script_id == script_tag)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
719 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
720 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
721 break;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
722 }
97858
111763d689bf (uniscribe_check_otf): Don't fallback on DFLT script.
Jason Rumney <jasonr@gnu.org>
parents: 97848
diff changeset
723 #if 0 /* Causes false positives. */
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
724 /* 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
725 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
726 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
727 OTF_INT16_VAL (tbl, scriptlist_table + 6 + j * 6, &script_table);
97858
111763d689bf (uniscribe_check_otf): Don't fallback on DFLT script.
Jason Rumney <jasonr@gnu.org>
parents: 97848
diff changeset
728 #endif
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
729 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
730 /* 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
731 does not support the script. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
732 if (!script_table)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
733 goto no_support;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
734
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
735 /* 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
736 script_table += scriptlist_table;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
737
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
738 /* Get default langsys 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, script_table, &langsys_table);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
740
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
741 /* 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
742 if (!NILP (lang))
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 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
745
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
746 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
747 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
748 DWORD lang_id;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
749 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
750 if (lang_id == lang_tag)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
751 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
752 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
753 break;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
754 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
755 }
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
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
758 if (!langsys_table)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
759 goto no_support;
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 /* 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
765 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
766 n_match_features = 0;
93660
96c69ebb9cfa (uniscribe_check_otf): Rearrange loop for counting features.
Jason Rumney <jasonr@gnu.org>
parents: 93659
diff changeset
767 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
768 {
93660
96c69ebb9cfa (uniscribe_check_otf): Rearrange loop for counting features.
Jason Rumney <jasonr@gnu.org>
parents: 93659
diff changeset
769 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
770 if (!NILP (feature))
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
771 n_match_features++;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
772 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
773
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
774 /* 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
775 if (!n_match_features)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
776 continue;
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 /* 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
779 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
780 if (feature_index != 0xFFFF)
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 char feature_id[5];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
783 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
784 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
785 /* 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
786 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
787 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
788 n_match_features--;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
789 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
790 /* 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
791 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
792 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
793 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
794 char feature_id[5];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
795 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
796 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
797 /* 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
798 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
799 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
800 n_match_features--;
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
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
803 if (n_match_features > 0)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
804 goto no_support;
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 retval = 1;
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 no_support:
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
810 font_table_error:
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
811 /* restore graphics context. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
812 SelectObject (context, old_font);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
813 DeleteObject (check_font);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
814 release_frame_dc (f, context);
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 return retval;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
817 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
818
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
819 static Lisp_Object
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
820 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
821 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
822 Lisp_Object script_list = Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
823 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
824 DWORD tbl = OTF_TAG (table);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
825 int i, j, k;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
826
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
827 /* 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
828 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
829 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
830 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
831
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
832 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
833 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
834 char script[5], lang[5];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
835 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
836 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
837 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
838 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
839 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
840
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
841 /* 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
842 script_table += scriptlist_table;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
843
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
844 script_tag = intern (script);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
845 langsys_list = Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
846
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
847 /* Optional default lang. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
848 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
849 if (langsys_table)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
850 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
851 /* 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
852 langsys_table += script_table;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
853
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
854 langsys_tag = Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
855 feature_list = Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
856 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
857 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
858 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
859 char feature[5];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
860 unsigned short index;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
861 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
862 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
863 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
864 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
865 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
866 langsys_list);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
867 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
868
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
869 /* List of supported languages. */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
870 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
871
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
872 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
873 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
874 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
875 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
876 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
877
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
878 /* 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
879 langsys_table += script_table;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
880
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
881 langsys_tag = intern (lang);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
882 feature_list = Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
883 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
884 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
885 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
886 char feature[5];
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
887 unsigned short index;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
888 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
889 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
890 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
891 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
892 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
893 langsys_list);
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
894
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
895 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
896
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
897 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
898 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
899
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
900 return script_list;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
901
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
902 font_table_error:
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
903 return Qnil;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
904 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
905
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
906 #undef OTF_INT16_VAL
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
907 #undef OTF_TAG_VAL
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
908 #undef OTF_TAG
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
909
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
910
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
911 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
912 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
913 0, /* Quniscribe */
94911
f29483946da4 Delete USE_FONT_BACKEND conditional.
Kenichi Handa <handa@m17n.org>
parents: 93863
diff changeset
914 0, /* case insensitive */
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
915 w32font_get_cache,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
916 uniscribe_list,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
917 uniscribe_match,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
918 uniscribe_list_family,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
919 NULL, /* free_entity */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
920 uniscribe_open,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
921 uniscribe_close,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
922 NULL, /* prepare_face */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
923 NULL, /* done_face */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
924 w32font_has_char,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
925 uniscribe_encode_char,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
926 w32font_text_extents,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
927 w32font_draw,
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
928 NULL, /* get_bitmap */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
929 NULL, /* free_bitmap */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
930 NULL, /* get_outline */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
931 NULL, /* free_outline */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
932 NULL, /* anchor_point */
109152
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
933 uniscribe_otf_capability, /* Defined so (font-get FONTOBJ :otf) works. */
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
934 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
935 NULL, /* start_for_frame */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
936 NULL, /* end_for_frame */
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
937 uniscribe_shape
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
938 };
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
939
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
940 /* 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
941 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
942 void
109152
e27859da5624 src/w32*.c: Convert function definitions to standard C.
Juanma Barranquero <lekktu@gmail.com>
parents: 109100
diff changeset
943 syms_of_w32uniscribe (void)
93590
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
944 {
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
945 HMODULE uniscribe;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
946
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
947 /* 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
948 if (!initialized)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
949 return;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
950
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
951 /* 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
952 uniscribe = GetModuleHandle ("usp10");
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
953 if (!uniscribe)
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
954 return;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
955
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
956 uniscribe_font_driver.type = Quniscribe;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
957 uniscribe_available = 1;
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
958
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
959 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
960 }
57eed2a0d99f Font backend implementation for Uniscribe on Windows 2000 and later.
Jason Rumney <jasonr@gnu.org>
parents:
diff changeset
961
93729
8dc921bd7171 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 93660
diff changeset
962 /* arch-tag: 9530f0e1-7471-47dd-a780-94330af87ea0
8dc921bd7171 Add arch tagline
Miles Bader <miles@gnu.org>
parents: 93660
diff changeset
963 (do not change this comment) */