aboutsummaryrefslogtreecommitdiffstats
path: root/src/libgamma_method.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/libgamma_method.py')
-rw-r--r--src/libgamma_method.py572
1 files changed, 572 insertions, 0 deletions
diff --git a/src/libgamma_method.py b/src/libgamma_method.py
new file mode 100644
index 0000000..7edd4a9
--- /dev/null
+++ b/src/libgamma_method.py
@@ -0,0 +1,572 @@
+# -*- python -*-
+'''
+pylibgamma — Python 3 wrapper for libgamma
+Copyright © 2014 Mattias Andrée (maandree@member.fsf.org)
+
+This library is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this library. If not, see <http://www.gnu.org/licenses/>.
+'''
+
+
+
+LIBGAMMA_METHOD_DUMMY = 0
+'''
+The identifier for the dummy adjustment method.
+This method can be configured and is useful for
+testing your program's ability to handle errors.
+'''
+
+LIBGAMMA_METHOD_X_RANDR = 1
+'''
+The identifier for the adjustment method with
+uses the RandR protocol under the X display server.
+'''
+
+LIBGAMMA_METHOD_X_VIDMODE = 2
+'''
+The identifier for the adjustment method with
+uses the VidMode protocol under the X display server.
+This is an older alternative to RandR that can
+work on some drivers that are not supported by RandR,
+however it can only control the primary CRTC per
+screen (partition).
+'''
+
+LIBGAMMA_METHOD_LINUX_DRM = 3
+'''
+The identifier for the Direct Rendering Manager
+adjustment method that is available in Linux
+(built in to the Linux kernel with a userland
+library for access) and is a part of the
+Direct Rendering Infrastructure. This adjustment
+method all work when you are in non-graphical
+mode; however a display server cannnot be
+started while this is running, but it can be
+started while a display server is running.
+'''
+
+LIBGAMMA_METHOD_W32_GDI = 4
+'''
+The identifier for the Graphics Device Interface
+adjustment method that is available in Windows.
+This method is not well tested; it can be compiled
+to be available under X.org using a translation layer.
+'''
+
+LIBGAMMA_METHOD_QUARTZ_CORE_GRAPHICS = 5
+'''
+The identifier for the CoreGraphics adjustment
+method that is available in Mac OS X that can
+adjust gamma ramps under the Quartz display server.
+This method is not well tested; it can be compiled
+to be available under X.org using a translation layer.
+'''
+
+
+LIBGAMMA_METHOD_MAX = 5
+'''
+The index of the last gamma method, neither it
+nor any index before it may actually be supported
+as it could have been disabled at compile-time
+'''
+
+LIBGAMMA_METHOD_COUNT = (LIBGAMMA_METHOD_MAX + 1)
+'''
+The number adjustment methods provided by this library.
+Note however that this includes adjstment methods that
+have been removed at compile-time.
+'''
+
+
+class MethodCapabilities:
+ '''
+ Capabilities of adjustment methods
+
+ ---- Integers variables ----
+
+ @variable crtc_information OR of the CRTC information fields in `CRTCInformation`
+ that may (but can fail) be read successfully.
+
+ ---- Boolean variables ----
+
+ @variable default_site_known Whether the default site is known, if true the site is integrated
+ to the system or can be determined using environment variables.
+ @variable multiple_sites Whether the adjustment method supports multiple sites rather
+ than just the default site.
+ @variable multiple_partitions Whether the adjustment method supports multiple partitions
+ per site.
+ @variable multiple_crtcs Whether the adjustment method supports multiple CRTC:s
+ per partition per site.
+ @variable partitions_are_graphics_cards Whether the partition to graphics card is a bijection.
+ @variable site_restore Whether the adjustment method supports `site_restore`.
+ @variable partition_restore Whether the adjustment method supports `partition_restore`.
+ @variable crtc_restore Whether the adjustment method supports `crtc_restore`.
+ @variable identical_gamma_sizes Whether the `red_gamma_size`, `green_gamma_size` and
+ `blue_gamma_size` fields in `CRTCInformation` will always
+ have the same values as each other for the adjustment method.
+ @variable fixed_gamma_size Whether the `red_gamma_size`, `green_gamma_size` and
+ `blue_gamma_size` fields in `CRTCInformation` will always be
+ filled with the same value for the adjustment method.
+ @variable fixed_gamma_depth Whether the `gamma_depth` field in `CRTCInformation` will
+ always be filled with the same value for the adjustment method.
+ @variable real Whether the adjustment method will actually perform adjustments.
+ @variable fake Whether the adjustment method is implement using a translation
+ layer.
+ '''
+
+ def __init__(self, crtc_information : int = 0, booleans : int = 0):
+ '''
+ Constructor
+
+ @param crtc_information The value for `CRTCInformation`
+ @param booleans The value for each booleanic variable
+ '''
+ self.crtc_information = crtc_information
+ self.default_site_known = (booleans & (1 << 0)) != 0
+ self.multiple_sites = (booleans & (1 << 1)) != 0
+ self.multiple_partitions = (booleans & (1 << 2)) != 0
+ self.multiple_crtcs = (booleans & (1 << 3)) != 0
+ self.partitions_are_graphics_cards = (booleans & (1 << 4)) != 0
+ self.site_restore = (booleans & (1 << 5)) != 0
+ self.partition_restore = (booleans & (1 << 6)) != 0
+ self.crtc_restore = (booleans & (1 << 7)) != 0
+ self.identical_gamma_sizes = (booleans & (1 << 8)) != 0
+ self.fixed_gamma_size = (booleans & (1 << 9)) != 0
+ self.fixed_gamma_depth = (booleans & (1 << 10)) != 0
+ self.real = (booleans & (1 << 11)) != 0
+ self.fake = (booleans & (1 << 12)) != 0
+
+
+class CRTCInformation:
+ '''
+ Cathode ray tube controller information data structure.
+
+ @variable edid:bytes The Extended Display Identification Data associated with
+ the attached monitor. This is raw byte array that is usually
+ 128 bytes long.
+ @variable edid_error:int Zero on success, positive it holds the value `errno` had
+ when the reading failed, otherwise (negative) the value
+ of an error identifier provided by this library.
+
+ @variable width_mm:int The phyical width, in millimetres, of the viewport of the
+ attached monitor, as reported by the adjustment method. This
+ value may be incorrect, which is a known issue with the X
+ server where it is the result of the X server attempting
+ the estimate the size on its own.
+ Zero means that its is not applicable, which is the case
+ for projectors.
+ @variable width_mm_error:int Zero on success, positive it holds the value `errno` had
+ when the reading failed, otherwise (negative) the value
+ of an error identifier provided by this library.
+ @variable height_mm:int The phyical height, in millimetres, of the viewport of the
+ attached monitor, as reported by the adjustment method. This
+ value may be incorrect, which is a known issue with the X
+ server where it is the result of the X server attempting
+ the estimate the size on its own.
+ Zero means that its is not applicable, which is the case
+ for projectors.
+ @variable height_mm_error:int Zero on success, positive it holds the value `errno` had
+ when the reading failed, otherwise (negative) the value
+ of an error identifier provided by this library.
+
+ @variable width_mm_edid:int The phyical width, in millimetres, of the viewport of the
+ attached monitor, as reported by it the monitor's Extended
+ Display Information Data. This value can only contain whole
+ centimetres, which means that the result is always zero
+ modulus ten. However, this could change with revisions of
+ the EDID structure.
+ Zero means that its is not applicable, which is the case
+ for projectors.
+ @variable width_mm_edid_error:int Zero on success, positive it holds the value `errno` had
+ when the reading failed, otherwise (negative) the value
+ of an error identifier provided by this library.
+ @variable height_mm_edid:int The phyical height, in millimetres, of the viewport of the
+ attached monitor, as reported by it the monitor's Extended
+ Display Information Data. This value can only contain whole
+ centimetres, which means that the result is always zero
+ modulus ten. However, this could change with revisions of
+ the EDID structure.
+ Zero means that its is not applicable, which is the case
+ for projectors.
+ @variable height_mm_edid_error:int Zero on success, positive it holds the value `errno` had
+ when the reading failed, otherwise (negative) the value
+ of an error identifier provided by this library.
+
+ @variable red_gamma_size:int The size of the encoding axis of the red gamma ramp.
+ @variable green_gamma_size:int The size of the encoding axis of the green gamma ramp.
+ @variable blue_gamma_size:int The size of the encoding axis of the blue gamma ramp.
+ @variable gamma_size_error:int Zero on success, positive it holds the value `errno` had
+ when the reading failed, otherwise (negative) the value
+ of an error identifier provided by this library.
+
+ @variable gamma_depth:int The bit-depth of the value axes of gamma ramps,
+ -1 for single precision floating point, and -2 for
+ double precision floating point.
+ @variable gamma_depth_error:int Zero on success, positive it holds the value `errno` had
+ when the reading failed, otherwise (negative) the value
+ of an error identifier provided by this library.
+
+ @variable gamma_support:int Non-zero gamma ramp adjustments are supported.
+ @variable gamma_support_error:int Zero on success, positive it holds the value `errno` had
+ when the reading failed, otherwise (negative) the value
+ of an error identifier provided by this library.
+
+ @variable subpixel_order:int The layout of the subpixels.
+ You cannot count on this value — especially for CRT:s —
+ but it is provided anyway as a means of distinguishing monitors.
+ @variable subpixel_order_error:int Zero on success, positive it holds the value `errno` had
+ when the reading failed, otherwise (negative) the value
+ of an error identifier provided by this library.
+
+ @variable active:bool Whether there is a monitors connected to the CRTC.
+ @variable active_error:int Zero on success, positive it holds the value `errno` had
+ when the reading failed, otherwise (negative) the value
+ of an error identifier provided by this library.
+
+ @variable connector_name:str The name of the connector as designated by the display
+ server or as give by this library in case the display
+ server lacks this feature.
+ @variable connector_name_error:int Zero on success, positive it holds the value `errno` had
+ when the reading failed, otherwise (negative) the value
+ of an error identifier provided by this library.
+
+ @variable connector_type:int The type of the connector that is associated with the CRTC.
+ @variable connector_type_error:int Zero on success, positive it holds the value `errno` had
+ when the reading failed, otherwise (negative) the value
+ of an error identifier provided by this library.
+
+ @variable gamma_red:float The gamma characteristics of the monitor as reported
+ in its Extended Display Information Data. The value
+ holds the value for the red channel. If you do not have
+ and more accurate measurement of the gamma for the
+ monitor this could be used to give a rought gamma
+ correction; simply divide the value with 2.2 and use
+ the result for the red channel in the gamma correction.
+ @variable gamma_green:float The gamma characteristics of the monitor as reported
+ in its Extended Display Information Data. The value
+ holds the value for the green channel. If you do not have
+ and more accurate measurement of the gamma for the
+ monitor this could be used to give a rought gamma
+ correction; simply divide the value with 2.2 and use
+ the result for the green channel in the gamma correction.
+ @variable gamma_blue:float The gamma characteristics of the monitor as reported
+ in its Extended Display Information Data. The value
+ holds the value for the blue channel. If you do not have
+ and more accurate measurement of the gamma for the
+ monitor this could be used to give a rought gamma
+ correction; simply divide the value with 2.2 and use
+ the result for the blue channel in the gamma correction.
+ @variable gamma_error:int Zero on success, positive it holds the value `errno` had
+ when the reading failed, otherwise (negative) the value
+ of an error identifier provided by this library.
+ '''
+
+ def __init__(self):
+ '''
+ Constructor
+ '''
+ pass
+
+
+LIBGAMMA_CONNECTOR_TYPE_Unknown = 0
+'''
+The adjustment method does not know the connector's type
+(This could be considered an error).
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_VGA = 1
+'''
+Video Graphics Array (VGA).
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_DVI = 2
+'''
+Digital Visual Interface, unknown type.
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_DVII = 3
+'''
+Digital Visual Interface, integrated (DVI-I).
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_DVID = 4
+'''
+Digital Visual Interface, digital only (DVI-D).
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_DVIA = 5
+'''
+Digital Visual Interface, analogue only (DVI-A).
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_Composite = 6
+'''
+Composite video.
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_SVIDEO = 7
+'''
+Separate Video (S-video).
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_LVDS = 8
+'''
+Low-voltage differential signaling (LVDS).
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_Component = 9
+'''
+Component video, usually separate cables for each channel.
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_9PinDIN = 10
+'''
+9 pin DIN (Deutsches Institut für Normung) connector.
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_DisplayPort = 11
+'''
+DisplayPort.
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_HDMI = 12
+'''
+High-Definition Multimedia Interface (HDMI), unknown type.
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_HDMIA = 13
+'''
+High-Definition Multimedia Interface, type A (HDMI-A).
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_HDMIB = 14
+'''
+High-Definition Multimedia Interface, type B (HDMI-B).
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_TV = 15
+'''
+Television, unknown connector.
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_eDP = 16
+'''
+Embedded DisplayPort (eDP).
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_VIRTUAL = 17
+'''
+A virtual connector.
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_DSI = 18
+'''
+Display Serial Interface (DSI).
+'''
+
+LIBGAMMA_CONNECTOR_TYPE_LFP = 19
+'''
+LFP connector.
+(If you know what this is add it to Wikipedia.)
+'''
+
+
+LIBGAMMA_CONNECTOR_TYPE_COUNT = 20
+'''
+The number of `LIBGAMMA_CONNECTOR_*` values defined.
+'''
+
+
+
+LIBGAMMA_SUBPIXEL_ORDER_UNKNOWN = 0
+'''
+The adjustment method does not know the order of the subpixels.
+(This could be considered an error.)
+'''
+
+LIBGAMMA_SUBPIXEL_ORDER_NONE = 1
+'''
+There are no subpixels in the monitor.
+'''
+
+LIBGAMMA_SUBPIXEL_ORDER_HORIZONTAL_RGB = 2
+'''
+The subpixels are ordered red, green and then blue, from left to right.
+'''
+
+LIBGAMMA_SUBPIXEL_ORDER_HORIZONTAL_BGR = 3
+'''
+The subpixels are ordered blue, green and then red, from left to right.
+'''
+
+LIBGAMMA_SUBPIXEL_ORDER_VERTICAL_RGB = 4
+'''
+The subpixels are ordered red, green and then blue, from the top down.
+'''
+
+LIBGAMMA_SUBPIXEL_ORDER_VERTICAL_BGR = 5
+'''
+The subpixels are ordered blue, green and then red, from the top down.
+'''
+
+
+LIBGAMMA_SUBPIXEL_ORDER_COUNT = 6
+'''
+The number of `LIBGAMMA_SUBPIXEL_ORDER_*` values defined.
+'''
+
+
+
+LIBGAMMA_CRTC_INFO_EDID = 1 << 0
+'''
+For a `CRTCInformation` fill in the
+values for `edid` and `edid_length` and report errors to `edid_error`.
+'''
+
+LIBGAMMA_CRTC_INFO_WIDTH_MM = 1 << 1
+'''
+For a `CRTCInformation` fill in the
+value for `width_mm` and report errors to `width_mm_error`.
+'''
+
+LIBGAMMA_CRTC_INFO_HEIGHT_MM = 1 << 2
+'''
+For a `CRTCInformation` fill in the
+value for `height_mm` and report errors to `height_mm_error`.
+'''
+
+LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID = 1 << 3
+'''
+For a `CRTCInformation` fill in the
+value for `width_mm_edid` and report errors to `width_mm_edid_error`.
+'''
+
+LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID = 1 << 4
+'''
+For a `CRTCInformation` fill in the
+value for `height_mm_edid` and report errors to `height_mm_edid_error`.
+'''
+
+LIBGAMMA_CRTC_INFO_GAMMA_SIZE = 1 << 5
+'''
+For a `CRTCInformation` fill in the
+values for `red_gamma_size`, `green_gamma_size` and `blue_gamma_size`.
+and report errors to `gamma_size_error`
+'''
+
+LIBGAMMA_CRTC_INFO_GAMMA_DEPTH = 1 << 6
+'''
+For a `CRTCInformation` fill in the
+value for `gamma_depth` and report errors to `gamma_depth_error`.
+'''
+
+LIBGAMMA_CRTC_INFO_GAMMA_SUPPORT = 1 << 7
+'''
+For a `CRTCInformation` fill in the
+value for `gamma_support` and report errors to `gamma_support_error`.
+'''
+
+LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER = 1 << 8
+'''
+For a `CRTCInformation` fill in the
+value for `subpixel_order` and report errors to `subpixel_order_error`.
+'''
+
+LIBGAMMA_CRTC_INFO_ACTIVE = 1 << 9
+'''
+For a `CRTCInformation` fill in the
+value for `active` and report errors to `active_error`.
+'''
+
+LIBGAMMA_CRTC_INFO_CONNECTOR_NAME = 1 << 10
+'''
+For a `CRTCInformation` fill in the
+value for `connector_name` and report errors to `connector_name_error`.
+'''
+
+LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE = 1 << 11
+'''
+For a `CRTCInformation` fill in the
+value for `connector_type` and report errors to `connector_type_error`.
+'''
+
+LIBGAMMA_CRTC_INFO_GAMMA = 1 << 12
+'''
+For a `CRTCInformation` fill in the
+values for `gamma_red`, `gamma_green` and `gamma_blue`
+and report errors to `gamma_error`.
+'''
+
+
+LIBGAMMA_CRTC_INFO_COUNT = 13
+'''
+The number of `LIBGAMMA_CRTC_INFO_*` values defined.
+'''
+
+
+
+'''
+Macro for both `CRTCInformation` fields
+that can specify the size of the monitor's viewport
+as specified in the monitor's Extended Display
+Information Data.
+'''
+LIBGAMMA_CRTC_INFO_MACRO_EDID_VIEWPORT = LIBGAMMA_CRTC_INFO_WIDTH_MM_EDID |
+ LIBGAMMA_CRTC_INFO_HEIGHT_MM_EDID
+
+'''
+Macro for all `CRTCInformation` fields
+that can be filled if the adjustment method have
+support for reading the monitors' Extended Display
+Information Data.
+'''
+LIBGAMMA_CRTC_INFO_MACRO_EDID = LIBGAMMA_CRTC_INFO_EDID |
+ LIBGAMMA_CRTC_INFO_MACRO_EDID_VIEWPORT |
+ LIBGAMMA_CRTC_INFO_GAMMA
+
+'''
+Macro for both `CRTCInformation` fields
+that can specify the size of the monitor's viewport
+as provided by the adjustment method without this
+library having to parse the monitor's Extended Display
+Information Data.
+'''
+LIBGAMMA_CRTC_INFO_MACRO_VIEWPORT = LIBGAMMA_CRTC_INFO_WIDTH_MM |
+ LIBGAMMA_CRTC_INFO_HEIGHT_MM
+
+'''
+Macro for the `CRTCInformation` fields
+that specifies the CRTC's gamma ramp sizes and gamma
+ramp depth.
+'''
+LIBGAMMA_CRTC_INFO_MACRO_RAMP = LIBGAMMA_CRTC_INFO_GAMMA_SIZE |
+ LIBGAMMA_CRTC_INFO_GAMMA_DEPTH
+
+'''
+Macro for the `CRTCInformation` fields
+that specifies the CRTC's connector type and the
+partition unique name of the connector.
+'''
+LIBGAMMA_CRTC_INFO_MACRO_CONNECTOR = LIBGAMMA_CRTC_INFO_CONNECTOR_NAME |
+ LIBGAMMA_CRTC_INFO_CONNECTOR_TYPE
+
+'''
+Macro for the `CRTCInformation` fields
+that required there is a monitor attached to the connector,
+and that status itself.
+'''
+LIBGAMMA_CRTC_INFO_MACRO_ACTIVE = LIBGAMMA_CRTC_INFO_MACRO_EDID |
+ LIBGAMMA_CRTC_INFO_MACRO_VIEWPORT |
+ LIBGAMMA_CRTC_INFO_SUBPIXEL_ORDER |
+ LIBGAMMA_CRTC_INFO_ACTIVE
+