[mutter] crtc: Get/set gamma via helper struct



commit b59dc05b22461adfd415b980ea452b976ea17042
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Fri Dec 3 17:34:34 2021 +0100

    crtc: Get/set gamma via helper struct
    
    Instead of passing 4 arguments (red, green and blue arrays as well as a
    size), always pass them together in a new struct MetaGammaLut. Makes
    things slightly less tedious.
    
    The KMS layer still has its own variant, but lets leave it as that for
    now, to keep the KMS layer "below" the cross backend CRTC layer.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2165>

 src/backends/meta-backend-types.h           | 11 ++++
 src/backends/meta-crtc.c                    | 34 ++++++-----
 src/backends/meta-crtc.h                    | 38 +++++-------
 src/backends/meta-monitor-manager-private.h |  1 +
 src/backends/meta-monitor-manager.c         | 36 +++++------
 src/backends/meta-monitor.c                 | 36 ++---------
 src/backends/meta-monitor.h                 |  7 +--
 src/backends/native/meta-crtc-kms.c         | 95 ++++++++++++++++-------------
 src/backends/native/meta-crtc-virtual.c     | 31 ++++------
 src/backends/x11/meta-crtc-xrandr.c         | 58 +++++++++++-------
 10 files changed, 171 insertions(+), 176 deletions(-)
---
diff --git a/src/backends/meta-backend-types.h b/src/backends/meta-backend-types.h
index 3e8b468814..799846ada9 100644
--- a/src/backends/meta-backend-types.h
+++ b/src/backends/meta-backend-types.h
@@ -21,6 +21,9 @@
 #ifndef META_BACKEND_TYPE_H
 #define META_BACKEND_TYPE_H
 
+#include <stdint.h>
+#include <stddef.h>
+
 typedef struct _MetaBackend MetaBackend;
 
 typedef struct _MetaColorDevice MetaColorDevice;
@@ -77,4 +80,12 @@ typedef struct _MetaIdleManager MetaIdleManager;
 typedef struct _MetaRemoteDesktop MetaRemoteDesktop;
 #endif
 
+typedef struct _MetaGammaLut
+{
+  uint16_t *red;
+  uint16_t *green;
+  uint16_t *blue;
+  size_t size;
+} MetaGammaLut;
+
 #endif /* META_BACKEND_TYPE_H */
diff --git a/src/backends/meta-crtc.c b/src/backends/meta-crtc.c
index de26dddab3..44c2fc0983 100644
--- a/src/backends/meta-crtc.c
+++ b/src/backends/meta-crtc.c
@@ -137,28 +137,32 @@ meta_crtc_get_config (MetaCrtc *crtc)
   return priv->config;
 }
 
-void
-meta_crtc_get_gamma_lut (MetaCrtc        *crtc,
-                         size_t          *size,
-                         unsigned short **red,
-                         unsigned short **green,
-                         unsigned short **blue)
+size_t
+meta_crtc_get_gamma_lut_size (MetaCrtc *crtc)
 {
-  MetaCrtcClass *crtc_class = META_CRTC_GET_CLASS (crtc);
+  return META_CRTC_GET_CLASS (crtc)->get_gamma_lut_size (crtc);
+}
 
-  crtc_class->get_gamma_lut (crtc, size, red, green, blue);
+MetaGammaLut *
+meta_crtc_get_gamma_lut (MetaCrtc *crtc)
+{
+  return META_CRTC_GET_CLASS (crtc)->get_gamma_lut (crtc);
 }
 
 void
-meta_crtc_set_gamma_lut (MetaCrtc       *crtc,
-                         size_t          size,
-                         unsigned short *red,
-                         unsigned short *green,
-                         unsigned short *blue)
+meta_crtc_set_gamma_lut (MetaCrtc           *crtc,
+                         const MetaGammaLut *lut)
 {
-  MetaCrtcClass *crtc_class = META_CRTC_GET_CLASS (crtc);
+  return META_CRTC_GET_CLASS (crtc)->set_gamma_lut (crtc, lut);
+}
 
-  crtc_class->set_gamma_lut (crtc, size, red, green, blue);
+void
+meta_gamma_lut_free (MetaGammaLut *lut)
+{
+  g_free (lut->red);
+  g_free (lut->green);
+  g_free (lut->blue);
+  g_free (lut);
 }
 
 static void
