X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/acfa068f4a1a4652b784af1d7aaac92929399249..893fcd38e9ef6bcb50dd9e9ed1de7caf194f8a83:/src/xftfont.c diff --git a/src/xftfont.c b/src/xftfont.c index 9f52eb8b23..37b33b3ead 100644 --- a/src/xftfont.c +++ b/src/xftfont.c @@ -1,5 +1,5 @@ /* xftfont.c -- XFT font driver. - Copyright (C) 2006-2012 Free Software Foundation, Inc. + Copyright (C) 2006-2013 Free Software Foundation, Inc. Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 National Institute of Advanced Industrial Science and Technology (AIST) Registration Number H13PRO009 @@ -58,7 +58,6 @@ struct xftfont_info int index; FT_Matrix matrix; Display *display; - int screen; XftFont *xftfont; }; @@ -70,17 +69,14 @@ struct xftface_info XftColor xft_bg; /* color for face->background */ }; -static void xftfont_get_colors (FRAME_PTR, struct face *, GC gc, - struct xftface_info *, - XftColor *fg, XftColor *bg); - - /* Setup foreground and background colors of GC into FG and BG. If XFTFACE_INFO is not NULL, reuse the colors in it if possible. BG may be NULL. */ static void -xftfont_get_colors (FRAME_PTR f, struct face *face, GC gc, struct xftface_info *xftface_info, XftColor *fg, XftColor *bg) +xftfont_get_colors (struct frame *f, struct face *face, GC gc, + struct xftface_info *xftface_info, + XftColor *fg, XftColor *bg) { if (xftface_info && face->gc == gc) { @@ -93,7 +89,7 @@ xftfont_get_colors (FRAME_PTR f, struct face *face, GC gc, struct xftface_info * XGCValues xgcv; bool fg_done = 0, bg_done = 0; - BLOCK_INPUT; + block_input (); XGetGCValues (FRAME_X_DISPLAY (f), gc, GCForeground | GCBackground, &xgcv); if (xftface_info) @@ -131,7 +127,7 @@ xftfont_get_colors (FRAME_PTR f, struct face *face, GC gc, struct xftface_info * bg->color.blue = colors[1].blue; } } - UNBLOCK_INPUT; + unblock_input (); } } @@ -139,9 +135,9 @@ xftfont_get_colors (FRAME_PTR f, struct face *face, GC gc, struct xftface_info * struct font_driver xftfont_driver; static Lisp_Object -xftfont_list (Lisp_Object frame, Lisp_Object spec) +xftfont_list (struct frame *f, Lisp_Object spec) { - Lisp_Object list = ftfont_driver.list (frame, spec), tail; + Lisp_Object list = ftfont_driver.list (f, spec), tail; for (tail = list; CONSP (tail); tail = XCDR (tail)) ASET (XCAR (tail), FONT_TYPE_INDEX, Qxft); @@ -149,9 +145,9 @@ xftfont_list (Lisp_Object frame, Lisp_Object spec) } static Lisp_Object -xftfont_match (Lisp_Object frame, Lisp_Object spec) +xftfont_match (struct frame *f, Lisp_Object spec) { - Lisp_Object entity = ftfont_driver.match (frame, spec); + Lisp_Object entity = ftfont_driver.match (f, spec); if (! NILP (entity)) ASET (entity, FONT_TYPE_INDEX, Qxft); @@ -262,7 +258,7 @@ xftfont_add_rendering_parameters (FcPattern *pat, Lisp_Object entity) } static Lisp_Object -xftfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) +xftfont_open (struct frame *f, Lisp_Object entity, int pixel_size) { FcResult result; Display *display = FRAME_X_DISPLAY (f); @@ -324,7 +320,7 @@ xftfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) FcPatternAddInteger (pat, FC_INDEX, XINT (idx)); - BLOCK_INPUT; + block_input (); /* Make sure that the Xrender extension is added before the Xft one. Otherwise, the close-display hook set by Xft is called after the one for Xrender, and the former tries to re-add the latter. This @@ -345,12 +341,12 @@ xftfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) xftfont = XftFontOpenPattern (display, match); if (!xftfont) { - UNBLOCK_INPUT; + unblock_input (); XftPatternDestroy (match); return Qnil; } ft_face = XftLockFace (xftfont); - UNBLOCK_INPUT; + unblock_input (); /* We should not destroy PAT here because it is kept in XFTFONT and destroyed automatically when XFTFONT is closed. */ @@ -369,13 +365,12 @@ xftfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) ASET (font_object, FONT_FORMAT_INDEX, ftfont_font_format (xftfont->pattern, filename)); font = XFONT_OBJECT (font_object); - font->pixel_size = pixel_size; + font->pixel_size = size; font->driver = &xftfont_driver; font->encoding_charset = font->repertory_charset = -1; xftfont_info = (struct xftfont_info *) font; xftfont_info->display = display; - xftfont_info->screen = FRAME_X_SCREEN_NUMBER (f); xftfont_info->xftfont = xftfont; /* This means that there's no need of transformation. */ xftfont_info->matrix.xx = 0; @@ -387,8 +382,6 @@ xftfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) xftfont_info->matrix.xy = 0x10000L * matrix->xy; xftfont_info->matrix.yx = 0x10000L * matrix->yx; } - font->pixel_size = size; - font->driver = &xftfont_driver; if (INTEGERP (AREF (entity, FONT_SPACING_INDEX))) spacing = XINT (AREF (entity, FONT_SPACING_INDEX)); else @@ -399,7 +392,7 @@ xftfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) for (ch = 0; ch < 95; ch++) ascii_printable[ch] = ' ' + ch; } - BLOCK_INPUT; + block_input (); /* Unfortunately Xft doesn't provide a way to get minimum char width. So, we set min_width to space_width. */ @@ -425,7 +418,7 @@ xftfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) XftTextExtents8 (display, xftfont, ascii_printable + 1, 94, &extents); font->average_width = (font->space_width + extents.xOff) / 95; } - UNBLOCK_INPUT; + unblock_input (); font->ascent = xftfont->ascent; font->descent = xftfont->descent; @@ -486,22 +479,30 @@ xftfont_open (FRAME_PTR f, Lisp_Object entity, int pixel_size) } static void -xftfont_close (FRAME_PTR f, struct font *font) +xftfont_close (struct font *font) { struct xftfont_info *xftfont_info = (struct xftfont_info *) font; #ifdef HAVE_LIBOTF if (xftfont_info->otf) - OTF_close (xftfont_info->otf); + { + OTF_close (xftfont_info->otf); + xftfont_info->otf = NULL; + } #endif - BLOCK_INPUT; - XftUnlockFace (xftfont_info->xftfont); - XftFontClose (xftfont_info->display, xftfont_info->xftfont); - UNBLOCK_INPUT; + + if (xftfont_info->xftfont) + { + block_input (); + XftUnlockFace (xftfont_info->xftfont); + XftFontClose (xftfont_info->display, xftfont_info->xftfont); + unblock_input (); + xftfont_info->xftfont = NULL; + } } static int -xftfont_prepare_face (FRAME_PTR f, struct face *face) +xftfont_prepare_face (struct frame *f, struct face *face) { struct xftface_info *xftface_info; @@ -524,7 +525,7 @@ xftfont_prepare_face (FRAME_PTR f, struct face *face) } static void -xftfont_done_face (FRAME_PTR f, struct face *face) +xftfont_done_face (struct frame *f, struct face *face) { struct xftface_info *xftface_info; @@ -581,10 +582,10 @@ xftfont_text_extents (struct font *font, unsigned int *code, int nglyphs, struct struct xftfont_info *xftfont_info = (struct xftfont_info *) font; XGlyphInfo extents; - BLOCK_INPUT; + block_input (); XftGlyphExtents (xftfont_info->display, xftfont_info->xftfont, code, nglyphs, &extents); - UNBLOCK_INPUT; + unblock_input (); if (metrics) { metrics->lbearing = - extents.x; @@ -597,18 +598,18 @@ xftfont_text_extents (struct font *font, unsigned int *code, int nglyphs, struct } static XftDraw * -xftfont_get_xft_draw (FRAME_PTR f) +xftfont_get_xft_draw (struct frame *f) { XftDraw *xft_draw = font_get_frame_data (f, &xftfont_driver); if (! xft_draw) { - BLOCK_INPUT; + block_input (); xft_draw= XftDrawCreate (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f), FRAME_X_VISUAL (f), FRAME_X_COLORMAP (f)); - UNBLOCK_INPUT; + unblock_input (); eassert (xft_draw != NULL); font_put_frame_data (f, &xftfont_driver, xft_draw); } @@ -619,7 +620,7 @@ static int xftfont_draw (struct glyph_string *s, int from, int to, int x, int y, bool with_background) { - FRAME_PTR f = s->f; + struct frame *f = s->f; struct face *face = s->face; struct xftfont_info *xftfont_info = (struct xftfont_info *) s->font; struct xftface_info *xftface_info = NULL; @@ -633,7 +634,7 @@ xftfont_draw (struct glyph_string *s, int from, int to, int x, int y, xftface_info = (struct xftface_info *) face->extra; xftfont_get_colors (f, face, s->gc, xftface_info, &fg, with_background ? &bg : NULL); - BLOCK_INPUT; + block_input (); if (s->num_clips > 0) XftDrawSetClipRectangles (xft_draw, 0, 0, s->clip, s->num_clips); else @@ -654,7 +655,7 @@ xftfont_draw (struct glyph_string *s, int from, int to, int x, int y, else XftDrawGlyphs (xft_draw, &fg, xftfont_info->xftfont, x, y, code, len); - UNBLOCK_INPUT; + unblock_input (); return len; } @@ -679,7 +680,7 @@ xftfont_shape (Lisp_Object lgstring) #endif static int -xftfont_end_for_frame (FRAME_PTR f) +xftfont_end_for_frame (struct frame *f) { XftDraw *xft_draw; @@ -690,9 +691,9 @@ xftfont_end_for_frame (FRAME_PTR f) if (xft_draw) { - BLOCK_INPUT; + block_input (); XftDrawDestroy (xft_draw); - UNBLOCK_INPUT; + unblock_input (); font_put_frame_data (f, &xftfont_driver, NULL); } return 0;