4 * map dvi fonts to X fonts
8 #include <X11/IntrinsicP.h>
9 #include <X11/StringDefs.h>
13 #include "XFontName.h"
15 static DisposeFontSizes();
25 n = XtMalloc (strlen (s) + 1);
32 LookupFontByPosition (dw, position)
38 for (f = dw->dvi.fonts; f; f = f->next)
39 if (f->dvi_number == position)
51 for (f = dw->dvi.fonts; f; f = f->next)
52 if (f->dvi_number > n)
57 static DviFontSizeList *
58 LookupFontSizeBySize (dw, f, size)
63 DviFontSizeList *fs, *best = 0, *smallest = 0;
66 unsigned int fontNameAttributes;
67 char fontNameString[2048];
71 decipointsize = (10*size)/dw->dvi.sizescale;
72 for (best = f->sizes; best; best = best->next)
73 if (best->size == decipointsize)
75 best = (DviFontSizeList *) XtMalloc(sizeof *best);
76 best->next = f->sizes;
77 best->size = decipointsize;
79 XParseFontName (f->x_name, &fontName, &fontNameAttributes);
80 fontNameAttributes &= ~(FontNamePixelSize|FontNameAverageWidth);
81 fontNameAttributes |= FontNameResolutionX;
82 fontNameAttributes |= FontNameResolutionY;
83 fontNameAttributes |= FontNamePointSize;
84 fontName.ResolutionX = dw->dvi.display_resolution;
85 fontName.ResolutionY = dw->dvi.display_resolution;
86 fontName.PointSize = decipointsize;
87 XFormatFontName (&fontName, fontNameAttributes, fontNameString);
88 best->x_name = savestr (fontNameString);
89 best->doesnt_exist = 0;
93 for (fs = f->sizes; fs; fs=fs->next) {
94 if (dw->dvi.sizescale*fs->size <= 10*size
95 && fs->size >= bestsize) {
99 if (smallest == 0 || fs->size < smallest->size)
102 return best ? best : smallest;
106 SkipFontNameElement (n)
115 # define SizePosition 8
116 # define EncodingPosition 13
119 ConvertFontNameToSize (n)
124 for (i = 0; i < SizePosition; i++) {
125 n = SkipFontNameElement (n);
134 ConvertFontNameToEncoding (n)
138 for (i = 0; i < EncodingPosition; i++) {
139 n = SkipFontNameElement (n);
147 InstallFontSizes (dw, x_name, scalablep)
152 char fontNameString[2048];
156 DviFontSizeList *sizes, *new;
158 unsigned int fontNameAttributes;
161 if (!XParseFontName (x_name, &fontName, &fontNameAttributes))
163 fontNameAttributes &= ~(FontNamePixelSize|FontNamePointSize
164 |FontNameAverageWidth);
165 fontNameAttributes |= FontNameResolutionX;
166 fontNameAttributes |= FontNameResolutionY;
167 fontName.ResolutionX = dw->dvi.display_resolution;
168 fontName.ResolutionY = dw->dvi.display_resolution;
169 XFormatFontName (&fontName, fontNameAttributes, fontNameString);
170 fonts = XListFonts (XtDisplay (dw), fontNameString, 10000000, &count);
172 for (i = 0; i < count; i++) {
173 size = ConvertFontNameToSize (fonts[i]);
175 DisposeFontSizes (dw, sizes);
181 new = (DviFontSizeList *) XtMalloc (sizeof *new);
184 new->x_name = savestr (fonts[i]);
185 new->doesnt_exist = 0;
190 XFreeFontNames (fonts);
195 DisposeFontSizes (dw, fs)
199 DviFontSizeList *next;
201 for (; fs; fs=next) {
205 if (fs->font && fs->font != dw->dvi.default_font) {
206 XUnloadFont (XtDisplay (dw), fs->font->fid);
207 XFree ((char *)fs->font);
209 XtFree ((char *) fs);
214 InstallFont (dw, position, dvi_name, x_name)
223 if ((f = LookupFontByPosition (dw, position)) != NULL) {
225 * ignore gratuitous font loading
227 if (!strcmp (f->dvi_name, dvi_name) &&
228 !strcmp (f->x_name, x_name))
231 DisposeFontSizes (dw, f->sizes);
233 XtFree (f->dvi_name);
238 f = (DviFontList *) XtMalloc (sizeof (*f));
239 f->next = dw->dvi.fonts;
242 f->initialized = FALSE;
243 f->dvi_name = savestr (dvi_name);
244 f->device_font = device_find_font (dw->dvi.device, dvi_name);
245 f->x_name = savestr (x_name);
246 f->dvi_number = position;
250 encoding = ConvertFontNameToEncoding (f->x_name);
251 f->char_map = DviFindMap (encoding);
255 * force requery of fonts
258 dw->dvi.font_number = -1;
259 dw->dvi.cache.font = 0;
260 dw->dvi.cache.font_number = -1;
261 dw->dvi.device_font = 0;
262 dw->dvi.device_font_number = -1;
269 DviFontList *f = dw->dvi.fonts;
272 DviFontList *tem = f;
275 DisposeFontSizes (dw, f->sizes);
277 XtFree (f->dvi_name);
281 XtFree ((char *) tem);
285 * force requery of fonts
288 dw->dvi.font_number = -1;
289 dw->dvi.cache.font = 0;
290 dw->dvi.cache.font_number = -1;
291 dw->dvi.device_font = 0;
292 dw->dvi.device_font_number = -1;
298 MapDviNameToXName (dw, dvi_name)
304 for (fm = dw->dvi.font_map; fm; fm=fm->next)
305 if (!strcmp (fm->dvi_name, dvi_name))
312 MapXNameToDviName (dw, x_name)
318 for (fm = dw->dvi.font_map; fm; fm=fm->next)
319 if (!strcmp (fm->x_name, x_name))
331 DviFontMap *fm, *new;
333 if (dw->dvi.font_map)
334 DestroyFontMap (dw->dvi.font_map);
336 m = dw->dvi.font_map_string;
339 while (*m && !isspace (*m))
341 strncpy (dvi_name, s, m-s);
342 dvi_name[m-s] = '\0';
346 while (*m && *m != '\n')
348 strncpy (x_name, s, m-s);
350 new = (DviFontMap *) XtMalloc (sizeof *new);
351 new->x_name = savestr (x_name);
352 new->dvi_name = savestr (dvi_name);
357 dw->dvi.font_map = fm;
360 DestroyFontMap (font_map)
361 DviFontMap *font_map;
365 for (; font_map; font_map = next) {
366 next = font_map->next;
367 if (font_map->x_name)
368 XtFree (font_map->x_name);
369 if (font_map->dvi_name)
370 XtFree (font_map->dvi_name);
371 XtFree ((char *) font_map);
377 SetFontPosition (dw, position, dvi_name, extra)
381 char *extra; /* unused */
385 x_name = MapDviNameToXName (dw, dvi_name);
387 (void) InstallFont (dw, position, dvi_name, x_name);
391 QueryFont (dw, position, size)
399 f = LookupFontByPosition (dw, position);
401 return dw->dvi.default_font;
402 if (!f->initialized) {
403 f->sizes = InstallFontSizes (dw, f->x_name, &f->scalable);
404 f->initialized = TRUE;
406 fs = LookupFontSizeBySize (dw, f, size);
408 return dw->dvi.default_font;
411 fs->font = XLoadQueryFont (XtDisplay (dw), fs->x_name);
413 fs->font = dw->dvi.default_font;
419 QueryDeviceFont (dw, position)
425 f = LookupFontByPosition (dw, position);
428 return f->device_font;
432 QueryFontMap (dw, position)
438 f = LookupFontByPosition (dw, position);
446 LoadFont (dw, position, size)
453 font = QueryFont (dw, position, size);
454 dw->dvi.font_number = position;
455 dw->dvi.font_size = size;
457 XSetFont (XtDisplay (dw), dw->dvi.normal_GC, font->fid);
465 c-continued-statement-offset: 8
469 c-tab-always-indent: nil