diff --git a/src/backends/meta-crtc.h b/src/backends/meta-crtc.h
index 25f0b32ceb..fa31463a43 100644
--- a/src/backends/meta-crtc.h
+++ b/src/backends/meta-crtc.h
@@ -43,17 +43,12 @@ struct _MetaCrtcClass
 {
   GObjectClass parent_class;
 
-  void (* get_gamma_lut) (MetaCrtc        *crtc,
-                          size_t          *size,
-                          unsigned short **red,
-                          unsigned short **green,
-                          unsigned short **blue);
-
-  void (* set_gamma_lut) (MetaCrtc       *crtc,
-                          size_t          size,
-                          unsigned short *red,
-                          unsigned short *green,
-                          unsigned short *blue);
+  size_t (* get_gamma_lut_size) (MetaCrtc *crtc);
+
+  MetaGammaLut * (* get_gamma_lut) (MetaCrtc *crtc);
+
+  void (* set_gamma_lut) (MetaCrtc           *crtc,
+                          const MetaGammaLut *lut);
 };
 
 META_EXPORT_TEST
@@ -86,16 +81,15 @@ void meta_crtc_unset_config (MetaCrtc *crtc);
 META_EXPORT_TEST
 const MetaCrtcConfig * meta_crtc_get_config (MetaCrtc *crtc);
 
-void meta_crtc_get_gamma_lut (MetaCrtc        *crtc,
-                              size_t          *size,
-                              unsigned short **red,
-                              unsigned short **green,
-                              unsigned short **blue);
-
-void meta_crtc_set_gamma_lut (MetaCrtc       *crtc,
-                              size_t          size,
-                              unsigned short *red,
-                              unsigned short *green,
-                              unsigned short *blue);
+size_t meta_crtc_get_gamma_lut_size (MetaCrtc *crtc);
+
+MetaGammaLut * meta_crtc_get_gamma_lut (MetaCrtc *crtc);
+
+void meta_crtc_set_gamma_lut (MetaCrtc           *crtc,
+                              const MetaGammaLut *lut);
+
+void meta_gamma_lut_free (MetaGammaLut *lut);
+
+G_DEFINE_AUTOPTR_CLEANUP_FUNC (MetaGammaLut, meta_gamma_lut_free)
 
 #endif /* META_CRTC_H */
diff --git a/src/backends/meta-monitor-manager-private.h b/src/backends/meta-monitor-manager-private.h
index a0ef3b8b36..d6a92bf2ac 100644
--- a/src/backends/meta-monitor-manager-private.h
+++ b/src/backends/meta-monitor-manager-private.h
@@ -32,6 +32,7 @@
 #endif
 
 #include "backends/meta-backend-private.h"
