X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/cf86e18b159f754d6e5537b7b9cbefc32297f7d2..d20f82e6f1ab902469723ebd530ca21bea9cc41b:/src/ftxfont.c diff --git a/src/ftxfont.c b/src/ftxfont.c index b44905d88c..52d844597e 100644 --- a/src/ftxfont.c +++ b/src/ftxfont.c @@ -1,5 +1,5 @@ /* ftxfont.c -- FreeType font driver on X (without using XFT). - Copyright (C) 2006-2013 Free Software Foundation, Inc. + Copyright (C) 2006-2015 Free Software Foundation, Inc. Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 National Institute of Advanced Industrial Science and Technology (AIST) Registration Number H13PRO009 @@ -37,9 +37,6 @@ along with GNU Emacs. If not, see . */ static Lisp_Object Qftx; -#if defined HAVE_XFT || !defined HAVE_FREETYPE -static -#endif struct font_driver ftxfont_driver; struct ftxfont_frame_data @@ -62,7 +59,7 @@ ftxfont_get_gcs (struct frame *f, unsigned long foreground, unsigned long backgr XColor color; XGCValues xgcv; int i; - struct ftxfont_frame_data *data = font_get_frame_data (f, &ftxfont_driver); + struct ftxfont_frame_data *data = font_get_frame_data (f, Qftx); struct ftxfont_frame_data *prev = NULL, *this = NULL, *new; if (data) @@ -81,19 +78,11 @@ ftxfont_get_gcs (struct frame *f, unsigned long foreground, unsigned long backgr } } - new = malloc (sizeof *new); - if (! new) - return NULL; + new = xmalloc (sizeof *new); new->next = this; if (prev) - { prev->next = new; - } - else if (font_put_frame_data (f, &ftxfont_driver, new) < 0) - { - free (new); - return NULL; - } + font_put_frame_data (f, Qftx, new); new->colors[0].pixel = background; new->colors[1].pixel = foreground; @@ -126,8 +115,8 @@ ftxfont_get_gcs (struct frame *f, unsigned long foreground, unsigned long backgr if (prev) prev->next = new->next; else if (data) - font_put_frame_data (f, &ftxfont_driver, new->next); - free (new); + font_put_frame_data (f, Qftx, new->next); + xfree (new); return NULL; } return new->gcs; @@ -255,7 +244,6 @@ ftxfont_open (struct frame *f, Lisp_Object entity, int pixel_size) if (NILP (font_object)) return Qnil; font = XFONT_OBJECT (font_object); - eassert (font->frame == f); font->driver = &ftxfont_driver; return font_object; } @@ -283,10 +271,11 @@ ftxfont_draw (struct glyph_string *s, int from, int to, int x, int y, n[0] = n[1] = n[2] = n[3] = n[4] = n[5] = n[6] = 0; + USE_SAFE_ALLOCA; + SAFE_NALLOCA (code, 1, len); block_input (); if (with_background) ftxfont_draw_background (f, font, s->gc, x, y, s->width); - code = alloca (sizeof (unsigned) * len); for (i = 0; i < len; i++) code[i] = ((XCHAR2B_BYTE1 (s->char2b + from + i) << 8) | XCHAR2B_BYTE2 (s->char2b + from + i)); @@ -334,6 +323,7 @@ ftxfont_draw (struct glyph_string *s, int from, int to, int x, int y, } unblock_input (); + SAFE_FREE (); return len; } @@ -341,7 +331,7 @@ ftxfont_draw (struct glyph_string *s, int from, int to, int x, int y, static int ftxfont_end_for_frame (struct frame *f) { - struct ftxfont_frame_data *data = font_get_frame_data (f, &ftxfont_driver); + struct ftxfont_frame_data *data = font_get_frame_data (f, Qftx); block_input (); while (data) @@ -351,11 +341,11 @@ ftxfont_end_for_frame (struct frame *f) for (i = 0; i < 6; i++) XFreeGC (FRAME_X_DISPLAY (f), data->gcs[i]); - free (data); + xfree (data); data = next; } unblock_input (); - font_put_frame_data (f, &ftxfont_driver, NULL); + font_put_frame_data (f, Qftx, NULL); return 0; }