Fix colorspace calculations on Haiku

* src/haiku_support.cc (be_get_display_planes)
(be_get_display_color_cells): Handle grayscale basic colorspaces
correctly.
(be_is_display_grayscale): New function.

* src/haiku_support.h: Update prototypes.

* src/haikufns.c (haiku_set_no_accept_focus, haiku_iconify_frame)
(Fxw_display_color_p, Fxw_color_values, Fx_display_grayscale_p):
Actually handle grayscale colorspaces.
(Fx_display_pixel_width, Fx_display_pixel_height)
(Fx_display_mm_height, Fx_display_mm_width): Clean up coding
style.
(Fx_display_visual_class): Handle grayscale colorspaces.
(syms_of_haikufns): New defsyms.
This commit is contained in:
Po Lu 2022-04-29 11:06:52 +00:00
parent e313cae71f
commit 20d3d62ec9
3 changed files with 95 additions and 46 deletions

View file

@ -3587,24 +3587,35 @@ int
be_get_display_planes (void)
{
color_space space = dpy_color_space;
BScreen screen;
if (space == B_NO_COLOR_SPACE)
{
BScreen screen; /* This is actually a very slow operation. */
if (!screen.IsValid ())
gui_abort ("Invalid screen");
space = dpy_color_space = screen.ColorSpace ();
}
if (space == B_RGB32 || space == B_RGB24)
return 24;
if (space == B_RGB16)
return 16;
if (space == B_RGB15)
return 15;
if (space == B_CMAP8)
return 8;
switch (space)
{
case B_RGB32:
case B_RGB24:
return 24;
case B_RGB16:
return 16;
case B_RGB15:
return 15;
case B_CMAP8:
case B_GRAY8:
return 8;
case B_GRAY1:
return 1;
default:
gui_abort ("Bad colorspace for screen");
}
gui_abort ("Bad colorspace for screen");
/* https://www.haiku-os.org/docs/api/classBScreen.html
says a valid screen can't be anything else. */
return -1;
@ -3614,28 +3625,58 @@ be_get_display_planes (void)
int
be_get_display_color_cells (void)
{
BScreen screen;
color_space space = dpy_color_space;
if (space == B_NO_COLOR_SPACE)
{
BScreen screen;
if (!screen.IsValid ())
gui_abort ("Invalid screen");
space = dpy_color_space = screen.ColorSpace ();
}
if (space == B_RGB32 || space == B_RGB24)
return 1677216;
if (space == B_RGB16)
return 65536;
if (space == B_RGB15)
return 32768;
if (space == B_CMAP8)
return 256;
switch (space)
{
case B_RGB32:
case B_RGB24:
return 16777216;
case B_RGB16:
return 65536;
case B_RGB15:
return 32768;
case B_CMAP8:
case B_GRAY8:
return 256;
case B_GRAY1:
return 2;
default:
gui_abort ("Bad colorspace for screen");
}
gui_abort ("Bad colorspace for screen");
return -1;
}
/* Return whether or not the current display is only capable of
producing grayscale colors. */
bool
be_is_display_grayscale (void)
{
BScreen screen;
color_space space = dpy_color_space;
if (space == B_NO_COLOR_SPACE)
{
if (!screen.IsValid ())
gui_abort ("Invalid screen");
space = dpy_color_space = screen.ColorSpace ();
}
return space == B_GRAY8 || space == B_GRAY1;
}
/* Warp the pointer to X by Y. */
void
be_warp_pointer (int x, int y)

View file

@ -605,6 +605,7 @@ extern void EmacsWindow_unzoom (void *);
extern void be_get_version_string (char *, int);
extern int be_get_display_planes (void);
extern int be_get_display_color_cells (void);
extern bool be_is_display_grayscale (void);
extern void be_warp_pointer (int, int);
extern void EmacsView_set_up_double_buffering (void *);

View file

@ -511,15 +511,13 @@ haiku_explicitly_set_name (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
static void
haiku_set_no_accept_focus (struct frame *f, Lisp_Object new_value, Lisp_Object old_value)
{
block_input ();
if (!EQ (new_value, old_value))
FRAME_NO_ACCEPT_FOCUS (f) = !NILP (new_value);
block_input ();
if (FRAME_HAIKU_WINDOW (f))
{
BWindow_set_avoid_focus (FRAME_HAIKU_WINDOW (f),
FRAME_NO_ACCEPT_FOCUS (f));
}
BWindow_set_avoid_focus (FRAME_HAIKU_WINDOW (f),
FRAME_NO_ACCEPT_FOCUS (f));
unblock_input ();
}
@ -1626,13 +1624,11 @@ haiku_iconify_frame (struct frame *frame)
if (FRAME_ICONIFIED_P (frame))
return;
block_input ();
SET_FRAME_VISIBLE (frame, false);
SET_FRAME_ICONIFIED (frame, true);
block_input ();
BWindow_iconify (FRAME_HAIKU_WINDOW (frame));
unblock_input ();
}
@ -1841,7 +1837,9 @@ DEFUN ("xw-display-color-p", Fxw_display_color_p, Sxw_display_color_p, 0, 1, 0,
doc: /* SKIP: real doc in xfns.c. */)
(Lisp_Object terminal)
{
return Qt;
check_haiku_display_info (terminal);
return be_is_display_grayscale () ? Qnil : Qt;
}
DEFUN ("xw-color-defined-p", Fxw_color_defined_p, Sxw_color_defined_p, 1, 2, 0,
@ -1861,20 +1859,19 @@ DEFUN ("xw-color-values", Fxw_color_values, Sxw_color_values, 1, 2, 0,
(Lisp_Object color, Lisp_Object frame)
{
Emacs_Color col;
int rc;
CHECK_STRING (color);
decode_window_system_frame (frame);
block_input ();
if (haiku_get_color (SSDATA (color), &col))
{
unblock_input ();
return Qnil;
}
rc = haiku_get_color (SSDATA (color), &col);
unblock_input ();
return list3i (lrint (col.red), lrint (col.green),
lrint (col.blue));
if (rc)
return Qnil;
return list3i (col.red, col.green, col.blue);
}
DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p, Sx_display_grayscale_p,
@ -1882,7 +1879,9 @@ DEFUN ("x-display-grayscale-p", Fx_display_grayscale_p, Sx_display_grayscale_p,
doc: /* SKIP: real doc in xfns.c. */)
(Lisp_Object terminal)
{
return Qnil;
check_haiku_display_info (terminal);
return be_is_display_grayscale () ? Qt : Qnil;
}
DEFUN ("x-open-connection", Fx_open_connection, Sx_open_connection,
@ -1923,9 +1922,9 @@ DEFUN ("x-display-pixel-width", Fx_display_pixel_width, Sx_display_pixel_width,
(Lisp_Object terminal)
{
int width, height;
check_haiku_display_info (terminal);
int width, height;
BScreen_px_dim (&width, &height);
return make_fixnum (width);
}
@ -1936,9 +1935,9 @@ DEFUN ("x-display-pixel-height", Fx_display_pixel_height, Sx_display_pixel_heigh
(Lisp_Object terminal)
{
int width, height;
check_haiku_display_info (terminal);
int width, height;
BScreen_px_dim (&width, &height);
return make_fixnum (width);
}
@ -1948,10 +1947,9 @@ DEFUN ("x-display-mm-height", Fx_display_mm_height, Sx_display_mm_height, 0, 1,
(Lisp_Object terminal)
{
struct haiku_display_info *dpyinfo = check_haiku_display_info (terminal);
int width, height;
BScreen_px_dim (&width, &height);
BScreen_px_dim (&width, &height);
return make_fixnum (height / (dpyinfo->resy / 25.4));
}
@ -1961,10 +1959,9 @@ DEFUN ("x-display-mm-width", Fx_display_mm_width, Sx_display_mm_width, 0, 1, 0,
(Lisp_Object terminal)
{
struct haiku_display_info *dpyinfo = check_haiku_display_info (terminal);
int width, height;
BScreen_px_dim (&width, &height);
BScreen_px_dim (&width, &height);
return make_fixnum (width / (dpyinfo->resx / 25.4));
}
@ -1981,14 +1978,20 @@ DEFUN ("x-display-visual-class", Fx_display_visual_class,
doc: /* SKIP: real doc in xfns.c. */)
(Lisp_Object terminal)
{
int planes;
bool grayscale_p;
check_haiku_display_info (terminal);
int planes = be_get_display_planes ();
grayscale_p = be_is_display_grayscale ();
if (grayscale_p)
return Qstatic_gray;
planes = be_get_display_planes ();
if (planes == 8)
return intern ("static-color");
return Qstatic_color;
return intern ("true-color");
return Qtrue_color;
}
DEFUN ("x-show-tip", Fx_show_tip, Sx_show_tip, 1, 6, 0,
@ -2742,6 +2745,10 @@ syms_of_haikufns (void)
DEFSYM (Qwhen_mapped, "when-mapped");
DEFSYM (Qtooltip_reuse_hidden_frame, "tooltip-reuse-hidden-frame");
DEFSYM (Qstatic_color, "static-color");
DEFSYM (Qstatic_gray, "static-gray");
DEFSYM (Qtrue_color, "true-color");
defsubr (&Sx_hide_tip);
defsubr (&Sxw_display_color_p);
defsubr (&Sx_display_grayscale_p);