summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Antipov <dmantipov@yandex.ru>2014-07-08 18:50:45 +0400
committerDmitry Antipov <dmantipov@yandex.ru>2014-07-08 18:50:45 +0400
commit96f17a2f73d1a29c7cdc279daa1fb7f1b7f58aff (patch)
treeeff4991614caccccefdc7d9b10f795728070159e
parentd64a4984c147d0c4550aa1e9e3b9a5db10b3de6a (diff)
downloademacs-96f17a2f73d1a29c7cdc279daa1fb7f1b7f58aff.tar.gz
* font.c (font_build_object) [HAVE_XFT || HAVE_FREETYPE || HAVE_NS]:
New function, with an intention to avoid code duplication between a few font drivers. * font.h (font_build_object) [HAVE_XFT || HAVE_FREETYPE || HAVE_NS]: Add prototype. * ftfont.c (ftfont_open): * macfont.m (macfont_open): * xftfont.c (xftfont_open): Use it.
-rw-r--r--src/ChangeLog9
-rw-r--r--src/font.c28
-rw-r--r--src/font.h3
-rw-r--r--src/ftfont.c16
-rw-r--r--src/macfont.m16
-rw-r--r--src/xftfont.c16
6 files changed, 48 insertions, 40 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 8e79414feaf..7a29f8d803b 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -5,7 +5,16 @@
Avoid Faref and assume that args are always valid. This helps to
speedup search, which is especially important for a huge buffers.
* lisp.h (char_table_translate): Remove prototype.
+
* nsfont.m (nsfont_close): Free glyphs and metrics arrays as well.
+ * font.c (font_build_object) [HAVE_XFT || HAVE_FREETYPE || HAVE_NS]:
+ New function, with an intention to avoid code duplication between
+ a few font drivers.
+ * font.h (font_build_object) [HAVE_XFT || HAVE_FREETYPE || HAVE_NS]:
+ Add prototype.
+ * ftfont.c (ftfont_open):
+ * macfont.m (macfont_open):
+ * xftfont.c (xftfont_open): Use it.
2014-07-08 Paul Eggert <eggert@cs.ucla.edu>
diff --git a/src/font.c b/src/font.c
index 7b9edcd3fb8..0a204cf0eea 100644
--- a/src/font.c
+++ b/src/font.c
@@ -225,7 +225,33 @@ font_make_object (int size, Lisp_Object entity, int pixelsize)
return font_object;
}
-
+#if defined (HAVE_XFT) || defined (HAVE_FREETYPE) || defined (HAVE_NS)
+
+/* Like above, but also set `type', `name' and `fullname' properties
+ of font-object. */
+
+Lisp_Object
+font_build_object (int vectorsize, Lisp_Object type,
+ Lisp_Object entity, double pixelsize)
+{
+ int len;
+ char name[256];
+ Lisp_Object font_object = font_make_object (vectorsize, entity, pixelsize);
+
+ ASET (font_object, FONT_TYPE_INDEX, type);
+ len = font_unparse_xlfd (entity, pixelsize, name, sizeof name);
+ if (len > 0)
+ ASET (font_object, FONT_NAME_INDEX, make_string (name, len));
+ len = font_unparse_fcname (entity, pixelsize, name, sizeof name);
+ if (len > 0)
+ ASET (font_object, FONT_FULLNAME_INDEX, make_string (name, len));
+ else
+ ASET (font_object, FONT_FULLNAME_INDEX,
+ AREF (font_object, FONT_NAME_INDEX));
+ return font_object;
+}
+
+#endif /* HAVE_XFT || HAVE_FREETYPE || HAVE_NS */
static int font_pixel_size (struct frame *f, Lisp_Object);
static Lisp_Object font_open_entity (struct frame *, Lisp_Object, int);
diff --git a/src/font.h b/src/font.h
index c23b826bd46..96c030c3af1 100644
--- a/src/font.h
+++ b/src/font.h
@@ -719,6 +719,9 @@ extern Lisp_Object merge_font_spec (Lisp_Object, Lisp_Object);
extern Lisp_Object font_make_entity (void);
extern Lisp_Object font_make_object (int, Lisp_Object, int);
+#if defined (HAVE_XFT) || defined (HAVE_FREETYPE) || defined (HAVE_NS)
+extern Lisp_Object font_build_object (int, Lisp_Object, Lisp_Object, double);
+#endif
extern Lisp_Object find_font_encoding (Lisp_Object);
extern int font_registry_charsets (Lisp_Object, struct charset **,
diff --git a/src/ftfont.c b/src/ftfont.c
index 7c5d01208d2..2d75dc22679 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -1183,8 +1183,7 @@ ftfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
Lisp_Object val, filename, idx, cache, font_object;
bool scalable;
int spacing;
- char name[256];
- int i, len;
+ int i;
int upEM;
val = assq_no_quit (QCfont_entity, AREF (entity, FONT_EXTRA_INDEX));
@@ -1221,17 +1220,8 @@ ftfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
return Qnil;
}
- font_object = font_make_object (VECSIZE (struct ftfont_info), entity, size);
- ASET (font_object, FONT_TYPE_INDEX, Qfreetype);
- len = font_unparse_xlfd (entity, size, name, 256);
- if (len > 0)
- ASET (font_object, FONT_NAME_INDEX, make_string (name, len));
- len = font_unparse_fcname (entity, size, name, 256);
- if (len > 0)
- ASET (font_object, FONT_FULLNAME_INDEX, make_string (name, len));
- else
- ASET (font_object, FONT_FULLNAME_INDEX,
- AREF (font_object, FONT_NAME_INDEX));
+ font_object = font_build_object (VECSIZE (struct ftfont_info),
+ Qfreetype, entity, size);
ASET (font_object, FONT_FILE_INDEX, filename);
ASET (font_object, FONT_FORMAT_INDEX, ftfont_font_format (NULL, filename));
font = XFONT_OBJECT (font_object);
diff --git a/src/macfont.m b/src/macfont.m
index 82ee54cdc63..60f261d5549 100644
--- a/src/macfont.m
+++ b/src/macfont.m
@@ -2444,8 +2444,7 @@ macfont_open (struct frame * f, Lisp_Object entity, int pixel_size)
int size;
FontRef macfont;
FontSymbolicTraits sym_traits;
- char name[256];
- int len, i, total_width;
+ int i, total_width;
CGGlyph glyph;
CGFloat ascent, descent, leading;
@@ -2472,17 +2471,8 @@ macfont_open (struct frame * f, Lisp_Object entity, int pixel_size)
if (! macfont)
return Qnil;
- font_object = font_make_object (VECSIZE (struct macfont_info), entity, size);
- ASET (font_object, FONT_TYPE_INDEX, macfont_driver.type);
- len = font_unparse_xlfd (entity, size, name, 256);
- if (len > 0)
- ASET (font_object, FONT_NAME_INDEX, make_string (name, len));
- len = font_unparse_fcname (entity, size, name, 256);
- if (len > 0)
- ASET (font_object, FONT_FULLNAME_INDEX, make_string (name, len));
- else
- ASET (font_object, FONT_FULLNAME_INDEX,
- AREF (font_object, FONT_NAME_INDEX));
+ font_object = font_build_object (VECSIZE (struct macfont_info),
+ Qmac_ct, entity, size);
font = XFONT_OBJECT (font_object);
font->pixel_size = size;
font->driver = &macfont_driver;
diff --git a/src/xftfont.c b/src/xftfont.c
index bd3f2c92142..1ca3f92b239 100644
--- a/src/xftfont.c
+++ b/src/xftfont.c
@@ -270,8 +270,7 @@ xftfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
double size = 0;
XftFont *xftfont = NULL;
int spacing;
- char name[256];
- int len, i;
+ int i;
XGlyphInfo extents;
FT_Face ft_face;
FcMatrix *matrix;
@@ -341,17 +340,8 @@ xftfont_open (struct frame *f, Lisp_Object entity, int pixel_size)
/* We should not destroy PAT here because it is kept in XFTFONT and
destroyed automatically when XFTFONT is closed. */
- font_object = font_make_object (VECSIZE (struct xftfont_info), entity, size);
- ASET (font_object, FONT_TYPE_INDEX, Qxft);
- len = font_unparse_xlfd (entity, size, name, 256);
- if (len > 0)
- ASET (font_object, FONT_NAME_INDEX, make_string (name, len));
- len = font_unparse_fcname (entity, size, name, 256);
- if (len > 0)
- ASET (font_object, FONT_FULLNAME_INDEX, make_string (name, len));
- else
- ASET (font_object, FONT_FULLNAME_INDEX,
- AREF (font_object, FONT_NAME_INDEX));
+ font_object = font_build_object (VECSIZE (struct xftfont_info),
+ Qxft, entity, size);
ASET (font_object, FONT_FILE_INDEX, filename);
ASET (font_object, FONT_FORMAT_INDEX,
ftfont_font_format (xftfont->pattern, filename));