annotate src/faces.h @ 412:697ef44129c6 r21-2-14

Import from CVS: tag r21-2-14
author cvs
date Mon, 13 Aug 2007 11:20:41 +0200
parents 2f8bb876ab1d
children 11054d720c21
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
1 /* Face data structures.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
2 Copyright (C) 1995 Board of Trustees, University of Illinois.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
3 Copyright (C) 1995 Ben Wing
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
4
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
5 This file is part of XEmacs.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
6
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
7 XEmacs is free software; you can redistribute it and/or modify it
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
10 later version.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
11
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
15 for more details.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
16
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
18 along with XEmacs; see the file COPYING. If not, write to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
20 Boston, MA 02111-1307, USA. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
21
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
22 /* Synched up with: Not in FSF. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
23
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
24 #ifndef _XEMACS_FACES_H_
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
25 #define _XEMACS_FACES_H_
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
26
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
27 #include "buffer.h" /* for NUM_LEADING_BYTES */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
28
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
29 /* a struct Lisp_Face is the C object corresponding to a face. There
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
30 is one of these per face. It basically contains all of the specifiers
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
31 for the built-in face properties, plus the plist of user-specified
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
32 properties. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
33
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
34 struct Lisp_Face
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
35 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
36 struct lcrecord_header header;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
37
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
38 Lisp_Object name;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
39 Lisp_Object doc_string;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
40 unsigned int dirty :1; /* Set whenever a face property is changed on
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
41 a face. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
42
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
43 Lisp_Object foreground;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
44 Lisp_Object background;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
45 Lisp_Object font;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
46
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
47 Lisp_Object display_table;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
48 Lisp_Object background_pixmap;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
49
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
50 Lisp_Object underline;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
51 Lisp_Object strikethru;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
52 Lisp_Object highlight;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
53 Lisp_Object dim;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
54 Lisp_Object blinking;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
55 Lisp_Object reverse;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
56
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
57 Lisp_Object plist;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
58
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
59 Lisp_Object charsets_warned_about;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
60 };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
61
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
62 /*
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
63
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
64 A face cache element caches the results of instantiating the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
65 properties of a face in a particular window. (Instantiation can
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
66 take a long time so this is very important.) Each window contains
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
67 an array of face cache elements (called the "face cache"), one for
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
68 each face that has been seen in the window so far.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
69
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
70 Some tricky stuff is done to make sure the face cache does not
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
71 become inconsistent:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
72
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
73 1) Switching buffers in a window clears the face cache for that
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
74 window, because this can change the way any property is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
75 instantiated in the window.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
76 2) Setting a face property causes that face to be marked as
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
77 dirty. This causes various stuff to happen to make sure
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
78 the appropriate face cache elements are invalidated.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
79 (#### Actually this doesn't work quite right, and errs
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
80 too much on the side of invalidating unnecessary stuff.)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
81
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
82 There are also face cache elements for "merged faces", which are the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
83 result of merging all the faces that overlap a particular buffer
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
84 position. The merging is always done in the context of a particular
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
85 domain (specifically, a window), and the face cache element is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
86 specific to a particular window. (Face cache elements are contained
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
87 in an array that is attached to each struct_window.) The reason that
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
88 the merging takes place in the context of a particular window has
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
89 to do with the way the merging works:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
90
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
91 1) All extents overlying the buffer position are sorted by descending
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
92 priority.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
93 2) The property of a particular merged face comes from the highest-
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
94 priority face that specifies a value for that particular property.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
95 3) The way to determine whether a face specifies a value for a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
96 particular property is to instantiate that face's property in
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
97 the window in question with the no-fallback option set, to
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
98 see if we got anything.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
99
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
100 For Mule, things get a bit trickier because there can be multiple
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
101 fonts per face/window combination -- the charset is an argument
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
102 to specifier-instance.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
103
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
104 We have two possible data structure representations:
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
105
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
106 1) Keep the original "one font per face cache element" representation
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
107 and use a different face cache element for each charset.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
108 2) Allow multiple fonts to be in a single face cache element.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
109
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
110 I've chosen to use (2) -- the data structure gets more complicated
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
111 but the algorithms for maintaining face cache elements end up
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
112 simpler.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
113 */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
114
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
115 #define NUM_STATIC_CACHEL_FACES 4
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
116
185
3d6bfa290dbd Import from CVS: tag r20-3b19
cvs
parents: 0
diff changeset
117 typedef struct face_cachel face_cachel;
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
118 struct face_cachel
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
119 {
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
120 /* There are two kinds of cachels; those created from a single face
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
121 and those created by merging more than one face. In the former
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
122 case, the FACE element specifies the face used. In the latter
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
123 case, the MERGED_FACES_STATIC and MERGED_FACES elements specify
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
124 the faces used for merging by giving the indices of the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
125 corresponding single-face cachels.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
126
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
127 Formerly we didn't bother to keep track of the faces used for
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
128 merging. We do know because we need to do so because there is no
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
129 other way to properly handle multiple charsets for Mule in the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
130 presence of display tables short of always computing the values
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
131 for all charsets, which is very expensive. Instead, we use a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
132 lazy scheme where we only compute the font for a particular charset
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
133 when it is needed. (The exception is the font for the ASCII charset.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
134 We always compute it, just like the other attributes, because
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
135 many places in the C code refer to the font of the ASCII charset
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
136 and expect it to always be there.)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
137
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
138 We store the first four faces in a static array, and use a
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
139 Dynarr for the rest. This has the advantage that the space used
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
140 is small but the Dynarr will almost never be created, so we
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
141 won't spend much time in malloc()/free().
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
142
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
143 The order of the faces here is decreasing extent priority. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
144 Lisp_Object face;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
145 int merged_faces_static[NUM_STATIC_CACHEL_FACES];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
146 int_dynarr *merged_faces;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
147 int nfaces;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
148
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
149 /* The values stored here are computed by calling specifier_instance()
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
150 on the appropriate specifiers. This means that we will have either
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
151 a value computed from the face itself or a value computed from the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
152 default face. We need to distinguish the two so that merging works
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
153 properly -- a value that comes from the default face is treated
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
154 as "unspecified" during merging and is overridden by lower-priority
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
155 faces. This is what the _specified flags below are for. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
156
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
157 Lisp_Object foreground;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
158 Lisp_Object background;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
159 /* There are currently 128 possible charsets under Mule. For the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
160 moment we just take the easy way out and allocate space for each
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
161 of them. This avoids messing with Dynarrs.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
162
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
163 #### We should look into this and probably clean it up
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
164 to use Dynarrs. This may be a big space hog as is. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
165 Lisp_Object font[NUM_LEADING_BYTES];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
166
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
167 Lisp_Object display_table;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
168 Lisp_Object background_pixmap;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
169
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
170 unsigned int underline :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
171 unsigned int strikethru :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
172 unsigned int highlight :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
173 unsigned int dim :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
174 unsigned int blinking :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
175 unsigned int reverse :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
176
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
177 /* Used when merging to tell if the above field represents an actual
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
178 value of this face or a fallback value. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
179 /* #### Of course we should use a bit array or something. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
180 unsigned char font_specified[NUM_LEADING_BYTES];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
181 unsigned int foreground_specified :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
182 unsigned int background_specified :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
183 unsigned int display_table_specified :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
184 unsigned int background_pixmap_specified :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
185
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
186 unsigned int strikethru_specified :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
187 unsigned int underline_specified :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
188 unsigned int highlight_specified :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
189 unsigned int dim_specified :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
190 unsigned int blinking_specified :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
191 unsigned int reverse_specified :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
192
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
193 /* The updated flag is set after we calculate the values for the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
194 face cachel and cleared whenever a face changes, to indicate
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
195 that the values stored here might be wrong. The next time
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
196 we go to access the values, we recompute them; if any values
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
197 change, we set the DIRTY flag, which tells the output routines
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
198 that a face value has in fact changed and the sections of text
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
199 using this face need to be redrawn.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
200
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
201 It is trickier with fonts because we don't automatically
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
202 recompute the fonts but do it only when it is necessary.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
203 (The ASCII font is an exception, of course; see above).
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
204
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
205 In the case of fonts, we maintain a separate updated flag
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
206 for each font. Whenever we need to access the font for
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
207 a particular charset, we recalculate it if either its
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
208 value is Qunbound (meaning it's never been computed at all)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
209 or the updated flag is not set. We set the dirty flag if
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
210 the value is not the same as before and the previous value
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
211 was not Qunbound.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
212
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
213 #### Note that we don't yet deal with the case of the new
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
214 value being Qunbound, as could happen if no fonts of the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
215 right sort are available on the system. In this case, the
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
216 whole program will just crash. For the moment, this is
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
217 OK (for debugging purposes) but we should fix this by
380
8626e4521993 Import from CVS: tag r21-2-5
cvs
parents: 290
diff changeset
218 storing a "blank font" if the instantiation fails. */
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
219 unsigned int dirty :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
220 unsigned int updated :1;
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
221 /* #### Of course we should use a bit array or something. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
222 unsigned char font_updated[NUM_LEADING_BYTES];
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
223 };
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
224
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
225 DECLARE_LRECORD (face, struct Lisp_Face);
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
226 #define XFACE(x) XRECORD (x, face, struct Lisp_Face)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
227 #define XSETFACE(x, p) XSETRECORD (x, p, face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
228 #define FACEP(x) RECORDP (x, face)
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
229 #define GC_FACEP(x) GC_RECORDP (x, face)
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
230 #define CHECK_FACE(x) CHECK_RECORD (x, face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
231
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
232 Lisp_Object ensure_face_cachel_contains_charset (struct face_cachel *cachel,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
233 Lisp_Object domain,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
234 Lisp_Object charset);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
235 void ensure_face_cachel_complete (struct face_cachel *cachel,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
236 Lisp_Object domain,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
237 unsigned char *charsets);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
238 void update_face_cachel_data (struct face_cachel *cachel,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
239 Lisp_Object domain,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
240 Lisp_Object face);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
241 void face_cachel_charset_font_metric_info (struct face_cachel *cachel,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
242 unsigned char *charsets,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
243 struct font_metric_info *fm);
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
244 void mark_face_cachels (face_cachel_dynarr *elements,
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
245 void (*markobj) (Lisp_Object));
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
246 void mark_face_cachels_as_clean (struct window *w);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
247 void mark_face_cachels_as_not_updated (struct window *w);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
248 void reset_face_cachel (struct face_cachel *inst);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
249 void reset_face_cachels (struct window *w);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
250 face_index get_builtin_face_cache_index (struct window *w,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
251 Lisp_Object face);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
252 #ifdef MEMORY_USAGE_STATS
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
253 int compute_face_cachel_usage (face_cachel_dynarr *face_cachels,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
254 struct overhead_stats *ovstats);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
255 #endif /* MEMORY_USAGE_STATS */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
256
272
c5d627a313b1 Import from CVS: tag r21-0b34
cvs
parents: 269
diff changeset
257 EXFUN (Fface_name, 1);
c5d627a313b1 Import from CVS: tag r21-0b34
cvs
parents: 269
diff changeset
258 EXFUN (Ffind_face, 1);
c5d627a313b1 Import from CVS: tag r21-0b34
cvs
parents: 269
diff changeset
259 EXFUN (Fget_face, 1);
c5d627a313b1 Import from CVS: tag r21-0b34
cvs
parents: 269
diff changeset
260
c5d627a313b1 Import from CVS: tag r21-0b34
cvs
parents: 269
diff changeset
261 extern Lisp_Object Qstrikethru, Vbuilt_in_face_specifiers, Vdefault_face;
c5d627a313b1 Import from CVS: tag r21-0b34
cvs
parents: 269
diff changeset
262 extern Lisp_Object Vleft_margin_face, Vpointer_face, Vright_margin_face;
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
263 extern Lisp_Object Vtext_cursor_face, Vvertical_divider_face;
384
bbff43aa5eb7 Import from CVS: tag r21-2-7
cvs
parents: 380
diff changeset
264 extern Lisp_Object Vtoolbar_face, Vgui_element_face, Vwidget_face;
272
c5d627a313b1 Import from CVS: tag r21-0b34
cvs
parents: 269
diff changeset
265
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
266 void mark_all_faces_as_clean (void);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
267 void init_frame_faces (struct frame *f);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
268 void init_device_faces (struct device *d);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
269 void init_global_faces (struct device *d);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
270 face_index get_extent_fragment_face_cache_index (struct window *w,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
271 struct extent_fragment *ef);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
272 void update_frame_face_values (struct frame *f);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
273 void face_property_was_changed (Lisp_Object face, Lisp_Object property,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
274 Lisp_Object locale);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
275 void default_face_font_info (Lisp_Object domain, int *ascent,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
276 int *descent, int *height, int *width,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
277 int *proportional_p);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
278 void default_face_height_and_width (Lisp_Object domain,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
279 int *height, int *width);
269
b2472a1930f2 Import from CVS: tag r20-5b33
cvs
parents: 185
diff changeset
280 void default_face_height_and_width_1 (Lisp_Object domain,
b2472a1930f2 Import from CVS: tag r20-5b33
cvs
parents: 185
diff changeset
281 int *height, int *width);
0
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
282
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
283 #define FACE_CACHEL_FONT(cachel, charset) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
284 (cachel->font[XCHARSET_LEADING_BYTE (charset) - 128])
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
285
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
286 #define WINDOW_FACE_CACHEL(window, index) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
287 Dynarr_atp ((window)->face_cachels, index)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
288
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
289 #define FACE_CACHEL_FINDEX_UNSAFE(cachel, offset) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
290 ((offset) < NUM_STATIC_CACHEL_FACES \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
291 ? (cachel)->merged_faces_static[offset] \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
292 : Dynarr_at ((cachel)->merged_faces, (offset) - NUM_STATIC_CACHEL_FACES))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
293
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
294 #define WINDOW_FACE_CACHEL_FACE(window, index) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
295 (WINDOW_FACE_CACHEL (window, index)->face)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
296 #define WINDOW_FACE_CACHEL_FOREGROUND(window, index) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
297 (WINDOW_FACE_CACHEL (window, index)->foreground)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
298 #define WINDOW_FACE_CACHEL_BACKGROUND(window, index) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
299 (WINDOW_FACE_CACHEL (window, index)->background)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
300 /* #### This can be referenced by various functions,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
301 but face_cachels isn't initialized for the stream device.
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
302 Since it doesn't need the value we just return nil here to avoid
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
303 blowing up in multiple places. */
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
304 #define WINDOW_FACE_CACHEL_FONT(window, index, charset) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
305 ((window)->face_cachels \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
306 ? FACE_CACHEL_FONT (WINDOW_FACE_CACHEL (window, index), charset) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
307 : Qnil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
308 #define WINDOW_FACE_CACHEL_DISPLAY_TABLE(window, index) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
309 (WINDOW_FACE_CACHEL (window, index)->display_table)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
310 #define WINDOW_FACE_CACHEL_BACKGROUND_PIXMAP(window, index) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
311 (WINDOW_FACE_CACHEL (window, index)->background_pixmap)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
312 #define WINDOW_FACE_CACHEL_DIRTY(window, index) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
313 (WINDOW_FACE_CACHEL (window, index)->dirty)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
314 #define WINDOW_FACE_CACHEL_UNDERLINE_P(window, index) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
315 (WINDOW_FACE_CACHEL (window, index)->underline)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
316 #define WINDOW_FACE_CACHEL_HIGHLIGHT_P(window, index) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
317 (WINDOW_FACE_CACHEL (window, index)->highlight)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
318 #define WINDOW_FACE_CACHEL_DIM_P(window, index) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
319 (WINDOW_FACE_CACHEL (window, index)->dim)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
320 #define WINDOW_FACE_CACHEL_BLINKING_P(window, index) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
321 (WINDOW_FACE_CACHEL (window, index)->blinking)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
322 #define WINDOW_FACE_CACHEL_REVERSE_P(window, index) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
323 (WINDOW_FACE_CACHEL (window, index)->reverse)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
324
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
325 #define FACE_PROPERTY_SPECIFIER(face, property) Fget (face, property, Qnil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
326
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
327 #define FACE_PROPERTY_INSTANCE_1(face, property, domain, errb, no_fallback, depth) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
328 specifier_instance (FACE_PROPERTY_SPECIFIER (face, property), Qunbound, \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
329 domain, errb, 1, no_fallback, depth)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
330
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
331 #define FACE_PROPERTY_INSTANCE(face, property, domain, no_fallback, depth) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
332 FACE_PROPERTY_INSTANCE_1 (face, property, domain, ERROR_ME_NOT, \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
333 no_fallback, depth)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
334
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
335 Lisp_Object face_property_matching_instance (Lisp_Object face,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
336 Lisp_Object property,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
337 Lisp_Object charset,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
338 Lisp_Object domain,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
339 Error_behavior errb,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
340 int no_fallback,
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
341 Lisp_Object depth);
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
342
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
343 #define FACE_PROPERTY_SPEC_LIST(face, property, locale) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
344 Fspecifier_spec_list (FACE_PROPERTY_SPECIFIER (face, property), \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
345 locale, Qnil, Qnil)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
346 #define SET_FACE_PROPERTY(face, property, locale, value, tag, how_to_add) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
347 Fadd_spec_to_specifier (FACE_PROPERTY_SPECIFIER (face, property), \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
348 locale, value, tag, how_to_add)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
349
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
350 #define FACE_FOREGROUND(face, domain) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
351 FACE_PROPERTY_INSTANCE (face, Qforeground, domain, 0, Qzero)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
352 #define FACE_BACKGROUND(face, domain) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
353 FACE_PROPERTY_INSTANCE (face, Qbackground, domain, 0, Qzero)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
354 #define FACE_FONT(face, domain, charset) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
355 face_property_matching_instance (face, Qfont, charset, domain, \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
356 ERROR_ME_NOT, 0, Qzero)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
357 #define FACE_DISPLAY_TABLE(face, domain) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
358 FACE_PROPERTY_INSTANCE (face, Qdisplay_table, domain, 0, Qzero)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
359 #define FACE_BACKGROUND_PIXMAP(face, domain) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
360 FACE_PROPERTY_INSTANCE (face, Qbackground_pixmap, domain, 0, Qzero)
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
361 #define FACE_UNDERLINE_P(face, domain) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
362 (!NILP (FACE_PROPERTY_INSTANCE (face, Qunderline, domain, 0, Qzero)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
363 #define FACE_HIGHLIGHT_P(face, domain) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
364 (!NILP (FACE_PROPERTY_INSTANCE (face, Qhighlight, domain, 0, Qzero)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
365 #define FACE_DIM_P(face, domain) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
366 (!NILP (FACE_PROPERTY_INSTANCE (face, Qdim, domain, 0, Qzero)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
367 #define FACE_BLINKING_P(face, domain) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
368 (!NILP (FACE_PROPERTY_INSTANCE (face, Qblinking, domain, 0, Qzero)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
369 #define FACE_REVERSE_P(face, domain) \
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
370 (!NILP (FACE_PROPERTY_INSTANCE (face, Qreverse, domain, 0, Qzero)))
376386a54a3c Import from CVS: tag r19-14
cvs
parents:
diff changeset
371
412
697ef44129c6 Import from CVS: tag r21-2-14
cvs
parents: 404
diff changeset
372 #endif /* _XEMACS_FACES_H_ */