aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPo Lu2024-04-23 15:57:45 +0800
committerPo Lu2024-04-23 15:57:45 +0800
commitcd7456e00d719d32c203c71b4e23c98b0c4e1967 (patch)
tree496bdb8d0a1f49aa4668d68c08e2f9309fd1868a
parentb9c191d690fd5d1480858469df23cc4509996fae (diff)
downloademacs-cd7456e00d719d32c203c71b4e23c98b0c4e1967.tar.gz
emacs-cd7456e00d719d32c203c71b4e23c98b0c4e1967.zip
Enable configuring Emacs for "pseudo-grayscale" systems on Android
* doc/emacs/android.texi (Android Windowing): Document how to configure Emacs for monochrome displays. * src/androidfns.c (Fx_display_visual_class): Return Qstatic_gray when n_planes is smaller than 24. (Fandroid_get_connection): Set n_planes by the value of android_display_planes. (syms_of_androidfns): <Qstatic_gray>: New function. * src/androidterm.c (android_alloc_nearest_color): Allocate monochrome colors similarly to the X server. (android_query_colors): Fix typos. (android_draw_fringe_bitmap): Create bitmaps of n_image_planes depth. (android_term_init): Initialize n_image_planes to 24. (syms_of_androidterm) <android_display_planes>: New variable. * src/androidterm.h (struct android_display_info): New field `n_image_planes'. * src/image.c (n_planes) [HAVE_ANDROID]: Define to n_image_planes.
-rw-r--r--doc/emacs/android.texi25
-rw-r--r--src/androidfns.c19
-rw-r--r--src/androidterm.c48
-rw-r--r--src/androidterm.h5
-rw-r--r--src/image.c3
5 files changed, 86 insertions, 14 deletions
diff --git a/doc/emacs/android.texi b/doc/emacs/android.texi
index 15c5fbcce3a..9e3716894ee 100644
--- a/doc/emacs/android.texi
+++ b/doc/emacs/android.texi
@@ -827,7 +827,7 @@ example, the permission to access contacts may be useful for EUDC.
827applications as maximized or full-screen, and, in the general case, only 827applications as maximized or full-screen, and, in the general case, only
828one window can be displayed at a time. On larger devices, the system 828one window can be displayed at a time. On larger devices, the system
829permits simultaneously tiling up to four windows on the screen, though 829permits simultaneously tiling up to four windows on the screen, though
830in emulators or installations configured for ``desktop'' system stacks 830in emulators or installations configured for ``desktop'' systems stacks
831freely resizable windows as other desktop window managers do. 831freely resizable windows as other desktop window managers do.
832 832
833 Windows, or, in system nomenclature, activities, do not exist 833 Windows, or, in system nomenclature, activities, do not exist
@@ -1002,12 +1002,31 @@ customized through altering the variable
1002@code{android-keyboard-bell-duration} to any value between @code{10} 1002@code{android-keyboard-bell-duration} to any value between @code{10}
1003and @code{1000}. 1003and @code{1000}.
1004 1004
1005@vindex android-display-planes
1006@cindex visual class, Android
1007@cindex display color space, Android
1008 Color-related characteristics of the display are not automatically
1009detectable on Android, so the variable @code{android-display-planes}
1010should be configured to a suitable value if Emacs is to realize faces
1011and images in a manner consistent with the true visual attributes of a
1012grayscale or monochrome display: to @code{8} for the former class of
1013display, and @code{1} for the latter, which will, respectively, force
1014all colors to be rendered in 256 grays, or in monochrome. As this
1015variable is processed at the time the display connection is established,
1016customizations will not take effect unless they be performed from
1017@code{early-init.el} (@pxref{Early Init File}).
1018
1019 The value of this variable does not affect anti-aliasing in the font
1020driver, as monochrome displays nevertheless expect Emacs to provide
1021antialiased text, which they receive after it is processed into bitmap
1022data by the display driver.
1023
1005@node Android Fonts 1024@node Android Fonts
1006@section Font Backends and Selection under Android 1025@section Font Backends and Selection under Android
1007@cindex fonts, android 1026@cindex fonts, android
1008 1027
1009 Emacs supports two font backends under Android: they are 1028 Emacs supports two font backends under Android: they are respectively
1010respectively named @code{sfnt-android} and @code{android}. 1029named @code{sfnt-android} and @code{android}.
1011 1030
1012 Upon startup, Emacs enumerates all the TrueType format fonts in the 1031 Upon startup, Emacs enumerates all the TrueType format fonts in the
1013directories @file{/system/fonts} and @file{/product/fonts}, and the 1032directories @file{/system/fonts} and @file{/product/fonts}, and the
diff --git a/src/androidfns.c b/src/androidfns.c
index 9f7ac8b69b2..b6df7ae0677 100644
--- a/src/androidfns.c
+++ b/src/androidfns.c
@@ -1345,7 +1345,12 @@ DEFUN ("x-display-visual-class", Fx_display_visual_class,
1345 doc: /* SKIP: real doc in xfns.c. */) 1345 doc: /* SKIP: real doc in xfns.c. */)
1346 (Lisp_Object terminal) 1346 (Lisp_Object terminal)
1347{ 1347{
1348 check_android_display_info (terminal); 1348 struct android_display_info *dpyinfo;
1349
1350 dpyinfo = check_android_display_info (terminal);
1351
1352 if (dpyinfo->n_planes < 24)
1353 return Qstatic_gray;
1349 1354
1350 return Qtrue_color; 1355 return Qtrue_color;
1351} 1356}
@@ -1805,7 +1810,16 @@ Android, so there is no equivalent of `x-open-connection'. */)
1805 terminal = Qnil; 1810 terminal = Qnil;
1806 1811
1807 if (x_display_list) 1812 if (x_display_list)
1808 XSETTERMINAL (terminal, x_display_list->terminal); 1813 {
1814 XSETTERMINAL (terminal, x_display_list->terminal);
1815
1816 /* Update the display's bit depth from
1817 `android_display_planes'. */
1818 x_display_list->n_planes
1819 = (android_display_planes > 8
1820 ? 24 : (android_display_planes > 1
1821 ? android_display_planes : 1));
1822 }
1809 1823
1810 return terminal; 1824 return terminal;
1811#endif 1825#endif
@@ -3479,6 +3493,7 @@ syms_of_androidfns (void)
3479{ 3493{
3480 /* Miscellaneous symbols used by some functions here. */ 3494 /* Miscellaneous symbols used by some functions here. */
3481 DEFSYM (Qtrue_color, "true-color"); 3495 DEFSYM (Qtrue_color, "true-color");
3496 DEFSYM (Qstatic_gray, "static-color");
3482 DEFSYM (Qwhen_mapped, "when-mapped"); 3497 DEFSYM (Qwhen_mapped, "when-mapped");
3483 3498
3484 DEFVAR_LISP ("x-pointer-shape", Vx_pointer_shape, 3499 DEFVAR_LISP ("x-pointer-shape", Vx_pointer_shape,
diff --git a/src/androidterm.c b/src/androidterm.c
index c920375fdbe..e4f3abdb2d3 100644
--- a/src/androidterm.c
+++ b/src/androidterm.c
@@ -1964,10 +1964,33 @@ android_parse_color (struct frame *f, const char *color_name,
1964bool 1964bool
1965android_alloc_nearest_color (struct frame *f, Emacs_Color *color) 1965android_alloc_nearest_color (struct frame *f, Emacs_Color *color)
1966{ 1966{
1967 unsigned int ntsc;
1968
1967 gamma_correct (f, color); 1969 gamma_correct (f, color);
1968 color->pixel = RGB_TO_ULONG (color->red / 256, 1970
1969 color->green / 256, 1971 if (FRAME_DISPLAY_INFO (f)->n_planes == 1)
1970 color->blue / 256); 1972 {
1973 /* Black and white. I think this is the luminance formula applied
1974 by the X server on generic monochrome framebuffers. */
1975 color->pixel = ((((30l * color->red
1976 + 59l * color->green
1977 + 11l * color->blue) >> 8)
1978 >= (((1 << 8) -1) * 50))
1979 ? 0xffffff : 0);
1980 }
1981 else if (FRAME_DISPLAY_INFO (f)->n_planes <= 8)
1982 {
1983 /* 256 grays. */
1984 ntsc = min (255, ((color->red * 0.299
1985 + color->green * 0.587
1986 + color->blue * 0.114)
1987 / 256));
1988 color->pixel = RGB_TO_ULONG (ntsc, ntsc, ntsc);
1989 }
1990 else
1991 color->pixel = RGB_TO_ULONG (color->red / 256,
1992 color->green / 256,
1993 color->blue / 256);
1971 1994
1972 return true; 1995 return true;
1973} 1996}
@@ -1980,8 +2003,8 @@ android_query_colors (struct frame *f, Emacs_Color *colors, int ncolors)
1980 for (i = 0; i < ncolors; ++i) 2003 for (i = 0; i < ncolors; ++i)
1981 { 2004 {
1982 colors[i].red = RED_FROM_ULONG (colors[i].pixel) * 257; 2005 colors[i].red = RED_FROM_ULONG (colors[i].pixel) * 257;
1983 colors[i].green = RED_FROM_ULONG (colors[i].pixel) * 257; 2006 colors[i].green = GREEN_FROM_ULONG (colors[i].pixel) * 257;
1984 colors[i].blue = RED_FROM_ULONG (colors[i].pixel) * 257; 2007 colors[i].blue = BLUE_FROM_ULONG (colors[i].pixel) * 257;
1985 } 2008 }
1986} 2009}
1987 2010
@@ -2630,7 +2653,7 @@ android_draw_fringe_bitmap (struct window *w, struct glyph_row *row,
2630 clipmask = ANDROID_NONE; 2653 clipmask = ANDROID_NONE;
2631 background = face->background; 2654 background = face->background;
2632 cursor_pixel = f->output_data.android->cursor_pixel; 2655 cursor_pixel = f->output_data.android->cursor_pixel;
2633 depth = FRAME_DISPLAY_INFO (f)->n_planes; 2656 depth = FRAME_DISPLAY_INFO (f)->n_image_planes;
2634 2657
2635 /* Intersect the destination rectangle with that of the row. 2658 /* Intersect the destination rectangle with that of the row.
2636 Setting a clip mask overrides the clip rectangles provided by 2659 Setting a clip mask overrides the clip rectangles provided by
@@ -6504,8 +6527,8 @@ android_term_init (void)
6504 terminal = android_create_terminal (dpyinfo); 6527 terminal = android_create_terminal (dpyinfo);
6505 terminal->kboard = allocate_kboard (Qandroid); 6528 terminal->kboard = allocate_kboard (Qandroid);
6506 terminal->kboard->reference_count++; 6529 terminal->kboard->reference_count++;
6507
6508 dpyinfo->n_planes = 24; 6530 dpyinfo->n_planes = 24;
6531 dpyinfo->n_image_planes = 24;
6509 6532
6510 /* This function should only be called once at startup. */ 6533 /* This function should only be called once at startup. */
6511 eassert (!x_display_list); 6534 eassert (!x_display_list);
@@ -6702,6 +6725,17 @@ Emacs is running on. */);
6702 doc: /* Name of the developer of the running version of Android. */); 6725 doc: /* Name of the developer of the running version of Android. */);
6703 Vandroid_build_manufacturer = Qnil; 6726 Vandroid_build_manufacturer = Qnil;
6704 6727
6728 DEFVAR_INT ("android-display-planes", android_display_planes,
6729 doc: /* Depth and visual class of the display.
6730This variable controls the visual class and depth of the display, which
6731cannot be detected on Android. The default value of 24, and values from
6732there to 8 represent a TrueColor display providing 24 planes, values
6733between 8 and 1 StaticGray displays providing that many planes, and 1 or
6734lower monochrome displays with a single plane. Modifications to this
6735variable must be completed before the window system is initialized, in,
6736for instance, `early-init.el', or they will be of no effect. */);
6737 android_display_planes = 24;
6738
6705 DEFVAR_LISP ("x-ctrl-keysym", Vx_ctrl_keysym, 6739 DEFVAR_LISP ("x-ctrl-keysym", Vx_ctrl_keysym,
6706 doc: /* SKIP: real doc in xterm.c. */); 6740 doc: /* SKIP: real doc in xterm.c. */);
6707 Vx_ctrl_keysym = Qnil; 6741 Vx_ctrl_keysym = Qnil;
diff --git a/src/androidterm.h b/src/androidterm.h
index fd4cc99f641..24eb2c30f12 100644
--- a/src/androidterm.h
+++ b/src/androidterm.h
@@ -77,8 +77,9 @@ struct android_display_info
77 /* Mouse highlight information. */ 77 /* Mouse highlight information. */
78 Mouse_HLInfo mouse_highlight; 78 Mouse_HLInfo mouse_highlight;
79 79
80 /* Number of planes on this screen. Always 24. */ 80 /* Number of planes on this screen, and the same for the purposes of
81 int n_planes; 81 image processing. */
82 int n_planes, n_image_planes;
82 83
83 /* Mask of things causing the mouse to be grabbed. */ 84 /* Mask of things causing the mouse to be grabbed. */
84 int grabbed; 85 int grabbed;
diff --git a/src/image.c b/src/image.c
index 3028c2e707a..d1faadee968 100644
--- a/src/image.c
+++ b/src/image.c
@@ -198,6 +198,9 @@ typedef android_pixmap Pixmap;
198#define GREEN16_FROM_ULONG(color) (GREEN_FROM_ULONG (color) * 0x101) 198#define GREEN16_FROM_ULONG(color) (GREEN_FROM_ULONG (color) * 0x101)
199#define BLUE16_FROM_ULONG(color) (BLUE_FROM_ULONG (color) * 0x101) 199#define BLUE16_FROM_ULONG(color) (BLUE_FROM_ULONG (color) * 0x101)
200 200
201/* DPYINFO->n_planes is unsuitable for this file, because it accepts
202 values that may not be supported for pixmap creation. */
203#define n_planes n_image_planes
201#endif 204#endif
202 205
203static void image_disable_image (struct frame *, struct image *); 206static void image_disable_image (struct frame *, struct image *);