[gnome-desktop] rr: Add color transform functions



commit ba73c28b668e1e40b3ba940485c77f49fd5b28f8
Author: Aaron Plattner <aplattner nvidia com>
Date:   Fri Jan 31 15:18:24 2020 -0800

    rr: Add color transform functions

 .../gnome-desktop3/gnome-desktop3-sections.txt     |  2 ++
 libgnome-desktop/gnome-rr.c                        | 31 ++++++++++++++++++++++
 libgnome-desktop/gnome-rr.h                        | 13 +++++++++
 libgnome-desktop/xrandr.xml                        | 19 +++++++++++++
 4 files changed, 65 insertions(+)
---
diff --git a/docs/reference/gnome-desktop3/gnome-desktop3-sections.txt 
b/docs/reference/gnome-desktop3/gnome-desktop3-sections.txt
index 39e46f20..4f189fcd 100644
--- a/docs/reference/gnome-desktop3/gnome-desktop3-sections.txt
+++ b/docs/reference/gnome-desktop3/gnome-desktop3-sections.txt
@@ -297,10 +297,12 @@ gnome_rr_output_list_modes
 gnome_rr_output_get_preferred_mode
 gnome_rr_output_supports_mode
 gnome_rr_output_supports_underscanning
+gnome_rr_output_supports_color_transform
 gnome_rr_output_get_is_primary
 gnome_rr_output_get_is_underscanning
 gnome_rr_output_get_backlight
 gnome_rr_output_set_backlight
+gnome_rr_output_set_color_transform
 gnome_rr_output_get_display_name
 gnome_rr_output_get_ids_from_edid
 gnome_rr_output_get_min_backlight_step
diff --git a/libgnome-desktop/gnome-rr.c b/libgnome-desktop/gnome-rr.c
index 11187aac..692dafaa 100644
--- a/libgnome-desktop/gnome-rr.c
+++ b/libgnome-desktop/gnome-rr.c
@@ -85,6 +85,7 @@ struct GnomeRROutput
     gboolean            is_presentation;
     gboolean            is_underscanning;
     gboolean            supports_underscanning;
+    gboolean            supports_color_transform;
 
     GnomeRRTile         tile_info;
 };
@@ -1409,6 +1410,7 @@ output_initialize (GnomeRROutput *output, GVariant *info)
     g_variant_lookup (properties, "presentation", "b", &output->is_presentation);
     g_variant_lookup (properties, "underscanning", "b", &output->is_underscanning);
     g_variant_lookup (properties, "supports-underscanning", "b", &output->supports_underscanning);
+    g_variant_lookup (properties, "supports-color-transform", "b", &output->supports_color_transform);
 
     if ((edid = g_variant_lookup_value (properties, "edid", G_VARIANT_TYPE ("ay"))))
       {
@@ -1629,6 +1631,28 @@ gnome_rr_output_set_backlight (GnomeRROutput *output, gint value, GError **error
                                                                NULL, error);
 }
 
+gboolean
+gnome_rr_output_set_color_transform (GnomeRROutput *output, GnomeRRCTM ctm,
+                                     GError **error)
+{
+    GVariant *ctm_var;
+    GVariant *values[9];
+    int i;
+
+    g_return_val_if_fail (output != NULL, FALSE);
+
+    for (i = 0; i < 9; i++)
+        values[i] = g_variant_new_uint64 (ctm.matrix[i]);
+
+    ctm_var = g_variant_new_tuple (values, 9);
+
+    return meta_dbus_display_config_call_set_output_ctm_sync (output->info->screen->priv->proxy,
+                                                              output->info->serial,
+                                                              output->id,
+                                                              ctm_var,
+                                                              NULL, error);
+}
+
 /**
  * gnome_rr_screen_get_output_by_name:
  *
@@ -2244,6 +2268,13 @@ gnome_rr_output_supports_underscanning (GnomeRROutput *output)
     return output->supports_underscanning;
 }
 
+gboolean
+gnome_rr_output_supports_color_transform (const GnomeRROutput *output)
+{
+    g_assert (output != NULL);
+    return output->supports_color_transform;
+}
+
 const char *
 _gnome_rr_output_get_connector_type (GnomeRROutput *output)
 {
diff --git a/libgnome-desktop/gnome-rr.h b/libgnome-desktop/gnome-rr.h
index 4c7cf80c..111bab3f 100644
--- a/libgnome-desktop/gnome-rr.h
+++ b/libgnome-desktop/gnome-rr.h
@@ -69,6 +69,15 @@ typedef enum {
        GNOME_RR_DPMS_UNKNOWN
 } GnomeRRDpmsMode;
 
+/* Identical to drm_color_ctm from <drm_mode.h> */
+typedef struct {
+    /*
+     * Conversion matrix in S31.32 sign-magnitude (not two's complement!)
+     * format.
+     */
+    uint64_t matrix[9];
+} GnomeRRCTM;
+
 /* Error codes */
 
 #define GNOME_RR_ERROR (gnome_rr_error_quark ())
@@ -159,6 +168,9 @@ gint            gnome_rr_output_get_min_backlight_step(GnomeRROutput      *outpu
 gboolean        gnome_rr_output_set_backlight      (GnomeRROutput         *output,
                                                     gint                   value,
                                                     GError                **error);
+gboolean        gnome_rr_output_set_color_transform(GnomeRROutput         *output,
+                                                    GnomeRRCTM             value,
+                                                    GError                **error);
 
 GnomeRRCrtc **  gnome_rr_output_get_possible_crtcs (GnomeRROutput         *output);
 GnomeRRMode *   gnome_rr_output_get_current_mode   (GnomeRROutput         *output);
@@ -176,6 +188,7 @@ gboolean        gnome_rr_output_supports_mode      (GnomeRROutput         *outpu
 gboolean        gnome_rr_output_get_is_primary     (GnomeRROutput         *output);
 gboolean        gnome_rr_output_get_is_underscanning (GnomeRROutput       *output);
 gboolean        gnome_rr_output_supports_underscanning (GnomeRROutput       *output);
+gboolean        gnome_rr_output_supports_color_transform (const GnomeRROutput *output);
 
 /* GnomeRRMode */
 guint32         gnome_rr_mode_get_id               (GnomeRRMode           *mode);
diff --git a/libgnome-desktop/xrandr.xml b/libgnome-desktop/xrandr.xml
index 16ef01ec..940ac179 100644
--- a/libgnome-desktop/xrandr.xml
+++ b/libgnome-desktop/xrandr.xml
@@ -101,6 +101,11 @@
                                             or not
                            - "presentation" (b): whether this output is
                                                  for presentation only
+                           - "supports-color-transform" (b): (readonly) whether
+                                                             this output
+                                                             supports the CTM
+                                                             (color transform
+                                                             matrix) property
                            Note: properties might be ignored if not consistenly
                            applied to all outputs in the same clone group. In
                            general, it's expected that presentation or primary
@@ -290,5 +295,19 @@
        The client should then call GetResources() to read the new layout.
     -->
     <signal name="MonitorsChanged" />
+
+    <!--
+        SetOutputCTM:
+        @serial: configuration serial
+        @output: API id of the output
+        @ctm: 3x3 matrix in fixed-point sign-magnitude S31.32
+
+        Changes the color transform matrix of @output
+    -->
+    <method name="SetOutputCTM">
+      <arg name="serial" direction="in" type="u" />
+      <arg name="output" direction="in" type="u" />
+      <arg name="ctm" direction="in" type="(ttttttttt)" />
+    </method>
   </interface>
 </node>


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