This source file includes following definitions.
- composition_registered_p
- COMPOSITION_ENCODE_RULE_VALID
- composition_method
- composition_valid_p
- lgstring_glyph_addr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 #ifndef EMACS_COMPOSITE_H
26 #define EMACS_COMPOSITE_H
27
28 #include "font.h"
29 #include "dispextern.h"
30
31 INLINE_HEADER_BEGIN
32
33
34 enum composition_method {
35
36 COMPOSITION_RELATIVE,
37
38
39
40 COMPOSITION_WITH_RULE,
41
42 COMPOSITION_WITH_ALTCHARS,
43
44 COMPOSITION_WITH_RULE_ALTCHARS,
45
46 COMPOSITION_NO
47 };
48
49
50 #define MAX_COMPOSITION_COMPONENTS 16
51
52
53
54
55
56
57
58
59
60 INLINE bool
61 composition_registered_p (Lisp_Object prop)
62 {
63 return FIXNUMP (XCAR (prop));
64 }
65
66
67 #define COMPOSITION_ID(prop) XFIXNUM (XCAR (prop))
68
69
70 #define COMPOSITION_LENGTH(prop) \
71 (composition_registered_p (prop) \
72 ? XFIXNUM (XCAR (XCDR (prop))) \
73 : XFIXNUM (XCAR (XCAR (prop))))
74
75
76 #define COMPOSITION_COMPONENTS(prop) \
77 (composition_registered_p (prop) \
78 ? XCAR (XCDR (XCDR (prop))) \
79 : XCDR (XCAR (prop)))
80
81
82 #define COMPOSITION_MODIFICATION_FUNC(prop) \
83 (composition_registered_p (prop) \
84 ? XCDR (XCDR (XCDR (prop))) \
85 : CONSP (prop) ? XCDR (prop) : Qnil)
86
87
88
89 #define COMPOSITION_GLYPH(cmp, n) \
90 XFIXNUM (XVECTOR (XVECTOR (XHASH_TABLE (composition_hash_table) \
91 ->key_and_value) \
92 ->contents[cmp->hash_index * 2]) \
93 ->contents[cmp->method == COMPOSITION_WITH_RULE_ALTCHARS \
94 ? (n) * 2 : (n)])
95
96
97
98
99 #define COMPOSITION_RULE(cmp, n) \
100 XFIXNUM (XVECTOR (XVECTOR (XHASH_TABLE (composition_hash_table) \
101 ->key_and_value) \
102 ->contents[cmp->hash_index * 2]) \
103 ->contents[(n) * 2 - 1])
104
105
106
107
108
109
110 #define COMPOSITION_DECODE_REFS(rule_code, gref, nref) \
111 do { \
112 rule_code &= 0xFF; \
113 gref = (rule_code) / 12; \
114 if (gref > 12) gref = 11; \
115 nref = (rule_code) % 12; \
116 } while (false)
117
118
119
120
121 #define COMPOSITION_DECODE_RULE(rule_code, gref, nref, xoff, yoff) \
122 do { \
123 xoff = (rule_code) >> 16; \
124 yoff = ((rule_code) >> 8) & 0xFF; \
125 COMPOSITION_DECODE_REFS (rule_code, gref, nref); \
126 } while (false)
127
128
129
130 INLINE bool
131 COMPOSITION_ENCODE_RULE_VALID (int gref, int nref)
132 {
133 return 0 <= gref && gref < 12 && 0 <= nref && nref < 12;
134 }
135
136
137
138 #define COMPOSITION_ENCODE_RULE(gref, nref) \
139 ((gref) * 12 + (nref))
140
141
142
143
144
145
146
147
148
149
150
151 struct composition {
152
153 int glyph_len;
154
155
156 short pixel_width, ascent, descent;
157
158 short lbearing, rbearing;
159
160
161
162
163 int width;
164
165
166 enum composition_method method;
167
168
169 ptrdiff_t hash_index;
170
171
172
173 void *font;
174
175
176
177
178
179
180 short *offsets;
181 };
182
183
184
185 extern struct composition **composition_table;
186
187 extern ptrdiff_t n_compositions;
188
189
190
191 #define CHECK_HEAD 1
192 #define CHECK_TAIL 2
193 #define CHECK_INSIDE 4
194 #define CHECK_BORDER (CHECK_HEAD | CHECK_TAIL)
195 #define CHECK_ALL (CHECK_BORDER | CHECK_INSIDE)
196
197 extern Lisp_Object composition_hash_table;
198 extern ptrdiff_t get_composition_id (ptrdiff_t, ptrdiff_t, ptrdiff_t,
199 Lisp_Object, Lisp_Object);
200 extern bool find_composition (ptrdiff_t, ptrdiff_t, ptrdiff_t *, ptrdiff_t *,
201 Lisp_Object *, Lisp_Object);
202 extern void update_compositions (ptrdiff_t, ptrdiff_t, int);
203 extern void make_composition_value_copy (Lisp_Object);
204 extern void syms_of_composite (void);
205 extern void compose_text (ptrdiff_t, ptrdiff_t, Lisp_Object, Lisp_Object,
206 Lisp_Object);
207
208
209
210 INLINE enum composition_method
211 composition_method (Lisp_Object prop)
212 {
213 if (composition_registered_p (prop))
214 return composition_table[COMPOSITION_ID (prop)]->method;
215 else
216 {
217 Lisp_Object temp = XCDR (XCAR (prop));
218 return (NILP (temp)
219 ? COMPOSITION_RELATIVE
220 : FIXNUMP (temp) || STRINGP (temp)
221 ? COMPOSITION_WITH_ALTCHARS
222 : COMPOSITION_WITH_RULE_ALTCHARS);
223 }
224 }
225
226
227
228
229 INLINE bool
230 composition_valid_p (ptrdiff_t start, ptrdiff_t end, Lisp_Object prop)
231 {
232 return (CONSP (prop)
233 && (composition_registered_p (prop)
234 ? (COMPOSITION_ID (prop) >= 0
235 && COMPOSITION_ID (prop) <= n_compositions
236 && CONSP (XCDR (prop)))
237 : (CONSP (XCAR (prop))
238 && (NILP (XCDR (XCAR (prop)))
239 || STRINGP (XCDR (XCAR (prop)))
240 || VECTORP (XCDR (XCAR (prop)))
241 || FIXNUMP (XCDR (XCAR (prop)))
242 || CONSP (XCDR (XCAR (prop))))))
243 && COMPOSITION_LENGTH (prop) == end - start);
244 }
245
246
247
248
249
250
251
252
253
254 #define LGSTRING_HEADER(lgs) AREF (lgs, 0)
255 #define LGSTRING_SET_HEADER(lgs, header) ASET (lgs, 0, header)
256
257
258
259
260
261 #define LGSTRING_FONT(lgs) AREF (LGSTRING_HEADER (lgs), 0)
262 #define LGSTRING_CHAR(lgs, i) AREF (LGSTRING_HEADER (lgs), (i) + 1)
263 #define LGSTRING_CHAR_LEN(lgs) (ASIZE (LGSTRING_HEADER (lgs)) - 1)
264
265 #define LGSTRING_SET_FONT(lgs, val) ASET (LGSTRING_HEADER (lgs), 0, (val))
266 #define LGSTRING_SET_CHAR(lgs, i, c) ASET (LGSTRING_HEADER (lgs), (i) + 1, (c))
267
268 #define LGSTRING_ID(lgs) AREF (lgs, 1)
269 #define LGSTRING_SET_ID(lgs, id) ASET (lgs, 1, id)
270
271
272
273
274
275 #define LGSTRING_GLYPH_LEN(lgs) (ASIZE ((lgs)) - 2)
276 #define LGSTRING_GLYPH(lgs, idx) AREF ((lgs), (idx) + 2)
277 #define LGSTRING_SET_GLYPH(lgs, idx, val) ASET ((lgs), (idx) + 2, (val))
278 INLINE Lisp_Object *
279 lgstring_glyph_addr (Lisp_Object lgs, ptrdiff_t idx)
280 {
281 return aref_addr (lgs, idx + 2);
282 }
283
284
285 enum lglyph_indices
286 {
287 LGLYPH_IX_FROM, LGLYPH_IX_TO, LGLYPH_IX_CHAR, LGLYPH_IX_CODE,
288 LGLYPH_IX_WIDTH, LGLYPH_IX_LBEARING, LGLYPH_IX_RBEARING,
289 LGLYPH_IX_ASCENT, LGLYPH_IX_DESCENT, LGLYPH_IX_ADJUSTMENT,
290
291 LGLYPH_SIZE
292 };
293
294
295
296
297
298
299
300
301
302 #define LGLYPH_NEW() make_nil_vector (LGLYPH_SIZE)
303 #define LGLYPH_FROM(g) XFIXNUM (AREF ((g), LGLYPH_IX_FROM))
304 #define LGLYPH_TO(g) XFIXNUM (AREF ((g), LGLYPH_IX_TO))
305 #define LGLYPH_CHAR(g) XFIXNUM (AREF ((g), LGLYPH_IX_CHAR))
306 #define LGLYPH_CODE(g) \
307 (NILP (AREF ((g), LGLYPH_IX_CODE)) \
308 ? FONT_INVALID_CODE \
309 : cons_to_unsigned (AREF (g, LGLYPH_IX_CODE), TYPE_MAXIMUM (unsigned)))
310 #define LGLYPH_WIDTH(g) XFIXNUM (AREF ((g), LGLYPH_IX_WIDTH))
311 #define LGLYPH_LBEARING(g) XFIXNUM (AREF ((g), LGLYPH_IX_LBEARING))
312 #define LGLYPH_RBEARING(g) XFIXNUM (AREF ((g), LGLYPH_IX_RBEARING))
313 #define LGLYPH_ASCENT(g) XFIXNUM (AREF ((g), LGLYPH_IX_ASCENT))
314 #define LGLYPH_DESCENT(g) XFIXNUM (AREF ((g), LGLYPH_IX_DESCENT))
315 #define LGLYPH_ADJUSTMENT(g) AREF ((g), LGLYPH_IX_ADJUSTMENT)
316 #define LGLYPH_SET_FROM(g, val) ASET ((g), LGLYPH_IX_FROM, make_fixnum (val))
317 #define LGLYPH_SET_TO(g, val) ASET ((g), LGLYPH_IX_TO, make_fixnum (val))
318 #define LGLYPH_SET_CHAR(g, val) ASET ((g), LGLYPH_IX_CHAR, make_fixnum (val))
319
320 #define LGLYPH_SET_CODE(g, val) \
321 ASET (g, LGLYPH_IX_CODE, \
322 val == FONT_INVALID_CODE ? Qnil : INT_TO_INTEGER (val))
323
324 #define LGLYPH_SET_WIDTH(g, val) ASET ((g), LGLYPH_IX_WIDTH, make_fixnum (val))
325 #define LGLYPH_SET_LBEARING(g, val) ASET ((g), LGLYPH_IX_LBEARING, make_fixnum (val))
326 #define LGLYPH_SET_RBEARING(g, val) ASET ((g), LGLYPH_IX_RBEARING, make_fixnum (val))
327 #define LGLYPH_SET_ASCENT(g, val) ASET ((g), LGLYPH_IX_ASCENT, make_fixnum (val))
328 #define LGLYPH_SET_DESCENT(g, val) ASET ((g), LGLYPH_IX_DESCENT, make_fixnum (val))
329 #define LGLYPH_SET_ADJUSTMENT(g, val) ASET ((g), LGLYPH_IX_ADJUSTMENT, (val))
330
331 #define LGLYPH_XOFF(g) (VECTORP (LGLYPH_ADJUSTMENT (g)) \
332 ? XFIXNUM (AREF (LGLYPH_ADJUSTMENT (g), 0)) : 0)
333 #define LGLYPH_YOFF(g) (VECTORP (LGLYPH_ADJUSTMENT (g)) \
334 ? XFIXNUM (AREF (LGLYPH_ADJUSTMENT (g), 1)) : 0)
335 #define LGLYPH_WADJUST(g) (VECTORP (LGLYPH_ADJUSTMENT (g)) \
336 ? XFIXNUM (AREF (LGLYPH_ADJUSTMENT (g), 2)) : 0)
337
338 extern Lisp_Object composition_gstring_put_cache (Lisp_Object, ptrdiff_t);
339 extern Lisp_Object composition_gstring_from_id (ptrdiff_t);
340 extern bool composition_gstring_p (Lisp_Object);
341 extern int composition_gstring_width (Lisp_Object, ptrdiff_t, ptrdiff_t,
342 struct font_metrics *);
343 extern void composition_gstring_adjust_zero_width (Lisp_Object);
344
345 extern bool find_automatic_composition (ptrdiff_t, ptrdiff_t, ptrdiff_t,
346 ptrdiff_t *, ptrdiff_t *,
347 Lisp_Object *, Lisp_Object);
348
349 extern void composition_compute_stop_pos (struct composition_it *,
350 ptrdiff_t, ptrdiff_t, ptrdiff_t,
351 Lisp_Object, bool);
352 extern bool composition_reseat_it (struct composition_it *, ptrdiff_t,
353 ptrdiff_t, ptrdiff_t, struct window *,
354 signed char, struct face *, Lisp_Object);
355 extern int composition_update_it (struct composition_it *,
356 ptrdiff_t, ptrdiff_t, Lisp_Object);
357
358 extern ptrdiff_t composition_adjust_point (ptrdiff_t, ptrdiff_t);
359 extern Lisp_Object composition_gstring_lookup_cache (Lisp_Object);
360
361 extern void composition_gstring_cache_clear_font (Lisp_Object);
362
363 INLINE_HEADER_END
364
365 #endif