Mercurial > hg > xemacs-beta
annotate src/font-mgr.h @ 4407:4ee73bbe4f8e
Always use boyer_moore in ASCII or Latin-1 buffers with ASCII search strings.
2007-12-26 Aidan Kehoe <kehoea@parhasard.net>
* casetab.c:
Extend and correct some case table documentation.
* search.c (search_buffer):
Correct a bug where only the first entry for a character in the
case equivalence table was examined in determining if the
Boyer-Moore search algorithm is appropriate.
If there are case mappings outside of the charset and row of the
characters specified in the search string, those case mappings can
be safely ignored (and Boyer-Moore search can be used) if we know
from the buffer statistics that the corresponding characters cannot
occur.
* search.c (boyer_moore):
Assert that we haven't been passed a string with varying
characters sets or rows within character sets. That's what
simple_search is for.
In the very rare event that a character in the search string has a
canonical case mapping that is not in the same character set and
row, don't try to search for the canonical character, search for
some other character that is in the the desired character set and
row. Assert that the case table isn't corrupt.
Do not search for any character case mappings that cannot possibly
occur in the buffer, given the buffer metadata about its
contents.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Wed, 26 Dec 2007 17:30:16 +0100 |
parents | dfd878799ef0 |
children | a23ac8f90a49 |
rev | line source |
---|---|
3354 | 1 /* Lisp font data structures for X and Xft. |
2 | |
3 Copyright (C) 2003 Eric Knauel and Matthias Neubauer | |
4 Copyright (C) 2005 Eric Knauel | |
5 Copyright (C) 2004, 2005 Free Software Foundation, Inc. | |
6 | |
7 Authors: Eric Knauel <knauel@informatik.uni-tuebingen.de> | |
8 Matthias Neubauer <neubauer@informatik.uni-freiburg.de> | |
9 Stephen J. Turnbull <stephen@xemacs.org> | |
10 Created: 27 Oct 2003 | |
11 Updated: 05 Mar 2005 by Stephen J. Turnbull | |
12 | |
13 This file is part of XEmacs. | |
14 | |
15 XEmacs is free software; you can redistribute it and/or modify it | |
16 under the terms of the GNU General Public License as published by the | |
17 Free Software Foundation; either version 2, or (at your option) any | |
18 later version. | |
19 | |
20 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
21 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
22 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
23 for more details. | |
24 | |
25 You should have received a copy of the GNU General Public License | |
26 along with XEmacs; see the file COPYING. If not, write to | |
27 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
28 Boston, MA 02111-1307, USA. */ | |
29 | |
30 /* Synched up with: Not in GNU Emacs. */ | |
31 | |
32 /* This module provides the Lisp interface to fonts in X11, including Xft, | |
33 but (at least at first) not GTK+ or Qt. | |
34 | |
35 It should be renamed to fonts-x.h. | |
36 | |
37 Sealevel code should be in ../lwlib/lwlib-fonts.h or | |
38 ../lwlib/lwlib-colors.h. | |
39 */ | |
40 | |
41 | |
42 #ifndef INCLUDED_font_mgr_h_ | |
43 #define INCLUDED_font_mgr_h_ | |
44 | |
45 #include "../lwlib/lwlib-fonts.h" | |
46 #include "../lwlib/lwlib-colors.h" | |
47 | |
48 extern Fixnum debug_xft; | |
49 | |
50 /* Standard for fontconfig. Use a macro to show we're not guessing. */ | |
3360 | 51 #define Qfc_font_name_encoding Qutf_8 |
3354 | 52 |
53 #define XE_XLFD_MAKE_LISP_STRING(s) (make_string(s, strlen(s))) | |
54 | |
55 struct fc_pattern | |
56 { | |
57 struct LCRECORD_HEADER header; | |
58 FcPattern *fcpatPtr; | |
59 }; | |
60 | |
61 typedef struct fc_pattern fc_pattern; | |
62 | |
63 DECLARE_LRECORD(fc_pattern, struct fc_pattern); | |
64 #define XFCPATTERN(x) XRECORD (x, fc_pattern, struct fc_pattern) | |
65 #define wrap_fcpattern(p) wrap_record (p, fc_pattern) | |
66 #define FCPATTERNP(x) RECORDP (x, fc_pattern) | |
67 #define CHECK_FCPATTERN(x) CHECK_RECORD (x, fc_pattern) | |
68 #define CONCHECK_FCPATTERN(x) CONCHECK_RECORD (x, fc_pattern) | |
69 #define XFCPATTERN_PTR(x) (XFCPATTERN(x)->fcpatPtr) | |
70 | |
3931 | 71 #define FONTCONFIG_EXPOSE_CONFIG |
72 #ifdef FONTCONFIG_EXPOSE_CONFIG | |
73 | |
74 struct fc_config | |
75 { | |
76 struct LCRECORD_HEADER header; | |
77 FcConfig *fccfgPtr; | |
78 }; | |
79 | |
80 typedef struct fc_config fc_config; | |
81 | |
82 DECLARE_LRECORD(fc_config, struct fc_config); | |
83 #define XFCCONFIG(x) XRECORD (x, fc_config, struct fc_config) | |
84 #define wrap_fcconfig(p) wrap_record (p, fc_config) | |
85 #define FCCONFIGP(x) RECORDP (x, fc_config) | |
86 #define CHECK_FCCONFIG(x) CHECK_RECORD (x, fc_config) | |
87 #define CONCHECK_FCCONFIG(x) CONCHECK_RECORD (x, fc_config) | |
88 #define XFCCONFIG_PTR(x) (XFCCONFIG(x)->fccfgPtr) | |
89 | |
90 #endif /* FONTCONFIG_EXPOSE_CONFIG */ | |
91 | |
3666 | 92 #ifdef USE_XFT |
4328
dfd878799ef0
Autoconfiscate the recent fontconfig spelling change.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3931
diff
changeset
|
93 |
dfd878799ef0
Autoconfiscate the recent fontconfig spelling change.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3931
diff
changeset
|
94 #ifndef HAVE_FCCONFIGGETRESCANINTERVAL |
dfd878799ef0
Autoconfiscate the recent fontconfig spelling change.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3931
diff
changeset
|
95 /* Older fontconfig versions misspell this function name. */ |
dfd878799ef0
Autoconfiscate the recent fontconfig spelling change.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3931
diff
changeset
|
96 #define FcConfigGetRescanInterval FcConfigGetRescanInverval |
dfd878799ef0
Autoconfiscate the recent fontconfig spelling change.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3931
diff
changeset
|
97 #endif /* */ |
dfd878799ef0
Autoconfiscate the recent fontconfig spelling change.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3931
diff
changeset
|
98 |
dfd878799ef0
Autoconfiscate the recent fontconfig spelling change.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3931
diff
changeset
|
99 #ifndef HAVE_FCCONFIGSETRESCANINTERVAL |
dfd878799ef0
Autoconfiscate the recent fontconfig spelling change.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3931
diff
changeset
|
100 /* Older fontconfig versions misspell this function name. */ |
dfd878799ef0
Autoconfiscate the recent fontconfig spelling change.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3931
diff
changeset
|
101 #define FcConfigSetRescanInterval FcConfigSetRescanInverval |
dfd878799ef0
Autoconfiscate the recent fontconfig spelling change.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3931
diff
changeset
|
102 #endif /* */ |
dfd878799ef0
Autoconfiscate the recent fontconfig spelling change.
Aidan Kehoe <kehoea@parhasard.net>
parents:
3931
diff
changeset
|
103 |
3666 | 104 /* |
105 The format of a fontname (as returned by fontconfig) is not well-documented, | |
106 But the character repertoire is represented in an ASCII-compatible way. See | |
107 fccharset.c (FcCharSetUnparse). So we can use UTF-8 for long names. | |
108 | |
109 Currently we have a hack where different versions of the unparsed name are | |
110 used in different contexts fairly arbitrarily. I don't think this is close | |
111 to coherency; even without the charset and lang properties fontconfig names | |
112 are too unwieldy to use. We need to rethink the approach here. I think | |
113 probably Lisp_Font_Instance.name should contain the font name as specified | |
114 to Lisp (almost surely much shorter than shortname, even, and most likely | |
115 wildcarded), while Lisp_Font_Instance.truename should contain the longname. | |
116 For now, I'm going to #ifdef the return values defaulting to short. -- sjt | |
117 */ | |
118 | |
119 /* DEBUGGING STUFF */ | |
120 | |
121 /* print message to stderr: one internal-format string argument */ | |
122 #define DEBUG_XFT0(level,s) \ | |
123 if (debug_xft > level) stderr_out (s) | |
124 | |
125 /* print message to stderr: one formatted argument */ | |
126 #define DEBUG_XFT1(level,format,x1) \ | |
127 if (debug_xft > level) stderr_out (format, x1) | |
128 | |
129 /* print message to stderr: two formatted arguments */ | |
130 #define DEBUG_XFT2(level,format,x1,x2) \ | |
131 if (debug_xft > level) stderr_out (format, x1, x2) | |
132 | |
133 /* print message to stderr: three formatted arguments */ | |
134 #define DEBUG_XFT3(level,format,x1,x2,x3) \ | |
135 if (debug_xft > level) stderr_out (format, x1, x2, x3) | |
136 | |
137 /* print message to stderr: four formatted arguments */ | |
138 #define DEBUG_XFT4(level,format,x1,x2,x3,x4) \ | |
139 if (debug_xft > level) stderr_out (format, x1, x2, x3, x4) | |
140 | |
141 /* print an Xft pattern to stderr | |
142 LEVEL is the debug level (to compare to debug_xft) | |
143 FORMAT is a newline-terminated printf format with one %s for the pattern | |
144 and must be internal format (eg, pure ASCII) | |
145 PATTERN is an FcPattern *. */ | |
146 #define PRINT_XFT_PATTERN(level,format,pattern) \ | |
147 do { \ | |
148 DECLARE_EISTRING (eistrpxft_name); \ | |
149 FcChar8 *name = FcNameUnparse (pattern); \ | |
150 \ | |
151 eicpy_ext(eistrpxft_name, name, Qfc_font_name_encoding); \ | |
152 DEBUG_XFT1 (level, format, eidata(eistrpxft_name)); \ | |
153 free (name); \ | |
154 } while (0) | |
155 | |
156 /* print a progress message | |
157 LEVEL is the debug level (to compare to debug_xft) | |
158 FONT is the Xft font name in UTF-8 (the native encoding of Xft) | |
159 LANG is the language being checked for support (must be ASCII). */ | |
160 #define CHECKING_LANG(level,font,lang) \ | |
161 do { \ | |
162 DECLARE_EISTRING (eistrcl_name); \ | |
163 eicpy_ext(eistrcl_name, font, Qfc_font_name_encoding); \ | |
164 DEBUG_XFT2 (level, "checking if %s handles %s\n", \ | |
165 eidata(eistrcl_name), lang); \ | |
166 } while (0) | |
167 | |
168 #else /* USE_XFT */ | |
169 | |
170 #endif /* USE_XFT */ | |
171 | |
3354 | 172 #endif /* INCLUDED_font_mgr_h_ */ |