x11: Support the CTM (color transform matrix) RandR property

When supported, this property allows the window system to apply a 3x3 color
correction matrix in order to transform colors from the window system's native
color space to the measured color space of a display device.

Query for this property and set the 'supports-color-transform' property in the
GetResource reply. Add support for the SetOutputCTM DBus method and plumb that
through to the server's CTM property.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1048>
This commit is contained in:
Aaron Plattner
2020-02-04 16:41:34 -08:00
committed by Marge Bot
parent bd15cfc94b
commit e88467f9d7
7 changed files with 156 additions and 0 deletions

View File

@ -5,6 +5,7 @@
* Copyright (C) 2003 Rob Adams
* Copyright (C) 2004-2006 Elijah Newren
* Copyright (C) 2013 Red Hat Inc.
* Copyright (C) 2020 NVIDIA CORPORATION
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
@ -92,6 +93,17 @@ struct _MetaOutputAssignment
gboolean is_underscanning;
};
/*
* MetaOutputCtm:
*
* A 3x3 color transform matrix in the fixed-point S31.32 sign-magnitude format
* used by DRM.
*/
typedef struct _MetaOutputCtm
{
uint64_t matrix[9];
} MetaOutputCtm;
#define META_TYPE_MONITOR_MANAGER (meta_monitor_manager_get_type ())
#define META_MONITOR_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER, MetaMonitorManager))
#define META_MONITOR_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), META_TYPE_MONITOR_MANAGER, MetaMonitorManagerClass))
@ -179,6 +191,7 @@ struct _MetaMonitorManager
* @get_capabilities: vfunc for meta_monitor_manager_get_capabilities().
* @get_max_screen_size: vfunc for meta_monitor_manager_get_max_screen_size().
* @get_default_layout_mode: vfunc for meta_monitor_manager_get_default_layout_mode().
* @set_output_ctm: vfunc for meta_monitor_manager_output_set_ctm()
*
* The base class for a #MetaMonitorManager.
*/
@ -245,6 +258,9 @@ struct _MetaMonitorManagerClass
int *);
MetaLogicalMonitorLayoutMode (*get_default_layout_mode) (MetaMonitorManager *);
void (*set_output_ctm) (MetaOutput *,
const MetaOutputCtm *);
};
META_EXPORT_TEST