changeset 25528:b5dd1bafd001

Include math.h. Add extern declaration for atof in case we don't see one. (Qscreen_gamma): New. (struct x_frame_parm_table): Add prototypes, add x_set_screen_gamma. (gamma_correct): New function. (defined_color): Call it. (x_set_screen_gamma): New. (x_set_title): Add parameter old_value. (RES_TYPE_FLOAT): New. (x_get_arg): Handle RES_TYPE_FLOAT. (Fx_create_frame): Call x_default_parameter for `screen-gamma'. (lookup_pixel_color): Change call to x_alloc_nearest_color to new prototype. (lookup_rgb_color): Ditto. (syms_of_xfns): Initialize Qscreen_gamma.
author Gerd Moellmann <gerd@gnu.org>
date Fri, 03 Sep 1999 18:49:56 +0000
parents 93b2f5b92137
children 7ae6423812ae
files src/xfns.c
diffstat 1 files changed, 81 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/src/xfns.c	Fri Sep 03 18:49:55 1999 +0000
+++ b/src/xfns.c	Fri Sep 03 18:49:56 1999 +0000
@@ -30,6 +30,7 @@
 #include <signal.h>
 #include <config.h>
 #include <stdio.h>
+#include <math.h>
 
 /* This makes the fields of a Display accessible, in Xlib header files.  */
 
@@ -120,6 +121,7 @@
 #endif
 
 extern void free_frame_menubar ();
+extern double atof ();
 
 #endif /* USE_X_TOOLKIT */
 
@@ -251,6 +253,7 @@
 Lisp_Object Quser_size;
 Lisp_Object Qdisplay;
 Lisp_Object Qscroll_bar_foreground, Qscroll_bar_background;
+Lisp_Object Qscreen_gamma;
 
 /* The below are defined in frame.c.  */
 
@@ -741,29 +744,31 @@
 struct x_frame_parm_table
 {
   char *name;
-  void (*setter)( /* struct frame *frame, Lisp_Object val, oldval */ );
+  void (*setter) P_ ((struct frame *, Lisp_Object, Lisp_Object));
 };
 
-void x_set_foreground_color ();
-void x_set_background_color ();
-void x_set_mouse_color ();
-void x_set_cursor_color ();
-void x_set_border_color ();
-void x_set_cursor_type ();
-void x_set_icon_type ();
-void x_set_icon_name ();
-void x_set_font ();
-void x_set_border_width ();
-void x_set_internal_border_width ();
-void x_explicitly_set_name ();
-void x_set_autoraise ();
-void x_set_autolower ();
-void x_set_vertical_scroll_bars ();
-void x_set_visibility ();
-void x_set_menu_bar_lines ();
-void x_set_scroll_bar_width ();
-void x_set_title ();
-void x_set_unsplittable ();
+void x_set_foreground_color P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_background_color P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_mouse_color P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_cursor_color P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_border_color P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_cursor_type P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_icon_type P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_icon_name P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_font P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_border_width P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_internal_border_width P_ ((struct frame *, Lisp_Object,
+				      Lisp_Object));
+void x_explicitly_set_name P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_autoraise P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_autolower P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_vertical_scroll_bars P_ ((struct frame *, Lisp_Object,
+				     Lisp_Object));
+void x_set_visibility P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_menu_bar_lines P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_scroll_bar_width P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_title P_ ((struct frame *, Lisp_Object, Lisp_Object));
+void x_set_unsplittable P_ ((struct frame *, Lisp_Object, Lisp_Object));
 void x_set_toolbar_lines P_ ((struct frame *, Lisp_Object, Lisp_Object));
 void x_set_scroll_bar_foreground P_ ((struct frame *, Lisp_Object,
 				      Lisp_Object));
@@ -774,6 +779,7 @@
 							     Lisp_Object,
 							     char *, char *,
 							     int));
+static void x_set_screen_gamma P_ ((struct frame *, Lisp_Object, Lisp_Object));
 
 static struct x_frame_parm_table x_frame_parms[] =
 {
@@ -800,6 +806,7 @@
   "toolbar-lines", x_set_toolbar_lines,
   "scroll-bar-foreground", x_set_scroll_bar_foreground,
   "scroll-bar-background", x_set_scroll_bar_background,
+  "screen-gamma", x_set_screen_gamma
 };
 
 /* Attach the `x-frame-parameter' properties to
@@ -1208,6 +1215,23 @@
 }
 
 
+
+/* Gamma-correct COLOR on frame F.  */
+
+void
+gamma_correct (f, color)
+     struct frame *f;
+     XColor *color;
+{
+  if (f->gamma)
+    {
+      color->red = pow (color->red / 65535.0, f->gamma) * 65535.0 + 0.5;
+      color->green = pow (color->green / 65535.0, f->gamma) * 65535.0 + 0.5;
+      color->blue = pow (color->blue / 65535.0, f->gamma) * 65535.0 + 0.5;
+    }
+}
+
+
 /* Decide if color named COLOR is valid for the display associated with
    the selected frame; if so, return the rgb values in COLOR_DEF.
    If ALLOC is nonzero, allocate a new colormap cell.  */
