aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYAMAMOTO Mitsuharu2019-06-18 10:19:40 +0900
committerYAMAMOTO Mitsuharu2019-06-18 10:21:06 +0900
commit64767008f70af88d193d36eb6d2c27e4bc95ea8e (patch)
tree6bb91be06a2c8e09b2b4b07450dede39dd59a659
parent56a90c4234afb41b6d41a356ab4a35e71923552c (diff)
downloademacs-64767008f70af88d193d36eb6d2c27e4bc95ea8e.tar.gz
emacs-64767008f70af88d193d36eb6d2c27e4bc95ea8e.zip
Support font driver supersession
* src/font.c (font_update_drivers): If argument NEW_DRIVERS is t, then don't use superseded drivers. (syms_of_font) <Qfont_driver_superseded_by>: New DEFSYM. * src/ftfont.c (syms_of_ftfont) [HAVE_HARFBUZZ]: * src/ftcrfont.c (syms_of_ftcrfont) [HAVE_HARFBUZZ]: * src/w32font.c (syms_of_w32font) [HAVE_HARFBUZZ]: * src/xftfont.c (syms_of_xftfont) [HAVE_HARFBUZZ]: Make Harfbuzz variants supersede non-Harfbuzz ones. * src/w32fns.c (Fx_create_frame, w32_create_tip_frame): Remove font backend determination code.
-rw-r--r--src/font.c35
-rw-r--r--src/ftcrfont.c1
-rw-r--r--src/ftfont.c1
-rw-r--r--src/w32fns.c80
-rw-r--r--src/w32font.c2
-rw-r--r--src/xftfont.c1
6 files changed, 38 insertions, 82 deletions
diff --git a/src/font.c b/src/font.c
index 5705758b99f..964028ccf00 100644
--- a/src/font.c
+++ b/src/font.c
@@ -3518,7 +3518,10 @@ free_font_driver_list (struct frame *f)
3518 3518
3519/* Make the frame F use font backends listed in NEW_DRIVERS (list of 3519/* Make the frame F use font backends listed in NEW_DRIVERS (list of
3520 symbols, e.g. xft, x). If NEW_DRIVERS is t, make F use all 3520 symbols, e.g. xft, x). If NEW_DRIVERS is t, make F use all
3521 available font drivers. If NEW_DRIVERS is nil, finalize all drivers. 3521 available font drivers that are not superseded by another driver.
3522 (A font driver SYMBOL is superseded by the driver specified by
3523 SYMBOL's 'font-driver-superseded-by property if it is a non-nil
3524 symbol.) If NEW_DRIVERS is nil, finalize all drivers.
3522 3525
3523 A caller must free all realized faces if any in advance. The 3526 A caller must free all realized faces if any in advance. The
3524 return value is a list of font backends actually made used on 3527 return value is a list of font backends actually made used on
@@ -3527,16 +3530,33 @@ free_font_driver_list (struct frame *f)
3527Lisp_Object 3530Lisp_Object
3528font_update_drivers (struct frame *f, Lisp_Object new_drivers) 3531font_update_drivers (struct frame *f, Lisp_Object new_drivers)
3529{ 3532{
3530 Lisp_Object active_drivers = Qnil; 3533 Lisp_Object active_drivers = Qnil, default_drivers = Qnil;
3531 struct font_driver_list *list; 3534 struct font_driver_list *list;
3532 3535
3536 /* Collect all unsuperseded driver symbols into
3537 `default_drivers'. */
3538 Lisp_Object all_drivers = Qnil;
3539 for (list = f->font_driver_list; list; list = list->next)
3540 all_drivers = Fcons (list->driver->type, all_drivers);
3541 for (Lisp_Object rest = all_drivers; CONSP (rest); rest = XCDR (rest))
3542 {
3543 Lisp_Object superseded_by
3544 = Fget (XCAR (rest), Qfont_driver_superseded_by);
3545
3546 if (NILP (superseded_by)
3547 || NILP (Fmemq (superseded_by, all_drivers)))
3548 default_drivers = Fcons (XCAR (rest), default_drivers);
3549 }
3550
3551 if (EQ (new_drivers, Qt))
3552 new_drivers = default_drivers;
3553
3533 /* At first, turn off non-requested drivers, and turn on requested 3554 /* At first, turn off non-requested drivers, and turn on requested
3534 drivers. */ 3555 drivers. */
3535 for (list = f->font_driver_list; list; list = list->next) 3556 for (list = f->font_driver_list; list; list = list->next)
3536 { 3557 {
3537 struct font_driver const *driver = list->driver; 3558 struct font_driver const *driver = list->driver;
3538 if ((EQ (new_drivers, Qt) || ! NILP (Fmemq (driver->type, new_drivers))) 3559 if ((! NILP (Fmemq (driver->type, new_drivers))) != list->on)
3539 != list->on)
3540 { 3560 {
3541 if (list->on) 3561 if (list->on)
3542 { 3562 {
@@ -3559,8 +3579,7 @@ font_update_drivers (struct frame *f, Lisp_Object new_drivers)
3559 3579
3560 if (NILP (new_drivers)) 3580 if (NILP (new_drivers))
3561 return Qnil; 3581 return Qnil;
3562 3582 else
3563 if (! EQ (new_drivers, Qt))
3564 { 3583 {
3565 /* Re-order the driver list according to new_drivers. */ 3584 /* Re-order the driver list according to new_drivers. */
3566 struct font_driver_list **list_table, **next; 3585 struct font_driver_list **list_table, **next;
@@ -3599,6 +3618,8 @@ font_update_drivers (struct frame *f, Lisp_Object new_drivers)
3599 { 3618 {
3600 struct font_driver const *driver = list->driver; 3619 struct font_driver const *driver = list->driver;
3601 eassert (! list->on); 3620 eassert (! list->on);
3621 if (NILP (Fmemq (driver->type, default_drivers)))
3622 continue;
3602 if (! driver->start_for_frame 3623 if (! driver->start_for_frame
3603 || driver->start_for_frame (f) == 0) 3624 || driver->start_for_frame (f) == 0)
3604 { 3625 {
@@ -5359,6 +5380,8 @@ syms_of_font (void)
5359 DEFSYM (QL2R, "L2R"); 5380 DEFSYM (QL2R, "L2R");
5360 DEFSYM (QR2L, "R2L"); 5381 DEFSYM (QR2L, "R2L");
5361 5382
5383 DEFSYM (Qfont_driver_superseded_by, "font-driver-superseded-by");
5384
5362 scratch_font_spec = Ffont_spec (0, NULL); 5385 scratch_font_spec = Ffont_spec (0, NULL);
5363 staticpro (&scratch_font_spec); 5386 staticpro (&scratch_font_spec);
5364 scratch_font_prefer = Ffont_spec (0, NULL); 5387 scratch_font_prefer = Ffont_spec (0, NULL);
diff --git a/src/ftcrfont.c b/src/ftcrfont.c
index 1c28a7ceb67..a019fe8294a 100644
--- a/src/ftcrfont.c
+++ b/src/ftcrfont.c
@@ -599,6 +599,7 @@ syms_of_ftcrfont (void)
599 DEFSYM (Qftcr, "ftcr"); 599 DEFSYM (Qftcr, "ftcr");
600#ifdef HAVE_HARFBUZZ 600#ifdef HAVE_HARFBUZZ
601 DEFSYM (Qftcrhb, "ftcrhb"); 601 DEFSYM (Qftcrhb, "ftcrhb");
602 Fput (Qftcr, Qfont_driver_superseded_by, Qftcrhb);
602#endif /* HAVE_HARFBUZZ */ 603#endif /* HAVE_HARFBUZZ */
603 pdumper_do_now_and_after_load (syms_of_ftcrfont_for_pdumper); 604 pdumper_do_now_and_after_load (syms_of_ftcrfont_for_pdumper);
604} 605}
diff --git a/src/ftfont.c b/src/ftfont.c
index efd0fcbd8c0..4380a48d8dc 100644
--- a/src/ftfont.c
+++ b/src/ftfont.c
@@ -2970,6 +2970,7 @@ syms_of_ftfont (void)
2970 DEFSYM (Qfreetype, "freetype"); 2970 DEFSYM (Qfreetype, "freetype");
2971#ifdef HAVE_HARFBUZZ 2971#ifdef HAVE_HARFBUZZ
2972 DEFSYM (Qfreetypehb, "freetypehb"); 2972 DEFSYM (Qfreetypehb, "freetypehb");
2973 Fput (Qfreetype, Qfont_driver_superseded_by, Qfreetypehb);
2973#endif /* HAVE_HARFBUZZ */ 2974#endif /* HAVE_HARFBUZZ */
2974 2975
2975 /* Fontconfig's generic families and their aliases. */ 2976 /* Fontconfig's generic families and their aliases. */
diff --git a/src/w32fns.c b/src/w32fns.c
index 8ebfc119521..83830c616e5 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -5844,46 +5844,10 @@ DEFUN ("x-create-frame", Fx_create_frame, Sx_create_frame,
5844 specbind (Qx_resource_name, name); 5844 specbind (Qx_resource_name, name);
5845 } 5845 }
5846 5846
5847 bool register_uniscribe = uniscribe_available;
5848#ifdef HAVE_HARFBUZZ 5847#ifdef HAVE_HARFBUZZ
5849 /* Register Uniscribe only if HarfBuzz is not available or if 5848 register_font_driver (&harfbuzz_font_driver, f);
5850 explicitly requested. If Uniscribe is registered, register
5851 HarfBuzz only if explicitly requested. */
5852 bool register_harfbuzz = harfbuzz_available;
5853 if (register_harfbuzz)
5854 register_uniscribe = false;
5855 Lisp_Object dflt_backends
5856 = gui_display_get_arg (dpyinfo, parameters, Qfont_backend,
5857 "fontBackend", "FontBackend", RES_TYPE_STRING);
5858 if (!EQ (dflt_backends, Qunbound))
5859 {
5860 bool harfbuzz_requested = false, uniscribe_requested = false;
5861 if (CONSP (dflt_backends))
5862 {
5863 if (!NILP (Fmemq (Quniscribe, dflt_backends)))
5864 uniscribe_requested = true;
5865 if (!NILP (Fmemq (Qharfbuzz, dflt_backends)))
5866 harfbuzz_requested = true;
5867 }
5868 else if (STRINGP (dflt_backends))
5869 {
5870 if (strcmp (SSDATA (dflt_backends), "uniscribe") == 0)
5871 uniscribe_requested = true;
5872 else if (strcmp (SSDATA (dflt_backends), "harfbuzz") == 0)
5873 harfbuzz_requested = true;
5874 }
5875 if (uniscribe_requested)
5876 {
5877 register_uniscribe = uniscribe_available;
5878 if (!harfbuzz_requested)
5879 register_harfbuzz = false;
5880 }
5881 }
5882 if (register_harfbuzz)
5883 register_font_driver (&harfbuzz_font_driver, f);
5884#endif 5849#endif
5885 if (register_uniscribe) 5850 register_font_driver (&uniscribe_font_driver, f);
5886 register_font_driver (&uniscribe_font_driver, f);
5887 register_font_driver (&w32font_driver, f); 5851 register_font_driver (&w32font_driver, f);
5888 5852
5889 gui_default_parameter (f, parameters, Qfont_backend, Qnil, 5853 gui_default_parameter (f, parameters, Qfont_backend, Qnil,
@@ -6935,46 +6899,10 @@ w32_create_tip_frame (struct w32_display_info *dpyinfo, Lisp_Object parms)
6935 specbind (Qx_resource_name, name); 6899 specbind (Qx_resource_name, name);
6936 } 6900 }
6937 6901
6938 bool register_uniscribe = uniscribe_available;
6939#ifdef HAVE_HARFBUZZ 6902#ifdef HAVE_HARFBUZZ
6940 /* Register Uniscribe only if HarfBuzz is not available or if 6903 register_font_driver (&harfbuzz_font_driver, f);
6941 explicitly requested. If Uniscribe is registered, register
6942 HarfBuzz only if explicitly requested. */
6943 bool register_harfbuzz = harfbuzz_available;
6944 if (register_harfbuzz)
6945 register_uniscribe = false;
6946 Lisp_Object dflt_backends
6947 = gui_display_get_arg (dpyinfo, parms, Qfont_backend,
6948 "fontBackend", "FontBackend", RES_TYPE_STRING);
6949 if (!EQ (dflt_backends, Qunbound))
6950 {
6951 bool harfbuzz_requested = false, uniscribe_requested = false;
6952 if (CONSP (dflt_backends))
6953 {
6954 if (!NILP (Fmemq (Quniscribe, dflt_backends)))
6955 uniscribe_requested = true;
6956 if (!NILP (Fmemq (Qharfbuzz, dflt_backends)))
6957 harfbuzz_requested = true;
6958 }
6959 else if (STRINGP (dflt_backends))
6960 {
6961 if (strcmp (SSDATA (dflt_backends), "uniscribe") == 0)
6962 uniscribe_requested = true;
6963 else if (strcmp (SSDATA (dflt_backends), "harfbuzz") == 0)
6964 harfbuzz_requested = true;
6965 }
6966 if (uniscribe_requested)
6967 {
6968 register_uniscribe = uniscribe_available;
6969 if (!harfbuzz_requested)
6970 register_harfbuzz = false;
6971 }
6972 }
6973 if (register_harfbuzz)
6974 register_font_driver (&harfbuzz_font_driver, f);
6975#endif 6904#endif
6976 if (register_uniscribe) 6905 register_font_driver (&uniscribe_font_driver, f);
6977 register_font_driver (&uniscribe_font_driver, f);
6978 register_font_driver (&w32font_driver, f); 6906 register_font_driver (&w32font_driver, f);
6979 6907
6980 gui_default_parameter (f, parms, Qfont_backend, Qnil, 6908 gui_default_parameter (f, parms, Qfont_backend, Qnil,
diff --git a/src/w32font.c b/src/w32font.c
index 14d49b24d9b..5d54f048fb5 100644
--- a/src/w32font.c
+++ b/src/w32font.c
@@ -2821,6 +2821,8 @@ versions of Windows) characters. */);
2821 2821
2822 defsubr (&Sx_select_font); 2822 defsubr (&Sx_select_font);
2823 2823
2824 Fput (Quniscribe, Qfont_driver_superseded_by, Qharfbuzz);
2825
2824 pdumper_do_now_and_after_load (syms_of_w32font_for_pdumper); 2826 pdumper_do_now_and_after_load (syms_of_w32font_for_pdumper);
2825} 2827}
2826 2828
diff --git a/src/xftfont.c b/src/xftfont.c
index 04cda12fb52..4d2a5f520e0 100644
--- a/src/xftfont.c
+++ b/src/xftfont.c
@@ -679,6 +679,7 @@ syms_of_xftfont (void)
679 DEFSYM (Qxft, "xft"); 679 DEFSYM (Qxft, "xft");
680#ifdef HAVE_HARFBUZZ 680#ifdef HAVE_HARFBUZZ
681 DEFSYM (Qxfthb, "xfthb"); 681 DEFSYM (Qxfthb, "xfthb");
682 Fput (Qxft, Qfont_driver_superseded_by, Qxfthb);
682#endif /* HAVE_HARFBUZZ */ 683#endif /* HAVE_HARFBUZZ */
683 684
684 DEFVAR_BOOL ("xft-font-ascent-descent-override", 685 DEFVAR_BOOL ("xft-font-ascent-descent-override",