From 9e0d69b5a17a0fa3b0dd099a51584a85f3ddb5bf Mon Sep 17 00:00:00 2001 From: Robert Pluim Date: Sat, 26 Jan 2019 12:31:02 +0100 Subject: [PATCH] Unify three font info structures * src/ftfont.h (struct font_info): New type, unifies similar types from ftcrfont.c, ftfont.c and xftfont.c * src/xftfont.c (struct xftfont_info): Remove, replace with struct font_info. Adjust all uses. * src/ftcrfont.c (struct ftcrfont_info): Likewise. * src/ftfont.c (struct ftfont_info): Likewise. --- src/ftcrfont.c | 43 +++++------------------------------- src/ftfont.c | 59 +++++++++++++++++++++----------------------------- src/ftfont.h | 37 +++++++++++++++++++++++++++---- src/xftfont.c | 45 ++++++++++---------------------------- 4 files changed, 75 insertions(+), 109 deletions(-) diff --git a/src/ftcrfont.c b/src/ftcrfont.c index 7c18e04b743..3a98e78d63e 100644 --- a/src/ftcrfont.c +++ b/src/ftcrfont.c @@ -28,34 +28,6 @@ along with GNU Emacs. If not, see . */ #include "ftfont.h" #include "pdumper.h" -/* FTCR font driver. */ - -/* The actual structure for FTCR font. A pointer to this structure - can be cast to struct font *. */ - -struct ftcrfont_info -{ - struct font font; - /* The following members up to and including 'matrix' must be here - in this order to be compatible with struct ftfont_info (in - ftfont.c). */ -#ifdef HAVE_LIBOTF - bool maybe_otf; /* Flag to tell if this may be OTF or not. */ - OTF *otf; -#endif /* HAVE_LIBOTF */ - FT_Size ft_size; - int index; - FT_Matrix matrix; - - cairo_font_face_t *cr_font_face; - /* To prevent cairo from cluttering the activated FT_Size maintained - in ftfont.c, we activate this special FT_Size before drawing. */ - FT_Size ft_size_draw; - /* Font metrics cache. */ - struct font_metrics **metrics; - short metrics_nrows; -}; - #define METRICS_NCOLS_PER_ROW (128) enum metrics_status @@ -72,7 +44,7 @@ ftcrfont_glyph_extents (struct font *font, unsigned glyph, struct font_metrics *metrics) { - struct ftcrfont_info *ftcrfont_info = (struct ftcrfont_info *) font; + struct font_info *ftcrfont_info = (struct font_info *) font; int row, col; struct font_metrics *cache; @@ -134,7 +106,7 @@ ftcrfont_open (struct frame *f, Lisp_Object entity, int pixel_size) { Lisp_Object font_object; struct font *font; - struct ftcrfont_info *ftcrfont_info; + struct font_info *ftcrfont_info; FT_Face ft_face; FT_UInt size; @@ -142,14 +114,14 @@ ftcrfont_open (struct frame *f, Lisp_Object entity, int pixel_size) size = XFIXNUM (AREF (entity, FONT_SIZE_INDEX)); if (size == 0) size = pixel_size; - font_object = font_build_object (VECSIZE (struct ftcrfont_info), + font_object = font_build_object (VECSIZE (struct font_info), Qftcr, entity, size); font_object = ftfont_open2 (f, entity, pixel_size, font_object); if (NILP (font_object)) return Qnil; font = XFONT_OBJECT (font_object); font->driver = &ftcrfont_driver; - ftcrfont_info = (struct ftcrfont_info *) font; + ftcrfont_info = (struct font_info *) font; ft_face = ftcrfont_info->ft_size->face; FT_New_Size (ft_face, &ftcrfont_info->ft_size_draw); FT_Activate_Size (ftcrfont_info->ft_size_draw); @@ -169,7 +141,7 @@ ftcrfont_close (struct font *font) if (font_data_structures_may_be_ill_formed ()) return; - struct ftcrfont_info *ftcrfont_info = (struct ftcrfont_info *) font; + struct font_info *ftcrfont_info = (struct font_info *) font; int i; block_input (); @@ -225,7 +197,7 @@ ftcrfont_draw (struct glyph_string *s, { struct frame *f = s->f; struct face *face = s->face; - struct ftcrfont_info *ftcrfont_info = (struct ftcrfont_info *) s->font; + struct font_info *ftcrfont_info = (struct font_info *) s->font; cairo_t *cr; cairo_glyph_t *glyphs; cairo_surface_t *surface; @@ -316,9 +288,6 @@ struct font_driver const ftcrfont_driver = void syms_of_ftcrfont (void) { - if (ftfont_info_size != offsetof (struct ftcrfont_info, cr_font_face)) - abort (); - DEFSYM (Qftcr, "ftcr"); pdumper_do_now_and_after_load (syms_of_ftcrfont_for_pdumper); } diff --git a/src/ftfont.c b/src/ftfont.c index bcc3460cb74..3e820f583ff 100644 --- a/src/ftfont.c +++ b/src/ftfont.c @@ -24,6 +24,17 @@ along with GNU Emacs. If not, see . */ #include #include +/* These two blocks are here because this file is built when using XFT + and when using Cairo, so struct font_info in ftfont.h needs access + to the appropriate types. */ +#ifdef HAVE_XFT +# include +# include +#endif +#ifdef USE_CAIRO +# include +#endif + #include #include "lisp.h" @@ -50,26 +61,6 @@ static Lisp_Object freetype_font_cache; /* Cache for FT_Face and FcCharSet. */ static Lisp_Object ft_face_cache; -/* The actual structure for FreeType font that can be cast to struct - font. */ - -struct ftfont_info -{ - struct font font; -#ifdef HAVE_LIBOTF - /* The following members up to and including 'matrix' must be here in - this order to be compatible with struct xftfont_info (in - xftfont.c). */ - bool maybe_otf; /* Flag to tell if this may be OTF or not. */ - OTF *otf; -#endif /* HAVE_LIBOTF */ - FT_Size ft_size; - int index; - FT_Matrix matrix; -}; - -size_t ftfont_info_size = sizeof (struct ftfont_info); - enum ftfont_cache_for { FTFONT_CACHE_FOR_FACE, @@ -454,7 +445,7 @@ ftfont_get_fc_charset (Lisp_Object entity) #ifdef HAVE_LIBOTF static OTF * -ftfont_get_otf (struct ftfont_info *ftfont_info) +ftfont_get_otf (struct font_info *ftfont_info) { OTF *otf; @@ -1095,7 +1086,7 @@ ftfont_open2 (struct frame *f, int pixel_size, Lisp_Object font_object) { - struct ftfont_info *ftfont_info; + struct font_info *ftfont_info; struct font *font; struct ftfont_cache_data *cache_data; FT_Face ft_face; @@ -1146,7 +1137,7 @@ ftfont_open2 (struct frame *f, ASET (font_object, FONT_FILE_INDEX, filename); font = XFONT_OBJECT (font_object); - ftfont_info = (struct ftfont_info *) font; + ftfont_info = (struct font_info *) font; ftfont_info->ft_size = ft_face->size; ftfont_info->index = XFIXNUM (idx); #ifdef HAVE_LIBOTF @@ -1236,7 +1227,7 @@ ftfont_open (struct frame *f, Lisp_Object entity, int pixel_size) size = XFIXNUM (AREF (entity, FONT_SIZE_INDEX)); if (size == 0) size = pixel_size; - font_object = font_build_object (VECSIZE (struct ftfont_info), + font_object = font_build_object (VECSIZE (struct font_info), Qfreetype, entity, size); return ftfont_open2 (f, entity, pixel_size, font_object); } @@ -1247,7 +1238,7 @@ ftfont_close (struct font *font) if (font_data_structures_may_be_ill_formed ()) return; - struct ftfont_info *ftfont_info = (struct ftfont_info *) font; + struct font_info *ftfont_info = (struct font_info *) font; Lisp_Object val, cache; val = Fcons (font->props[FONT_FILE_INDEX], make_fixnum (ftfont_info->index)); @@ -1291,9 +1282,9 @@ ftfont_has_char (Lisp_Object font, int c) } else { - struct ftfont_info *ftfont_info; + struct font_info *ftfont_info; - ftfont_info = (struct ftfont_info *) XFONT_OBJECT (font); + ftfont_info = (struct font_info *) XFONT_OBJECT (font); return (FT_Get_Char_Index (ftfont_info->ft_size->face, (FT_ULong) c) != 0); } @@ -1302,7 +1293,7 @@ ftfont_has_char (Lisp_Object font, int c) unsigned ftfont_encode_char (struct font *font, int c) { - struct ftfont_info *ftfont_info = (struct ftfont_info *) font; + struct font_info *ftfont_info = (struct font_info *) font; FT_Face ft_face = ftfont_info->ft_size->face; FT_ULong charcode = c; FT_UInt code = FT_Get_Char_Index (ft_face, charcode); @@ -1314,7 +1305,7 @@ void ftfont_text_extents (struct font *font, unsigned int *code, int nglyphs, struct font_metrics *metrics) { - struct ftfont_info *ftfont_info = (struct ftfont_info *) font; + struct font_info *ftfont_info = (struct font_info *) font; FT_Face ft_face = ftfont_info->ft_size->face; int i, width = 0; bool first; @@ -1357,7 +1348,7 @@ ftfont_text_extents (struct font *font, unsigned int *code, int ftfont_get_bitmap (struct font *font, unsigned int code, struct font_bitmap *bitmap, int bits_per_pixel) { - struct ftfont_info *ftfont_info = (struct ftfont_info *) font; + struct font_info *ftfont_info = (struct font_info *) font; FT_Face ft_face = ftfont_info->ft_size->face; FT_Int32 load_flags = FT_LOAD_RENDER; @@ -1401,7 +1392,7 @@ int ftfont_anchor_point (struct font *font, unsigned int code, int idx, int *x, int *y) { - struct ftfont_info *ftfont_info = (struct ftfont_info *) font; + struct font_info *ftfont_info = (struct font_info *) font; FT_Face ft_face = ftfont_info->ft_size->face; if (ftfont_info->ft_size != ft_face->size) @@ -1466,7 +1457,7 @@ ftfont_otf_features (OTF_GSUB_GPOS *gsub_gpos) Lisp_Object ftfont_otf_capability (struct font *font) { - struct ftfont_info *ftfont_info = (struct ftfont_info *) font; + struct font_info *ftfont_info = (struct font_info *) font; OTF *otf = ftfont_get_otf (ftfont_info); Lisp_Object gsub_gpos; @@ -2616,7 +2607,7 @@ Lisp_Object ftfont_shape (Lisp_Object lgstring) { struct font *font = CHECK_FONT_GET_OBJECT (LGSTRING_FONT (lgstring)); - struct ftfont_info *ftfont_info = (struct ftfont_info *) font; + struct font_info *ftfont_info = (struct font_info *) font; OTF *otf = ftfont_get_otf (ftfont_info); return ftfont_shape_by_flt (lgstring, font, ftfont_info->ft_size->face, otf, @@ -2630,7 +2621,7 @@ ftfont_shape (Lisp_Object lgstring) int ftfont_variation_glyphs (struct font *font, int c, unsigned variations[256]) { - struct ftfont_info *ftfont_info = (struct ftfont_info *) font; + struct font_info *ftfont_info = (struct font_info *) font; OTF *otf = ftfont_get_otf (ftfont_info); if (! otf) diff --git a/src/ftfont.h b/src/ftfont.h index 4201b2c2d67..b6b0c5ba47b 100644 --- a/src/ftfont.h +++ b/src/ftfont.h @@ -26,13 +26,13 @@ along with GNU Emacs. If not, see . */ #include FT_FREETYPE_H #include FT_SIZES_H #ifdef FT_BDF_H -#include FT_BDF_H +# include FT_BDF_H #endif #ifdef HAVE_LIBOTF -#include +# include #ifdef HAVE_M17N_FLT -#include +# include #endif /* HAVE_M17N_FLT */ #endif /* HAVE_LIBOTF */ @@ -41,6 +41,35 @@ extern Lisp_Object ftfont_open2 (struct frame *f, Lisp_Object entity, int pixel_size, Lisp_Object font_object); -extern size_t ftfont_info_size; + +/* This struct is shared by the XFT, Freetype, and Cairo font + backends. Members up to and including 'matrix' are common, the + rest depend on which backend is in use. */ +struct font_info +{ + struct font font; +#ifdef HAVE_LIBOTF + bool maybe_otf; /* Flag to tell if this may be OTF or not. */ + OTF *otf; +#endif /* HAVE_LIBOTF */ + FT_Size ft_size; + int index; + FT_Matrix matrix; + +#ifdef USE_CAIRO + cairo_font_face_t *cr_font_face; + /* To prevent cairo from cluttering the activated FT_Size maintained + in ftfont.c, we activate this special FT_Size before drawing. */ + FT_Size ft_size_draw; + /* Font metrics cache. */ + struct font_metrics **metrics; + short metrics_nrows; +#else + /* These are used by the XFT backend. */ + Display *display; + XftFont *xftfont; + unsigned x_display_id; +#endif +}; #endif /* EMACS_FTFONT_H */ diff --git a/src/xftfont.c b/src/xftfont.c index ea8572f4242..8a4516f7f91 100644 --- a/src/xftfont.c +++ b/src/xftfont.c @@ -36,29 +36,6 @@ along with GNU Emacs. If not, see . */ /* Xft font driver. */ - -/* The actual structure for Xft font that can be cast to struct - font. */ - -struct xftfont_info -{ - struct font font; - /* The following members up to and including 'matrix' must be here - in this order to be compatible with struct ftfont_info (in - ftfont.c). */ -#ifdef HAVE_LIBOTF - bool maybe_otf; /* Flag to tell if this may be OTF or not. */ - OTF *otf; -#endif /* HAVE_LIBOTF */ - FT_Size ft_size; - int index; - FT_Matrix matrix; - - Display *display; - XftFont *xftfont; - unsigned x_display_id; -}; - /* Structure pointed by (struct face *)->extra */ struct xftface_info @@ -258,7 +235,7 @@ xftfont_open (struct frame *f, Lisp_Object entity, int pixel_size) Display *display = FRAME_X_DISPLAY (f); Lisp_Object val, filename, idx, font_object; FcPattern *pat = NULL, *match; - struct xftfont_info *xftfont_info = NULL; + struct font_info *xftfont_info = NULL; struct font *font; double size = 0; XftFont *xftfont = NULL; @@ -333,7 +310,7 @@ 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_build_object (VECSIZE (struct xftfont_info), + font_object = font_build_object (VECSIZE (struct font_info), Qxft, entity, size); ASET (font_object, FONT_FILE_INDEX, filename); font = XFONT_OBJECT (font_object); @@ -341,7 +318,7 @@ xftfont_open (struct frame *f, Lisp_Object entity, int pixel_size) font->driver = &xftfont_driver; font->encoding_charset = font->repertory_charset = -1; - xftfont_info = (struct xftfont_info *) font; + xftfont_info = (struct font_info *) font; xftfont_info->display = display; xftfont_info->xftfont = xftfont; xftfont_info->x_display_id = FRAME_DISPLAY_INFO (f)->x_id; @@ -463,7 +440,7 @@ static void xftfont_close (struct font *font) { struct x_display_info *xdi; - struct xftfont_info *xftfont_info = (struct xftfont_info *) font; + struct font_info *xftfont_info = (struct font_info *) font; #ifdef HAVE_LIBOTF if (xftfont_info->otf) @@ -529,7 +506,7 @@ xftfont_done_face (struct frame *f, struct face *face) static int xftfont_has_char (Lisp_Object font, int c) { - struct xftfont_info *xftfont_info; + struct font_info *xftfont_info; struct charset *cs = NULL; if (EQ (AREF (font, FONT_ADSTYLE_INDEX), Qja) @@ -543,7 +520,7 @@ xftfont_has_char (Lisp_Object font, int c) if (FONT_ENTITY_P (font)) return ftfont_has_char (font, c); - xftfont_info = (struct xftfont_info *) XFONT_OBJECT (font); + xftfont_info = (struct font_info *) XFONT_OBJECT (font); return (XftCharExists (xftfont_info->display, xftfont_info->xftfont, (FcChar32) c) == FcTrue); } @@ -551,7 +528,7 @@ xftfont_has_char (Lisp_Object font, int c) static unsigned xftfont_encode_char (struct font *font, int c) { - struct xftfont_info *xftfont_info = (struct xftfont_info *) font; + struct font_info *xftfont_info = (struct font_info *) font; unsigned code = XftCharIndex (xftfont_info->display, xftfont_info->xftfont, (FcChar32) c); @@ -562,7 +539,7 @@ static void xftfont_text_extents (struct font *font, unsigned int *code, int nglyphs, struct font_metrics *metrics) { - struct xftfont_info *xftfont_info = (struct xftfont_info *) font; + struct font_info *xftfont_info = (struct font_info *) font; XGlyphInfo extents; block_input (); @@ -604,7 +581,7 @@ xftfont_draw (struct glyph_string *s, int from, int to, int x, int y, struct frame *f = s->f; struct face *face = s->face; - struct xftfont_info *xftfont_info = (struct xftfont_info *) s->font; + struct font_info *xftfont_info = (struct font_info *) s->font; struct xftface_info *xftface_info = NULL; XftDraw *xft_draw = xftfont_get_xft_draw (f); FT_UInt *code; @@ -667,7 +644,7 @@ static Lisp_Object xftfont_shape (Lisp_Object lgstring) { struct font *font = CHECK_FONT_GET_OBJECT (LGSTRING_FONT (lgstring)); - struct xftfont_info *xftfont_info = (struct xftfont_info *) font; + struct font_info *xftfont_info = (struct font_info *) font; FT_Face ft_face = XftLockFace (xftfont_info->xftfont); xftfont_info->ft_size = ft_face->size; Lisp_Object val = ftfont_shape (lgstring); @@ -711,7 +688,7 @@ static bool xftfont_cached_font_ok (struct frame *f, Lisp_Object font_object, Lisp_Object entity) { - struct xftfont_info *info = (struct xftfont_info *) XFONT_OBJECT (font_object); + struct font_info *info = (struct font_info *) XFONT_OBJECT (font_object); FcPattern *oldpat = info->xftfont->pattern; Display *display = FRAME_X_DISPLAY (f); FcPattern *pat = FcPatternCreate (); -- 2.39.2