24a39d4
From 8c052c789b585f434da1e6b92b3f452412074361 Mon Sep 17 00:00:00 2001
24a39d4
From: Dave Airlie <airlied@redhat.com>
24a39d4
Date: Thu, 8 Oct 2009 16:09:50 +1000
24a39d4
Subject: [PATCH] rrcrtc: add initial gamma interfaces (v3)
24a39d4
24a39d4
These are used by gnome-screensaver to do the fade in/out.
24a39d4
24a39d4
Reviewed by ssp: removed unneeded crtc interfaces,
24a39d4
made get gamma to the allocs, for caller to free
24a39d4
24a39d4
New interfaces:
24a39d4
Add gamma get/set functions per crtc.
24a39d4
24a39d4
v3: coding style cleanups from ssp
24a39d4
---
24a39d4
 libgnome-desktop/gnome-rr.c            |   75 ++++++++++++++++++++++++++++++++
24a39d4
 libgnome-desktop/libgnomeui/gnome-rr.h |   10 ++++
24a39d4
 2 files changed, 85 insertions(+), 0 deletions(-)
24a39d4
24a39d4
diff --git a/libgnome-desktop/gnome-rr.c b/libgnome-desktop/gnome-rr.c
24a39d4
index a64f8ae..9a93573 100644
24a39d4
--- a/libgnome-desktop/gnome-rr.c
24a39d4
+++ b/libgnome-desktop/gnome-rr.c
24a39d4
@@ -74,6 +74,7 @@ struct GnomeRRCrtc
24a39d4
     
24a39d4
     GnomeRRRotation	current_rotation;
24a39d4
     GnomeRRRotation	rotations;
24a39d4
+    int			gamma_size;
24a39d4
 };
24a39d4
 
24a39d4
 struct GnomeRRMode
24a39d4
@@ -1447,6 +1448,9 @@ crtc_initialize (GnomeRRCrtc        *crtc,
24a39d4
     
24a39d4
     XRRFreeCrtcInfo (info);
24a39d4
 
24a39d4
+    /* get an store gamma size */
24a39d4
+    crtc->gamma_size = XRRGetCrtcGammaSize (DISPLAY (crtc), crtc->id);
24a39d4
+
24a39d4
     return TRUE;
24a39d4
 }
24a39d4
 
24a39d4
@@ -1516,3 +1520,74 @@ mode_free (GnomeRRMode *mode)
24a39d4
     g_free (mode->name);
24a39d4
     g_free (mode);
24a39d4
 }
24a39d4
+
24a39d4
+void
24a39d4
+gnome_rr_crtc_set_gamma (GnomeRRCrtc *crtc, int size,
24a39d4
+			 unsigned short *red,
24a39d4
+			 unsigned short *green,
24a39d4
+			 unsigned short *blue)
24a39d4
+{
24a39d4
+    int copy_size;
24a39d4
+    XRRCrtcGamma *gamma;
24a39d4
+
24a39d4
+    g_return_if_fail (crtc != NULL);
24a39d4
+    g_return_if_fail (red != NULL);
24a39d4
+    g_return_if_fail (green != NULL);
24a39d4
+    g_return_if_fail (blue != NULL);
24a39d4
+
24a39d4
+    if (size != crtc->gamma_size)
24a39d4
+	return;
24a39d4
+
24a39d4
+    gamma = XRRAllocGamma (crtc->gamma_size);
24a39d4
+
24a39d4
+    copy_size = crtc->gamma_size * sizeof (unsigned short);
24a39d4
+    memcpy (gamma->red, red, copy_size);
24a39d4
+    memcpy (gamma->green, green, copy_size);
24a39d4
+    memcpy (gamma->blue, blue, copy_size);
24a39d4
+
24a39d4
+    XRRSetCrtcGamma (DISPLAY (crtc), crtc->id, gamma);
24a39d4
+    XRRFreeGamma (gamma);
24a39d4
+}
24a39d4
+
24a39d4
+gboolean
24a39d4
+gnome_rr_crtc_get_gamma (GnomeRRCrtc *crtc, int *size,
24a39d4
+			 unsigned short **red, unsigned short **green,
24a39d4
+			 unsigned short **blue)
24a39d4
+{
24a39d4
+    int copy_size;
24a39d4
+    unsigned short *r, *g, *b;
24a39d4
+    XRRCrtcGamma *gamma;
24a39d4
+
24a39d4
+    g_return_val_if_fail (crtc != NULL, FALSE);
24a39d4
+
24a39d4
+    gamma = XRRGetCrtcGamma (DISPLAY (crtc), crtc->id);
24a39d4
+    if (!gamma)
24a39d4
+	return FALSE;
24a39d4
+
24a39d4
+    copy_size = crtc->gamma_size * sizeof (unsigned short);
24a39d4
+
24a39d4
+    if (red) {
24a39d4
+	r = g_new0 (unsigned short, crtc->gamma_size);
24a39d4
+	memcpy (r, gamma->red, copy_size);
24a39d4
+	*red = r;
24a39d4
+    }
24a39d4
+
24a39d4
+    if (green) {
24a39d4
+	g = g_new0 (unsigned short, crtc->gamma_size);
24a39d4
+	memcpy (g, gamma->green, copy_size);
24a39d4
+	*green = g;
24a39d4
+    }
24a39d4
+
24a39d4
+    if (blue) {
24a39d4
+	b = g_new0 (unsigned short, crtc->gamma_size);
24a39d4
+	memcpy (b, gamma->blue, copy_size);
24a39d4
+	*blue = b;
24a39d4
+    }
24a39d4
+
24a39d4
+    XRRFreeGamma (gamma);
24a39d4
+
24a39d4
+    if (size)
24a39d4
+	*size = crtc->gamma_size;
24a39d4
+    return TRUE;
24a39d4
+}
24a39d4
+
24a39d4
diff --git a/libgnome-desktop/libgnomeui/gnome-rr.h b/libgnome-desktop/libgnomeui/gnome-rr.h
24a39d4
index 6eae3d0..e149336 100644
24a39d4
--- a/libgnome-desktop/libgnomeui/gnome-rr.h
24a39d4
+++ b/libgnome-desktop/libgnomeui/gnome-rr.h
24a39d4
@@ -160,4 +160,14 @@ GnomeRRRotation gnome_rr_crtc_get_rotations        (GnomeRRCrtc           *crtc)
24a39d4
 gboolean        gnome_rr_crtc_supports_rotation    (GnomeRRCrtc           *crtc,
24a39d4
 						    GnomeRRRotation        rotation);
24a39d4
 
24a39d4
+gboolean        gnome_rr_crtc_get_gamma            (GnomeRRCrtc           *crtc,
24a39d4
+						    int *size,
24a39d4
+						    unsigned short **red,
24a39d4
+						    unsigned short **green,
24a39d4
+						    unsigned short **blue);
24a39d4
+void            gnome_rr_crtc_set_gamma            (GnomeRRCrtc           *crtc,
24a39d4
+						    int size,
24a39d4
+						    unsigned short *red,
24a39d4
+						    unsigned short *green,
24a39d4
+						    unsigned short *blue);
24a39d4
 #endif
24a39d4
-- 
24a39d4
1.6.5.rc2
24a39d4