annotate src/w32bdf.c @ 38588:08a4c6c00af0

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