From 94e80b0f0144d2825fe75595e81bc6920aa1b71b Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Thu, 8 Oct 2009 16:09:50 +1000 Subject: [PATCH] rrcrtc: add initial gamma interfaces These are used by gnome-screensaver to do the fade in/out. New interfaces: add a way to get crtc count and ids - getting the crtc list is pointless since GnomeRRCrtc is an opaque type, so we cannot iterate since we don't know what size each element in an GnomeRRCrtc ** array is. Add gamma get/set functions per crtc. --- libgnome-desktop/gnome-rr.c | 95 ++++++++++++++++++++++++++++++++ libgnome-desktop/libgnomeui/gnome-rr.h | 16 +++++ 2 files changed, 111 insertions(+), 0 deletions(-) diff --git a/libgnome-desktop/gnome-rr.c b/libgnome-desktop/gnome-rr.c index a64f8ae..627918e 100644 --- a/libgnome-desktop/gnome-rr.c +++ b/libgnome-desktop/gnome-rr.c @@ -74,6 +74,8 @@ struct GnomeRRCrtc GnomeRRRotation current_rotation; GnomeRRRotation rotations; + XRRCrtcGamma *gamma; + int gamma_size; }; struct GnomeRRMode @@ -828,6 +830,36 @@ gnome_rr_screen_get_output_by_id (GnomeRRScreen *screen, return NULL; } +int +gnome_rr_screen_get_crtc_count(GnomeRRScreen *screen) +{ + int i; + + g_return_val_if_fail (screen != NULL, 0); + g_return_val_if_fail (screen->info != NULL, 0); + + for (i = 0; screen->info->crtcs[i] != NULL; ++i); + + return i; +} + +void gnome_rr_screen_get_crtc_ids(GnomeRRScreen *screen, + int count, + guint32 *ids) +{ + int i; + + g_return_if_fail (screen != NULL); + g_return_if_fail (screen->info != NULL); + + for (i = 0; screen->info->crtcs[i] != NULL; ++i) + { + if (i >= count) + break; + ids[i] = screen->info->crtcs[i]->id; + } +} + /* GnomeRROutput */ static GnomeRROutput * output_new (ScreenInfo *info, RROutput id) @@ -1516,3 +1548,66 @@ mode_free (GnomeRRMode *mode) g_free (mode->name); g_free (mode); } + +void +gnome_rr_crtc_set_gamma(GnomeRRCrtc *crtc, int size, + unsigned short *red, + unsigned short *green, + unsigned short *blue) +{ + int copy_size; + g_return_if_fail (crtc != NULL); + g_return_if_fail (red != NULL); + g_return_if_fail (green != NULL); + g_return_if_fail (blue != NULL); + + if (size != crtc->gamma_size) + return; + + crtc->gamma = XRRAllocGamma(crtc->gamma_size); + + copy_size = crtc->gamma_size * sizeof(unsigned short); + memcpy(crtc->gamma->red, red, copy_size); + memcpy(crtc->gamma->green, green, copy_size); + memcpy(crtc->gamma->blue, blue, copy_size); + + XRRSetCrtcGamma(DISPLAY (crtc), crtc->id, crtc->gamma); + XRRFreeGamma(crtc->gamma); +} + +int +gnome_rr_crtc_get_gamma_size(GnomeRRCrtc *crtc) +{ + g_return_val_if_fail (crtc != NULL, 0); + + if (!crtc->gamma_size) + crtc->gamma_size = XRRGetCrtcGammaSize(DISPLAY (crtc), crtc->id); + return crtc->gamma_size; +} + +void +gnome_rr_crtc_get_gamma(GnomeRRCrtc *crtc, int size, + unsigned short *red, unsigned short *green, + unsigned short *blue) +{ + int copy_size; + g_return_if_fail (crtc != NULL); + g_return_if_fail (red != NULL); + g_return_if_fail (green != NULL); + g_return_if_fail (blue != NULL); + + if (size != crtc->gamma_size) + return; + + crtc->gamma = XRRGetCrtcGamma(DISPLAY (crtc), crtc->id); + + if (!crtc->gamma) + return; + + copy_size = crtc->gamma_size * sizeof(unsigned short); + memcpy(red, crtc->gamma->red, copy_size); + memcpy(green, crtc->gamma->green, copy_size); + memcpy(blue, crtc->gamma->blue, copy_size); + XRRFreeGamma(crtc->gamma); +} + diff --git a/libgnome-desktop/libgnomeui/gnome-rr.h b/libgnome-desktop/libgnomeui/gnome-rr.h index 6eae3d0..f254688 100644 --- a/libgnome-desktop/libgnomeui/gnome-rr.h +++ b/libgnome-desktop/libgnomeui/gnome-rr.h @@ -98,6 +98,11 @@ void gnome_rr_screen_get_timestamps (GnomeRRScreen *scree void gnome_rr_screen_set_primary_output (GnomeRRScreen *screen, GnomeRROutput *output); +int gnome_rr_screen_get_crtc_count (GnomeRRScreen *screen); +void gnome_rr_screen_get_crtc_ids (GnomeRRScreen *screen, + int count, + guint32 *ids); + /* GnomeRROutput */ guint32 gnome_rr_output_get_id (GnomeRROutput *output); const char * gnome_rr_output_get_name (GnomeRROutput *output); @@ -160,4 +165,15 @@ GnomeRRRotation gnome_rr_crtc_get_rotations (GnomeRRCrtc *crtc) gboolean gnome_rr_crtc_supports_rotation (GnomeRRCrtc *crtc, GnomeRRRotation rotation); +int gnome_rr_crtc_get_gamma_size (GnomeRRCrtc *crtc); +void gnome_rr_crtc_get_gamma (GnomeRRCrtc *crtc, + int size, + unsigned short *red, + unsigned short *green, + unsigned short *blue); +void gnome_rr_crtc_set_gamma (GnomeRRCrtc *crtc, + int size, + unsigned short *red, + unsigned short *green, + unsigned short *blue); #endif -- 1.6.5.rc2