Mercurial > emacs
annotate src/w32bdf.c @ 50715:46229d46cbeb
Major rewrite. The code is reordered, cleaner and faster.
Introduced new options to automatically cleanup the recent list,
and to handle filename transformation (for example to use true
filenames).
(recentf-version): New constant.
(recentf-save-file-header): Moved.
(recentf-data-cache): New variable.
(recentf-update-menu-p, recentf-initialized-p): Removed.
(recentf-menu-customization-changed): Moved. Doc fix.
(recentf-max-saved-items): Doc fix.
(recentf-save-file): Doc fix. No more expand filename here.
(recentf-exclude, recentf-menu-action)
(recentf-menu-filter): Doc fix.
(recentf-menu-append-commands-flag): Renamed from...
(recentf-menu-append-commands-p): Made obsolete.
(recentf-keep-non-readable-files-flag): Renamed from...
(recentf-keep-non-readable-files-p): Made obsolete.
(recentf-auto-cleanup, recentf-filename-handler): New options.
(recentf-string-equal, recentf-string-lessp)
(recentf-string-member): New functions.
(recentf-trunc-list): Moved.
(recentf-dump-variable): Moved. Better code and output format.
(recentf-auto-cleanup-timer): New variable.
(recentf-auto-cleanup): New function.
(recentf-push, recentf-expand-file-name): New functions.
(recentf-add-file): In-lined. Use above functions.
(recentf-remove-if-non-readable): In-lined. Expand file name.
(recentf-find-file): Use `recentf-remove-if-non-readable'.
(recentf-directory-compare): Moved. Use `recentf-string-equal'
and `recentf-string-lessp' to do comparisons.
(recentf-menu-items-for-commands)
(recentf-menu-filter-commands): Moved.
(recentf-elements, recentf-make-menu-element)
(recentf-menu-element-item, recentf-menu-element-value)
(recentf-set-menu-element-item, recentf-set-menu-element-value)
(recentf-sub-menu-element-p, recentf-make-default-menu-element)
(recentf-menu-elements): In-lined. Some doc fix.
(recentf-apply-menu-filter): Better code.
(recentf-make-menu-items): Doc fix. Use
`recentf-menu-append-commands-flag'.
(recentf-make-menu-item): In-lined. Better code.
(recentf-clear-data): New function.
(recentf-sort-ascending, recentf-sort-descending)
(recentf-sort-basenames-ascending)
(recentf-sort-basenames-descending)
(recentf-sort-directories-ascending)
(recentf-sort-directories-descending)
(recentf-show-basenames-ascending)
(recentf-show-basenames-descending: In-lined. Better code. Some
doc fix.
(recentf-show-basenames)
(recentf-relative-filter): Better code. Doc fix.
(recentf-arrange-by-rule-subfilter): Doc fix. Improved :set code.
(recentf-match-rule-p): Use filename instead of file-path.
(recentf-arrange-by-rule, recentf-build-mode-rules)
(recentf-arrange-by-mode, recentf-build-dir-rules)
(recentf-file-name-nondir)
(recentf-filter-changer-alist): Some doc fix and code cleanup.
(recentf-filter-changer-goto-next): Doc fix. Call
`recentf-clear-data'.
(recentf-filter-changer-get-current)
(recentf-filter-changer-get-next): In-lined. Doc fix and better
code.
(recentf-filter-changer): Doc fix and better code.
(recentf-cancel-dialog): Doc fix.
(recentf-dialog-mode-map): Initialized in defvar.
(recentf-dialog-mode): Doc fix.
(recentf-track-opened-file): Renamed from...
(recentf-add-file-hook): Removed.
(recentf-track-closed-file): Renamed from...
(recentf-remove-file-hook): Removed.
(recentf-update-menu-hook): Removed. Replaced by...
(recentf-update-menu): New. Better catch unnecessary updates.
Display a message on error.
(recentf-used-hooks): New constant.
(recentf-enabled-p): New function.
(recentf-edit-selected-items)
(recentf-open-files-action)
(recentf-open-files-item-shift): Doc fix.
(recentf-edit-list-action)
(recentf-open-files-item): Doc fix. Code cleanup.
(recentf-edit-list, recentf-open-files)
(recentf-open-more-files): Likewise. Removed autoload cookie.
(recentf-save-list, recentf-cleanup): Likewise. Moved.
(recentf-load-list): New command.
(recentf-mode): Better code. Does nothing if enabling the already
enabled mode.
author | Juanma Barranquero <lekktu@gmail.com> |
---|---|
date | Sat, 26 Apr 2003 23:41:59 +0000 |
parents | 23a1cea22d13 |
children | 695cf19ef79e d7ddb3e565de |
rev | line source |
---|---|
24141 | 1 /* Implementation of BDF font handling on the Microsoft W32 API. |
2 Copyright (C) 1999 Free Software Foundation, Inc. | |
3 | |
4 This file is part of GNU Emacs. | |
5 | |
6 GNU Emacs is free software; you can redistribute it and/or modify | |
7 it under the terms of the GNU General Public License as published by | |
8 the Free Software Foundation; either version 2, or (at your option) | |
9 any later version. | |
10 | |
11 GNU Emacs is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with GNU Emacs; see the file COPYING. If not, write to | |
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 Boston, MA 02111-1307, USA. */ | |
20 | |
21 /* Based heavily on code by H. Miyashita for Meadow (a descendant of | |
22 MULE for W32). */ | |
23 | |
24 #include <windows.h> | |
42469 | 25 |
26 #ifdef HAVE_CONFIG_H | |
27 #include <config.h> | |
28 #endif | |
29 | |
24141 | 30 #include "lisp.h" |
31 #include "charset.h" | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
32 #include "keyboard.h" |
28271
f6a8927824c9
Include frame.h and dispextern.h before fontset.h.
Jason Rumney <jasonr@gnu.org>
parents:
24841
diff
changeset
|
33 #include "frame.h" |
f6a8927824c9
Include frame.h and dispextern.h before fontset.h.
Jason Rumney <jasonr@gnu.org>
parents:
24841
diff
changeset
|
34 #include "dispextern.h" |
24141 | 35 #include "fontset.h" |
36 #include "blockinput.h" | |
37 #include "w32gui.h" | |
38 #include "w32term.h" | |
39 #include "w32bdf.h" | |
40 | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
41 /* 10 planes */ |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
42 #define BDF_CODEPOINT_HEAP_INITIAL_SIZE (96 * 10) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
43 /* about 96 characters */ |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
44 #define BDF_BITMAP_HEAP_INITIAL_SIZE (64 * 96) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
45 |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
46 HANDLE hbdf_cp_heap = INVALID_HANDLE_VALUE; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
47 HANDLE hbdf_bmp_heap = INVALID_HANDLE_VALUE; |
24841
d2d412758428
(clear_cached_bitmap_slots): Remove.
Jason Rumney <jasonr@gnu.org>
parents:
24496
diff
changeset
|
48 |
24141 | 49 void w32_free_bdf_font(bdffont *fontp); |
50 bdffont *w32_init_bdf_font(char *filename); | |
51 | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
52 cache_bitmap cached_bitmap_slots[BDF_FONT_CACHE_SIZE]; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
53 cache_bitmap *pcached_bitmap_latest = cached_bitmap_slots; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
54 |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
55 #define FONT_CACHE_SLOT_OVER_P(p) ((p) >= cached_bitmap_slots + BDF_FONT_CACHE_SIZE) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
56 |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43398
diff
changeset
|
57 static int |
24141 | 58 search_file_line(char *key, char *start, int len, char **val, char **next) |
59 { | |
35285
dd533a188c51
(search_file_line, get_cached_font_char)
Jason Rumney <jasonr@gnu.org>
parents:
34777
diff
changeset
|
60 unsigned int linelen; |
dd533a188c51
(search_file_line, get_cached_font_char)
Jason Rumney <jasonr@gnu.org>
parents:
34777
diff
changeset
|
61 unsigned char *p; |
24141 | 62 |
63 p = memchr(start, '\n', len); | |
64 if (!p) return -1; | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
65 for (;(unsigned char *)start < p;start++) |
24141 | 66 { |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
67 if ((*start != ' ') && (*start != '\t')) break; |
24141 | 68 } |
32722
6385ffa62dd5
(w32_load_bdf_font): Call w32_cache_char_metrics.
Andrew Innes <andrewi@gnu.org>
parents:
32024
diff
changeset
|
69 linelen = (char *) p - start + 1; |
24141 | 70 *next = p + 1; |
71 if (strncmp(start, key, min(strlen(key), linelen)) == 0) | |
72 { | |
73 *val = start + strlen(key); | |
74 return 1; | |
75 } | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43398
diff
changeset
|
76 |
24141 | 77 return 0; |
78 } | |
79 | |
80 static int | |
81 proceed_file_line(char *key, char *start, int *len, char **val, char **next) | |
82 { | |
83 int flag = 0; | |
84 | |
85 do { | |
86 flag = search_file_line(key, start, *len, val, next); | |
87 *len -= (int)(*next - start); | |
88 start = *next; | |
89 }while(flag == 0); | |
90 | |
91 if (flag == -1) return 0; | |
92 return 1; | |
93 } | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
94 |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
95 char* |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
96 get_quoted_string(char *start, char *end) |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
97 { |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
98 char *p, *q, *result; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
99 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
100 p = memchr(start, '\"', end - start); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
101 if (!p) return NULL; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
102 p++; |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
103 q = memchr(p, '\"', end - p); |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
104 if (!q) return NULL; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
105 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
106 result = (char*) xmalloc(q - p + 1); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
107 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
108 memcpy(result, p, q - p); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
109 result[q - p] = '\0'; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
110 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
111 return result; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
112 } |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
113 |
24141 | 114 static int |
115 set_bdf_font_info(bdffont *fontp) | |
116 { | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
117 unsigned char *start, *p, *q; |
24141 | 118 int len, flag; |
119 int bbw, bbh, bbx, bby; | |
120 int val1; | |
121 | |
122 len = fontp->size; | |
123 start = fontp->font; | |
124 | |
125 fontp->yoffset = 0; | |
126 fontp->relative_compose = 0; | |
127 fontp->default_ascent = 0; | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
128 |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
129 fontp->registry = NULL; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
130 fontp->encoding = NULL; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
131 fontp->slant = NULL; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
132 /* fontp->width = NULL; */ |
24141 | 133 |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
134 flag = proceed_file_line("FONTBOUNDINGBOX", start, &len, |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
135 (char **)&p, (char **)&q); |
24141 | 136 if (!flag) return 0; |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
137 bbw = strtol(p, (char **)&start, 10); |
24141 | 138 p = start; |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
139 bbh = strtol(p, (char **)&start, 10); |
24141 | 140 p = start; |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
141 bbx = strtol(p, (char **)&start, 10); |
24141 | 142 p = start; |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
143 bby = strtol(p, (char **)&start, 10); |
24141 | 144 |
145 fontp->llx = bbx; | |
146 fontp->lly = bby; | |
147 fontp->urx = bbw + bbx; | |
148 fontp->ury = bbh + bby; | |
149 fontp->width = bbw; | |
150 fontp->height = bbh; | |
151 start = q; | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
152 flag = proceed_file_line("STARTPROPERTIES", start, &len, |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
153 (char **)&p, (char **)&q); |
24141 | 154 if (!flag) return 1; |
155 | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
156 flag = 0; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
157 |
24141 | 158 do { |
159 start = q; | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
160 if (search_file_line("PIXEL_SIZE", start, len, |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
161 (char **)&p, (char **)&q) == 1) |
24141 | 162 { |
163 val1 = atoi(p); | |
164 fontp->pixsz = val1; | |
165 } | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
166 else if (search_file_line("FONT_ASCENT", start, len, |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
167 (char **)&p, (char **)&q) == 1) |
24141 | 168 { |
169 val1 = atoi(p); | |
170 fontp->ury = val1; | |
171 } | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
172 else if (search_file_line("FONT_DESCENT", start, len, |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
173 (char **)&p, (char **)&q) == 1) |
24141 | 174 { |
175 val1 = atoi(p); | |
176 fontp->lly = -val1; | |
177 } | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
178 else if (search_file_line("_MULE_BASELINE_OFFSET", start, len, |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
179 (char **)&p, (char **)&q) == 1) |
24141 | 180 { |
181 val1 = atoi(p); | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
182 fontp->yoffset = -val1; |
24141 | 183 } |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
184 else if (search_file_line("_MULE_RELATIVE_COMPOSE", start, len, |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
185 (char **)&p, (char **)&q) == 1) |
24141 | 186 { |
187 val1 = atoi(p); | |
188 fontp->relative_compose = val1; | |
189 } | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
190 else if (search_file_line("_MULE_DEFAULT_ASCENT", start, len, |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
191 (char **)&p, (char **)&q) == 1) |
24141 | 192 { |
193 val1 = atoi(p); | |
194 fontp->default_ascent = val1; | |
195 } | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
196 else if (search_file_line("CHARSET_REGISTRY", start, len, |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
197 (char **)&p, (char **)&q) == 1) |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
198 { |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
199 fontp->registry = get_quoted_string(p, q); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
200 } |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
201 else if (search_file_line("CHARSET_ENCODING", start, len, |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
202 (char **)&p, (char **)&q) == 1) |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
203 { |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
204 fontp->encoding = get_quoted_string(p, q); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
205 } |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
206 else if (search_file_line("SLANT", start, len, |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
207 (char **)&p, (char **)&q) == 1) |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
208 { |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
209 fontp->slant = get_quoted_string(p, q); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
210 } |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
211 /* |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
212 else if (search_file_line("SETWIDTH_NAME", start, len, |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
213 (char **)&p, (char **)&q) == 1) |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
214 { |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
215 fontp->width = get_quoted_string(p, q); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
216 } |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
217 */ |
24141 | 218 else |
219 { | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
220 flag = search_file_line("ENDPROPERTIES", start, len, |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
221 (char **)&p, (char **)&q); |
24141 | 222 } |
223 if (flag == -1) return 0; | |
224 len -= (q - start); | |
225 }while(flag == 0); | |
226 start = q; | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
227 flag = proceed_file_line("CHARS", start, &len, (char **)&p, (char **)&q); |
24141 | 228 if (!flag) return 0; |
33038
5a1e3282fe2e
(set_bdf_font_info): Set it.
Jason Rumney <jasonr@gnu.org>
parents:
32722
diff
changeset
|
229 fontp->nchars = atoi(p); |
24141 | 230 fontp->seeked = q; |
231 | |
232 return 1; | |
233 } | |
234 | |
235 bdffont* | |
236 w32_init_bdf_font(char *filename) | |
237 { | |
238 HANDLE hfile, hfilemap; | |
239 bdffont *bdffontp; | |
240 unsigned char *font; | |
241 BY_HANDLE_FILE_INFORMATION fileinfo; | |
242 int i; | |
243 | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
244 if (hbdf_cp_heap == INVALID_HANDLE_VALUE) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
245 hbdf_cp_heap = HeapCreate(0, BDF_CODEPOINT_HEAP_INITIAL_SIZE, 0); |
34777
3b4361fc6ae3
(w32_init_bdf_font): Fix test for valid bmp heap.
Jason Rumney <jasonr@gnu.org>
parents:
33038
diff
changeset
|
246 if (hbdf_bmp_heap == INVALID_HANDLE_VALUE) |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
247 hbdf_bmp_heap = HeapCreate(0, BDF_BITMAP_HEAP_INITIAL_SIZE, 0); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
248 |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
249 if (!hbdf_cp_heap || !hbdf_bmp_heap) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
250 error("Fail to create heap for BDF."); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
251 |
24141 | 252 hfile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, |
253 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); | |
254 if (hfile == INVALID_HANDLE_VALUE) return NULL; | |
255 if (!GetFileInformationByHandle(hfile, &fileinfo) || | |
256 (fileinfo.nFileSizeHigh != 0) || | |
257 (fileinfo.nFileSizeLow > BDF_FILE_SIZE_MAX)) | |
258 { | |
259 CloseHandle(hfile); | |
260 error("Fail to open BDF file."); | |
261 } | |
262 hfilemap = CreateFileMapping(hfile, NULL, PAGE_READONLY, 0, 0, NULL); | |
263 if (hfilemap == INVALID_HANDLE_VALUE) | |
264 { | |
265 CloseHandle(hfile); | |
266 error("Can't map font."); | |
267 } | |
268 | |
269 font = MapViewOfFile(hfilemap, FILE_MAP_READ, 0, 0, 0); | |
270 | |
271 if (!font) | |
272 { | |
273 CloseHandle(hfile); | |
274 CloseHandle(hfilemap); | |
275 error("Can't view font."); | |
276 } | |
277 | |
278 bdffontp = (bdffont *) xmalloc(sizeof(bdffont)); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43398
diff
changeset
|
279 |
24141 | 280 for(i = 0;i < BDF_FIRST_OFFSET_TABLE;i++) |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
281 bdffontp->chtbl[i] = NULL; |
24141 | 282 bdffontp->size = fileinfo.nFileSizeLow; |
283 bdffontp->font = font; | |
284 bdffontp->hfile = hfile; | |
285 bdffontp->hfilemap = hfilemap; | |
286 bdffontp->filename = (char*) xmalloc(strlen(filename) + 1); | |
287 strcpy(bdffontp->filename, filename); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43398
diff
changeset
|
288 |
24141 | 289 if (!set_bdf_font_info(bdffontp)) |
290 { | |
291 w32_free_bdf_font(bdffontp); | |
292 error("Invalid BDF font!"); | |
293 } | |
294 return bdffontp; | |
295 } | |
296 | |
297 void | |
298 w32_free_bdf_font(bdffont *fontp) | |
299 { | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
300 int i, j; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
301 font_char *pch; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
302 cache_bitmap *pcb; |
24141 | 303 |
304 UnmapViewOfFile(fontp->hfilemap); | |
305 CloseHandle(fontp->hfilemap); | |
306 CloseHandle(fontp->hfile); | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
307 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
308 if (fontp->registry) xfree(fontp->registry); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
309 if (fontp->encoding) xfree(fontp->encoding); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
310 if (fontp->slant) xfree(fontp->slant); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
311 /* if (fontp->width) xfree(fontp->width); */ |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
312 |
24141 | 313 xfree(fontp->filename); |
314 for(i = 0;i < BDF_FIRST_OFFSET_TABLE;i++) | |
315 { | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
316 pch = fontp->chtbl[i]; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
317 if (pch) |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
318 { |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
319 for (j = 0;j < BDF_SECOND_OFFSET_TABLE;j++) |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
320 { |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
321 pcb = pch[j].pcbmp; |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
322 if (pcb) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
323 { |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
324 if (pcb->pbmp) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
325 HeapFree(hbdf_bmp_heap, 0, pcb->pbmp); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
326 pcb->psrc = NULL; |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
327 } |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
328 } |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
329 HeapFree(hbdf_cp_heap, 0, pch); |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
330 } |
24141 | 331 } |
332 xfree(fontp); | |
333 } | |
334 | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
335 static font_char* |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
336 get_cached_font_char(bdffont *fontp, int index) |
24141 | 337 { |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
338 font_char *pch, *result; |
24141 | 339 |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
340 if (!BDF_CODEPOINT_RANGE_COVER_P(index)) |
24141 | 341 return NULL; |
342 | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
343 pch = fontp->chtbl[BDF_FIRST_OFFSET(index)]; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
344 if (!pch) |
24141 | 345 return NULL; |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
346 |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
347 result = &pch[BDF_SECOND_OFFSET(index)]; |
24141 | 348 |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
349 if (!result->offset) return NULL; |
24141 | 350 |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
351 return result; |
24141 | 352 } |
353 | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
354 static font_char* |
24141 | 355 cache_char_offset(bdffont *fontp, int index, unsigned char *offset) |
356 { | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
357 font_char *pch, *result; |
24141 | 358 |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
359 if (!BDF_CODEPOINT_RANGE_COVER_P(index)) |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
360 return NULL; |
24141 | 361 |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
362 pch = fontp->chtbl[BDF_FIRST_OFFSET(index)]; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
363 if (!pch) |
24141 | 364 { |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
365 pch = fontp->chtbl[BDF_FIRST_OFFSET(index)] = |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
366 (font_char*) HeapAlloc(hbdf_cp_heap, |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43398
diff
changeset
|
367 HEAP_ZERO_MEMORY, |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
368 sizeof(font_char) * |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
369 BDF_SECOND_OFFSET_TABLE); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
370 if (!pch) return NULL; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
371 /* memset(pch, 0, sizeof(font_char) * BDF_SECOND_OFFSET_TABLE); */ |
24141 | 372 } |
373 | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
374 result = &pch[BDF_SECOND_OFFSET(index)]; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
375 result->offset = offset; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
376 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
377 return result; |
24141 | 378 } |
379 | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
380 static font_char* |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
381 seek_char(bdffont *fontp, int index) |
24141 | 382 { |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
383 font_char *result; |
24141 | 384 int len, flag, font_index; |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
385 unsigned char *start, *p, *q; |
24141 | 386 |
387 if (!fontp->seeked) return NULL; | |
388 | |
389 start = fontp->seeked; | |
390 len = fontp->size - (start - fontp->font); | |
391 | |
392 do { | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
393 flag = proceed_file_line("ENCODING", start, &len, |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
394 (char **)&p, (char **)&q); |
24141 | 395 if (!flag) |
396 { | |
397 fontp->seeked = NULL; | |
398 return NULL; | |
399 } | |
400 font_index = atoi(p); | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
401 result = cache_char_offset(fontp, font_index, q); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
402 if (!result) return NULL; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
403 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
404 start = result->offset; |
24141 | 405 } while (font_index != index); |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
406 fontp->seeked = start; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
407 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
408 return result; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
409 } |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
410 |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
411 static void |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
412 clear_cached_bitmap_slots() |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
413 { |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
414 int i; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
415 cache_bitmap *p; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
416 |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
417 p = pcached_bitmap_latest; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
418 for (i = 0;i < BDF_FONT_CLEAR_SIZE;i++) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
419 { |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
420 if (p->psrc) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
421 { |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
422 if (p->pbmp) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
423 HeapFree(hbdf_bmp_heap, 0, p->pbmp); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
424 p->psrc->pcbmp = NULL; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
425 p->psrc = NULL; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
426 } |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
427 p++; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
428 if (FONT_CACHE_SLOT_OVER_P(p)) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
429 p = cached_bitmap_slots; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
430 } |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
431 } |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
432 |
24141 | 433 #define GET_HEX_VAL(x) ((isdigit(x)) ? ((x) - '0') : \ |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
434 (((x) >= 'A') && ((x) <= 'F')) ? ((x) - 'A' + 10) : \ |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
435 (((x) >= 'a') && ((x) <= 'f')) ? ((x) - 'a' + 10) : \ |
24141 | 436 (-1)) |
437 | |
438 int | |
439 w32_get_bdf_glyph(bdffont *fontp, int index, int size, glyph_struct *glyph) | |
440 { | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
441 font_char *pch; |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
442 unsigned char *start, *p, *q, *bitmapp; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
443 unsigned char val, val1, val2; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
444 int i, j, len, flag, consumed; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
445 int align, rowbytes; |
24141 | 446 |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
447 pch = get_cached_font_char(fontp, index); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
448 if (!pch) |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
449 { |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
450 pch = seek_char(fontp, index); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
451 if (!pch) |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
452 return 0; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
453 } |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
454 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
455 start = pch->offset; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
456 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
457 if ((size == 0) && pch->pcbmp) |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
458 { |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
459 glyph->metric = pch->pcbmp->metric; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
460 return 1; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
461 } |
24141 | 462 |
463 len = fontp->size - (start - fontp->font); | |
464 | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
465 flag = proceed_file_line("DWIDTH", start, &len, (char **)&p, (char **)&q); |
24141 | 466 if (!flag) |
467 return 0; | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
468 glyph->metric.dwidth = atoi(p); |
24141 | 469 |
470 start = q; | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
471 flag = proceed_file_line("BBX", start, &len, (char **)&p, (char **)&q); |
24141 | 472 if (!flag) |
473 return 0; | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
474 glyph->metric.bbw = strtol(p, (char **)&start, 10); |
24141 | 475 p = start; |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
476 glyph->metric.bbh = strtol(p, (char **)&start, 10); |
24141 | 477 p = start; |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
478 glyph->metric.bbox = strtol(p, (char **)&start, 10); |
24141 | 479 p = start; |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
480 glyph->metric.bboy = strtol(p, (char **)&start, 10); |
24141 | 481 |
482 if (size == 0) return 1; | |
483 | |
484 start = q; | |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
485 flag = proceed_file_line("BITMAP", start, &len, (char **)&p, (char **)&q); |
24141 | 486 if (!flag) |
487 return 0; | |
488 | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
489 consumed = 0; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
490 flag = 0; |
24141 | 491 p = q; |
492 bitmapp = glyph->bitmap; | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
493 rowbytes = (glyph->metric.bbw + 7) / 8; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
494 /* DIB requires DWORD alignment. */ |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
495 align = sizeof(DWORD) - rowbytes % sizeof(DWORD); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
496 consumed = glyph->metric.bbh * (rowbytes + align); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
497 glyph->bitmap_size = consumed; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
498 glyph->row_byte_size = rowbytes; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
499 if (size < consumed) return 0; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
500 |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
501 for(i = 0;i < glyph->metric.bbh;i++) |
24141 | 502 { |
503 q = memchr(p, '\n', len); | |
504 if (!q) return 0; | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
505 for(j = 0;((q > p) && (j < rowbytes));j++) |
24141 | 506 { |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
507 int ival = GET_HEX_VAL(*p); |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
508 |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
509 if (ival == -1) return 0; |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
510 val1 = ival; |
24141 | 511 p++; |
37701
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
512 ival = GET_HEX_VAL(*p); |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
513 if (ival == -1) return 0; |
bc25122cbfe4
(search_file_line, set_bdf_font_info, seek_char)
Eli Zaretskii <eliz@gnu.org>
parents:
35285
diff
changeset
|
514 val2 = ival; |
24141 | 515 p++; |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
516 val = (unsigned char)((val1 << 4) | val2); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
517 if (val) flag = 1; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
518 *bitmapp++ = val; |
24141 | 519 } |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
520 for(j = 0;j < align;j++) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
521 *bitmapp++ = 0x00; |
24141 | 522 p = q + 1; |
523 } | |
524 | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
525 /* If this glyph is white space, return -1. */ |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
526 if (flag == 0) return -1; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
527 |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
528 return consumed; |
24141 | 529 } |
530 | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
531 static |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
532 cache_bitmap* |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
533 get_bitmap_with_cache(bdffont *fontp, int index) |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
534 { |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
535 int bitmap_size, bitmap_real_size; |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
536 font_char *pch; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
537 cache_bitmap* pcb; |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
538 unsigned char *pbmp; |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
539 glyph_struct glyph; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
540 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
541 pch = get_cached_font_char(fontp, index); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
542 if (pch) |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
543 { |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
544 pcb = pch->pcbmp; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
545 if (pcb) return pcb; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
546 } |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
547 |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
548 bitmap_size = ((fontp->urx - fontp->llx) / 8 + 3) * (fontp->ury - fontp->lly) |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
549 + 256; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
550 glyph.bitmap = (unsigned char*) alloca(sizeof(unsigned char) * bitmap_size); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
551 |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
552 bitmap_real_size = w32_get_bdf_glyph(fontp, index, bitmap_size, &glyph); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
553 |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
554 if (bitmap_real_size == 0) |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
555 return NULL; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
556 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
557 pch = get_cached_font_char(fontp, index); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
558 if (!pch) return NULL; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
559 |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
560 if (bitmap_real_size > 0) |
24841
d2d412758428
(clear_cached_bitmap_slots): Remove.
Jason Rumney <jasonr@gnu.org>
parents:
24496
diff
changeset
|
561 { |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
562 pbmp = (unsigned char*) HeapAlloc(hbdf_bmp_heap, 0, |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
563 bitmap_real_size); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
564 if (!pbmp) return NULL; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
565 memcpy(pbmp, glyph.bitmap, bitmap_real_size); |
24841
d2d412758428
(clear_cached_bitmap_slots): Remove.
Jason Rumney <jasonr@gnu.org>
parents:
24496
diff
changeset
|
566 } |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
567 else |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
568 pbmp = NULL; /* white space character */ |
24841
d2d412758428
(clear_cached_bitmap_slots): Remove.
Jason Rumney <jasonr@gnu.org>
parents:
24496
diff
changeset
|
569 |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
570 pcb = pcached_bitmap_latest; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
571 if (pcb->psrc) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
572 clear_cached_bitmap_slots(); |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
573 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
574 pcb->psrc = pch; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
575 pcb->metric = glyph.metric; |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
576 pcb->pbmp = pbmp; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
577 pcb->bitmap_size = glyph.bitmap_size; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
578 pcb->row_byte_size = glyph.row_byte_size; |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
579 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
580 pch->pcbmp = pcb; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43398
diff
changeset
|
581 |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
582 pcached_bitmap_latest++; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
583 if (FONT_CACHE_SLOT_OVER_P(pcached_bitmap_latest)) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
584 pcached_bitmap_latest = cached_bitmap_slots; |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
585 |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
586 return pcb; |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
587 } |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
588 |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
589 static HBITMAP |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
590 create_offscreen_bitmap(HDC hdc, int width, int height, unsigned char **bitsp) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
591 { |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
592 struct { |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
593 BITMAPINFOHEADER h; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
594 RGBQUAD c[2]; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
595 } info; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
596 |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
597 memset(&info, 0, sizeof(info)); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
598 info.h.biSize = sizeof(BITMAPINFOHEADER); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
599 info.h.biWidth = width; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
600 info.h.biHeight = -height; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
601 info.h.biPlanes = 1; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
602 info.h.biBitCount = 1; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
603 info.h.biCompression = BI_RGB; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
604 info.c[1].rgbRed = info.c[1].rgbGreen = info.c[1].rgbBlue = 255; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
605 |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
606 return CreateDIBSection(hdc, (LPBITMAPINFO)&info, |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
607 DIB_RGB_COLORS, bitsp, NULL, 0); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
608 } |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
609 |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
610 glyph_metric * |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
611 w32_BDF_TextMetric(bdffont *fontp, unsigned char *text, int dim) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
612 { |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
613 int index; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
614 cache_bitmap *pcb; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
615 |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
616 if (dim == 1) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
617 index = *text; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
618 else |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
619 index = MAKELENDSHORT(text[1], text[0]); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
620 |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
621 pcb = get_bitmap_with_cache(fontp, index); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
622 if (!pcb) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
623 return NULL; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
624 |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
625 return &(pcb->metric); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
626 } |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
627 |
24141 | 628 int |
629 w32_BDF_TextOut(bdffont *fontp, HDC hdc, int left, | |
630 int top, unsigned char *text, int dim, int bytelen, | |
631 int fixed_pitch_size) | |
632 { | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
633 int index, btop; |
24141 | 634 unsigned char *textp; |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
635 cache_bitmap *pcb; |
24141 | 636 HBRUSH hFgBrush, hOrgBrush; |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
637 HANDLE horgobj; |
24141 | 638 UINT textalign; |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
639 int width, height; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
640 HDC hCompatDC; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
641 int ret = 1; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
642 static HBITMAP hBMP = 0; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
643 static HDC DIBsection_hdc = 0; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
644 static int DIBsection_width, DIBsection_height; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
645 static unsigned char *bits; |
24141 | 646 |
647 hCompatDC = CreateCompatibleDC(hdc); | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
648 if (!hCompatDC) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
649 return 0; |
24141 | 650 |
651 textalign = GetTextAlign(hdc); | |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43398
diff
changeset
|
652 |
24141 | 653 hFgBrush = CreateSolidBrush(GetTextColor(hdc)); |
654 hOrgBrush = SelectObject(hdc, hFgBrush); | |
655 | |
656 textp = text; | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
657 |
24141 | 658 while(bytelen > 0) |
659 { | |
660 if (dim == 1) | |
661 { | |
662 index = *textp++; | |
663 bytelen--; | |
664 } | |
665 else | |
666 { | |
667 bytelen -= 2; | |
668 if (bytelen < 0) break; | |
33038
5a1e3282fe2e
(set_bdf_font_info): Set it.
Jason Rumney <jasonr@gnu.org>
parents:
32722
diff
changeset
|
669 index = MAKELENDSHORT(textp[0], textp[1]); |
24141 | 670 textp += 2; |
671 } | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
672 pcb = get_bitmap_with_cache(fontp, index); |
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
673 if (!pcb) |
24141 | 674 { |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
675 ret = 0; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
676 break; |
24141 | 677 } |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
678 if (pcb->pbmp) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
679 { |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
680 width = pcb->metric.bbw; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
681 height = pcb->metric.bbh; |
49600
23a1cea22d13
Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
43398
diff
changeset
|
682 |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
683 if (!(hBMP |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
684 && (DIBsection_hdc == hdc) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
685 && (DIBsection_width == width) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
686 && (DIBsection_height == height))) |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
687 { |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
688 if (hBMP) DeleteObject(hBMP); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
689 hBMP = create_offscreen_bitmap(hdc, width, height, &bits); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
690 DIBsection_hdc = hdc; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
691 DIBsection_width = width; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
692 DIBsection_height = height; |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
693 if (!hBMP) return 0; |
24141 | 694 } |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
695 |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
696 memcpy(bits, pcb->pbmp, pcb->bitmap_size); |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
697 |
24141 | 698 if (textalign & TA_BASELINE) |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
699 btop = top - (pcb->metric.bbh + pcb->metric.bboy); |
24141 | 700 else if (textalign & TA_BOTTOM) |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
701 btop = top - pcb->metric.bbh; |
24141 | 702 else |
703 btop = top; | |
704 | |
705 horgobj = SelectObject(hCompatDC, hBMP); | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
706 BitBlt(hdc, left, btop, width, height, hCompatDC, 0, 0, 0xE20746); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
707 SelectObject(hCompatDC, horgobj); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
708 } |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
709 |
24141 | 710 if (fixed_pitch_size) |
711 left += fixed_pitch_size; | |
712 else | |
24496
541ff963ba80
Merged patches from Meadow.
Geoff Voelker <voelker@cs.washington.edu>
parents:
24141
diff
changeset
|
713 left += pcb->metric.dwidth; |
24141 | 714 } |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
715 |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
716 DeleteDC(hCompatDC); |
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
717 |
24141 | 718 SelectObject(hdc, hOrgBrush); |
719 DeleteObject(hFgBrush); | |
720 | |
32024
a0ba404b97a5
(search_file_line): Fix skipping of whitespace.
Jason Rumney <jasonr@gnu.org>
parents:
31108
diff
changeset
|
721 return ret; |
24141 | 722 } |
723 | |
724 struct font_info *w32_load_bdf_font (struct frame *f, char *fontname, | |
725 int size, char* filename) | |
726 { | |
727 struct w32_display_info *dpyinfo = FRAME_W32_DISPLAY_INFO (f); | |
728 struct font_info *fontp; | |
729 XFontStruct *font; | |
730 bdffont* bdf_font; | |
731 | |
732 bdf_font = w32_init_bdf_font (filename); | |
733 | |
734 if (!bdf_font) return NULL; | |
735 | |
736 font = (XFontStruct *) xmalloc (sizeof (XFontStruct)); | |
32722
6385ffa62dd5
(w32_load_bdf_font): Call w32_cache_char_metrics.
Andrew Innes <andrewi@gnu.org>
parents:
32024
diff
changeset
|
737 bzero (font, sizeof (*font)); |
24141 | 738 |
739 font->bdf = bdf_font; | |
740 font->hfont = 0; | |
741 | |
33038
5a1e3282fe2e
(set_bdf_font_info): Set it.
Jason Rumney <jasonr@gnu.org>
parents:
32722
diff
changeset
|
742 /* NTEMACS_TODO: Better way of determining if a font is double byte |
5a1e3282fe2e
(set_bdf_font_info): Set it.
Jason Rumney <jasonr@gnu.org>
parents:
32722
diff
changeset
|
743 or not. */ |
5a1e3282fe2e
(set_bdf_font_info): Set it.
Jason Rumney <jasonr@gnu.org>
parents:
32722
diff
changeset
|
744 font->double_byte_p = bdf_font->nchars > 255 ? 1 : 0; |
29315
e0ea7a9dd20b
(w32_load_bdf_font): Initialize font->double_byte_p.
Jason Rumney <jasonr@gnu.org>
parents:
28271
diff
changeset
|
745 |
32722
6385ffa62dd5
(w32_load_bdf_font): Call w32_cache_char_metrics.
Andrew Innes <andrewi@gnu.org>
parents:
32024
diff
changeset
|
746 w32_cache_char_metrics (font); |
6385ffa62dd5
(w32_load_bdf_font): Call w32_cache_char_metrics.
Andrew Innes <andrewi@gnu.org>
parents:
32024
diff
changeset
|
747 |
24141 | 748 /* Do we need to create the table? */ |
749 if (dpyinfo->font_table_size == 0) | |
750 { | |
751 dpyinfo->font_table_size = 16; | |
752 dpyinfo->font_table | |
753 = (struct font_info *) xmalloc (dpyinfo->font_table_size | |
754 * sizeof (struct font_info)); | |
755 } | |
756 /* Do we need to grow the table? */ | |
757 else if (dpyinfo->n_fonts | |
758 >= dpyinfo->font_table_size) | |
759 { | |
760 dpyinfo->font_table_size *= 2; | |
761 dpyinfo->font_table | |
762 = (struct font_info *) xrealloc (dpyinfo->font_table, | |
763 (dpyinfo->font_table_size | |
764 * sizeof (struct font_info))); | |
765 } | |
766 | |
767 fontp = dpyinfo->font_table + dpyinfo->n_fonts; | |
768 | |
769 /* Now fill in the slots of *FONTP. */ | |
770 BLOCK_INPUT; | |
771 fontp->font = font; | |
772 fontp->font_idx = dpyinfo->n_fonts; | |
773 fontp->name = (char *) xmalloc (strlen (fontname) + 1); | |
774 bcopy (fontname, fontp->name, strlen (fontname) + 1); | |
775 fontp->full_name = fontp->name; | |
776 fontp->size = FONT_WIDTH (font); | |
777 fontp->height = FONT_HEIGHT (font); | |
778 | |
779 /* The slot `encoding' specifies how to map a character | |
780 code-points (0x20..0x7F or 0x2020..0x7F7F) of each charset to | |
781 the font code-points (0:0x20..0x7F, 1:0xA0..0xFF, 0:0x2020..0x7F7F, | |
782 the font code-points (0:0x20..0x7F, 1:0xA0..0xFF, | |
783 0:0x2020..0x7F7F, 1:0xA0A0..0xFFFF, 3:0x20A0..0x7FFF, or | |
784 2:0xA020..0xFF7F). For the moment, we don't know which charset | |
785 uses this font. So, we set informatoin in fontp->encoding[1] | |
786 which is never used by any charset. If mapping can't be | |
787 decided, set FONT_ENCODING_NOT_DECIDED. */ | |
788 fontp->encoding[1] = FONT_ENCODING_NOT_DECIDED; | |
789 fontp->baseline_offset = bdf_font->yoffset; | |
790 fontp->relative_compose = bdf_font->relative_compose; | |
791 fontp->default_ascent = bdf_font->default_ascent; | |
792 | |
43398 | 793 /* Set global flag fonts_changed_p to non-zero if the font loaded |
794 has a character with a smaller width than any other character | |
795 before, or if the font loaded has a smaller height than any | |
796 other font loaded before. If this happens, it will make a | |
797 glyph matrix reallocation necessary. */ | |
798 fonts_changed_p |= x_compute_min_glyph_bounds (f); | |
799 | |
24141 | 800 UNBLOCK_INPUT; |
801 dpyinfo->n_fonts++; | |
802 return fontp; | |
803 } | |
804 | |
41986 | 805 /* Check a file for an XLFD string describing it. */ |
24141 | 806 int w32_BDF_to_x_font (char *file, char* xstr, int len) |
807 { | |
808 HANDLE hfile, hfilemap; | |
809 BY_HANDLE_FILE_INFORMATION fileinfo; | |
31108 | 810 char *font, *start, *p, *q; |
24141 | 811 int flag, size, retval = 0; |
812 | |
813 hfile = CreateFile (file, GENERIC_READ, FILE_SHARE_READ, NULL, | |
814 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); | |
815 if (hfile == INVALID_HANDLE_VALUE) return 0; | |
816 if (!GetFileInformationByHandle(hfile, &fileinfo) || | |
817 (fileinfo.nFileSizeHigh != 0) || | |
818 (fileinfo.nFileSizeLow > BDF_FILE_SIZE_MAX)) | |
819 { | |
820 CloseHandle (hfile); | |
821 return 0; | |
822 } | |
823 size = fileinfo.nFileSizeLow; | |
824 | |
825 hfilemap = CreateFileMapping (hfile, NULL, PAGE_READONLY, 0, 0, NULL); | |
826 if (hfilemap == INVALID_HANDLE_VALUE) | |
827 { | |
828 CloseHandle (hfile); | |
829 return 0; | |
830 } | |
831 | |
832 font = MapViewOfFile (hfilemap, FILE_MAP_READ, 0, 0, 0); | |
833 if (!font) | |
834 { | |
835 CloseHandle (hfile); | |
836 CloseHandle (hfilemap); | |
837 return 0; | |
838 } | |
839 start = font; | |
840 | |
841 flag = proceed_file_line ("FONT ", start, &size, &p, &q); | |
842 if (flag) | |
843 { | |
844 /* If font provides a description of itself, check it is a | |
845 full XLFD before accepting it. */ | |
846 int count = 0; | |
847 char *s; | |
848 | |
849 for (s = p; s < q; s++) | |
850 if (*s == '\n') | |
851 break; | |
852 else if (*s == '-') | |
853 count++; | |
854 if (count == 14 && q - p - 1 <= len) | |
855 { | |
856 strncpy (xstr, p, q-p-1); | |
857 xstr[q-p-1] = '\0'; | |
858 /* Files may have DOS line ends (ie still ^M on end). */ | |
859 if (iscntrl(xstr[q-p-2])) | |
860 xstr[q-p-2] = '\0'; | |
861 | |
862 retval = 1; | |
863 } | |
864 } | |
865 CloseHandle (hfile); | |
866 CloseHandle (hfilemap); | |
867 return retval; | |
868 } |