X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/691a3cb77b362b2d57800dd7a20f03d3663a9f09..6dd697d9a5a0d749e26b0c371d0f96a47e1ed501:/src/w32bdf.c diff --git a/src/w32bdf.c b/src/w32bdf.c index 53e1b17b21..80ef098d8d 100644 --- a/src/w32bdf.c +++ b/src/w32bdf.c @@ -1,11 +1,12 @@ /* Implementation of BDF font handling on the Microsoft W32 API. - Copyright (C) 1999 Free Software Foundation, Inc. + Copyright (C) 1999, 2001, 2002, 2003, 2004, 2005, + 2006, 2007 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2, or (at your option) +the Free Software Foundation; either version 3, or (at your option) any later version. GNU Emacs is distributed in the hope that it will be useful, @@ -15,16 +16,21 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Emacs; see the file COPYING. If not, write to -the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, +Boston, MA 02110-1301, USA. */ /* Based heavily on code by H. Miyashita for Meadow (a descendant of MULE for W32). */ #include -#include "config.h" + +#ifdef HAVE_CONFIG_H +#include +#endif + #include "lisp.h" #include "charset.h" +#include "keyboard.h" #include "frame.h" #include "dispextern.h" #include "fontset.h" @@ -33,9 +39,6 @@ Boston, MA 02111-1307, USA. */ #include "w32term.h" #include "w32bdf.h" -#define min(a, b) ((a) < (b) ? (a) : (b)) -#define max(a, b) ((a) > (b) ? (a) : (b)) - /* 10 planes */ #define BDF_CODEPOINT_HEAP_INITIAL_SIZE (96 * 10) /* about 96 characters */ @@ -52,15 +55,15 @@ cache_bitmap *pcached_bitmap_latest = cached_bitmap_slots; #define FONT_CACHE_SLOT_OVER_P(p) ((p) >= cached_bitmap_slots + BDF_FONT_CACHE_SIZE) -static int +static int search_file_line(char *key, char *start, int len, char **val, char **next) { - int linelen; - unsigned char *p, *q; + unsigned int linelen; + unsigned char *p; p = memchr(start, '\n', len); if (!p) return -1; - for (;start < p;start++) + for (;(unsigned char *)start < p;start++) { if ((*start != ' ') && (*start != '\t')) break; } @@ -71,7 +74,7 @@ search_file_line(char *key, char *start, int len, char **val, char **next) *val = start + strlen(key); return 1; } - + return 0; } @@ -129,15 +132,16 @@ set_bdf_font_info(bdffont *fontp) fontp->slant = NULL; /* fontp->width = NULL; */ - flag = proceed_file_line("FONTBOUNDINGBOX", start, &len, &p, &q); + flag = proceed_file_line("FONTBOUNDINGBOX", start, &len, + (char **)&p, (char **)&q); if (!flag) return 0; - bbw = strtol(p, &start, 10); + bbw = strtol(p, (char **)&start, 10); p = start; - bbh = strtol(p, &start, 10); + bbh = strtol(p, (char **)&start, 10); p = start; - bbx = strtol(p, &start, 10); + bbx = strtol(p, (char **)&start, 10); p = start; - bby = strtol(p, &start, 10); + bby = strtol(p, (char **)&start, 10); fontp->llx = bbx; fontp->lly = bby; @@ -146,70 +150,82 @@ set_bdf_font_info(bdffont *fontp) fontp->width = bbw; fontp->height = bbh; start = q; - flag = proceed_file_line("STARTPROPERTIES", start, &len, &p, &q); + flag = proceed_file_line("STARTPROPERTIES", start, &len, + (char **)&p, (char **)&q); if (!flag) return 1; flag = 0; do { start = q; - if (search_file_line("PIXEL_SIZE", start, len, &p, &q) == 1) + if (search_file_line("PIXEL_SIZE", start, len, + (char **)&p, (char **)&q) == 1) { val1 = atoi(p); fontp->pixsz = val1; } - else if (search_file_line("FONT_ASCENT", start, len, &p, &q) == 1) + else if (search_file_line("FONT_ASCENT", start, len, + (char **)&p, (char **)&q) == 1) { val1 = atoi(p); fontp->ury = val1; } - else if (search_file_line("FONT_DESCENT", start, len, &p, &q) == 1) + else if (search_file_line("FONT_DESCENT", start, len, + (char **)&p, (char **)&q) == 1) { val1 = atoi(p); fontp->lly = -val1; } - else if (search_file_line("_MULE_BASELINE_OFFSET", start, len, &p, &q) == 1) + else if (search_file_line("_MULE_BASELINE_OFFSET", start, len, + (char **)&p, (char **)&q) == 1) { val1 = atoi(p); fontp->yoffset = -val1; } - else if (search_file_line("_MULE_RELATIVE_COMPOSE", start, len, &p, &q) == 1) + else if (search_file_line("_MULE_RELATIVE_COMPOSE", start, len, + (char **)&p, (char **)&q) == 1) { val1 = atoi(p); fontp->relative_compose = val1; } - else if (search_file_line("_MULE_DEFAULT_ASCENT", start, len, &p, &q) == 1) + else if (search_file_line("_MULE_DEFAULT_ASCENT", start, len, + (char **)&p, (char **)&q) == 1) { val1 = atoi(p); fontp->default_ascent = val1; } - else if (search_file_line("CHARSET_REGISTRY", start, len, &p, &q) == 1) + else if (search_file_line("CHARSET_REGISTRY", start, len, + (char **)&p, (char **)&q) == 1) { fontp->registry = get_quoted_string(p, q); } - else if (search_file_line("CHARSET_ENCODING", start, len, &p, &q) == 1) + else if (search_file_line("CHARSET_ENCODING", start, len, + (char **)&p, (char **)&q) == 1) { fontp->encoding = get_quoted_string(p, q); } - else if (search_file_line("SLANT", start, len, &p, &q) == 1) + else if (search_file_line("SLANT", start, len, + (char **)&p, (char **)&q) == 1) { fontp->slant = get_quoted_string(p, q); } /* - else if (search_file_line("SETWIDTH_NAME", start, len, &p, &q) == 1) + else if (search_file_line("SETWIDTH_NAME", start, len, + (char **)&p, (char **)&q) == 1) { fontp->width = get_quoted_string(p, q); } */ else { - flag = search_file_line("ENDPROPERTIES", start, len, &p, &q); + flag = search_file_line("ENDPROPERTIES", start, len, + (char **)&p, (char **)&q); } if (flag == -1) return 0; len -= (q - start); }while(flag == 0); start = q; - flag = proceed_file_line("CHARS", start, &len, &p, &q); + flag = proceed_file_line("CHARS", start, &len, (char **)&p, (char **)&q); if (!flag) return 0; fontp->nchars = atoi(p); fontp->seeked = q; @@ -228,11 +244,11 @@ w32_init_bdf_font(char *filename) if (hbdf_cp_heap == INVALID_HANDLE_VALUE) hbdf_cp_heap = HeapCreate(0, BDF_CODEPOINT_HEAP_INITIAL_SIZE, 0); - if (hbdf_bmp_heap = INVALID_HANDLE_VALUE) + if (hbdf_bmp_heap == INVALID_HANDLE_VALUE) hbdf_bmp_heap = HeapCreate(0, BDF_BITMAP_HEAP_INITIAL_SIZE, 0); if (!hbdf_cp_heap || !hbdf_bmp_heap) - error("Fail to create heap for BDF."); + error("Fail to create heap for BDF"); hfile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); @@ -242,13 +258,13 @@ w32_init_bdf_font(char *filename) (fileinfo.nFileSizeLow > BDF_FILE_SIZE_MAX)) { CloseHandle(hfile); - error("Fail to open BDF file."); + error("Fail to open BDF file"); } hfilemap = CreateFileMapping(hfile, NULL, PAGE_READONLY, 0, 0, NULL); if (hfilemap == INVALID_HANDLE_VALUE) { CloseHandle(hfile); - error("Can't map font."); + error("Can't map font"); } font = MapViewOfFile(hfilemap, FILE_MAP_READ, 0, 0, 0); @@ -257,11 +273,11 @@ w32_init_bdf_font(char *filename) { CloseHandle(hfile); CloseHandle(hfilemap); - error("Can't view font."); + error("Can't view font"); } bdffontp = (bdffont *) xmalloc(sizeof(bdffont)); - + for(i = 0;i < BDF_FIRST_OFFSET_TABLE;i++) bdffontp->chtbl[i] = NULL; bdffontp->size = fileinfo.nFileSizeLow; @@ -270,7 +286,7 @@ w32_init_bdf_font(char *filename) bdffontp->hfilemap = hfilemap; bdffontp->filename = (char*) xmalloc(strlen(filename) + 1); strcpy(bdffontp->filename, filename); - + if (!set_bdf_font_info(bdffontp)) { w32_free_bdf_font(bdffontp); @@ -286,7 +302,7 @@ w32_free_bdf_font(bdffont *fontp) font_char *pch; cache_bitmap *pcb; - UnmapViewOfFile(fontp->hfilemap); + UnmapViewOfFile(fontp->font); CloseHandle(fontp->hfilemap); CloseHandle(fontp->hfile); @@ -321,7 +337,6 @@ static font_char* get_cached_font_char(bdffont *fontp, int index) { font_char *pch, *result; - int i; if (!BDF_CODEPOINT_RANGE_COVER_P(index)) return NULL; @@ -341,7 +356,6 @@ static font_char* cache_char_offset(bdffont *fontp, int index, unsigned char *offset) { font_char *pch, *result; - int i; if (!BDF_CODEPOINT_RANGE_COVER_P(index)) return NULL; @@ -351,7 +365,7 @@ cache_char_offset(bdffont *fontp, int index, unsigned char *offset) { pch = fontp->chtbl[BDF_FIRST_OFFSET(index)] = (font_char*) HeapAlloc(hbdf_cp_heap, - HEAP_ZERO_MEMORY, + HEAP_ZERO_MEMORY, sizeof(font_char) * BDF_SECOND_OFFSET_TABLE); if (!pch) return NULL; @@ -377,7 +391,8 @@ seek_char(bdffont *fontp, int index) len = fontp->size - (start - fontp->font); do { - flag = proceed_file_line("ENCODING", start, &len, &p, &q); + flag = proceed_file_line("ENCODING", start, &len, + (char **)&p, (char **)&q); if (!flag) { fontp->seeked = NULL; @@ -448,27 +463,27 @@ w32_get_bdf_glyph(bdffont *fontp, int index, int size, glyph_struct *glyph) len = fontp->size - (start - fontp->font); - flag = proceed_file_line("DWIDTH", start, &len, &p, &q); + flag = proceed_file_line("DWIDTH", start, &len, (char **)&p, (char **)&q); if (!flag) return 0; glyph->metric.dwidth = atoi(p); start = q; - flag = proceed_file_line("BBX", start, &len, &p, &q); + flag = proceed_file_line("BBX", start, &len, (char **)&p, (char **)&q); if (!flag) return 0; - glyph->metric.bbw = strtol(p, &start, 10); + glyph->metric.bbw = strtol(p, (char **)&start, 10); p = start; - glyph->metric.bbh = strtol(p, &start, 10); + glyph->metric.bbh = strtol(p, (char **)&start, 10); p = start; - glyph->metric.bbox = strtol(p, &start, 10); + glyph->metric.bbox = strtol(p, (char **)&start, 10); p = start; - glyph->metric.bboy = strtol(p, &start, 10); + glyph->metric.bboy = strtol(p, (char **)&start, 10); if (size == 0) return 1; start = q; - flag = proceed_file_line("BITMAP", start, &len, &p, &q); + flag = proceed_file_line("BITMAP", start, &len, (char **)&p, (char **)&q); if (!flag) return 0; @@ -490,11 +505,14 @@ w32_get_bdf_glyph(bdffont *fontp, int index, int size, glyph_struct *glyph) if (!q) return 0; for(j = 0;((q > p) && (j < rowbytes));j++) { - val1 = GET_HEX_VAL(*p); - if (val1 == -1) return 0; + int ival = GET_HEX_VAL(*p); + + if (ival == -1) return 0; + val1 = ival; p++; - val2 = GET_HEX_VAL(*p); - if (val2 == -1) return 0; + ival = GET_HEX_VAL(*p); + if (ival == -1) return 0; + val2 = ival; p++; val = (unsigned char)((val1 << 4) | val2); if (val) flag = 1; @@ -561,7 +579,7 @@ get_bitmap_with_cache(bdffont *fontp, int index) pcb->row_byte_size = glyph.row_byte_size; pch->pcbmp = pcb; - + pcached_bitmap_latest++; if (FONT_CACHE_SLOT_OVER_P(pcached_bitmap_latest)) pcached_bitmap_latest = cached_bitmap_slots; @@ -572,7 +590,6 @@ get_bitmap_with_cache(bdffont *fontp, int index) static HBITMAP create_offscreen_bitmap(HDC hdc, int width, int height, unsigned char **bitsp) { - HBITMAP hBMP; struct { BITMAPINFOHEADER h; RGBQUAD c[2]; @@ -588,7 +605,7 @@ create_offscreen_bitmap(HDC hdc, int width, int height, unsigned char **bitsp) info.c[1].rgbRed = info.c[1].rgbGreen = info.c[1].rgbBlue = 255; return CreateDIBSection(hdc, (LPBITMAPINFO)&info, - DIB_RGB_COLORS, bitsp, NULL, 0); + DIB_RGB_COLORS, (void **)bitsp, NULL, 0); } glyph_metric * @@ -633,7 +650,7 @@ w32_BDF_TextOut(bdffont *fontp, HDC hdc, int left, return 0; textalign = GetTextAlign(hdc); - + hFgBrush = CreateSolidBrush(GetTextColor(hdc)); hOrgBrush = SelectObject(hdc, hFgBrush); @@ -663,7 +680,7 @@ w32_BDF_TextOut(bdffont *fontp, HDC hdc, int left, { width = pcb->metric.bbw; height = pcb->metric.bbh; - + if (!(hBMP && (DIBsection_hdc == hdc) && (DIBsection_width == width) @@ -752,12 +769,16 @@ struct font_info *w32_load_bdf_font (struct frame *f, char *fontname, /* Now fill in the slots of *FONTP. */ BLOCK_INPUT; + bzero (fontp, sizeof (*fontp)); fontp->font = font; fontp->font_idx = dpyinfo->n_fonts; fontp->name = (char *) xmalloc (strlen (fontname) + 1); bcopy (fontname, fontp->name, strlen (fontname) + 1); fontp->full_name = fontp->name; - fontp->size = FONT_WIDTH (font); + /* FIXME: look at BDF spec to see if there are better ways of finding + average_width and space_width, hopefully that don't involve working out + the values for ourselves from the data. */ + fontp->size = fontp->average_width = fontp->space_width = FONT_WIDTH (font); fontp->height = FONT_HEIGHT (font); /* The slot `encoding' specifies how to map a character @@ -774,12 +795,19 @@ struct font_info *w32_load_bdf_font (struct frame *f, char *fontname, fontp->relative_compose = bdf_font->relative_compose; fontp->default_ascent = bdf_font->default_ascent; + /* Set global flag fonts_changed_p to non-zero if the font loaded + has a character with a smaller width than any other character + before, or if the font loaded has a smaller height than any + other font loaded before. If this happens, it will make a + glyph matrix reallocation necessary. */ + fonts_changed_p |= x_compute_min_glyph_bounds (f); + UNBLOCK_INPUT; dpyinfo->n_fonts++; return fontp; } -/* Check a file for an XFLD string describing it. */ +/* Check a file for an XLFD string describing it. */ int w32_BDF_to_x_font (char *file, char* xstr, int len) { HANDLE hfile, hfilemap; @@ -839,7 +867,11 @@ int w32_BDF_to_x_font (char *file, char* xstr, int len) retval = 1; } } + UnmapViewOfFile (font); CloseHandle (hfile); CloseHandle (hfilemap); return retval; } + +/* arch-tag: 2e9a45de-0c54-4a0e-95c8-2d67b2b1fa32 + (do not change this comment) */