Mercurial > emacs
annotate src/composite.c @ 109885:42a68d95e799
* image.c (imagemagick_clear_image): Remove debugging output.
author | Andreas Schwab <schwab@linux-m68k.org> |
---|---|
date | Fri, 20 Aug 2010 14:02:43 +0200 |
parents | 228a5fa4eda0 |
children | 7a86ccf3260e |
rev | line source |
---|---|
26848 | 1 /* Composite sequence support. |
68651
3bd95f4f2941
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
67658
diff
changeset
|
2 Copyright (C) 2001, 2002, 2003, 2004, 2005, |
106815 | 3 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
4 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 | |
67658 | 5 National Institute of Advanced Industrial Science and Technology (AIST) |
6 Registration Number H14PRO021 | |
90405
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
7 Copyright (C) 2003, 2006 |
88366
97f11940f06a
Include "character.h" instead of "charset.h".
Kenichi Handa <handa@m17n.org>
parents:
41001
diff
changeset
|
8 National Institute of Advanced Industrial Science and Technology (AIST) |
97f11940f06a
Include "character.h" instead of "charset.h".
Kenichi Handa <handa@m17n.org>
parents:
41001
diff
changeset
|
9 Registration Number H13PRO009 |
26848 | 10 |
11 This file is part of GNU Emacs. | |
12 | |
94963
8971ddf55736
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94922
diff
changeset
|
13 GNU Emacs is free software: you can redistribute it and/or modify |
26848 | 14 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:
94922
diff
changeset
|
15 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:
94922
diff
changeset
|
16 (at your option) any later version. |
26848 | 17 |
18 GNU Emacs is distributed in the hope that it will be useful, | |
19 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
21 GNU General Public License for more details. | |
22 | |
23 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:
94922
diff
changeset
|
24 along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */ |
26848 | 25 |
26 #include <config.h> | |
105669
68dd71358159
* alloc.c: Do not define struct catchtag.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
102726
diff
changeset
|
27 #include <setjmp.h> |
26848 | 28 #include "lisp.h" |
29 #include "buffer.h" | |
88366
97f11940f06a
Include "character.h" instead of "charset.h".
Kenichi Handa <handa@m17n.org>
parents:
41001
diff
changeset
|
30 #include "character.h" |
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
31 #include "coding.h" |
26848 | 32 #include "intervals.h" |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
33 #include "window.h" |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
34 #include "frame.h" |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
35 #include "dispextern.h" |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
36 #include "font.h" |
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
37 #include "termhooks.h" |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
38 |
26848 | 39 |
40 /* Emacs uses special text property `composition' to support character | |
41 composition. A sequence of characters that have the same (i.e. eq) | |
42 `composition' property value is treated as a single composite | |
43 sequence (we call it just `composition' here after). Characters in | |
44 a composition are all composed somehow on the screen. | |
45 | |
46 The property value has this form when the composition is made: | |
47 ((LENGTH . COMPONENTS) . MODIFICATION-FUNC) | |
48 then turns to this form: | |
49 (COMPOSITION-ID . (LENGTH COMPONENTS-VEC . MODIFICATION-FUNC)) | |
50 when the composition is registered in composition_hash_table and | |
51 composition_table. These rather peculiar structures were designed | |
52 to make it easy to distinguish them quickly (we can do that by | |
53 checking only the first element) and to extract LENGTH (from the | |
54 former form) and COMPOSITION-ID (from the latter form). | |
55 | |
56 We register a composition when it is displayed, or when the width | |
57 is required (for instance, to calculate columns). | |
58 | |
59 LENGTH -- Length of the composition. This information is used to | |
60 check the validity of the composition. | |
61 | |
62 COMPONENTS -- Character, string, vector, list, or nil. | |
63 | |
64 If it is nil, characters in the text are composed relatively | |
65 according to their metrics in font glyphs. | |
66 | |
67 If it is a character or a string, the character or characters | |
68 in the string are composed relatively. | |
69 | |
70 If it is a vector or list of integers, the element is a | |
71 character or an encoded composition rule. The characters are | |
72 composed according to the rules. (2N)th elements are | |
73 characters to be composed and (2N+1)th elements are | |
74 composition rules to tell how to compose (2N+2)th element with | |
75 the previously composed 2N glyphs. | |
76 | |
108107
ad640fcce53a
Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents:
108105
diff
changeset
|
77 COMPONENTS-VEC -- Vector of integers. In a relative composition, |
ad640fcce53a
Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents:
108105
diff
changeset
|
78 the elements are the characters to be composed. In a rule-base |
26848 | 79 composition, the elements are characters or encoded |
80 composition rules. | |
81 | |
82 MODIFICATION-FUNC -- If non nil, it is a function to call when the | |
83 composition gets invalid after a modification in a buffer. If | |
84 it is nil, a function in `composition-function-table' of the | |
85 first character in the sequence is called. | |
86 | |
87 COMPOSITION-ID --Identification number of the composition. It is | |
88 used as an index to composition_table for the composition. | |
89 | |
90 When Emacs has to display a composition or has to know its | |
91 displaying width, the function get_composition_id is called. It | |
92 returns COMPOSITION-ID so that the caller can access the | |
93 information about the composition through composition_table. If a | |
94 COMPOSITION-ID has not yet been assigned to the composition, | |
95 get_composition_id checks the validity of `composition' property, | |
96 and, if valid, assigns a new ID, registers the information in | |
97 composition_hash_table and composition_table, and changes the form | |
108107
ad640fcce53a
Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents:
108105
diff
changeset
|
98 of the property value. If the property is invalid, |
ad640fcce53a
Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents:
108105
diff
changeset
|
99 get_composition_id returns -1 without changing the property value. |
26848 | 100 |
108107
ad640fcce53a
Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents:
108105
diff
changeset
|
101 We use two tables to keep the information about composition; |
26848 | 102 composition_hash_table and composition_table. |
103 | |
108107
ad640fcce53a
Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents:
108105
diff
changeset
|
104 The former is a hash table whose keys are COMPONENTS-VECs and |
26848 | 105 values are the corresponding COMPOSITION-IDs. This hash table is |
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
106 weak, but as each key (COMPONENTS-VEC) is also kept as a value of the |
26848 | 107 `composition' property, it won't be collected as garbage until all |
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
108 bits of text that have the same COMPONENTS-VEC are deleted. |
26848 | 109 |
110 The latter is a table of pointers to `struct composition' indexed | |
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
111 by COMPOSITION-ID. This structure keeps the other information (see |
26848 | 112 composite.h). |
113 | |
114 In general, a text property holds information about individual | |
115 characters. But, a `composition' property holds information about | |
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
116 a sequence of characters (in this sense, it is like the `intangible' |
26848 | 117 property). That means that we should not share the property value |
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
118 in adjacent compositions -- we can't distinguish them if they have the |
26848 | 119 same property. So, after any changes, we call |
120 `update_compositions' and change a property of one of adjacent | |
121 compositions to a copy of it. This function also runs a proper | |
122 composition modification function to make a composition that gets | |
123 invalid by the change valid again. | |
124 | |
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
125 As the value of the `composition' property holds information about a |
26848 | 126 specific range of text, the value gets invalid if we change the |
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
127 text in the range. We treat the `composition' property as always |
26848 | 128 rear-nonsticky (currently by setting default-text-properties to |
129 (rear-nonsticky (composition))) and we never make properties of | |
130 adjacent compositions identical. Thus, any such changes make the | |
49136
6a4a30f1c2cb
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
48318
diff
changeset
|
131 range just shorter. So, we can check the validity of the `composition' |
26848 | 132 property by comparing LENGTH information with the actual length of |
133 the composition. | |
134 | |
135 */ | |
136 | |
137 | |
138 Lisp_Object Qcomposition; | |
139 | |
140 /* Table of pointers to the structure `composition' indexed by | |
141 COMPOSITION-ID. This structure is for storing information about | |
142 each composition except for COMPONENTS-VEC. */ | |
143 struct composition **composition_table; | |
144 | |
145 /* The current size of `composition_table'. */ | |
146 static int composition_table_size; | |
147 | |
148 /* Number of compositions currently made. */ | |
149 int n_compositions; | |
150 | |
151 /* Hash table for compositions. The key is COMPONENTS-VEC of | |
152 `composition' property. The value is the corresponding | |
153 COMPOSITION-ID. */ | |
154 Lisp_Object composition_hash_table; | |
155 | |
156 /* Function to call to adjust composition. */ | |
157 Lisp_Object Vcompose_chars_after_function; | |
158 | |
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
159 Lisp_Object Qauto_composed; |
106812
23c562723a8d
Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents:
106799
diff
changeset
|
160 Lisp_Object Vauto_composition_mode; |
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
161 Lisp_Object Vauto_composition_function; |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
162 Lisp_Object Qauto_composition_function; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
163 Lisp_Object Vcomposition_function_table; |
33240
aaa42106f0da
(Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents:
30171
diff
changeset
|
164 |
108107
ad640fcce53a
Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents:
108105
diff
changeset
|
165 /* Maximum number of characters to look back for |
ad640fcce53a
Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents:
108105
diff
changeset
|
166 auto-compositions. */ |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
167 #define MAX_AUTO_COMPOSITION_LOOKBACK 3 |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
168 |
89546
c380df3cc4df
(Fremove_list_of_text_properties): Declare.
Dave Love <fx@gnu.org>
parents:
89509
diff
changeset
|
169 EXFUN (Fremove_list_of_text_properties, 4); |
33240
aaa42106f0da
(Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents:
30171
diff
changeset
|
170 |
26848 | 171 /* Temporary variable used in macros COMPOSITION_XXX. */ |
172 Lisp_Object composition_temp; | |
90405
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
173 |
26848 | 174 |
175 /* Return COMPOSITION-ID of a composition at buffer position | |
176 CHARPOS/BYTEPOS and length NCHARS. The `composition' property of | |
177 the sequence is PROP. STRING, if non-nil, is a string that | |
178 contains the composition instead of the current buffer. | |
179 | |
180 If the composition is invalid, return -1. */ | |
181 | |
182 int | |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
183 get_composition_id (int charpos, int bytepos, int nchars, Lisp_Object prop, Lisp_Object string) |
26848 | 184 { |
185 Lisp_Object id, length, components, key, *key_contents; | |
186 int glyph_len; | |
187 struct Lisp_Hash_Table *hash_table = XHASH_TABLE (composition_hash_table); | |
188 int hash_index; | |
189 unsigned hash_code; | |
190 struct composition *cmp; | |
191 int i, ch; | |
192 | |
193 /* PROP should be | |
194 Form-A: ((LENGTH . COMPONENTS) . MODIFICATION-FUNC) | |
195 or | |
196 Form-B: (COMPOSITION-ID . (LENGTH COMPONENTS-VEC . MODIFICATION-FUNC)) | |
197 */ | |
198 if (nchars == 0 || !CONSP (prop)) | |
199 goto invalid_composition; | |
200 | |
201 id = XCAR (prop); | |
202 if (INTEGERP (id)) | |
203 { | |
204 /* PROP should be Form-B. */ | |
205 if (XINT (id) < 0 || XINT (id) >= n_compositions) | |
206 goto invalid_composition; | |
207 return XINT (id); | |
208 } | |
209 | |
210 /* PROP should be Form-A. | |
211 Thus, ID should be (LENGTH . COMPONENTS). */ | |
212 if (!CONSP (id)) | |
213 goto invalid_composition; | |
214 length = XCAR (id); | |
215 if (!INTEGERP (length) || XINT (length) != nchars) | |
216 goto invalid_composition; | |
217 | |
218 components = XCDR (id); | |
219 | |
220 /* Check if the same composition has already been registered or not | |
221 by consulting composition_hash_table. The key for this table is | |
222 COMPONENTS (converted to a vector COMPONENTS-VEC) or, if it is | |
223 nil, vector of characters in the composition range. */ | |
224 if (INTEGERP (components)) | |
225 key = Fmake_vector (make_number (1), components); | |
226 else if (STRINGP (components) || CONSP (components)) | |
227 key = Fvconcat (1, &components); | |
228 else if (VECTORP (components)) | |
229 key = components; | |
230 else if (NILP (components)) | |
231 { | |
232 key = Fmake_vector (make_number (nchars), Qnil); | |
233 if (STRINGP (string)) | |
234 for (i = 0; i < nchars; i++) | |
235 { | |
236 FETCH_STRING_CHAR_ADVANCE (ch, string, charpos, bytepos); | |
237 XVECTOR (key)->contents[i] = make_number (ch); | |
238 } | |
239 else | |
240 for (i = 0; i < nchars; i++) | |
241 { | |
242 FETCH_CHAR_ADVANCE (ch, charpos, bytepos); | |
243 XVECTOR (key)->contents[i] = make_number (ch); | |
244 } | |
245 } | |
246 else | |
247 goto invalid_composition; | |
248 | |
249 hash_index = hash_lookup (hash_table, key, &hash_code); | |
250 if (hash_index >= 0) | |
251 { | |
252 /* We have already registered the same composition. Change PROP | |
253 from Form-A above to Form-B while replacing COMPONENTS with | |
254 COMPONENTS-VEC stored in the hash table. We can directly | |
255 modify the cons cell of PROP because it is not shared. */ | |
256 key = HASH_KEY (hash_table, hash_index); | |
257 id = HASH_VALUE (hash_table, hash_index); | |
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39046
diff
changeset
|
258 XSETCAR (prop, id); |
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39046
diff
changeset
|
259 XSETCDR (prop, Fcons (make_number (nchars), Fcons (key, XCDR (prop)))); |
26848 | 260 return XINT (id); |
261 } | |
262 | |
263 /* This composition is a new one. We must register it. */ | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49136
diff
changeset
|
264 |
26848 | 265 /* Check if we have sufficient memory to store this information. */ |
266 if (composition_table_size == 0) | |
267 { | |
268 composition_table_size = 256; | |
269 composition_table | |
270 = (struct composition **) xmalloc (sizeof (composition_table[0]) | |
271 * composition_table_size); | |
272 } | |
273 else if (composition_table_size <= n_compositions) | |
274 { | |
275 composition_table_size += 256; | |
276 composition_table | |
277 = (struct composition **) xrealloc (composition_table, | |
278 sizeof (composition_table[0]) | |
279 * composition_table_size); | |
280 } | |
281 | |
282 key_contents = XVECTOR (key)->contents; | |
283 | |
284 /* Check if the contents of COMPONENTS are valid if COMPONENTS is a | |
285 vector or a list. It should be a sequence of: | |
286 char1 rule1 char2 rule2 char3 ... ruleN charN+1 */ | |
90405
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
287 |
94922
181a3677061e
Throughout the file, delete all USE_FONT_BACKEND
Kenichi Handa <handa@m17n.org>
parents:
92028
diff
changeset
|
288 if (VECTORP (components) |
90405
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
289 && ASIZE (components) >= 2 |
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
290 && VECTORP (AREF (components, 0))) |
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
291 { |
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
292 /* COMPONENTS is a glyph-string. */ |
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
293 int len = ASIZE (key); |
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
294 |
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
295 for (i = 1; i < len; i++) |
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
296 if (! VECTORP (AREF (key, i))) |
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
297 goto invalid_composition; |
3dc2ea167caf
(get_composition_id) [USE_FONT_BACKEND]: If
Kenichi Handa <handa@m17n.org>
parents:
90294
diff
changeset
|
298 } |
94922
181a3677061e
Throughout the file, delete all USE_FONT_BACKEND
Kenichi Handa <handa@m17n.org>
parents:
92028
diff
changeset
|
299 else if (VECTORP (components) || CONSP (components)) |
26848 | 300 { |
301 int len = XVECTOR (key)->size; | |
302 | |
303 /* The number of elements should be odd. */ | |
304 if ((len % 2) == 0) | |
305 goto invalid_composition; | |
306 /* All elements should be integers (character or encoded | |
307 composition rule). */ | |
308 for (i = 0; i < len; i++) | |
309 { | |
310 if (!INTEGERP (key_contents[i])) | |
311 goto invalid_composition; | |
312 } | |
313 } | |
314 | |
315 /* Change PROP from Form-A above to Form-B. We can directly modify | |
316 the cons cell of PROP because it is not shared. */ | |
317 XSETFASTINT (id, n_compositions); | |
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39046
diff
changeset
|
318 XSETCAR (prop, id); |
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39046
diff
changeset
|
319 XSETCDR (prop, Fcons (make_number (nchars), Fcons (key, XCDR (prop)))); |
26848 | 320 |
321 /* Register the composition in composition_hash_table. */ | |
322 hash_index = hash_put (hash_table, key, id, hash_code); | |
323 | |
324 /* Register the composition in composition_table. */ | |
325 cmp = (struct composition *) xmalloc (sizeof (struct composition)); | |
326 | |
327 cmp->method = (NILP (components) | |
328 ? COMPOSITION_RELATIVE | |
329 : ((INTEGERP (components) || STRINGP (components)) | |
330 ? COMPOSITION_WITH_ALTCHARS | |
331 : COMPOSITION_WITH_RULE_ALTCHARS)); | |
332 cmp->hash_index = hash_index; | |
333 glyph_len = (cmp->method == COMPOSITION_WITH_RULE_ALTCHARS | |
334 ? (XVECTOR (key)->size + 1) / 2 | |
335 : XVECTOR (key)->size); | |
336 cmp->glyph_len = glyph_len; | |
337 cmp->offsets = (short *) xmalloc (sizeof (short) * glyph_len * 2); | |
338 cmp->font = NULL; | |
339 | |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
340 if (cmp->method != COMPOSITION_WITH_RULE_ALTCHARS) |
26848 | 341 { |
342 /* Relative composition. */ | |
343 cmp->width = 0; | |
344 for (i = 0; i < glyph_len; i++) | |
345 { | |
346 int this_width; | |
347 ch = XINT (key_contents[i]); | |
96413
b38a7de9af46
(get_composition_id): Fix the width calculation for TAB.
Kenichi Handa <handa@m17n.org>
parents:
94963
diff
changeset
|
348 this_width = (ch == '\t' ? 1 : CHAR_WIDTH (ch)); |
26848 | 349 if (cmp->width < this_width) |
350 cmp->width = this_width; | |
351 } | |
352 } | |
353 else | |
354 { | |
355 /* Rule-base composition. */ | |
356 float leftmost = 0.0, rightmost; | |
357 | |
358 ch = XINT (key_contents[0]); | |
90618
b7ce72709298
(get_composition_id): Pay attention to TAB
Kenichi Handa <handa@m17n.org>
parents:
90405
diff
changeset
|
359 rightmost = ch != '\t' ? CHAR_WIDTH (ch) : 1; |
26848 | 360 |
361 for (i = 1; i < glyph_len; i += 2) | |
362 { | |
89726
2660b0974edb
(get_composition_id): Handle xoff and yoff in a
Kenichi Handa <handa@m17n.org>
parents:
89706
diff
changeset
|
363 int rule, gref, nref, xoff, yoff; |
26848 | 364 int this_width; |
365 float this_left; | |
366 | |
367 rule = XINT (key_contents[i]); | |
368 ch = XINT (key_contents[i + 1]); | |
90618
b7ce72709298
(get_composition_id): Pay attention to TAB
Kenichi Handa <handa@m17n.org>
parents:
90405
diff
changeset
|
369 this_width = ch != '\t' ? CHAR_WIDTH (ch) : 1; |
26848 | 370 |
371 /* A composition rule is specified by an integer value | |
372 that encodes global and new reference points (GREF and | |
373 NREF). GREF and NREF are specified by numbers as | |
374 below: | |
375 0---1---2 -- ascent | |
376 | | | |
377 | | | |
378 | | | |
379 9--10--11 -- center | |
380 | | | |
381 ---3---4---5--- baseline | |
382 | | | |
383 6---7---8 -- descent | |
384 */ | |
89726
2660b0974edb
(get_composition_id): Handle xoff and yoff in a
Kenichi Handa <handa@m17n.org>
parents:
89706
diff
changeset
|
385 COMPOSITION_DECODE_RULE (rule, gref, nref, xoff, yoff); |
26848 | 386 this_left = (leftmost |
387 + (gref % 3) * (rightmost - leftmost) / 2.0 | |
388 - (nref % 3) * this_width / 2.0); | |
389 | |
390 if (this_left < leftmost) | |
391 leftmost = this_left; | |
392 if (this_left + this_width > rightmost) | |
393 rightmost = this_left + this_width; | |
394 } | |
395 | |
396 cmp->width = rightmost - leftmost; | |
397 if (cmp->width < (rightmost - leftmost)) | |
398 /* To get a ceiling integer value. */ | |
399 cmp->width++; | |
400 } | |
401 | |
402 composition_table[n_compositions] = cmp; | |
403 | |
404 return n_compositions++; | |
405 | |
406 invalid_composition: | |
407 /* Would it be better to remove this `composition' property? */ | |
408 return -1; | |
409 } | |
410 | |
411 | |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
412 /* Find a static composition at or nearest to position POS of OBJECT |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
413 (buffer or string). |
26848 | 414 |
415 OBJECT defaults to the current buffer. If there's a composition at | |
416 POS, set *START and *END to the start and end of the sequence, | |
417 *PROP to the `composition' property, and return 1. | |
418 | |
419 If there's no composition at POS and LIMIT is negative, return 0. | |
420 | |
421 Otherwise, search for a composition forward (LIMIT > POS) or | |
422 backward (LIMIT < POS). In this case, LIMIT bounds the search. | |
423 | |
424 If a composition is found, set *START, *END, and *PROP as above, | |
425 and return 1, else return 0. | |
426 | |
427 This doesn't check the validity of composition. */ | |
428 | |
429 int | |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
430 find_composition (int pos, int limit, EMACS_INT *start, EMACS_INT *end, Lisp_Object *prop, Lisp_Object object) |
26848 | 431 { |
432 Lisp_Object val; | |
433 | |
434 if (get_property_and_range (pos, Qcomposition, prop, start, end, object)) | |
435 return 1; | |
436 | |
437 if (limit < 0 || limit == pos) | |
438 return 0; | |
439 | |
440 if (limit > pos) /* search forward */ | |
34933
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
441 { |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
442 val = Fnext_single_property_change (make_number (pos), Qcomposition, |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
443 object, make_number (limit)); |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
444 pos = XINT (val); |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
445 if (pos == limit) |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
446 return 0; |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
447 } |
26848 | 448 else /* search backward */ |
34933
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
449 { |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
450 if (get_property_and_range (pos - 1, Qcomposition, prop, start, end, |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
451 object)) |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
452 return 1; |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
453 val = Fprevious_single_property_change (make_number (pos), Qcomposition, |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
454 object, make_number (limit)); |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
455 pos = XINT (val); |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
456 if (pos == limit) |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
457 return 0; |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
458 pos--; |
414310d24f52
(find_composition): Fix a code for searching a composition backward.
Kenichi Handa <handa@m17n.org>
parents:
34241
diff
changeset
|
459 } |
26848 | 460 get_property_and_range (pos, Qcomposition, prop, start, end, object); |
461 return 1; | |
462 } | |
463 | |
464 /* Run a proper function to adjust the composition sitting between | |
465 FROM and TO with property PROP. */ | |
466 | |
467 static void | |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
468 run_composition_function (int from, int to, Lisp_Object prop) |
26848 | 469 { |
34958
e3133339e30c
(run_composition_function): Remove unused variable
Eli Zaretskii <eliz@gnu.org>
parents:
34933
diff
changeset
|
470 Lisp_Object func; |
89509
3c9d2f9bf6bb
(find_composition, run_composition_function)
Dave Love <fx@gnu.org>
parents:
89483
diff
changeset
|
471 EMACS_INT start, end; |
26848 | 472 |
473 func = COMPOSITION_MODIFICATION_FUNC (prop); | |
474 /* If an invalid composition precedes or follows, try to make them | |
475 valid too. */ | |
476 if (from > BEGV | |
477 && find_composition (from - 1, -1, &start, &end, &prop, Qnil) | |
478 && !COMPOSITION_VALID_P (start, end, prop)) | |
479 from = start; | |
480 if (to < ZV | |
481 && find_composition (to, -1, &start, &end, &prop, Qnil) | |
482 && !COMPOSITION_VALID_P (start, end, prop)) | |
483 to = end; | |
46940 | 484 if (!NILP (Ffboundp (func))) |
26848 | 485 call2 (func, make_number (from), make_number (to)); |
486 } | |
487 | |
488 /* Make invalid compositions adjacent to or inside FROM and TO valid. | |
489 CHECK_MASK is bitwise `or' of mask bits defined by macros | |
490 CHECK_XXX (see the comment in composite.h). | |
491 | |
89361
1dd4e6b8509a
(syms_of_composite): Make composition_hash_table
Dave Love <fx@gnu.org>
parents:
89340
diff
changeset
|
492 It also resets the text-property `auto-composed' to a proper region |
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
493 so that automatic character composition works correctly later while |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
494 displaying the region. |
89483 | 495 |
26848 | 496 This function is called when a buffer text is changed. If the |
497 change is deletion, FROM == TO. Otherwise, FROM < TO. */ | |
498 | |
499 void | |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
500 update_compositions (EMACS_INT from, EMACS_INT to, int check_mask) |
26848 | 501 { |
34958
e3133339e30c
(run_composition_function): Remove unused variable
Eli Zaretskii <eliz@gnu.org>
parents:
34933
diff
changeset
|
502 Lisp_Object prop; |
89509
3c9d2f9bf6bb
(find_composition, run_composition_function)
Dave Love <fx@gnu.org>
parents:
89483
diff
changeset
|
503 EMACS_INT start, end; |
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
504 /* The beginning and end of the region to set the property |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
505 `auto-composed' to nil. */ |
89509
3c9d2f9bf6bb
(find_composition, run_composition_function)
Dave Love <fx@gnu.org>
parents:
89483
diff
changeset
|
506 EMACS_INT min_pos = from, max_pos = to; |
26848 | 507 |
39046
a61b3d907098
(update_compositions): Do nothing if
Gerd Moellmann <gerd@gnu.org>
parents:
38116
diff
changeset
|
508 if (inhibit_modification_hooks) |
a61b3d907098
(update_compositions): Do nothing if
Gerd Moellmann <gerd@gnu.org>
parents:
38116
diff
changeset
|
509 return; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49136
diff
changeset
|
510 |
28581
151b7ae3b21f
(update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents:
28472
diff
changeset
|
511 /* If FROM and TO are not in a valid range, do nothing. */ |
151b7ae3b21f
(update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents:
28472
diff
changeset
|
512 if (! (BEGV <= from && from <= to && to <= ZV)) |
151b7ae3b21f
(update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents:
28472
diff
changeset
|
513 return; |
151b7ae3b21f
(update_compositions): If FROM and TO is not in a
Kenichi Handa <handa@m17n.org>
parents:
28472
diff
changeset
|
514 |
26848 | 515 if (check_mask & CHECK_HEAD) |
516 { | |
517 /* FROM should be at composition boundary. But, insertion or | |
518 deletion will make two compositions adjacent and | |
519 indistinguishable when they have same (eq) property. To | |
520 avoid it, in such a case, we change the property of the | |
521 latter to the copy of it. */ | |
522 if (from > BEGV | |
78011
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
523 && find_composition (from - 1, -1, &start, &end, &prop, Qnil) |
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
524 && COMPOSITION_VALID_P (start, end, prop)) |
26848 | 525 { |
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
526 min_pos = start; |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
527 if (end > to) |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
528 max_pos = end; |
26848 | 529 if (from < end) |
530 Fput_text_property (make_number (from), make_number (end), | |
531 Qcomposition, | |
532 Fcons (XCAR (prop), XCDR (prop)), Qnil); | |
533 run_composition_function (start, end, prop); | |
534 from = end; | |
535 } | |
37242
029c8c1b451d
(update_compositions) <check_mask & CHECK_HEAD>: Fix
Dave Love <fx@gnu.org>
parents:
34958
diff
changeset
|
536 else if (from < ZV |
78011
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
537 && find_composition (from, -1, &start, &from, &prop, Qnil) |
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
538 && COMPOSITION_VALID_P (start, from, prop)) |
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
539 { |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
540 if (from > to) |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
541 max_pos = from; |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
542 run_composition_function (start, from, prop); |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
543 } |
26848 | 544 } |
545 | |
546 if (check_mask & CHECK_INSIDE) | |
547 { | |
548 /* In this case, we are sure that (check & CHECK_TAIL) is also | |
549 nonzero. Thus, here we should check only compositions before | |
550 (to - 1). */ | |
551 while (from < to - 1 | |
552 && find_composition (from, to, &start, &from, &prop, Qnil) | |
78011
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
553 && COMPOSITION_VALID_P (start, from, prop) |
26848 | 554 && from < to - 1) |
555 run_composition_function (start, from, prop); | |
556 } | |
557 | |
558 if (check_mask & CHECK_TAIL) | |
559 { | |
560 if (from < to | |
78011
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
561 && find_composition (to - 1, -1, &start, &end, &prop, Qnil) |
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
562 && COMPOSITION_VALID_P (start, end, prop)) |
26848 | 563 { |
564 /* TO should be also at composition boundary. But, | |
565 insertion or deletion will make two compositions adjacent | |
566 and indistinguishable when they have same (eq) property. | |
567 To avoid it, in such a case, we change the property of | |
568 the former to the copy of it. */ | |
569 if (to < end) | |
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
570 { |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
571 Fput_text_property (make_number (start), make_number (to), |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
572 Qcomposition, |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
573 Fcons (XCAR (prop), XCDR (prop)), Qnil); |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
574 max_pos = end; |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
575 } |
26848 | 576 run_composition_function (start, end, prop); |
577 } | |
578 else if (to < ZV | |
78011
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
579 && find_composition (to, -1, &start, &end, &prop, Qnil) |
f6d5dccc38c9
(update_compositions): Check validity of compositions.
Chong Yidong <cyd@stupidchicken.com>
parents:
75348
diff
changeset
|
580 && COMPOSITION_VALID_P (start, end, prop)) |
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
581 { |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
582 run_composition_function (start, end, prop); |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
583 max_pos = end; |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
584 } |
26848 | 585 } |
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
586 if (min_pos < max_pos) |
89633
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
587 { |
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
588 int count = SPECPDL_INDEX (); |
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
589 |
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
590 specbind (Qinhibit_read_only, Qt); |
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
591 specbind (Qinhibit_modification_hooks, Qt); |
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
592 specbind (Qinhibit_point_motion_hooks, Qt); |
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
593 Fremove_list_of_text_properties (make_number (min_pos), |
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
594 make_number (max_pos), |
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
595 Fcons (Qauto_composed, Qnil), Qnil); |
40b05b530518
(update_compositions): Bind inhibit-read-only, etc
Kenichi Handa <handa@m17n.org>
parents:
89546
diff
changeset
|
596 unbind_to (count, Qnil); |
26848 | 597 } |
598 } | |
599 | |
30022
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
600 |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
601 /* Modify composition property values in LIST destructively. LIST is |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
602 a list as returned from text_property_list. Change values to the |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
603 top-level copies of them so that none of them are `eq'. */ |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
604 |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
605 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
606 make_composition_value_copy (Lisp_Object list) |
30022
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
607 { |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
608 Lisp_Object plist, val; |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
609 |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
610 for (; CONSP (list); list = XCDR (list)) |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
611 { |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
612 plist = XCAR (XCDR (XCDR (XCAR (list)))); |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
613 while (CONSP (plist) && CONSP (XCDR (plist))) |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
614 { |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
615 if (EQ (XCAR (plist), Qcomposition) |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
616 && (val = XCAR (XCDR (plist)), CONSP (val))) |
39973
579177964efa
Avoid (most) uses of XCAR/XCDR as lvalues, for flexibility in experimenting
Ken Raeburn <raeburn@raeburn.org>
parents:
39046
diff
changeset
|
617 XSETCAR (XCDR (plist), Fcons (XCAR (val), XCDR (val))); |
30022
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
618 plist = XCDR (XCDR (plist)); |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
619 } |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
620 } |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
621 } |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
622 |
6a52904a743b
(make_composition_value_copy): New function.
Kenichi Handa <handa@m17n.org>
parents:
28581
diff
changeset
|
623 |
26848 | 624 /* Make text in the region between START and END a composition that |
625 has COMPONENTS and MODIFICATION-FUNC. | |
626 | |
627 If STRING is non-nil, then operate on characters contained between | |
628 indices START and END in STRING. */ | |
629 | |
630 void | |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
631 compose_text (int start, int end, Lisp_Object components, Lisp_Object modification_func, Lisp_Object string) |
26848 | 632 { |
633 Lisp_Object prop; | |
634 | |
635 prop = Fcons (Fcons (make_number (end - start), components), | |
636 modification_func); | |
637 Fput_text_property (make_number (start), make_number (end), | |
638 Qcomposition, prop, string); | |
639 } | |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
640 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
641 |
109100
2bc9a0c04c87
Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents:
108881
diff
changeset
|
642 static Lisp_Object autocmp_chars (Lisp_Object, EMACS_INT, EMACS_INT, |
2bc9a0c04c87
Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents:
108881
diff
changeset
|
643 EMACS_INT, struct window *, |
2bc9a0c04c87
Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents:
108881
diff
changeset
|
644 struct face *, Lisp_Object); |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
645 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
646 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
647 /* Lisp glyph-string handlers */ |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
648 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
649 /* Hash table for automatic composition. The key is a header of a |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
650 lgstring (Lispy glyph-string), and the value is a body of a |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
651 lgstring. */ |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
652 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
653 static Lisp_Object gstring_hash_table; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
654 |
109100
2bc9a0c04c87
Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents:
108881
diff
changeset
|
655 static Lisp_Object gstring_lookup_cache (Lisp_Object); |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
656 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
657 static Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
658 gstring_lookup_cache (Lisp_Object header) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
659 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
660 struct Lisp_Hash_Table *h = XHASH_TABLE (gstring_hash_table); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
661 int i = hash_lookup (h, header, NULL); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
662 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
663 return (i >= 0 ? HASH_VALUE (h, i) : Qnil); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
664 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
665 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
666 Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
667 composition_gstring_put_cache (Lisp_Object gstring, int len) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
668 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
669 struct Lisp_Hash_Table *h = XHASH_TABLE (gstring_hash_table); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
670 unsigned hash; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
671 Lisp_Object header, copy; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
672 int i; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
673 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
674 header = LGSTRING_HEADER (gstring); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
675 hash = h->hashfn (h, header); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
676 if (len < 0) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
677 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
678 len = LGSTRING_GLYPH_LEN (gstring); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
679 for (i = 0; i < len; i++) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
680 if (NILP (LGSTRING_GLYPH (gstring, i))) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
681 break; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
682 len = i; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
683 } |
102726
93ad3a5a4f75
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
101967
diff
changeset
|
684 |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
685 copy = Fmake_vector (make_number (len + 2), Qnil); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
686 LGSTRING_SET_HEADER (copy, Fcopy_sequence (header)); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
687 for (i = 0; i < len; i++) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
688 LGSTRING_SET_GLYPH (copy, i, Fcopy_sequence (LGSTRING_GLYPH (gstring, i))); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
689 i = hash_put (h, LGSTRING_HEADER (copy), copy, hash); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
690 LGSTRING_SET_ID (copy, make_number (i)); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
691 return copy; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
692 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
693 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
694 Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
695 composition_gstring_from_id (int id) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
696 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
697 struct Lisp_Hash_Table *h = XHASH_TABLE (gstring_hash_table); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
698 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
699 return HASH_VALUE (h, id); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
700 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
701 |
109100
2bc9a0c04c87
Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents:
108881
diff
changeset
|
702 static Lisp_Object fill_gstring_header (Lisp_Object, Lisp_Object, |
2bc9a0c04c87
Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents:
108881
diff
changeset
|
703 Lisp_Object, Lisp_Object, |
2bc9a0c04c87
Remove __P and P_ from .c and .m files and definition of P_
Jan D <jan.h.d@swipnet.se>
parents:
108881
diff
changeset
|
704 Lisp_Object); |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
705 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
706 int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
707 composition_gstring_p (Lisp_Object gstring) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
708 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
709 Lisp_Object header; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
710 int i; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
711 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
712 if (! VECTORP (gstring) || ASIZE (gstring) < 2) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
713 return 0; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
714 header = LGSTRING_HEADER (gstring); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
715 if (! VECTORP (header) || ASIZE (header) < 2) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
716 return 0; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
717 if (! NILP (LGSTRING_FONT (gstring)) |
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
718 && (! FONT_OBJECT_P (LGSTRING_FONT (gstring)) |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
719 && ! CODING_SYSTEM_P (LGSTRING_FONT (gstring)))) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
720 return 0; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
721 for (i = 1; i < ASIZE (LGSTRING_HEADER (gstring)); i++) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
722 if (! NATNUMP (AREF (LGSTRING_HEADER (gstring), i))) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
723 return 0; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
724 if (! NILP (LGSTRING_ID (gstring)) && ! NATNUMP (LGSTRING_ID (gstring))) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
725 return 0; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
726 for (i = 0; i < LGSTRING_GLYPH_LEN (gstring); i++) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
727 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
728 Lisp_Object glyph = LGSTRING_GLYPH (gstring, i); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
729 if (NILP (glyph)) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
730 break; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
731 if (! VECTORP (glyph) || ASIZE (glyph) != LGLYPH_SIZE) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
732 return 0; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
733 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
734 return 1; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
735 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
736 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
737 int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
738 composition_gstring_width (Lisp_Object gstring, int from, int to, struct font_metrics *metrics) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
739 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
740 Lisp_Object *glyph; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
741 int width = 0; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
742 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
743 if (metrics) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
744 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
745 Lisp_Object font_object = LGSTRING_FONT (gstring); |
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
746 |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
747 if (FONT_OBJECT_P (font_object)) |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
748 { |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
749 struct font *font = XFONT_OBJECT (font_object); |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
750 |
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
751 metrics->ascent = font->ascent; |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
752 metrics->descent = font->descent; |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
753 } |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
754 else |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
755 { |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
756 metrics->ascent = 1; |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
757 metrics->descent = 0; |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
758 } |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
759 metrics->width = metrics->lbearing = metrics->rbearing = 0; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
760 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
761 for (glyph = &LGSTRING_GLYPH (gstring, from); from < to; from++, glyph++) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
762 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
763 int x; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
764 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
765 if (NILP (LGLYPH_ADJUSTMENT (*glyph))) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
766 width += LGLYPH_WIDTH (*glyph); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
767 else |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
768 width += LGLYPH_WADJUST (*glyph); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
769 if (metrics) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
770 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
771 x = metrics->width + LGLYPH_LBEARING (*glyph) + LGLYPH_XOFF (*glyph); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
772 if (metrics->lbearing > x) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
773 metrics->lbearing = x; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
774 x = metrics->width + LGLYPH_RBEARING (*glyph) + LGLYPH_XOFF (*glyph); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
775 if (metrics->rbearing < x) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
776 metrics->rbearing = x; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
777 metrics->width = width; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
778 x = LGLYPH_ASCENT (*glyph) - LGLYPH_YOFF (*glyph); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
779 if (metrics->ascent < x) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
780 metrics->ascent = x; |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
781 x = LGLYPH_DESCENT (*glyph) + LGLYPH_YOFF (*glyph); |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
782 if (metrics->descent < x) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
783 metrics->descent = x; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
784 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
785 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
786 return width; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
787 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
788 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
789 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
790 static Lisp_Object gstring_work; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
791 static Lisp_Object gstring_work_headers; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
792 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
793 static Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
794 fill_gstring_header (Lisp_Object header, Lisp_Object start, Lisp_Object end, Lisp_Object font_object, Lisp_Object string) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
795 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
796 EMACS_INT from, to, from_byte; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
797 EMACS_INT len, i; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
798 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
799 if (NILP (string)) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
800 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
801 if (NILP (current_buffer->enable_multibyte_characters)) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
802 error ("Attempt to shape unibyte text"); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
803 validate_region (&start, &end); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
804 from = XFASTINT (start); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
805 to = XFASTINT (end); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
806 from_byte = CHAR_TO_BYTE (from); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
807 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
808 else |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
809 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
810 CHECK_STRING (string); |
99301
ef372a9c4197
(fill_gstring_header): Fix copy/paste typo.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
98369
diff
changeset
|
811 if (! STRING_MULTIBYTE (string)) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
812 error ("Attempt to shape unibyte text"); |
98214
5803b1114219
(fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents:
98213
diff
changeset
|
813 /* FROM and TO are checked by the caller. */ |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
814 from = XINT (start); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
815 to = XINT (end); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
816 if (from < 0 || from > to || to > SCHARS (string)) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
817 args_out_of_range_3 (string, start, end); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
818 from_byte = string_char_to_byte (string, from); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
819 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
820 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
821 len = to - from; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
822 if (len == 0) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
823 error ("Attempt to shape zero-length text"); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
824 if (VECTORP (header)) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
825 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
826 if (ASIZE (header) != len + 1) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
827 args_out_of_range (header, make_number (len + 1)); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
828 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
829 else |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
830 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
831 if (len <= 8) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
832 header = AREF (gstring_work_headers, len - 1); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
833 else |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
834 header = Fmake_vector (make_number (len + 1), Qnil); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
835 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
836 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
837 ASET (header, 0, font_object); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
838 for (i = 0; i < len; i++) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
839 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
840 int c; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
841 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
842 if (NILP (string)) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
843 FETCH_CHAR_ADVANCE_NO_CHECK (c, from, from_byte); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
844 else |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
845 FETCH_STRING_CHAR_ADVANCE_NO_CHECK (c, string, from, from_byte); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
846 ASET (header, i + 1, make_number (c)); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
847 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
848 return header; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
849 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
850 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
851 static void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
852 fill_gstring_body (Lisp_Object gstring) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
853 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
854 Lisp_Object font_object = LGSTRING_FONT (gstring); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
855 Lisp_Object header = AREF (gstring, 0); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
856 EMACS_INT len = LGSTRING_CHAR_LEN (gstring); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
857 EMACS_INT i; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
858 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
859 for (i = 0; i < len; i++) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
860 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
861 Lisp_Object g = LGSTRING_GLYPH (gstring, i); |
97854
a361f652d863
(fill_gstring_body): Avoid compiler warnings.
Eli Zaretskii <eliz@gnu.org>
parents:
97819
diff
changeset
|
862 EMACS_INT c = XINT (AREF (header, i + 1)); |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
863 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
864 if (NILP (g)) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
865 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
866 g = LGLYPH_NEW (); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
867 LGSTRING_SET_GLYPH (gstring, i, g); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
868 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
869 LGLYPH_SET_FROM (g, i); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
870 LGLYPH_SET_TO (g, i); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
871 LGLYPH_SET_CHAR (g, c); |
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
872 if (FONT_OBJECT_P (font_object)) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
873 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
874 font_fill_lglyph_metrics (g, font_object); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
875 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
876 else |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
877 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
878 int width = XFASTINT (CHAR_TABLE_REF (Vchar_width_table, c)); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
879 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
880 LGLYPH_SET_CODE (g, c); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
881 LGLYPH_SET_LBEARING (g, 0); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
882 LGLYPH_SET_RBEARING (g, width); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
883 LGLYPH_SET_WIDTH (g, width); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
884 LGLYPH_SET_ASCENT (g, 1); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
885 LGLYPH_SET_DESCENT (g, 0); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
886 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
887 LGLYPH_SET_ADJUSTMENT (g, Qnil); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
888 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
889 if (i < LGSTRING_GLYPH_LEN (gstring)) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
890 LGSTRING_SET_GLYPH (gstring, i, Qnil); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
891 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
892 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
893 |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
894 /* Try to compose the characters at CHARPOS according to composition |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
895 rule RULE ([PATTERN PREV-CHARS FUNC]). LIMIT limits the characters |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
896 to compose. STRING, if not nil, is a target string. WIN is a |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
897 window where the characters are being displayed. If characters are |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
898 successfully composed, return the composition as a glyph-string |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
899 object. Otherwise return nil. */ |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
900 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
901 static Lisp_Object |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
902 autocmp_chars (Lisp_Object rule, EMACS_INT charpos, EMACS_INT bytepos, EMACS_INT limit, struct window *win, struct face *face, Lisp_Object string) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
903 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
904 int count = SPECPDL_INDEX (); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
905 FRAME_PTR f = XFRAME (win->frame); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
906 Lisp_Object pos = make_number (charpos); |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
907 EMACS_INT to; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
908 EMACS_INT pt = PT, pt_byte = PT_BYTE; |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
909 Lisp_Object re, font_object, lgstring; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
910 int len; |
102726
93ad3a5a4f75
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
101967
diff
changeset
|
911 |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
912 record_unwind_save_match_data (); |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
913 re = AREF (rule, 0); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
914 if (NILP (re)) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
915 len = 1; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
916 else if (! STRINGP (re)) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
917 return unbind_to (count, Qnil); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
918 else if ((len = fast_looking_at (re, charpos, bytepos, limit, -1, string)) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
919 > 0) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
920 { |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
921 if (NILP (string)) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
922 len = BYTE_TO_CHAR (bytepos + len) - charpos; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
923 else |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
924 len = string_byte_to_char (string, bytepos + len) - charpos; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
925 } |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
926 if (len <= 0) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
927 return unbind_to (count, Qnil); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
928 to = limit = charpos + len; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
929 #ifdef HAVE_WINDOW_SYSTEM |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
930 if (FRAME_WINDOW_P (f)) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
931 { |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
932 font_object = font_range (charpos, &to, win, face, string); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
933 if (! FONT_OBJECT_P (font_object) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
934 || (! NILP (re) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
935 && to < limit |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
936 && (fast_looking_at (re, charpos, bytepos, to, -1, string) <= 0))) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
937 return unbind_to (count, Qnil); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
938 } |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
939 else |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
940 #endif /* not HAVE_WINDOW_SYSTEM */ |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
941 font_object = win->frame; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
942 lgstring = Fcomposition_get_gstring (pos, make_number (to), font_object, |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
943 string); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
944 if (NILP (LGSTRING_ID (lgstring))) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
945 { |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
946 Lisp_Object args[6]; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
947 |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
948 /* Save point as marker before calling out to lisp. */ |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
949 if (NILP (string)) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
950 { |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
951 Lisp_Object m = Fmake_marker (); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
952 set_marker_both (m, Qnil, pt, pt_byte); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
953 record_unwind_protect (restore_point_unwind, m); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
954 } |
108361 | 955 |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
956 args[0] = Vauto_composition_function; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
957 args[1] = AREF (rule, 2); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
958 args[2] = pos; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
959 args[3] = make_number (to); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
960 args[4] = font_object; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
961 args[5] = string; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
962 lgstring = safe_call (6, args); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
963 if (NILP (string)) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
964 TEMP_SET_PT_BOTH (pt, pt_byte); |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
965 } |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
966 return unbind_to (count, lgstring); |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
967 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
968 |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
969 static Lisp_Object _work_val; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
970 static int _work_char; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
971 |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
972 /* 1 iff the character C is composable. */ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
973 #define CHAR_COMPOSABLE_P(C) \ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
974 ((C) == 0x200C || (C) == 0x200D \ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
975 || (_work_val = CHAR_TABLE_REF (Vunicode_category_table, (C)), \ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
976 (SYMBOLP (_work_val) \ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
977 && (_work_char = SDATA (SYMBOL_NAME (_work_val))[0]) != 'C' \ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
978 && _work_char != 'Z'))) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
979 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
980 /* Update cmp_it->stop_pos to the next position after CHARPOS (and |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
981 BYTEPOS) where character composition may happen. If BYTEPOS is |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
982 negative, compute it. ENDPOS is a limit of searching. If it is |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
983 less than CHARPOS, search backward to ENDPOS+1 assuming that |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
984 set_iterator_to_next works in reverse order. In this case, if a |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
985 composition closest to CHARPOS is found, set cmp_it->stop_pos to |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
986 the last character of the composition. |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
987 |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
988 If no composition is found, set cmp_it->ch to -2. If a static |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
989 composition is found, set cmp_it->ch to -1. Otherwise, set |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
990 cmp_it->ch to the character that triggers the automatic |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
991 composition. */ |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
992 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
993 void |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
994 composition_compute_stop_pos (struct composition_it *cmp_it, EMACS_INT charpos, EMACS_INT bytepos, EMACS_INT endpos, Lisp_Object string) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
995 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
996 EMACS_INT start, end, c; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
997 Lisp_Object prop, val; |
98107
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
998 /* This is from forward_to_next_line_start in xdisp.c. */ |
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
999 const int MAX_NEWLINE_DISTANCE = 500; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1000 |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1001 if (charpos < endpos) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1002 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1003 if (endpos > charpos + MAX_NEWLINE_DISTANCE) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1004 endpos = charpos + MAX_NEWLINE_DISTANCE; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1005 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1006 else if (endpos < charpos) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1007 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1008 /* We search backward for a position to check composition. */ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1009 if (endpos < 0) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1010 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1011 /* But we don't know where to stop the searching. */ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1012 endpos = NILP (string) ? BEGV - 1 : -1; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1013 /* Usually we don't reach ENDPOS because we stop searching |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1014 at an uncomposable character (NL, LRE, etc). */ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1015 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1016 } |
98128
092123c2b01a
(composition_compute_stop_pos): Reset cmp_it->id to -1 at first.
Kenichi Handa <handa@m17n.org>
parents:
98115
diff
changeset
|
1017 cmp_it->id = -1; |
98115
463a86221cdd
(composition_compute_stop_pos): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
98107
diff
changeset
|
1018 cmp_it->ch = -2; |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1019 cmp_it->reversed_p = 0; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1020 cmp_it->stop_pos = endpos; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1021 if (charpos == endpos) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1022 return; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1023 /* FIXME: Bidi is not yet handled well in static composition. */ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1024 if (charpos < endpos |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1025 && find_composition (charpos, endpos, &start, &end, &prop, string) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1026 && COMPOSITION_VALID_P (start, end, prop)) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1027 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1028 cmp_it->stop_pos = endpos = start; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1029 cmp_it->ch = -1; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1030 } |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1031 if (NILP (string)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1032 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1033 /* A composition never strides over PT. */ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1034 if (PT > charpos) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1035 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1036 if (PT < endpos) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1037 cmp_it->stop_pos = endpos = PT; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1038 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1039 else if (PT < charpos && PT > endpos) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1040 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1041 cmp_it->stop_pos = endpos = PT - 1; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1042 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1043 } |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1044 if (NILP (current_buffer->enable_multibyte_characters) |
106812
23c562723a8d
Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents:
106799
diff
changeset
|
1045 || NILP (Vauto_composition_mode)) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1046 return; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1047 if (bytepos < 0) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1048 { |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1049 if (NILP (string)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1050 bytepos = CHAR_TO_BYTE (charpos); |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1051 else |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1052 bytepos = string_char_to_byte (string, charpos); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1053 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1054 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1055 start = charpos; |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1056 if (charpos < endpos) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1057 { |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1058 /* Forward search. */ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1059 while (charpos < endpos) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1060 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1061 if (STRINGP (string)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1062 FETCH_STRING_CHAR_ADVANCE (c, string, charpos, bytepos); |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1063 else |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1064 FETCH_CHAR_ADVANCE (c, charpos, bytepos); |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1065 if (c == '\n') |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1066 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1067 cmp_it->ch = -2; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1068 break; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1069 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1070 val = CHAR_TABLE_REF (Vcomposition_function_table, c); |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1071 if (! NILP (val)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1072 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1073 Lisp_Object elt; |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1074 int ridx; |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1075 |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1076 for (ridx = 0; CONSP (val); val = XCDR (val), ridx++) |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1077 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1078 elt = XCAR (val); |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1079 if (VECTORP (elt) && ASIZE (elt) == 3 |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1080 && NATNUMP (AREF (elt, 1)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1081 && charpos - 1 - XFASTINT (AREF (elt, 1)) >= start) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1082 break; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1083 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1084 if (CONSP (val)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1085 { |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1086 cmp_it->rule_idx = ridx; |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1087 cmp_it->lookback = XFASTINT (AREF (elt, 1)); |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1088 cmp_it->stop_pos = charpos - 1 - cmp_it->lookback; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1089 cmp_it->ch = c; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1090 return; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1091 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1092 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1093 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1094 } |
108784
009ef331a2bc
Fix for finding a static composition.
Kenichi Handa <handa@etlken>
parents:
108759
diff
changeset
|
1095 else if (charpos > endpos) |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1096 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1097 /* Search backward for a pattern that may be composed and the |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1098 position of (possibly) the last character of the match is |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1099 closest to (but not after) START. The reason for the last |
108570
dce075eda1bf
Fix comments from revno 100276.
Eli Zaretskii <eliz@gnu.org>
parents:
108552
diff
changeset
|
1100 character is that set_iterator_to_next works in reverse order, |
dce075eda1bf
Fix comments from revno 100276.
Eli Zaretskii <eliz@gnu.org>
parents:
108552
diff
changeset
|
1101 and thus we must stop at the last character for composition |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1102 check. */ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1103 unsigned char *p; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1104 int len; |
108570
dce075eda1bf
Fix comments from revno 100276.
Eli Zaretskii <eliz@gnu.org>
parents:
108552
diff
changeset
|
1105 /* Limit byte position used in fast_looking_at. This is the |
dce075eda1bf
Fix comments from revno 100276.
Eli Zaretskii <eliz@gnu.org>
parents:
108552
diff
changeset
|
1106 byte position of the character after START. */ |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1107 EMACS_INT limit; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1108 |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1109 if (NILP (string)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1110 p = BYTE_POS_ADDR (bytepos); |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1111 else |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1112 p = SDATA (string) + bytepos; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1113 c = STRING_CHAR_AND_LENGTH (p, len); |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1114 limit = bytepos + len; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1115 while (CHAR_COMPOSABLE_P (c)) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1116 { |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1117 val = CHAR_TABLE_REF (Vcomposition_function_table, c); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1118 if (! NILP (val)) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1119 { |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1120 Lisp_Object elt; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1121 int ridx, back, len; |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1122 |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1123 for (ridx = 0; CONSP (val); val = XCDR (val), ridx++) |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1124 { |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1125 elt = XCAR (val); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1126 if (VECTORP (elt) && ASIZE (elt) == 3 |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1127 && NATNUMP (AREF (elt, 1)) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1128 && charpos - (back = XFASTINT (AREF (elt, 1))) > endpos) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1129 { |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1130 EMACS_INT cpos = charpos - back, bpos; |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1131 |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1132 if (back == 0) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1133 bpos = bytepos; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1134 else |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1135 bpos = (NILP (string) ? CHAR_TO_BYTE (cpos) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1136 : string_char_to_byte (string, cpos)); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1137 if (STRINGP (AREF (elt, 0))) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1138 len = fast_looking_at (AREF (elt, 0), cpos, bpos, |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1139 start + 1, limit, string); |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1140 else |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1141 len = 1; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1142 if (len > 0) |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1143 { |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1144 /* Make CPOS point to the last character of |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1145 match. Note that LEN is byte-length. */ |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1146 if (len > 1) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1147 { |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1148 bpos += len; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1149 if (NILP (string)) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1150 cpos = BYTE_TO_CHAR (bpos) - 1; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1151 else |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1152 cpos = string_byte_to_char (string, bpos) - 1; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1153 } |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1154 back = cpos - (charpos - back); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1155 if (cmp_it->stop_pos < cpos |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1156 || (cmp_it->stop_pos == cpos |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1157 && cmp_it->lookback < back)) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1158 { |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1159 cmp_it->rule_idx = ridx; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1160 cmp_it->stop_pos = cpos; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1161 cmp_it->ch = c; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1162 cmp_it->lookback = back; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1163 cmp_it->nchars = back + 1; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1164 } |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1165 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1166 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1167 } |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1168 } |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1169 if (charpos - 1 == endpos) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1170 break; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1171 if (STRINGP (string)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1172 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1173 p--, bytepos--; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1174 while (! CHAR_HEAD_P (*p)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1175 p--, bytepos--; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1176 charpos--; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1177 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1178 else |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1179 { |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1180 DEC_BOTH (charpos, bytepos); |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1181 p = BYTE_POS_ADDR (bytepos); |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1182 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1183 c = STRING_CHAR (p); |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1184 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1185 if (cmp_it->ch >= 0) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1186 /* We found a position to check. */ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1187 return; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1188 /* Skip all uncomposable characters. */ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1189 if (NILP (string)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1190 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1191 while (charpos - 1 > endpos && ! CHAR_COMPOSABLE_P (c)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1192 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1193 DEC_BOTH (charpos, bytepos); |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1194 c = FETCH_MULTIBYTE_CHAR (bytepos); |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1195 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1196 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1197 else |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1198 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1199 while (charpos - 1 > endpos && ! CHAR_COMPOSABLE_P (c)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1200 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1201 p--; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1202 while (! CHAR_HEAD_P (*p)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1203 p--; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1204 charpos--; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1205 c = STRING_CHAR (p); |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1206 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1207 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1208 } |
98115
463a86221cdd
(composition_compute_stop_pos): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
98107
diff
changeset
|
1209 cmp_it->stop_pos = charpos; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1210 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1211 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1212 /* Check if the character at CHARPOS (and BYTEPOS) is composed |
99512
0ba1e475119f
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
99301
diff
changeset
|
1213 (possibly with the following characters) on window W. ENDPOS limits |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1214 characters to be composed. FACE, in non-NULL, is a base face of |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1215 the character. If STRING is not nil, it is a string containing the |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1216 character to check, and CHARPOS and BYTEPOS are indices in the |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1217 string. In that case, FACE must not be NULL. |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1218 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1219 If the character is composed, setup members of CMP_IT (id, nglyphs, |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1220 from, to, reversed_p), and return 1. Otherwise, update |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1221 CMP_IT->stop_pos, and return 0. */ |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1222 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1223 int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
1224 composition_reseat_it (struct composition_it *cmp_it, EMACS_INT charpos, EMACS_INT bytepos, EMACS_INT endpos, struct window *w, struct face *face, Lisp_Object string) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1225 { |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1226 if (endpos <= charpos) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1227 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1228 if (NILP (string)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1229 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1230 if (endpos < 0) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1231 endpos = BEGV; |
108881
5582106cddf0
Remove obsolete pre-unicode2 macros.
Juanma Barranquero <lekktu@gmail.com>
parents:
108784
diff
changeset
|
1232 if (endpos < PT && PT < charpos) |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1233 endpos = PT; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1234 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1235 else if (endpos < 0) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1236 endpos = 0; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1237 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1238 else |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1239 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1240 if (NILP (string) && charpos < PT && PT < endpos) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1241 endpos = PT; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1242 } |
106632
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1243 |
98107
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1244 if (cmp_it->ch == -2) |
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1245 { |
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1246 composition_compute_stop_pos (cmp_it, charpos, bytepos, endpos, string); |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1247 if (cmp_it->ch == -2 || cmp_it->stop_pos != charpos) |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1248 /* The current position is not composed. */ |
98107
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1249 return 0; |
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1250 } |
77ec19652e4d
(composition_compute_stop_pos): Limit the search of composition to
Kenichi Handa <handa@m17n.org>
parents:
98100
diff
changeset
|
1251 |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1252 if (cmp_it->ch < 0) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1253 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1254 /* We are looking at a static composition. */ |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1255 EMACS_INT start, end; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1256 Lisp_Object prop; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1257 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1258 find_composition (charpos, -1, &start, &end, &prop, string); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1259 cmp_it->id = get_composition_id (charpos, bytepos, end - start, |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1260 prop, string); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1261 if (cmp_it->id < 0) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1262 goto no_composition; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1263 cmp_it->nchars = end - start; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1264 cmp_it->nglyphs = composition_table[cmp_it->id]->glyph_len; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1265 } |
98156
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1266 else if (w) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1267 { |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1268 Lisp_Object lgstring = Qnil; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1269 Lisp_Object val, elt, re; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1270 int len, i; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1271 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1272 val = CHAR_TABLE_REF (Vcomposition_function_table, cmp_it->ch); |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1273 for (i = 0; i < cmp_it->rule_idx; i++, val = XCDR (val)); |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1274 if (charpos < endpos) |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1275 { |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1276 for (; CONSP (val); val = XCDR (val)) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1277 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1278 elt = XCAR (val); |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1279 if (! VECTORP (elt) || ASIZE (elt) != 3 |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1280 || ! INTEGERP (AREF (elt, 1))) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1281 continue; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1282 if (XFASTINT (AREF (elt, 1)) != cmp_it->lookback) |
108881
5582106cddf0
Remove obsolete pre-unicode2 macros.
Juanma Barranquero <lekktu@gmail.com>
parents:
108784
diff
changeset
|
1283 goto no_composition; |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1284 lgstring = autocmp_chars (elt, charpos, bytepos, endpos, |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1285 w, face, string); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1286 if (composition_gstring_p (lgstring)) |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1287 break; |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1288 lgstring = Qnil; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1289 /* Composition failed perhaps because the font doesn't |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1290 support sufficient range of characters. Try the |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1291 other composition rules if any. */ |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1292 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1293 cmp_it->reversed_p = 0; |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1294 } |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1295 else |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1296 { |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1297 EMACS_INT cpos = charpos, bpos = bytepos; |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1298 |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1299 while (1) |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1300 { |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1301 elt = XCAR (val); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1302 if (cmp_it->lookback > 0) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1303 { |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1304 cpos -= cmp_it->lookback; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1305 if (STRINGP (string)) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1306 bpos = string_char_to_byte (string, cpos); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1307 else |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1308 bpos = CHAR_TO_BYTE (cpos); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1309 } |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1310 lgstring = autocmp_chars (elt, cpos, bpos, charpos + 1, w, face, |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1311 string); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1312 if (composition_gstring_p (lgstring) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1313 && cpos + LGSTRING_CHAR_LEN (lgstring) - 1 == charpos) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1314 break; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1315 /* Composition failed or didn't cover the current |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1316 character. */ |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1317 if (cmp_it->lookback == 0) |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1318 goto no_composition; |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1319 lgstring = Qnil; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1320 /* Try to find a shorter compostion that starts after CPOS. */ |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1321 composition_compute_stop_pos (cmp_it, charpos, bytepos, cpos, |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1322 string); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1323 if (cmp_it->ch == -2 || cmp_it->stop_pos < charpos) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1324 goto no_composition; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1325 val = CHAR_TABLE_REF (Vcomposition_function_table, cmp_it->ch); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1326 for (i = 0; i < cmp_it->rule_idx; i++, val = XCDR (val)); |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1327 } |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1328 cmp_it->reversed_p = 1; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1329 } |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1330 if (NILP (lgstring)) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1331 goto no_composition; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1332 if (NILP (LGSTRING_ID (lgstring))) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1333 lgstring = composition_gstring_put_cache (lgstring, -1); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1334 cmp_it->id = XINT (LGSTRING_ID (lgstring)); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1335 for (i = 0; i < LGSTRING_GLYPH_LEN (lgstring); i++) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1336 if (NILP (LGSTRING_GLYPH (lgstring, i))) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1337 break; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1338 cmp_it->nglyphs = i; |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1339 cmp_it->from = 0; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1340 cmp_it->to = i; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1341 } |
98156
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1342 else |
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1343 goto no_composition; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1344 return 1; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1345 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1346 no_composition: |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1347 if (charpos == endpos) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1348 return 0; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1349 if (charpos < endpos) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1350 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1351 charpos++; |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1352 if (NILP (string)) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1353 INC_POS (bytepos); |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1354 else |
108881
5582106cddf0
Remove obsolete pre-unicode2 macros.
Juanma Barranquero <lekktu@gmail.com>
parents:
108784
diff
changeset
|
1355 bytepos += BYTES_BY_CHAR_HEAD (*(SDATA (string) + bytepos)); |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1356 } |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1357 else |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1358 { |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1359 charpos--; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1360 /* BYTEPOS is calculated in composition_compute_stop_pos */ |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1361 bytepos = -1; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1362 } |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1363 composition_compute_stop_pos (cmp_it, charpos, bytepos, endpos, string); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1364 return 0; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1365 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1366 |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1367 /* Update charpos, nchars, nbytes, and width of the current grapheme |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1368 cluster. |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1369 |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1370 If the composition is static or automatic in L2R context, the |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1371 cluster is identified by CMP_IT->from, and CHARPOS is the position |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1372 of the first character of the cluster. In this case, update |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1373 CMP_IT->to too. |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1374 |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1375 If the composition is automatic in R2L context, the cluster is |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1376 identified by CMP_IT->to, and CHARPOS is the position of the last |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1377 character of the cluster. In this case, update CMP_IT->from too. |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1378 |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1379 The return value is the character code of the first character of |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1380 the cluster, or -1 if the composition is somehow broken. */ |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1381 |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1382 int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
1383 composition_update_it (struct composition_it *cmp_it, EMACS_INT charpos, EMACS_INT bytepos, Lisp_Object string) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1384 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1385 int i, c; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1386 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1387 if (cmp_it->ch < 0) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1388 { |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1389 /* static composition */ |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1390 struct composition *cmp = composition_table[cmp_it->id]; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1391 |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1392 cmp_it->charpos = charpos; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1393 cmp_it->to = cmp_it->nglyphs; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1394 if (cmp_it->nglyphs == 0) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1395 c = -1; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1396 else |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1397 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1398 for (i = 0; i < cmp->glyph_len; i++) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1399 if ((c = COMPOSITION_GLYPH (cmp, i)) != '\t') |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1400 break; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1401 if (c == '\t') |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1402 c = ' '; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1403 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1404 cmp_it->width = cmp->width; |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1405 charpos += cmp_it->nchars; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1406 if (STRINGP (string)) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1407 cmp_it->nbytes = string_char_to_byte (string, charpos) - bytepos; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1408 else |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1409 cmp_it->nbytes = CHAR_TO_BYTE (charpos) - bytepos; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1410 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1411 else |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1412 { |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1413 /* automatic composition */ |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1414 Lisp_Object gstring = composition_gstring_from_id (cmp_it->id); |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1415 Lisp_Object glyph; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1416 int from, to; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1417 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1418 if (cmp_it->nglyphs == 0) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1419 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1420 cmp_it->nchars = LGSTRING_CHAR_LEN (gstring); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1421 cmp_it->width = 0; |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1422 cmp_it->from = cmp_it->to = 0; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1423 return -1; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1424 } |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1425 if (! cmp_it->reversed_p) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1426 { |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1427 glyph = LGSTRING_GLYPH (gstring, cmp_it->from); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1428 from = LGLYPH_FROM (glyph); |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1429 for (cmp_it->to = cmp_it->from + 1; cmp_it->to < cmp_it->nglyphs; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1430 cmp_it->to++) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1431 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1432 glyph = LGSTRING_GLYPH (gstring, cmp_it->to); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1433 if (LGLYPH_FROM (glyph) != from) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1434 break; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1435 } |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1436 cmp_it->charpos = charpos; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1437 } |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1438 else |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1439 { |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1440 glyph = LGSTRING_GLYPH (gstring, cmp_it->to - 1); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1441 from = LGLYPH_FROM (glyph); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1442 cmp_it->charpos = charpos - (LGLYPH_TO (glyph) - from); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1443 for (cmp_it->from = cmp_it->to - 1; cmp_it->from > 0; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1444 cmp_it->from--) |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1445 { |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1446 glyph = LGSTRING_GLYPH (gstring, cmp_it->from - 1); |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1447 if (LGLYPH_FROM (glyph) != from) |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1448 break; |
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1449 } |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1450 } |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1451 glyph = LGSTRING_GLYPH (gstring, cmp_it->from); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1452 cmp_it->nchars = LGLYPH_TO (glyph) + 1 - from; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1453 cmp_it->nbytes = 0; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1454 cmp_it->width = 0; |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1455 for (i = cmp_it->nchars - 1; i >= 0; i--) |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1456 { |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1457 c = XINT (LGSTRING_CHAR (gstring, i)); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1458 cmp_it->nbytes += CHAR_BYTES (c); |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1459 cmp_it->width = (LGLYPH_WIDTH (glyph) > 0 |
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1460 ? CHAR_WIDTH (LGLYPH_CHAR (glyph)) : 0); |
108552
03ab6621f67d
Fix bidi-composition interaction.
Kenichi Handa <handa@etlken>
parents:
108375
diff
changeset
|
1461 } |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1462 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1463 return c; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1464 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1465 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1466 |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1467 struct position_record |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1468 { |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1469 EMACS_INT pos, pos_byte; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1470 unsigned char *p; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1471 }; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1472 |
108107
ad640fcce53a
Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents:
108105
diff
changeset
|
1473 /* Update the members of POSITION to the next character boundary. */ |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1474 #define FORWARD_CHAR(POSITION, STOP) \ |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1475 do { \ |
98068
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1476 (POSITION).pos++; \ |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1477 if ((POSITION).pos == (STOP)) \ |
98068
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1478 { \ |
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1479 (POSITION).p = GAP_END_ADDR; \ |
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1480 (POSITION).pos_byte = GPT_BYTE; \ |
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1481 } \ |
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1482 else \ |
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1483 { \ |
98100
2eda9a0daa3e
(FORWARD_CHAR): Fix calculation of (POSITION).pos_byte.
Kenichi Handa <handa@m17n.org>
parents:
98068
diff
changeset
|
1484 (POSITION).pos_byte += BYTES_BY_CHAR_HEAD (*((POSITION).p)); \ |
98068
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1485 (POSITION).p += BYTES_BY_CHAR_HEAD (*((POSITION).p)); \ |
9723eb0d11ab
(FORWARD_CHAR): Check STOP after incrementing (POSITION).pos.
Kenichi Handa <handa@m17n.org>
parents:
97982
diff
changeset
|
1486 } \ |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1487 } while (0) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1488 |
108107
ad640fcce53a
Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents:
108105
diff
changeset
|
1489 /* Update the members of POSITION to the previous character boundary. */ |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1490 #define BACKWARD_CHAR(POSITION, STOP) \ |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1491 do { \ |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1492 if ((POSITION).pos == STOP) \ |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1493 (POSITION).p = GPT_ADDR; \ |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1494 do { \ |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1495 (POSITION).pos_byte--; \ |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1496 (POSITION).p--; \ |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1497 } while (! CHAR_HEAD_P (*((POSITION).p))); \ |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1498 (POSITION).pos--; \ |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1499 } while (0) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1500 |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1501 /* This is like find_composition, but find an automatic composition |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1502 instead. If found, set *GSTRING to the glyph-string representing |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1503 the composition, and return 1. Otherwise, return 0. */ |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1504 |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1505 static int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
1506 find_automatic_composition (EMACS_INT pos, EMACS_INT limit, EMACS_INT *start, EMACS_INT *end, Lisp_Object *gstring, Lisp_Object string) |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1507 { |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1508 EMACS_INT head, tail, stop; |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1509 /* Limit to check a composition after POS. */ |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1510 EMACS_INT fore_check_limit; |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1511 struct position_record orig, cur, check, prev; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1512 Lisp_Object check_val, val, elt; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1513 int check_lookback; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1514 int c; |
98156
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1515 Lisp_Object window; |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1516 struct window *w; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1517 |
98158
f9f157d63fd1
(find_automatic_composition): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents:
98157
diff
changeset
|
1518 window = Fget_buffer_window (Fcurrent_buffer (), Qnil); |
98156
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1519 if (NILP (window)) |
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1520 return 0; |
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1521 w = XWINDOW (window); |
464ec62a612c
(composition_reseat_it): If the current buffer is
Kenichi Handa <handa@m17n.org>
parents:
98128
diff
changeset
|
1522 |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1523 orig.pos = pos; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1524 if (NILP (string)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1525 { |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1526 head = BEGV, tail = ZV, stop = GPT; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1527 orig.pos_byte = CHAR_TO_BYTE (orig.pos); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1528 orig.p = BYTE_POS_ADDR (orig.pos_byte); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1529 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1530 else |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1531 { |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1532 head = 0, tail = SCHARS (string), stop = -1; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1533 orig.pos_byte = string_char_to_byte (string, orig.pos); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1534 orig.p = SDATA (string) + orig.pos_byte; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1535 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1536 if (limit < pos) |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1537 fore_check_limit = min (tail, pos + MAX_AUTO_COMPOSITION_LOOKBACK); |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1538 else |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1539 fore_check_limit = min (tail, limit + MAX_AUTO_COMPOSITION_LOOKBACK); |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1540 cur = orig; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1541 |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1542 retry: |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1543 check_val = Qnil; |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1544 /* At first, check if POS is composable. */ |
106185
f2cea199b0c4
* character.h (STRING_CHAR, STRING_CHAR_AND_LENGTH): Remove
Andreas Schwab <schwab@linux-m68k.org>
parents:
105877
diff
changeset
|
1545 c = STRING_CHAR (cur.p); |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1546 if (! CHAR_COMPOSABLE_P (c)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1547 { |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1548 if (limit < 0) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1549 return 0; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1550 if (limit >= cur.pos) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1551 goto search_forward; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1552 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1553 else |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1554 { |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1555 val = CHAR_TABLE_REF (Vcomposition_function_table, c); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1556 if (! NILP (val)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1557 check_val = val, check = cur; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1558 else |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1559 while (cur.pos + 1 < fore_check_limit) |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1560 { |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1561 EMACS_INT b, e; |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1562 |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1563 FORWARD_CHAR (cur, stop); |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1564 if (get_property_and_range (cur.pos, Qcomposition, &val, &b, &e, |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1565 Qnil) |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1566 && COMPOSITION_VALID_P (b, e, val)) |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1567 { |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1568 fore_check_limit = cur.pos; |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1569 break; |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1570 } |
106185
f2cea199b0c4
* character.h (STRING_CHAR, STRING_CHAR_AND_LENGTH): Remove
Andreas Schwab <schwab@linux-m68k.org>
parents:
105877
diff
changeset
|
1571 c = STRING_CHAR (cur.p); |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1572 if (! CHAR_COMPOSABLE_P (c)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1573 break; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1574 val = CHAR_TABLE_REF (Vcomposition_function_table, c); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1575 if (NILP (val)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1576 continue; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1577 check_val = val, check = cur; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1578 break; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1579 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1580 cur = orig; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1581 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1582 /* Rewind back to the position where we can safely search forward |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1583 for compositions. */ |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1584 while (cur.pos > head) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1585 { |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1586 EMACS_INT b, e; |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1587 |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1588 BACKWARD_CHAR (cur, stop); |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1589 if (get_property_and_range (cur.pos, Qcomposition, &val, &b, &e, Qnil) |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1590 && COMPOSITION_VALID_P (b, e, val)) |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1591 break; |
106185
f2cea199b0c4
* character.h (STRING_CHAR, STRING_CHAR_AND_LENGTH): Remove
Andreas Schwab <schwab@linux-m68k.org>
parents:
105877
diff
changeset
|
1592 c = STRING_CHAR (cur.p); |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1593 if (! CHAR_COMPOSABLE_P (c)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1594 break; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1595 val = CHAR_TABLE_REF (Vcomposition_function_table, c); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1596 if (! NILP (val)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1597 check_val = val, check = cur; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1598 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1599 prev = cur; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1600 /* Now search forward. */ |
102726
93ad3a5a4f75
Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents:
101967
diff
changeset
|
1601 search_forward: |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1602 *gstring = Qnil; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1603 if (! NILP (check_val) || limit >= orig.pos) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1604 { |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1605 if (NILP (check_val)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1606 cur = orig; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1607 else |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1608 cur = check; |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1609 while (cur.pos < fore_check_limit) |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1610 { |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1611 int need_adjustment = 0; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1612 |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1613 if (NILP (check_val)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1614 { |
106185
f2cea199b0c4
* character.h (STRING_CHAR, STRING_CHAR_AND_LENGTH): Remove
Andreas Schwab <schwab@linux-m68k.org>
parents:
105877
diff
changeset
|
1615 c = STRING_CHAR (cur.p); |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1616 check_val = CHAR_TABLE_REF (Vcomposition_function_table, c); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1617 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1618 for (; CONSP (check_val); check_val = XCDR (check_val)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1619 { |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1620 elt = XCAR (check_val); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1621 if (VECTORP (elt) && ASIZE (elt) == 3 && NATNUMP (AREF (elt, 1)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1622 && cur.pos - XFASTINT (AREF (elt, 1)) >= head) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1623 { |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1624 check.pos = cur.pos - XFASTINT (AREF (elt, 1)); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1625 if (check.pos == cur.pos) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1626 check.pos_byte = cur.pos_byte; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1627 else |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1628 check.pos_byte = CHAR_TO_BYTE (check.pos); |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
1629 val = autocmp_chars (elt, check.pos, check.pos_byte, |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1630 tail, w, NULL, string); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1631 need_adjustment = 1; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1632 if (! NILP (val)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1633 { |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1634 *gstring = val; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1635 *start = check.pos; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1636 *end = check.pos + LGSTRING_CHAR_LEN (*gstring); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1637 if (*start <= orig.pos ? *end > orig.pos |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1638 : limit >= orig.pos) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1639 return 1; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1640 cur.pos = *end; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1641 cur.pos_byte = CHAR_TO_BYTE (cur.pos); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1642 break; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1643 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1644 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1645 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1646 if (need_adjustment) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1647 { |
108107
ad640fcce53a
Fix typos in comments of composite.c
Eli Zaretskii <eliz@gnu.org>
parents:
108105
diff
changeset
|
1648 /* As we have called Lisp, there's a possibility that |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1649 buffer/string is relocated. */ |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1650 if (NILP (string)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1651 cur.p = BYTE_POS_ADDR (cur.pos_byte); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1652 else |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1653 cur.p = SDATA (string) + cur.pos_byte; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1654 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1655 if (! CONSP (check_val)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1656 FORWARD_CHAR (cur, stop); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1657 check_val = Qnil; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1658 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1659 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1660 if (! NILP (*gstring)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1661 return (limit >= 0 || (*start <= orig.pos && *end > orig.pos)); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1662 if (limit >= 0 && limit < orig.pos && prev.pos > head) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1663 { |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1664 cur = prev; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1665 BACKWARD_CHAR (cur, stop); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1666 orig = cur; |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1667 fore_check_limit = orig.pos; |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1668 goto retry; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1669 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1670 return 0; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1671 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1672 |
106632
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1673 /* Return the adjusted point provided that point is moved from LAST_PT |
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1674 to NEW_PT. */ |
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1675 |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1676 int |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
1677 composition_adjust_point (EMACS_INT last_pt, EMACS_INT new_pt) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1678 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1679 EMACS_INT charpos, bytepos, startpos, beg, end, pos; |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1680 Lisp_Object val; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1681 int i; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1682 |
106632
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1683 if (new_pt == BEGV || new_pt == ZV) |
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1684 return new_pt; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1685 |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1686 /* At first check the static composition. */ |
106632
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1687 if (get_property_and_range (new_pt, Qcomposition, &val, &beg, &end, Qnil) |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1688 && COMPOSITION_VALID_P (beg, end, val)) |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1689 { |
106632
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1690 if (beg < new_pt /* && end > new_pt <- It's always the case. */ |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1691 && (last_pt <= beg || last_pt >= end)) |
106632
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1692 return (new_pt < last_pt ? beg : end); |
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1693 return new_pt; |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1694 } |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1695 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1696 if (NILP (current_buffer->enable_multibyte_characters) |
106812
23c562723a8d
Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents:
106799
diff
changeset
|
1697 || NILP (Vauto_composition_mode)) |
106632
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1698 return new_pt; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1699 |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1700 /* Next check the automatic composition. */ |
106632
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1701 if (! find_automatic_composition (new_pt, (EMACS_INT) -1, &beg, &end, &val, |
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1702 Qnil) |
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1703 || beg == new_pt) |
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1704 return new_pt; |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1705 for (i = 0; i < LGSTRING_GLYPH_LEN (val); i++) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1706 { |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1707 Lisp_Object glyph = LGSTRING_GLYPH (val, i); |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1708 |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1709 if (NILP (glyph)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1710 break; |
106632
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1711 if (beg + LGLYPH_FROM (glyph) == new_pt) |
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1712 return new_pt; |
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1713 if (beg + LGLYPH_TO (glyph) >= new_pt) |
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1714 return (new_pt < last_pt |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1715 ? beg + LGLYPH_FROM (glyph) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1716 : beg + LGLYPH_TO (glyph) + 1); |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1717 } |
106632
484702d8c582
(composition_reseat_it): Don't make a composition
Kenichi Handa <handa@m17n.org>
parents:
106185
diff
changeset
|
1718 return new_pt; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1719 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1720 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1721 DEFUN ("composition-get-gstring", Fcomposition_get_gstring, |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1722 Scomposition_get_gstring, 4, 4, 0, |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1723 doc: /* Return a glyph-string for characters between FROM and TO. |
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1724 If the glyph string is for graphic display, FONT-OBJECT must be |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1725 a font-object to use for those characters. |
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1726 Otherwise (for terminal display), FONT-OBJECT must be a terminal ID, a |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1727 frame, or nil for the selected frame's terminal device. |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1728 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1729 If the optional 4th argument STRING is not nil, it is a string |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1730 containing the target characters between indices FROM and TO. |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1731 |
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1732 A glyph-string is a vector containing information about how to display |
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1733 a specific character sequence. The format is: |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1734 [HEADER ID GLYPH ...] |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1735 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1736 HEADER is a vector of this form: |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1737 [FONT-OBJECT CHAR ...] |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1738 where |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1739 FONT-OBJECT is a font-object for all glyphs in the glyph-string, |
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1740 or the terminal coding system of the specified terminal. |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1741 CHARs are characters to be composed by GLYPHs. |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1742 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1743 ID is an identification number of the glyph-string. It may be nil if |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1744 not yet shaped. |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1745 |
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1746 GLYPH is a vector whose elements have this form: |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1747 [ FROM-IDX TO-IDX C CODE WIDTH LBEARING RBEARING ASCENT DESCENT |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1748 [ [X-OFF Y-OFF WADJUST] | nil] ] |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1749 where |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1750 FROM-IDX and TO-IDX are used internally and should not be touched. |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1751 C is the character of the glyph. |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1752 CODE is the glyph-code of C in FONT-OBJECT. |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1753 WIDTH thru DESCENT are the metrics (in pixels) of the glyph. |
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1754 X-OFF and Y-OFF are offsets to the base position for the glyph. |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1755 WADJUST is the adjustment to the normal width of the glyph. |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1756 |
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1757 If GLYPH is nil, the remaining elements of the glyph-string vector |
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1758 should be ignored. */) |
109179
8cfee7d2955f
Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109126
diff
changeset
|
1759 (Lisp_Object from, Lisp_Object to, Lisp_Object font_object, Lisp_Object string) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1760 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1761 Lisp_Object gstring, header; |
98213
52d26067a946
(Fcomposition_get_gstring): Yet another int/Lisp_Oject mixup (YAILOM).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
98209
diff
changeset
|
1762 EMACS_INT frompos, topos; |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1763 |
98214
5803b1114219
(fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents:
98213
diff
changeset
|
1764 CHECK_NATNUM (from); |
5803b1114219
(fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents:
98213
diff
changeset
|
1765 CHECK_NATNUM (to); |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1766 if (XINT (to) > XINT (from) + MAX_COMPOSITION_COMPONENTS) |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
1767 to = make_number (XINT (from) + MAX_COMPOSITION_COMPONENTS); |
101775
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1768 if (! FONT_OBJECT_P (font_object)) |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1769 { |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1770 struct coding_system *coding; |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1771 struct terminal *terminal = get_terminal (font_object, 1); |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1772 |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1773 coding = ((TERMINAL_TERMINAL_CODING (terminal)->common_flags |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1774 & CODING_REQUIRE_ENCODING_MASK) |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1775 ? TERMINAL_TERMINAL_CODING (terminal) : &safe_terminal_coding); |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1776 font_object = CODING_ID_NAME (coding->id); |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1777 } |
250ce1fa6aed
Include coding.h and termhooks.h.
Kenichi Handa <handa@m17n.org>
parents:
100951
diff
changeset
|
1778 |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1779 header = fill_gstring_header (Qnil, from, to, font_object, string); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1780 gstring = gstring_lookup_cache (header); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1781 if (! NILP (gstring)) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1782 return gstring; |
98213
52d26067a946
(Fcomposition_get_gstring): Yet another int/Lisp_Oject mixup (YAILOM).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
98209
diff
changeset
|
1783 |
98214
5803b1114219
(fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents:
98213
diff
changeset
|
1784 frompos = XINT (from); |
5803b1114219
(fill_gstring_header): Don't check FROM and TO here.
Kenichi Handa <handa@m17n.org>
parents:
98213
diff
changeset
|
1785 topos = XINT (to); |
98213
52d26067a946
(Fcomposition_get_gstring): Yet another int/Lisp_Oject mixup (YAILOM).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
98209
diff
changeset
|
1786 if (LGSTRING_GLYPH_LEN (gstring_work) < topos - frompos) |
52d26067a946
(Fcomposition_get_gstring): Yet another int/Lisp_Oject mixup (YAILOM).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
98209
diff
changeset
|
1787 gstring_work = Fmake_vector (make_number (topos - frompos + 2), Qnil); |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1788 LGSTRING_SET_HEADER (gstring_work, header); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1789 LGSTRING_SET_ID (gstring_work, Qnil); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1790 fill_gstring_body (gstring_work); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1791 return gstring_work; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1792 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1793 |
26848 | 1794 |
1795 /* Emacs Lisp APIs. */ | |
1796 | |
1797 DEFUN ("compose-region-internal", Fcompose_region_internal, | |
1798 Scompose_region_internal, 2, 4, 0, | |
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1799 doc: /* Internal use only. |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1800 |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1801 Compose text in the region between START and END. |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1802 Optional 3rd and 4th arguments are COMPONENTS and MODIFICATION-FUNC |
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1803 for the composition. See `compose-region' for more details. */) |
109179
8cfee7d2955f
Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109126
diff
changeset
|
1804 (Lisp_Object start, Lisp_Object end, Lisp_Object components, Lisp_Object modification_func) |
26848 | 1805 { |
1806 validate_region (&start, &end); | |
1807 if (!NILP (components) | |
1808 && !INTEGERP (components) | |
1809 && !CONSP (components) | |
1810 && !STRINGP (components)) | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
1811 CHECK_VECTOR (components); |
26848 | 1812 |
64574
5c90d9a42573
(Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents:
64084
diff
changeset
|
1813 compose_text (XINT (start), XINT (end), components, modification_func, Qnil); |
26848 | 1814 return Qnil; |
1815 } | |
1816 | |
1817 DEFUN ("compose-string-internal", Fcompose_string_internal, | |
1818 Scompose_string_internal, 3, 5, 0, | |
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1819 doc: /* Internal use only. |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1820 |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1821 Compose text between indices START and END of STRING. |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1822 Optional 4th and 5th arguments are COMPONENTS and MODIFICATION-FUNC |
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1823 for the composition. See `compose-string' for more details. */) |
109179
8cfee7d2955f
Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109126
diff
changeset
|
1824 (Lisp_Object string, Lisp_Object start, Lisp_Object end, Lisp_Object components, Lisp_Object modification_func) |
26848 | 1825 { |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
1826 CHECK_STRING (string); |
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
1827 CHECK_NUMBER (start); |
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
1828 CHECK_NUMBER (end); |
26848 | 1829 |
1830 if (XINT (start) < 0 || | |
1831 XINT (start) > XINT (end) | |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
1832 || XINT (end) > SCHARS (string)) |
26848 | 1833 args_out_of_range (start, end); |
1834 | |
64574
5c90d9a42573
(Fcompose_region_internal, Fcompose_string_internal):
Juanma Barranquero <lekktu@gmail.com>
parents:
64084
diff
changeset
|
1835 compose_text (XINT (start), XINT (end), components, modification_func, string); |
26848 | 1836 return string; |
1837 } | |
1838 | |
1839 DEFUN ("find-composition-internal", Ffind_composition_internal, | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49136
diff
changeset
|
1840 Sfind_composition_internal, 4, 4, 0, |
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1841 doc: /* Internal use only. |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1842 |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1843 Return information about composition at or nearest to position POS. |
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1844 See `find-composition' for more details. */) |
109179
8cfee7d2955f
Convert DEFUNs to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109126
diff
changeset
|
1845 (Lisp_Object pos, Lisp_Object limit, Lisp_Object string, Lisp_Object detail_p) |
26848 | 1846 { |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1847 Lisp_Object prop, tail, gstring; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1848 EMACS_INT start, end, from, to; |
26848 | 1849 int id; |
1850 | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
1851 CHECK_NUMBER_COERCE_MARKER (pos); |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1852 from = XINT (pos); |
26848 | 1853 if (!NILP (limit)) |
1854 { | |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
1855 CHECK_NUMBER_COERCE_MARKER (limit); |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1856 to = XINT (limit); |
26848 | 1857 } |
1858 else | |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1859 to = -1; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49136
diff
changeset
|
1860 |
26848 | 1861 if (!NILP (string)) |
38097
8757fe98656e
(Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents:
37242
diff
changeset
|
1862 { |
40656
cdfd4d09b79a
Update usage of CHECK_ macros (remove unused second argument).
Pavel Janík <Pavel@Janik.cz>
parents:
39973
diff
changeset
|
1863 CHECK_STRING (string); |
46370
40db0673e6f0
Most uses of XSTRING combined with STRING_BYTES or indirection changed to
Ken Raeburn <raeburn@raeburn.org>
parents:
46293
diff
changeset
|
1864 if (XINT (pos) < 0 || XINT (pos) > SCHARS (string)) |
38097
8757fe98656e
(Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents:
37242
diff
changeset
|
1865 args_out_of_range (string, pos); |
8757fe98656e
(Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents:
37242
diff
changeset
|
1866 } |
8757fe98656e
(Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents:
37242
diff
changeset
|
1867 else |
8757fe98656e
(Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents:
37242
diff
changeset
|
1868 { |
38116
a85b9df3dffb
(Ffind_composition_internal): Accept ZV
Gerd Moellmann <gerd@gnu.org>
parents:
38098
diff
changeset
|
1869 if (XINT (pos) < BEGV || XINT (pos) > ZV) |
38097
8757fe98656e
(Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents:
37242
diff
changeset
|
1870 args_out_of_range (Fcurrent_buffer (), pos); |
8757fe98656e
(Ffind_composition_internal): Check POS
Gerd Moellmann <gerd@gnu.org>
parents:
37242
diff
changeset
|
1871 } |
26848 | 1872 |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1873 if (!find_composition (from, to, &start, &end, &prop, string)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1874 { |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1875 if (!NILP (current_buffer->enable_multibyte_characters) |
106812
23c562723a8d
Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents:
106799
diff
changeset
|
1876 && ! NILP (Vauto_composition_mode) |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1877 && find_automatic_composition (from, to, &start, &end, &gstring, |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1878 string)) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1879 return list3 (make_number (start), make_number (end), gstring); |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1880 return Qnil; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1881 } |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1882 if ((end <= XINT (pos) || start > XINT (pos))) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1883 { |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1884 EMACS_INT s, e; |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1885 |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1886 if (find_automatic_composition (from, to, &s, &e, &gstring, string) |
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1887 && (e <= XINT (pos) ? e > end : s < start)) |
108117
fb2072139c80
composite.c (Ffind_composition_internal): Fix the return value for an automatic composition.
Kenichi Handa <handa@etlken>
parents:
108107
diff
changeset
|
1888 return list3 (make_number (s), make_number (e), gstring); |
97982
59bcf1726f2c
(autocmp_chars): Check lookback count.
Kenichi Handa <handa@m17n.org>
parents:
97887
diff
changeset
|
1889 } |
26848 | 1890 if (!COMPOSITION_VALID_P (start, end, prop)) |
1891 return Fcons (make_number (start), Fcons (make_number (end), | |
1892 Fcons (Qnil, Qnil))); | |
1893 if (NILP (detail_p)) | |
1894 return Fcons (make_number (start), Fcons (make_number (end), | |
1895 Fcons (Qt, Qnil))); | |
1896 | |
1897 if (COMPOSITION_REGISTERD_P (prop)) | |
1898 id = COMPOSITION_ID (prop); | |
1899 else | |
1900 { | |
1901 int start_byte = (NILP (string) | |
1902 ? CHAR_TO_BYTE (start) | |
1903 : string_char_to_byte (string, start)); | |
1904 id = get_composition_id (start, start_byte, end - start, prop, string); | |
1905 } | |
1906 | |
1907 if (id >= 0) | |
1908 { | |
1909 Lisp_Object components, relative_p, mod_func; | |
1910 enum composition_method method = COMPOSITION_METHOD (prop); | |
1911 int width = composition_table[id]->width; | |
1912 | |
1913 components = Fcopy_sequence (COMPOSITION_COMPONENTS (prop)); | |
1914 relative_p = (method == COMPOSITION_WITH_RULE_ALTCHARS | |
1915 ? Qnil : Qt); | |
1916 mod_func = COMPOSITION_MODIFICATION_FUNC (prop); | |
1917 tail = Fcons (components, | |
1918 Fcons (relative_p, | |
1919 Fcons (mod_func, | |
1920 Fcons (make_number (width), Qnil)))); | |
1921 } | |
1922 else | |
1923 tail = Qnil; | |
1924 | |
1925 return Fcons (make_number (start), Fcons (make_number (end), tail)); | |
1926 } | |
1927 | |
1928 | |
1929 void | |
109126
aec1143e8d85
Convert (most) functions in src to standard C.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
109100
diff
changeset
|
1930 syms_of_composite (void) |
26848 | 1931 { |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1932 int i; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1933 |
105877
21bdda3ded62
* xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
1934 Qcomposition = intern_c_string ("composition"); |
26848 | 1935 staticpro (&Qcomposition); |
1936 | |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1937 /* Make a hash table for static composition. */ |
26848 | 1938 { |
28472
bae9218986ac
* composite.c (run_composite_function): Use NILP when checking for nil.
Ken Raeburn <raeburn@raeburn.org>
parents:
26848
diff
changeset
|
1939 Lisp_Object args[6]; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
49136
diff
changeset
|
1940 |
26848 | 1941 args[0] = QCtest; |
1942 args[1] = Qequal; | |
1943 args[2] = QCweakness; | |
53316 | 1944 /* We used to make the hash table weak so that unreferenced |
92028 | 1945 compositions can be garbage-collected. But, usually once |
53316 | 1946 created compositions are repeatedly used in an Emacs session, |
1947 and thus it's not worth to save memory in such a way. So, we | |
1948 make the table not weak. */ | |
53221
94ae4d74b7e0
(syms_of_composite): Don't make the compostion hash table week.
Kenichi Handa <handa@m17n.org>
parents:
52401
diff
changeset
|
1949 args[3] = Qnil; |
26848 | 1950 args[4] = QCsize; |
1951 args[5] = make_number (311); | |
28472
bae9218986ac
* composite.c (run_composite_function): Use NILP when checking for nil.
Ken Raeburn <raeburn@raeburn.org>
parents:
26848
diff
changeset
|
1952 composition_hash_table = Fmake_hash_table (6, args); |
26848 | 1953 staticpro (&composition_hash_table); |
1954 } | |
1955 | |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1956 /* Make a hash table for glyph-string. */ |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1957 { |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1958 Lisp_Object args[6]; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1959 args[0] = QCtest; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1960 args[1] = Qequal; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1961 args[2] = QCweakness; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1962 args[3] = Qnil; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1963 args[4] = QCsize; |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1964 args[5] = make_number (311); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1965 gstring_hash_table = Fmake_hash_table (6, args); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1966 staticpro (&gstring_hash_table); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1967 } |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1968 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1969 staticpro (&gstring_work_headers); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1970 gstring_work_headers = Fmake_vector (make_number (8), Qnil); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1971 for (i = 0; i < 8; i++) |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1972 ASET (gstring_work_headers, i, Fmake_vector (make_number (i + 2), Qnil)); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1973 staticpro (&gstring_work); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1974 gstring_work = Fmake_vector (make_number (10), Qnil); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
1975 |
26848 | 1976 /* Text property `composition' should be nonsticky by default. */ |
1977 Vtext_property_default_nonsticky | |
1978 = Fcons (Fcons (Qcomposition, Qt), Vtext_property_default_nonsticky); | |
1979 | |
1980 DEFVAR_LISP ("compose-chars-after-function", &Vcompose_chars_after_function, | |
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1981 doc: /* Function to adjust composition of buffer text. |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1982 |
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1983 This function is called with three arguments: FROM, TO, and OBJECT. |
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
1984 FROM and TO specify the range of text whose composition should be |
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1985 adjusted. OBJECT, if non-nil, is a string that contains the text. |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1986 |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1987 This function is called after a text with `composition' property is |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1988 inserted or deleted to keep `composition' property of buffer text |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1989 valid. |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1990 |
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
1991 The default value is the function `compose-chars-after'. */); |
105877
21bdda3ded62
* xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
1992 Vcompose_chars_after_function = intern_c_string ("compose-chars-after"); |
26848 | 1993 |
105877
21bdda3ded62
* xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
1994 Qauto_composed = intern_c_string ("auto-composed"); |
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
1995 staticpro (&Qauto_composed); |
33240
aaa42106f0da
(Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents:
30171
diff
changeset
|
1996 |
105877
21bdda3ded62
* xterm.c (syms_of_xterm):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105669
diff
changeset
|
1997 Qauto_composition_function = intern_c_string ("auto-composition-function"); |
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
1998 staticpro (&Qauto_composition_function); |
33240
aaa42106f0da
(Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents:
30171
diff
changeset
|
1999 |
106812
23c562723a8d
Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents:
106799
diff
changeset
|
2000 DEFVAR_LISP ("auto-composition-mode", &Vauto_composition_mode, |
23c562723a8d
Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents:
106799
diff
changeset
|
2001 doc: /* Non-nil if Auto-Composition mode is enabled. |
23c562723a8d
Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents:
106799
diff
changeset
|
2002 Use the command `auto-composition-mode' to change this variable. */); |
23c562723a8d
Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents:
106799
diff
changeset
|
2003 Vauto_composition_mode = Qt; |
23c562723a8d
Make auto-composition work on all buffers even if they are fundamental mode.
Kenichi Handa <handa@m17n.org>
parents:
106799
diff
changeset
|
2004 |
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
2005 DEFVAR_LISP ("auto-composition-function", &Vauto_composition_function, |
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
2006 doc: /* Function to call to compose characters automatically. |
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
2007 This function is called from the display routine with four arguments: |
91287
ac1b29b04053
(syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents:
91132
diff
changeset
|
2008 FROM, TO, WINDOW, and STRING. |
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
2009 |
91287
ac1b29b04053
(syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents:
91132
diff
changeset
|
2010 If STRING is nil, the function must compose characters in the region |
ac1b29b04053
(syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents:
91132
diff
changeset
|
2011 between FROM and TO in the current buffer. |
41001
a17c8b15ef1b
Change doc-string comments to `new style' [w/`doc:' keyword].
Pavel Janík <Pavel@Janik.cz>
parents:
40656
diff
changeset
|
2012 |
91287
ac1b29b04053
(syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents:
91132
diff
changeset
|
2013 Otherwise, STRING is a string, and FROM and TO are indices into the |
ac1b29b04053
(syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents:
91132
diff
changeset
|
2014 string. In this case, the function must compose characters in the |
ac1b29b04053
(syms_of_composite): Fix docstring of
Kenichi Handa <handa@m17n.org>
parents:
91132
diff
changeset
|
2015 string. */); |
89283
6ed290fbc678
(Vcomposition_function_table,
Kenichi Handa <handa@m17n.org>
parents:
88929
diff
changeset
|
2016 Vauto_composition_function = Qnil; |
33240
aaa42106f0da
(Vcomposition_function_table): New variable.
Kenichi Handa <handa@m17n.org>
parents:
30171
diff
changeset
|
2017 |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2018 DEFVAR_LISP ("composition-function-table", &Vcomposition_function_table, |
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
2019 doc: /* Char-table of functions for automatic character composition. |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2020 For each character that has to be composed automatically with |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2021 preceding and/or following characters, this char-table contains |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2022 a function to call to compose that character. |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2023 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2024 The element at index C in the table, if non-nil, is a list of |
108759
0bb727f1d547
Fix bidi-composition interaction in backward scanning..
Kenichi Handa <handa@etlken>
parents:
108570
diff
changeset
|
2025 composition rules of this form: ([PATTERN PREV-CHARS FUNC] ...) |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2026 |
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
2027 PATTERN is a regular expression which C and the surrounding |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2028 characters must match. |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2029 |
101967
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
2030 PREV-CHARS is a non-negative integer (less than 4) specifying how many |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
2031 characters before C to check the matching with PATTERN. If it is 0, |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
2032 PATTERN must match C and the following characters. If it is 1, |
1127170a5c39
(MAX_AUTO_COMPOSITION_LOOKBACK): New macro.
Kenichi Handa <handa@m17n.org>
parents:
101775
diff
changeset
|
2033 PATTERN must match a character before C and the following characters. |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2034 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2035 If PREV-CHARS is 0, PATTERN can be nil, which means that the |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2036 single character C should be composed. |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2037 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2038 FUNC is a function to return a glyph-string representing a |
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
2039 composition of the characters that match PATTERN. It is |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2040 called with one argument GSTRING. |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2041 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2042 GSTRING is a template of a glyph-string to return. It is already |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2043 filled with a proper header for the characters to compose, and |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2044 glyphs corresponding to those characters one by one. The |
98369
690a23ccfcf9
(Fcomposition_get_gstring, Fcompose_region_internal, Fcompose_string_internal)
Eli Zaretskii <eliz@gnu.org>
parents:
98214
diff
changeset
|
2045 function must return a new glyph-string with the same header as |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2046 GSTRING, or modify GSTRING itself and return it. |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2047 |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2048 See also the documentation of `auto-composition-mode'. */); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2049 Vcomposition_function_table = Fmake_char_table (Qnil, Qnil); |
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2050 |
26848 | 2051 defsubr (&Scompose_region_internal); |
2052 defsubr (&Scompose_string_internal); | |
2053 defsubr (&Sfind_composition_internal); | |
97819
23390849e8b8
Include window.h, frame.h, dispextern.h font.h.
Kenichi Handa <handa@m17n.org>
parents:
96413
diff
changeset
|
2054 defsubr (&Scomposition_get_gstring); |
26848 | 2055 } |
52401 | 2056 |
2057 /* arch-tag: 79cefaf8-ca48-4eed-97e5-d5afb290d272 | |
2058 (do not change this comment) */ |