diff options
| author | YAMAMOTO Mitsuharu | 2019-06-18 10:19:40 +0900 |
|---|---|---|
| committer | YAMAMOTO Mitsuharu | 2019-06-18 10:21:06 +0900 |
| commit | 64767008f70af88d193d36eb6d2c27e4bc95ea8e (patch) | |
| tree | 6bb91be06a2c8e09b2b4b07450dede39dd59a659 | |
| parent | 56a90c4234afb41b6d41a356ab4a35e71923552c (diff) | |
| download | emacs-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.c | 35 | ||||
| -rw-r--r-- | src/ftcrfont.c | 1 | ||||
| -rw-r--r-- | src/ftfont.c | 1 | ||||
| -rw-r--r-- | src/w32fns.c | 80 | ||||
| -rw-r--r-- | src/w32font.c | 2 | ||||
| -rw-r--r-- | src/xftfont.c | 1 |
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) | |||
| 3527 | Lisp_Object | 3530 | Lisp_Object |
| 3528 | font_update_drivers (struct frame *f, Lisp_Object new_drivers) | 3531 | font_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", |