@@ -1229,6 +1253,9 @@
   status = XParseColor (display, screen_colormap, color, color_def);
   if (status && alloc) 
     {
+      /* Apply gamma correction.  */
+      gamma_correct (f, color_def);
+      
       status = XAllocColor (display, screen_colormap, color_def);
       if (!status)
 	{
@@ -1330,6 +1357,27 @@
 			  Fcons (arg, Qnil)));
 }
 
+/* Change the `screen-gamma' frame parameter of frame F.  OLD_VALUE is
+   the previous value of that parameter, NEW_VALUE is the new value.  */
+
+static void
+x_set_screen_gamma (f, new_value, old_value)
+     struct frame *f;
+     Lisp_Object new_value, old_value;
+{
+  if (NILP (new_value))
+    f->gamma = 0;
+  else if (NUMBERP (new_value) && XFLOATINT (new_value) > 0)
+    /* The value 0.4545 is the normal viewing gamma.  */
+    f->gamma = 1.0 / (0.4545 * XFLOATINT (new_value));
+  else
+    Fsignal (Qerror, Fcons (build_string ("Illegal screen-gamma"),
+			    Fcons (new_value, Qnil)));
+
+  clear_face_cache (0);
+}
+
+
 /* Functions called only from `x_set_frame_param'
    to set individual parameters.
 
@@ -2154,9 +2202,9 @@
        F->explicit_name is set, ignore the new name; otherwise, set it.  */
 
 void
-x_set_title (f, name)
+x_set_title (f, name, old_name)
      struct frame *f;
-     Lisp_Object name;
+     Lisp_Object name, old_name;
 {
   /* Don't change the title if it's already NAME.  */
   if (EQ (name, f->title))
@@ -2553,6 +2601,7 @@
 enum resource_types
 {
   RES_TYPE_NUMBER,
+  RES_TYPE_FLOAT,
   RES_TYPE_BOOLEAN,
   RES_TYPE_STRING,
   RES_TYPE_SYMBOL
@@ -2600,6 +2649,9 @@
 	    case RES_TYPE_NUMBER:
 	      return make_number (atoi (XSTRING (tem)->data));
 
+	    case RES_TYPE_FLOAT:
+	      return make_float (atof (XSTRING (tem)->data));
+
 	    case RES_TYPE_BOOLEAN:
 	      tem = Fdowncase (tem);
 	      if (!strcmp (XSTRING (tem)->data, "on")
@@ -3701,6 +3753,8 @@
 		       "cursorColor", "Foreground", RES_TYPE_STRING);
   x_default_parameter (f, parms, Qborder_color, build_string ("black"),
 		       "borderColor", "BorderColor", RES_TYPE_STRING);
+  x_default_parameter (f, parms, Qscreen_gamma, Qnil,
+		       "screenGamma", "ScreenGamma", RES_TYPE_FLOAT);
 
   x_default_scroll_bar_color_parameter (f, parms, Qscroll_bar_foreground,
 					"scrollBarForeground",
@@ -7213,8 +7267,7 @@
       
       BLOCK_INPUT;
       cmap = DefaultColormapOfScreen (FRAME_X_SCREEN (f));
-      rc = x_alloc_nearest_color (FRAME_X_DISPLAY (f), FRAME_X_SCREEN (f),
-				  cmap, &color);
+      rc = x_alloc_nearest_color (f, cmap, &color);
       UNBLOCK_INPUT;
 
       if (rc)
@@ -7263,8 +7316,7 @@
       cmap = DefaultColormapOfScreen (FRAME_X_SCREEN (f));
       color.pixel = pixel;
       XQueryColor (FRAME_X_DISPLAY (f), cmap, &color);
-      rc = x_alloc_nearest_color (FRAME_X_DISPLAY (f), FRAME_X_SCREEN (f),
-				  cmap, &color);
+      rc = x_alloc_nearest_color (f, cmap, &color);
       UNBLOCK_INPUT;
 
       if (rc)
@@ -10127,6 +10179,8 @@
   staticpro (&Qscroll_bar_foreground);
   Qscroll_bar_background = intern ("scroll-bar-background");
   staticpro (&Qscroll_bar_background);
+  Qscreen_gamma = intern ("screen-gamma");
+  staticpro (&Qscreen_gamma);
   /* This is the end of symbol initialization.  */
 
   Qlaplace = intern ("laplace");