+#include "backends/meta-crtc.h"
 #include "backends/meta-cursor.h"
 #include "backends/meta-display-config-shared.h"
 #include "backends/meta-monitor-transform.h"
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index 32a83beed6..a60518850d 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -1169,10 +1169,8 @@ update_night_light_supported (MetaMonitorManager *manager)
       for (l_crtc = meta_gpu_get_crtcs (gpu); l_crtc; l_crtc = l_crtc->next)
         {
           MetaCrtc *crtc = l_crtc->data;
-          size_t gamma_lut_size;
 
-          meta_crtc_get_gamma_lut (crtc, &gamma_lut_size, NULL, NULL, NULL);
-          if (gamma_lut_size > 0)
+          if (meta_crtc_get_gamma_lut_size (crtc) > 0)
             {
               night_light_supported = TRUE;
               break;
@@ -2861,10 +2859,7 @@ meta_monitor_manager_handle_get_crtc_gamma  (MetaDBusDisplayConfig *skeleton,
 {
   GList *combined_crtcs;
   MetaCrtc *crtc;
-  gsize size;
-  unsigned short *red;
-  unsigned short *green;
-  unsigned short *blue;
+  g_autoptr (MetaGammaLut) gamma_lut = NULL;
   GBytes *red_bytes, *green_bytes, *blue_bytes;
   GVariant *red_v, *green_v, *blue_v;
 
@@ -2889,11 +2884,14 @@ meta_monitor_manager_handle_get_crtc_gamma  (MetaDBusDisplayConfig *skeleton,
   crtc = g_list_nth_data (combined_crtcs, crtc_id);
   g_list_free (combined_crtcs);
 
-  meta_crtc_get_gamma_lut (crtc, &size, &red, &green, &blue);
+  gamma_lut = meta_crtc_get_gamma_lut (crtc);
 
-  red_bytes = g_bytes_new_take (red, size * sizeof (unsigned short));
-  green_bytes = g_bytes_new_take (green, size * sizeof (unsigned short));
-  blue_bytes = g_bytes_new_take (blue, size * sizeof (unsigned short));
+  red_bytes = g_bytes_new_take (g_steal_pointer (&gamma_lut->red),
+                                gamma_lut->size * sizeof (unsigned short));
+  green_bytes = g_bytes_new_take (g_steal_pointer (&gamma_lut->green),
+                                  gamma_lut->size * sizeof (unsigned short));
+  blue_bytes = g_bytes_new_take (g_steal_pointer (&gamma_lut->blue),
+                                 gamma_lut->size * sizeof (unsigned short));
 
   red_v = g_variant_new_from_bytes (G_VARIANT_TYPE ("aq"), red_bytes, TRUE);
   green_v = g_variant_new_from_bytes (G_VARIANT_TYPE ("aq"), green_bytes, TRUE);
@@ -2921,11 +2919,9 @@ meta_monitor_manager_handle_set_crtc_gamma  (MetaDBusDisplayConfig *skeleton,
 {
   GList *combined_crtcs;
   MetaCrtc *crtc;
-  gsize size, dummy;
-  unsigned short *red;
-  unsigned short *green;
-  unsigned short *blue;
+  size_t dummy;
   GBytes *red_bytes, *green_bytes, *blue_bytes;
+  MetaGammaLut lut;
 
   if (serial != manager->serial)
     {
@@ -2953,12 +2949,12 @@ meta_monitor_manager_handle_set_crtc_gamma  (MetaDBusDisplayConfig *skeleton,
   green_bytes = g_variant_get_data_as_bytes (green_v);
   blue_bytes = g_variant_get_data_as_bytes (blue_v);
 
-  size = g_bytes_get_size (red_bytes) / sizeof (unsigned short);
-  red = (unsigned short*) g_bytes_get_data (red_bytes, &dummy);
-  green = (unsigned short*) g_bytes_get_data (green_bytes, &dummy);
-  blue = (unsigned short*) g_bytes_get_data (blue_bytes, &dummy);
+  lut.size = g_bytes_get_size (red_bytes) / sizeof (uint16_t);
+  lut.red = (uint16_t *) g_bytes_get_data (red_bytes, &dummy);
+  lut.green = (uint16_t *) g_bytes_get_data (green_bytes, &dummy);
+  lut.blue = (uint16_t *) g_bytes_get_data (blue_bytes, &dummy);
 
-  meta_crtc_set_gamma_lut (crtc, size, red, green, blue);
+  meta_crtc_set_gamma_lut (crtc, &lut);
   meta_dbus_display_config_complete_set_crtc_gamma (skeleton, invocation);
 
   g_bytes_unref (red_bytes);
diff --git a/src/backends/meta-monitor.c b/src/backends/meta-monitor.c
index c4d8358893..e9ea57a3b1 100644
--- a/src/backends/meta-monitor.c
+++ b/src/backends/meta-monitor.c
@@ -689,22 +689,12 @@ meta_monitor_get_gamma_lut_size (MetaMonitor *monitor)
 {
   MetaOutput *output;
   MetaCrtc *crtc;
-  size_t size;
 
   output = meta_monitor_get_main_output (monitor);
   crtc = meta_output_get_assigned_crtc (output);
-  meta_crtc_get_gamma_lut (crtc, &size, NULL, NULL, NULL);
-  return size;
+  return meta_crtc_get_gamma_lut_size (crtc);
 }
 
-typedef struct
-{
-  uint16_t *red;
-  uint16_t *green;
-  uint16_t *blue;
-  size_t size;
-} LutData;
-
 static gboolean
 set_gamma_lut (MetaMonitor          *monitor,
                MetaMonitorMode      *mode,
@@ -712,16 +702,12 @@ set_gamma_lut (MetaMonitor          *monitor,
                gpointer              user_data,
                GError              **error)
 {
-  LutData *lut_data = user_data;
+  const MetaGammaLut *lut = user_data;
   MetaCrtc *crtc;
 
   crtc = meta_output_get_assigned_crtc (monitor_crtc_mode->output);
 
-  meta_crtc_set_gamma_lut (crtc,
-                           lut_data->size,
-                           lut_data->red,
-                           lut_data->green,
-                           lut_data->blue);
+  meta_crtc_set_gamma_lut (crtc, lut);
   return TRUE;
 }
 
@@ -731,28 +717,18 @@ set_gamma_lut (MetaMonitor          *monitor,
  * Set a new gamma look-up table (LUT) for the given monitor's CRTCs.
  */
 void
-meta_monitor_set_gamma_lut (MetaMonitor *monitor,
-                            uint16_t    *red,
-                            uint16_t    *green,
-                            uint16_t    *blue,
-                            size_t       size)
+meta_monitor_set_gamma_lut (MetaMonitor        *monitor,
+                            const MetaGammaLut *lut)
 {
   MetaMonitorMode *current_mode;
-  LutData lut_data;
 
   current_mode = meta_monitor_get_current_mode (monitor);
   g_return_if_fail (current_mode);
 
-  lut_data = (LutData) {
-    .red = red,
-    .green = green,
-    .blue = blue,
-    .size = size,
-  };
   meta_monitor_mode_foreach_crtc (monitor,
                                   current_mode,
                                   set_gamma_lut,
-                                  &lut_data,
+                                  (gpointer) lut,
                                   NULL);
 }
 
diff --git a/src/backends/meta-monitor.h b/src/backends/meta-monitor.h
index 6973e348a7..5ce98c3a15 100644
--- a/src/backends/meta-monitor.h
+++ b/src/backends/meta-monitor.h
@@ -305,10 +305,7 @@ gboolean meta_monitor_set_privacy_screen_enabled (MetaMonitor  *monitor,
 
 size_t meta_monitor_get_gamma_lut_size (MetaMonitor *monitor);
 
-void meta_monitor_set_gamma_lut (MetaMonitor *monitor,
-                                 uint16_t    *red,
-                                 uint16_t    *green,
-                                 uint16_t    *blue,
-                                 size_t       size);
+void meta_monitor_set_gamma_lut (MetaMonitor        *monitor,
+                                 const MetaGammaLut *lut);
 
 #endif /* META_MONITOR_H */
diff --git a/src/backends/native/meta-crtc-kms.c b/src/backends/native/meta-crtc-kms.c
index 35207caab7..0bfd3f5ad5 100644
--- a/src/backends/native/meta-crtc-kms.c
+++ b/src/backends/native/meta-crtc-kms.c
@@ -85,12 +85,20 @@ meta_crtc_kms_set_cursor_renderer_private (MetaCrtcKms    *crtc_kms,
   crtc_kms->cursor_renderer_private_destroy_notify = destroy_notify;
 }
 
-static void
-meta_crtc_kms_get_gamma_lut (MetaCrtc        *crtc,
-                             size_t          *size,
-                             unsigned short **red,
-                             unsigned short **green,
-                             unsigned short **blue)
+static size_t
+meta_crtc_kms_get_gamma_lut_size (MetaCrtc *crtc)
+{
+  MetaKmsCrtc *kms_crtc;
+  const MetaKmsCrtcState *crtc_state;
+
+  kms_crtc = meta_crtc_kms_get_kms_crtc (META_CRTC_KMS (crtc));
+  crtc_state = meta_kms_crtc_get_current_state (kms_crtc);
+
+  return crtc_state->gamma.size;
+}
+
+static MetaGammaLut *
+meta_crtc_kms_get_gamma_lut (MetaCrtc *crtc)
 {
   MetaCrtcKms *crtc_kms = META_CRTC_KMS (crtc);
   MetaKmsCrtc *kms_crtc = meta_crtc_kms_get_kms_crtc (crtc_kms);
@@ -98,40 +106,40 @@ meta_crtc_kms_get_gamma_lut (MetaCrtc        *crtc,
     monitor_manager_from_crtc (crtc);
   const MetaKmsCrtcState *crtc_state;
   MetaKmsCrtcGamma *crtc_gamma;
+  MetaGammaLut *lut;
 
   crtc_gamma =
     meta_monitor_manager_native_get_cached_crtc_gamma (monitor_manager_native,
                                                        crtc_kms);
   if (crtc_gamma)
     {
-      if (size)
-        *size = crtc_gamma->size;
-      if (red)
-        *red = g_memdup2 (crtc_gamma->red, *size * sizeof **red);
-      if (green)
-        *green = g_memdup2 (crtc_gamma->green, *size * sizeof **green);
-      if (blue)
-        *blue = g_memdup2 (crtc_gamma->blue, *size * sizeof **blue);
-      return;
+      lut = g_new0 (MetaGammaLut, 1);
+      lut->size = crtc_gamma->size;
+      lut->red = g_memdup2 (crtc_gamma->red,
+                            lut->size * sizeof (uint16_t));
+      lut->green = g_memdup2 (crtc_gamma->green,
+                              lut->size * sizeof (uint16_t));
+      lut->blue = g_memdup2 (crtc_gamma->blue,
+                             lut->size * sizeof (uint16_t));
+      return lut;
     }
 
   crtc_state = meta_kms_crtc_get_current_state (kms_crtc);
 
-  if (size)
-    *size = crtc_state->gamma.size;
-  if (red)
-    *red = g_memdup2 (crtc_state->gamma.red, *size * sizeof **red);
-  if (green)
-    *green = g_memdup2 (crtc_state->gamma.green, *size * sizeof **green);
-  if (blue)
-    *blue = g_memdup2 (crtc_state->gamma.blue, *size * sizeof **blue);
+  lut = g_new0 (MetaGammaLut, 1);
+  lut->size = crtc_state->gamma.size;
+  lut->red = g_memdup2 (crtc_state->gamma.red,
+                        lut->size * sizeof (uint16_t));
+  lut->green = g_memdup2 (crtc_state->gamma.green,
+                          lut->size * sizeof (uint16_t));
+  lut->blue = g_memdup2 (crtc_state->gamma.blue,
+                         lut->size * sizeof (uint16_t));
+
+  return lut;
 }
 
 static char *
-generate_gamma_ramp_string (size_t          size,
-                            unsigned short *red,
-                            unsigned short *green,
-                            unsigned short *blue)
+generate_gamma_ramp_string (const MetaGammaLut *lut)
 {
   GString *string;
   int color;
@@ -139,39 +147,39 @@ generate_gamma_ramp_string (size_t          size,
   string = g_string_new ("[");
   for (color = 0; color < 3; color++)
     {
-      unsigned short **color_ptr = NULL;
+      uint16_t * const *color_ptr = NULL;
       char color_char;
       size_t i;
 
       switch (color)
         {
         case 0:
-          color_ptr = &red;
+          color_ptr = &lut->red;
           color_char = 'r';
           break;
         case 1:
-          color_ptr = &green;
+          color_ptr = &lut->green;
           color_char = 'g';
           break;
         case 2:
-          color_ptr = &blue;
+          color_ptr = &lut->blue;
           color_char = 'b';
           break;
         }
 
       g_assert (color_ptr);
       g_string_append_printf (string, " %c: ", color_char);
-      for (i = 0; i < MIN (4, size); i++)
+      for (i = 0; i < MIN (4, lut->size); i++)
         {
           int j;
 
-          if (size > 4)
+          if (lut->size > 4)
             {
               if (i == 2)
                 g_string_append (string, ",...");
 
               if (i >= 2)
-                j = i + (size - 4);
+                j = i + (lut->size - 4);
               else
                 j = i;
             }
@@ -191,11 +199,8 @@ generate_gamma_ramp_string (size_t          size,
 }
 
 static void
-meta_crtc_kms_set_gamma_lut (MetaCrtc       *crtc,
-                             size_t          size,
-                             unsigned short *red,
-                             unsigned short *green,
-                             unsigned short *blue)
+meta_crtc_kms_set_gamma_lut (MetaCrtc           *crtc,
+                             const MetaGammaLut *lut)
 {
   MetaCrtcKms *crtc_kms = META_CRTC_KMS (crtc);
   MetaKmsCrtc *kms_crtc = meta_crtc_kms_get_kms_crtc (crtc_kms);
@@ -209,7 +214,7 @@ meta_crtc_kms_set_gamma_lut (MetaCrtc       *crtc,
 
   crtc_state = meta_kms_crtc_get_current_state (kms_crtc);
 
-  if (size != crtc_state->gamma.size)
+  if (lut->size != crtc_state->gamma.size)
     {
       MetaKmsDevice *kms_device = meta_kms_crtc_get_device (kms_crtc);
 
@@ -219,13 +224,16 @@ meta_crtc_kms_set_gamma_lut (MetaCrtc       *crtc,
       return;
     }
 
-  gamma_ramp_string = generate_gamma_ramp_string (size, red, green, blue);
+  gamma_ramp_string = generate_gamma_ramp_string (lut);
   meta_topic (META_DEBUG_COLOR,
               "Setting CRTC (%" G_GUINT64_FORMAT ") gamma to %s",
               meta_crtc_get_id (crtc), gamma_ramp_string);
 
-  crtc_gamma = meta_kms_crtc_gamma_new (kms_crtc, size,
-                                        red, green, blue);
+  crtc_gamma = meta_kms_crtc_gamma_new (kms_crtc,
+                                        lut->size,
+                                        lut->red,
+                                        lut->green,
+                                        lut->blue);
   meta_monitor_manager_native_update_cached_crtc_gamma (monitor_manager_native,
                                                         crtc_kms,
                                                         crtc_gamma);
@@ -559,6 +567,7 @@ meta_crtc_kms_class_init (MetaCrtcKmsClass *klass)
 
   object_class->dispose = meta_crtc_kms_dispose;
 
+  crtc_class->get_gamma_lut_size = meta_crtc_kms_get_gamma_lut_size;
   crtc_class->get_gamma_lut = meta_crtc_kms_get_gamma_lut;
   crtc_class->set_gamma_lut = meta_crtc_kms_set_gamma_lut;
 
diff --git a/src/backends/native/meta-crtc-virtual.c b/src/backends/native/meta-crtc-virtual.c
index e8a3892182..aedda8ec28 100644
--- a/src/backends/native/meta-crtc-virtual.c
+++ b/src/backends/native/meta-crtc-virtual.c
@@ -38,29 +38,21 @@ meta_crtc_virtual_new (uint64_t id)
                        NULL);
 }
 
-static void
-meta_crtc_virtual_get_gamma_lut (MetaCrtc        *crtc,
-                                 size_t          *size,
-                                 unsigned short **red,
-                                 unsigned short **green,
-                                 unsigned short **blue)
+static size_t
+meta_crtc_virtual_get_gamma_lut_size (MetaCrtc *crtc)
+{
+  return 0;
+}
+
+static MetaGammaLut *
+meta_crtc_virtual_get_gamma_lut (MetaCrtc *crtc)
 {
-  if (size)
-    *size = 0;
-  if (red)
-    *red = NULL;
-  if (green)
-    *green = NULL;
-  if (blue)
-    *blue = NULL;
+  return NULL;
 }
 
 static void
-meta_crtc_virtual_set_gamma_lut (MetaCrtc       *crtc,
-                                 size_t          size,
-                                 unsigned short *red,
-                                 unsigned short *green,
-                                 unsigned short *blue)
+meta_crtc_virtual_set_gamma_lut (MetaCrtc           *crtc,
+                                 const MetaGammaLut *lut)
 {
   g_warn_if_reached ();
 }
@@ -89,6 +81,7 @@ meta_crtc_virtual_class_init (MetaCrtcVirtualClass *klass)
   MetaCrtcClass *crtc_class = META_CRTC_CLASS (klass);
   MetaCrtcNativeClass *crtc_native_class = META_CRTC_NATIVE_CLASS (klass);
 
+  crtc_class->get_gamma_lut_size = meta_crtc_virtual_get_gamma_lut_size;
   crtc_class->get_gamma_lut = meta_crtc_virtual_get_gamma_lut;
   crtc_class->set_gamma_lut = meta_crtc_virtual_set_gamma_lut;
 
diff --git a/src/backends/x11/meta-crtc-xrandr.c b/src/backends/x11/meta-crtc-xrandr.c
index 4fc579bedf..c9104002f1 100644
--- a/src/backends/x11/meta-crtc-xrandr.c
+++ b/src/backends/x11/meta-crtc-xrandr.c
@@ -297,38 +297,51 @@ meta_crtc_xrandr_new (MetaGpuXrandr      *gpu_xrandr,
   return crtc_xrandr;
 }
 
-static void
-meta_crtc_xrandr_get_gamma_lut (MetaCrtc        *crtc,
-                                size_t          *size,
-                                unsigned short **red,
-                                unsigned short **green,
-                                unsigned short **blue)
+static MetaGammaLut *
+meta_crtc_xrandr_get_gamma_lut (MetaCrtc *crtc)
+{
+  MetaGpu *gpu = meta_crtc_get_gpu (crtc);
+  MetaBackend *backend = meta_gpu_get_backend (gpu);
+  Display *xdisplay =
+    meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
+  XRRCrtcGamma *gamma;
+  MetaGammaLut *lut;
+
+  gamma = XRRGetCrtcGamma (xdisplay, (XID) meta_crtc_get_id (crtc));
+
+  lut = g_new0 (MetaGammaLut, 1);
+  lut->size = gamma->size;
+  lut->red = g_memdup2 (gamma->red, sizeof (unsigned short) * gamma->size);
+  lut->green = g_memdup2 (gamma->green, sizeof (unsigned short) * gamma->size);
+  lut->blue = g_memdup2 (gamma->blue, sizeof (unsigned short) * gamma->size);
+
+  XRRFreeGamma (gamma);
+
+  return lut;
+}
+
+static size_t
+meta_crtc_xrandr_get_gamma_lut_size (MetaCrtc *crtc)
 {
   MetaGpu *gpu = meta_crtc_get_gpu (crtc);
   MetaBackend *backend = meta_gpu_get_backend (gpu);
   Display *xdisplay =
     meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
   XRRCrtcGamma *gamma;
+  size_t size;
 
   gamma = XRRGetCrtcGamma (xdisplay, (XID) meta_crtc_get_id (crtc));
 
-  *size = gamma->size;
-  if (red)
-    *red = g_memdup2 (gamma->red, sizeof (unsigned short) * gamma->size);
-  if (green)
-    *green = g_memdup2 (gamma->green, sizeof (unsigned short) * gamma->size);
-  if (blue)
-    *blue = g_memdup2 (gamma->blue, sizeof (unsigned short) * gamma->size);
+  size = gamma->size;
 
   XRRFreeGamma (gamma);
+
+  return size;
 }
 
 static void
-meta_crtc_xrandr_set_gamma_lut (MetaCrtc       *crtc,
-                                size_t          size,
-                                unsigned short *red,
-                                unsigned short *green,
-                                unsigned short *blue)
+meta_crtc_xrandr_set_gamma_lut (MetaCrtc           *crtc,
+                                const MetaGammaLut *lut)
 {
   MetaGpu *gpu = meta_crtc_get_gpu (crtc);
   MetaBackend *backend = meta_gpu_get_backend (gpu);
@@ -336,10 +349,10 @@ meta_crtc_xrandr_set_gamma_lut (MetaCrtc       *crtc,
     meta_backend_x11_get_xdisplay (META_BACKEND_X11 (backend));
   XRRCrtcGamma *gamma;
 
-  gamma = XRRAllocGamma (size);
-  memcpy (gamma->red, red, sizeof (unsigned short) * size);
-  memcpy (gamma->green, green, sizeof (unsigned short) * size);
-  memcpy (gamma->blue, blue, sizeof (unsigned short) * size);
+  gamma = XRRAllocGamma (lut->size);
+  memcpy (gamma->red, lut->red, sizeof (uint16_t) * lut->size);
+  memcpy (gamma->green, lut->green, sizeof (uint16_t) * lut->size);
+  memcpy (gamma->blue, lut->blue, sizeof (uint16_t) * lut->size);
 
   XRRSetCrtcGamma (xdisplay, (XID) meta_crtc_get_id (crtc), gamma);
 
@@ -356,6 +369,7 @@ meta_crtc_xrandr_class_init (MetaCrtcXrandrClass *klass)
 {
   MetaCrtcClass *crtc_class = META_CRTC_CLASS (klass);
 
+  crtc_class->get_gamma_lut_size = meta_crtc_xrandr_get_gamma_lut_size;
   crtc_class->get_gamma_lut = meta_crtc_xrandr_get_gamma_lut;
   crtc_class->set_gamma_lut = meta_crtc_xrandr_set_gamma_lut;
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]