summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>2019-06-02 13:33:43 +0900
committerYAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>2019-06-02 13:33:43 +0900
commit295572c6f603c7150f68f3a7479fb0969b2f86d0 (patch)
treebe63752fccbd05d7863fe7329e717da77d3f803f
parent2ae0c7a434dcdcc53e2ccfc758093714b0695c3b (diff)
downloademacs-295572c6f603c7150f68f3a7479fb0969b2f86d0.tar.gz
Implement the get_variation_glyphs method for FreeType >= 2.3.6
* configure.ac: Check availability of FT_Face_GetCharVariantIndex. * src/ftfont.c (ftfont_variation_glyphs) [HAVE_FT_FACE_GETCHARVARIANTINDEX]: Add function implementation. * src/ftcrfont.c (ftcrfont_variation_glyphs) [HAVE_FT_FACE_GETCHARVARIANTINDEX]: Use function implementation for HAVE_OTF_GET_VARIATION_GLYPHS. * src/ftfont.c (ftfont_driver) [HAVE_FT_FACE_GETCHARVARIANTINDEX]: * src/xftfont.c (xftfont_driver) [HAVE_FT_FACE_GETCHARVARIANTINDEX]: * src/ftxfont.c (ftxfont_driver) [HAVE_FT_FACE_GETCHARVARIANTINDEX]: * src/ftcrfont.c (ftcrfont_driver) [HAVE_FT_FACE_GETCHARVARIANTINDEX]: Populate the get_variation_glyphs method.
-rw-r--r--configure.ac7
-rw-r--r--src/ftcrfont.c6
-rw-r--r--src/ftfont.c30
-rw-r--r--src/ftxfont.c2
-rw-r--r--src/xftfont.c2
5 files changed, 37 insertions, 10 deletions
diff --git a/configure.ac b/configure.ac
index b228571c177..bd51f54212c 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3413,6 +3413,13 @@ if test "${HAVE_X11}" = "yes"; then
if test "${HAVE_FREETYPE}" = "yes"; then
AC_DEFINE(HAVE_FREETYPE, 1,
[Define to 1 if using the freetype and fontconfig libraries.])
+ OLD_CFLAGS=$CFLAGS
+ OLD_LIBS=$LIBS
+ CFLAGS="$CFLAGS $FREETYPE_CFLAGS"
+ LIBS="$FREETYPE_LIBS $LIBS"
+ AC_CHECK_FUNCS(FT_Face_GetCharVariantIndex)
+ CFLAGS=$OLD_CFLAGS
+ LIBS=$OLD_LIBS
if test "${with_libotf}" != "no"; then
EMACS_CHECK_MODULES([LIBOTF], [libotf])
if test "$HAVE_LIBOTF" = "yes"; then
diff --git a/src/ftcrfont.c b/src/ftcrfont.c
index 0c3b74ff289..1c28a7ceb67 100644
--- a/src/ftcrfont.c
+++ b/src/ftcrfont.c
@@ -455,7 +455,7 @@ ftcrfont_shape (Lisp_Object lgstring, Lisp_Object direction)
}
#endif
-#ifdef HAVE_OTF_GET_VARIATION_GLYPHS
+#if defined HAVE_OTF_GET_VARIATION_GLYPHS || defined HAVE_FT_FACE_GETCHARVARIANTINDEX
static int
ftcrfont_variation_glyphs (struct font *font, int c, unsigned variations[256])
{
@@ -470,7 +470,7 @@ ftcrfont_variation_glyphs (struct font *font, int c, unsigned variations[256])
return result;
}
-#endif /* HAVE_OTF_GET_VARIATION_GLYPHS */
+#endif /* HAVE_OTF_GET_VARIATION_GLYPHS || HAVE_FT_FACE_GETCHARVARIANTINDEX */
static int
ftcrfont_draw (struct glyph_string *s,
@@ -583,7 +583,7 @@ struct font_driver const ftcrfont_driver =
#if defined HAVE_M17N_FLT && defined HAVE_LIBOTF
.shape = ftcrfont_shape,
#endif
-#ifdef HAVE_OTF_GET_VARIATION_GLYPHS
+#if defined HAVE_OTF_GET_VARIATION_GLYPHS || defined HAVE_FT_FACE_GETCHARVARIANTINDEX
.get_variation_glyphs = ftcrfont_variation_glyphs,
#endif
.filter_properties = ftfont_filter_properties,
diff --git a/src/ftfont.c b/src/ftfont.c
index 97ab4d0e377..efd0fcbd8c0 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -2820,21 +2820,41 @@ ftfont_shape (Lisp_Object lgstring, Lisp_Object direction)
#endif /* HAVE_M17N_FLT */
-#ifdef HAVE_OTF_GET_VARIATION_GLYPHS
+#endif /* HAVE_LIBOTF */
+#if defined HAVE_OTF_GET_VARIATION_GLYPHS || defined HAVE_FT_FACE_GETCHARVARIANTINDEX
int
ftfont_variation_glyphs (struct font *font, int c, unsigned variations[256])
{
struct font_info *ftfont_info = (struct font_info *) font;
+#ifdef HAVE_OTF_GET_VARIATION_GLYPHS
OTF *otf = ftfont_get_otf (ftfont_info);
if (! otf)
return 0;
return OTF_get_variation_glyphs (otf, c, variations);
-}
+#else /* !HAVE_OTF_GET_VARIATION_GLYPHS */
+ FT_Face ft_face = ftfont_info->ft_size->face;
+ int i, n = 0;
-#endif /* HAVE_OTF_GET_VARIATION_GLYPHS */
-#endif /* HAVE_LIBOTF */
+ for (i = 0; i < 16; i++)
+ {
+ variations[i] = FT_Face_GetCharVariantIndex (ft_face, c, 0xFE00 + i);
+ if (variations[i])
+ n++;
+ }
+ for (; i < 256; i++)
+ {
+ variations[i] = FT_Face_GetCharVariantIndex (ft_face, c,
+ 0xE0100 + (i - 16));
+ if (variations[i])
+ n++;
+ }
+
+ return n;
+#endif /* !HAVE_OTF_GET_VARIATION_GLYPHS */
+}
+#endif /* HAVE_OTF_GET_VARIATION_GLYPHS || HAVE_FT_FACE_GETCHARVARIANTINDEX */
#ifdef HAVE_HARFBUZZ
@@ -2936,7 +2956,7 @@ static struct font_driver const ftfont_driver =
#if defined HAVE_M17N_FLT && defined HAVE_LIBOTF
.shape = ftfont_shape,
#endif
-#ifdef HAVE_OTF_GET_VARIATION_GLYPHS
+#if defined HAVE_OTF_GET_VARIATION_GLYPHS || defined HAVE_FT_FACE_GETCHARVARIANTINDEX
.get_variation_glyphs = ftfont_variation_glyphs,
#endif
.filter_properties = ftfont_filter_properties,
diff --git a/src/ftxfont.c b/src/ftxfont.c
index da3e3fbae10..b1467360ad6 100644
--- a/src/ftxfont.c
+++ b/src/ftxfont.c
@@ -351,7 +351,7 @@ struct font_driver const ftxfont_driver =
#if defined HAVE_M17N_FLT && defined HAVE_LIBOTF
.shape = ftfont_shape,
#endif
-#ifdef HAVE_OTF_GET_VARIATION_GLYPHS
+#if defined HAVE_OTF_GET_VARIATION_GLYPHS || defined HAVE_FT_FACE_GETCHARVARIANTINDEX
.get_variation_glyphs = ftfont_variation_glyphs,
#endif
.filter_properties = ftfont_filter_properties,
diff --git a/src/xftfont.c b/src/xftfont.c
index c1b93b76f57..04cda12fb52 100644
--- a/src/xftfont.c
+++ b/src/xftfont.c
@@ -661,7 +661,7 @@ struct font_driver const xftfont_driver =
#if defined HAVE_M17N_FLT && defined HAVE_LIBOTF
.shape = xftfont_shape,
#endif
-#ifdef HAVE_OTF_GET_VARIATION_GLYPHS
+#if defined HAVE_OTF_GET_VARIATION_GLYPHS || defined HAVE_FT_FACE_GETCHARVARIANTINDEX
.get_variation_glyphs = ftfont_variation_glyphs,
#endif
.filter_properties = ftfont_filter_properties,