diff options
author | Mattias Andrée <maandree@operamail.com> | 2014-09-02 04:43:20 +0200 |
---|---|---|
committer | Mattias Andrée <maandree@operamail.com> | 2014-09-02 04:43:20 +0200 |
commit | 9f0f3aa33d904cf284ce757b928db23928750657 (patch) | |
tree | 3f043828cdfa09c2bb0c69d903b30cebccb3314c /src/libgamma_native_facade.pyx | |
parent | add alternative to the libgamma_crtc_set_gamma_ramps_f functions (diff) | |
download | pylibgamma-9f0f3aa33d904cf284ce757b928db23928750657.tar.gz pylibgamma-9f0f3aa33d904cf284ce757b928db23928750657.tar.bz2 pylibgamma-9f0f3aa33d904cf284ce757b928db23928750657.tar.xz |
some of libgamma-facade
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to '')
-rw-r--r-- | src/libgamma_native_facade.pyx | 1312 |
1 files changed, 1312 insertions, 0 deletions
diff --git a/src/libgamma_native_facade.pyx b/src/libgamma_native_facade.pyx new file mode 100644 index 0000000..de15bd6 --- /dev/null +++ b/src/libgamma_native_facade.pyx @@ -0,0 +1,1312 @@ +# -*- 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/>. +''' + +cimport cython + +from libc.stddef cimport size_t +from libc.stdlib cimport malloc, free +from libc.stdint cimport int32_t, uint8_t, uint16_t, uint32_t, uint64_t + + +ctypedef int libgamma_subpixel_order_t +ctypedef int libgamma_connector_type_t + + +cdef extern from "libgamma/libgamma-method.h": + + ctypedef struct libgamma_method_capabilities_t: + # Capabilities of adjustment methods. + + int32_t crtc_information + # OR of the CRTC information fields in `libgamma_crtc_information_t` + # that may (but can fail) be read successfully. + + unsigned default_site_known # : 1 + # Whether the default site is known, if true the site is integrated + # to the system or can be determined using environment variables. + + unsigned multiple_sites # : 1 + # Whether the adjustment method supports multiple sites rather + # than just the default site. + + unsigned multiple_partitions # : 1 + # Whether the adjustment method supports multiple partitions + # per site. + + unsigned multiple_crtcs # : 1 + # Whether the adjustment method supports multiple CRTC:s + # per partition per site. + + unsigned partitions_are_graphics_cards # : 1 + # Whether the partition to graphics card is a bijection. + + unsigned site_restore # : 1 + # Whether the adjustment method supports `libgamma_site_restore`. + + unsigned partition_restore # : 1 + # Whether the adjustment method supports `libgamma_partition_restore`. + + unsigned crtc_restore # : 1 + # Whether the adjustment method supports `libgamma_crtc_restore`. + + unsigned identical_gamma_sizes # : 1 + # Whether the `red_gamma_size`, `green_gamma_size` and `blue_gamma_size` + # fields in `libgamma_crtc_information_t` will always have the same + # values as each other for the adjustment method. + + unsigned fixed_gamma_size # : 1 + # Whether the `red_gamma_size`, `green_gamma_size` and `blue_gamma_size` + # fields in `libgamma_crtc_information_t` will always be filled with the + # same value for the adjustment method. + + unsigned fixed_gamma_depth # : 1 + # Whether the `gamma_depth` field in `libgamma_crtc_information_t` + # will always be filled with the same value for the adjustment method. + + unsigned real # : 1 + # Whether the adjustment method will actually perform adjustments. + + unsigned fake # : 1 + # Whether the adjustment method is implement using a translation layer. + + + ctypedef struct libgamma_site_state_t: + # Site state. + # + # On operating systems that integrate a graphical environment + # there is usually just one site. However, one systems with + # pluggable graphics, like Unix-like systems such as GNU/Linux + # and the BSD:s, there can usually be any (feasible) number of + # sites. In X.org parlance they are called displays. + + void* data + # Adjustment method implementation specific data. + # You as a user of this library should not touch this. + + int method + # This field specifies, for the methods if this library, + # which adjustment method (display server and protocol) + # is used to adjust the gamma ramps. + + char* site + # The site identifier. It can either be `NULL` or a string. + # `NULL` indicates the default site. On systems like the + # Unix-like systems, where the graphics are pluggable, this + # is usually resolved by an environment variable, such as + # "DISPLAY" for X.org. + + size_t partitions_available + # The number of partitions that is available on this site. + # Probably the majority of display server only one partition + # per site. However, X.org can, and traditional used to have + # on multi-headed environments, multiple partitions per site. + # In X.org partitions are called 'screens'. It is not to be + # confused with monitor. A screen is a collection of monitors, + # and the mapping from monitors to screens is a surjection. + # On hardware-level adjustment methods, such as Direct + # Rendering Manager, a partition is a graphics card. + + + ctypedef struct libgamma_partition_state_t: + # Partition state. + # + # Probably the majority of display server only one partition + # per site. However, X.org can, and traditional used to have + # on multi-headed environments, multiple partitions per site. + # In X.org partitions are called 'screens'. It is not to be + # confused with monitor. A screen is a collection of monitors, + # and the mapping from monitors to screens is a surjection. + # On hardware-level adjustment methods, such as Direct + # Rendering Manager, a partition is a graphics card. + + void* data + # Adjustment method implementation specific data. + # You as a user of this library should not touch this. + + libgamma_site_state_t* site + # The site this partition belongs to. + + size_t partition + # The index of the partition. + + size_t crtcs_available + # The number of CRTC:s that are available under this + # partition. Note that the CRTC:s are not necessarily + # online. + + + ctypedef struct libgamma_crtc_state_t: + # Cathode ray tube controller state. + # + # The CRTC controls the gamma ramps for the + # monitor that is plugged in to the connector + # that the CRTC belongs to. + + void* data + # Adjustment method implementation specific data. + # You as a user of this library should not touch this. + + libgamma_partition_state_t* partition + # The partition this CRTC belongs to. + + size_t crtc + #* The index of the CRTC within its partition. + + + ctypedef struct libgamma_crtc_information_t: + # Cathode ray tube controller information data structure. + + unsigned char* edid + # The Extended Display Identification Data associated with + # the attached monitor. This is raw byte array that is usually + # 128 bytes long. It is not NUL-terminate, rather its length + # is stored in `edid_length`. + + size_t edid_length + # The length of `edid`. + + int edid_error + # 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. + + + size_t width_mm + # 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. + + int width_mm_error + # 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. + + + size_t height_mm + # 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. + + int height_mm_error + # 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. + + + size_t width_mm_edid + # 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. + + int width_mm_edid_error + # 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. + + + size_t height_mm_edid + # 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. + + int height_mm_edid_error + # 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. + + + size_t red_gamma_size + # The size of the encoding axis of the red gamma ramp. + + size_t green_gamma_size + # The size of the encoding axis of the green gamma ramp. + + size_t blue_gamma_size + # The size of the encoding axis of the blue gamma ramp. + + int gamma_size_error + # 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. + + + signed gamma_depth + # The bit-depth of the value axes of gamma ramps, + # -1 for single precision floating point, and -2 for + # double precision floating point. + + int gamma_depth_error + # 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. + + + int gamma_support + # Non-zero gamma ramp adjustments are supported. + + int gamma_support_error + # 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. + + + libgamma_subpixel_order_t subpixel_order + # 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. + + int subpixel_order_error + # 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. + + + int active + # Whether there is a monitors connected to the CRTC. + + int active_error + # 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. + + + char* connector_name + # 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. + + int connector_name_error + # 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. + + + libgamma_connector_type_t connector_type + # The type of the connector that is associated with the CRTC. + + int connector_type_error + # 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. + + + float gamma_red + # 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. + + float gamma_green + # 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. + + float gamma_blue + # 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. + + int gamma_error + # 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. + + + ctypedef struct libgamma_gamma_ramps8_t: + # Gamma ramp structure for 8-bit gamma ramps. + size_t red_size + # The size of `red`. + size_t green_size + # The size of `green`. + size_t blue_size + # The size of `blue`. + uint8_t* red + # The gamma ramp for the red channel. + uint8_t* green + # The gamma ramp for the green channel. + uint8_t* blue + # The gamma ramp for the blue channel. + + ctypedef struct libgamma_gamma_ramps16_t: + # Gamma ramp structure for 16-bit gamma ramps. + size_t red_size + # The size of `red`. + size_t green_size + # The size of `green`. + size_t blue_size + # The size of `blue`. + uint16_t* red + # The gamma ramp for the red channel. + uint16_t* green + # The gamma ramp for the green channel. + uint16_t* blue + # The gamma ramp for the blue channel. + + ctypedef struct libgamma_gamma_ramps32_t: + # Gamma ramp structure for 32-bit gamma ramps. + size_t red_size + # The size of `red`. + size_t green_size + # The size of `green`. + size_t blue_size + # The size of `blue`. + uint32_t* red + # The gamma ramp for the red channel. + uint32_t* green + # The gamma ramp for the green channel. + uint32_t* blue + # The gamma ramp for the blue channel. + + ctypedef struct libgamma_gamma_ramps64_t: + # Gamma ramp structure for 64-bit gamma ramps. + size_t red_size + # The size of `red`. + size_t green_size + # The size of `green`. + size_t blue_size + # The size of `blue`. + uint64_t* red + # The gamma ramp for the red channel. + uint64_t* green + # The gamma ramp for the green channel. + uint64_t* blue + # The gamma ramp for the blue channel. + + ctypedef struct libgamma_gamma_rampsf_t: + # Gamma ramp structure for `float` gamma ramps. + size_t red_size + # The size of `red`. + size_t green_size + # The size of `green`. + size_t blue_size + # The size of `blue`. + float* red + # The gamma ramp for the red channel. + float* green + # The gamma ramp for the green channel. + float* blue + # The gamma ramp for the blue channel. + + ctypedef struct libgamma_gamma_rampsd_t: + # Gamma ramp structure for `double` gamma ramps. + size_t red_size + # The size of `red`. + size_t green_size + # The size of `green`. + size_t blue_size + # The size of `blue`. + double* red + # The gamma ramp for the red channel. + double* green + # The gamma ramp for the green channel. + double* blue + # The gamma ramp for the blue channel. + + +cdef extern size_t libgamma_list_methods(int* methods, size_t buf_size, int operation) +''' +List available adjustment methods by their order of preference based on the environment. + +@param methods Output array of methods, should be able to hold `LIBGAMMA_METHOD_COUNT` elements. +@param buf_size The number of elements that fits in `methods`, it should be `LIBGAMMA_METHOD_COUNT`, + This is used to avoid writing outside the output buffer if this library adds new + adjustment methods without the users of the library recompiling. +@param operation Allowed values: + 0: Methods that the environment suggests will work, excluding fake. + 1: Methods that the environment suggests will work, including fake. + 2: All real non-fake methods. + 3: All real methods. + 4: All methods. + Other values invoke undefined behaviour. +@return The number of element that have been stored in `methods`, or should + have been stored if the buffer was large enough. +''' + + +cdef extern int libgamma_is_method_available(int method) +''' +Check whether an adjustment method is available, non-existing (invalid) methods will be +identified as not available under the rationale that the library may be out of date. + +@param method The adjustment method. +@return Whether the adjustment method is available. +''' + + +cdef extern void libgamma_method_capabilities(libgamma_method_capabilities_t* this, int method) +''' +Return the capabilities of an adjustment method. + +@param this The data structure to fill with the method's capabilities +@param method The adjustment method (display server and protocol). +''' + + +cdef extern char* libgamma_method_default_site(int method) +''' +Return the capabilities of an adjustment method. + +@param method The adjustment method (display server and protocol.) +@return The default site, `NULL` if it cannot be determined or + if multiple sites are not supported by the adjustment + method. This value should not be `free`:d. +''' + + +cdef extern const char* libgamma_method_default_site_variable(int method) +''' +Return the capabilities of an adjustment method. + +@param method The adjustment method (display server and protocol.) +@return The environ variables that is used to determine the + default site. `NULL` if there is none, that is, if + the method does not support multiple sites. + This value should not be `free`:d. +''' + + + +cdef extern int libgamma_site_initialise(libgamma_site_state_t* this, int method, char* site) +''' +Initialise an allocated site state. + +@param this The site state to initialise. +@param method The adjustment method (display server and protocol.) +@param site The site identifier, unless it is `NULL` it must a + `free`:able. One the state is destroyed the library + will attempt to free it. There you should not free + it yourself, and it must not be a string constant + or allocate on the stack. Note however that it will + not be `free`:d if this function fails. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + +cdef extern void libgamma_site_free(libgamma_site_state_t* this) +''' +Release all resources held by a site state +and free the site state pointer. + +@param this The site state. +''' + + +cdef extern int libgamma_site_restore(libgamma_site_state_t* this) +''' +Restore the gamma ramps all CRTC:s with a site to the system settings. + +@param this The site state. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + + +cdef extern int libgamma_partition_initialise(libgamma_partition_state_t* this, libgamma_site_state_t* site, size_t partition) +''' +Initialise an allocated partition state. + +@param this The partition state to initialise. +@param site The site state for the site that the partition belongs to. +@param partition The index of the partition within the site. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + +cdef extern void libgamma_partition_free(libgamma_partition_state_t* this) +''' +Release all resources held by a partition state +and free the partition state pointer. + +@param this The partition state. +''' + + +cdef extern int libgamma_partition_restore(libgamma_partition_state_t* this) +''' +Restore the gamma ramps all CRTC:s with a partition to the system settings. + +@param this The partition state. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + + +cdef extern int libgamma_crtc_initialise(libgamma_crtc_state_t* this, libgamma_partition_state_t* partition, size_t crtc) +''' +Initialise an allocated CRTC state. + +@param this The CRTC state to initialise. +@param partition The partition state for the partition that the CRTC belongs to. +@param crtc The index of the CRTC within the partition. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + +cdef extern void libgamma_crtc_free(libgamma_crtc_state_t* this) +''' +Release all resources held by a CRTC state +and free the CRTC state pointer. + +@param this The CRTC state. +''' + + +cdef extern int libgamma_crtc_restore(libgamma_crtc_state_t* this) +''' +Restore the gamma ramps for a CRTC to the system settings for that CRTC. + +@param this The CRTC state +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + + +cdef extern int libgamma_get_crtc_information(libgamma_crtc_information_t* this, libgamma_crtc_state_t* crtc, int32_t fields) +''' +Read information about a CRTC. + +@param this Instance of a data structure to fill with the information about the CRTC. +@param crtc The state of the CRTC whose information should be read. +@param fields OR:ed identifiers for the information about the CRTC that should be read. +@return Zero on success, -1 on error. On error refer to the error reports in `this`. +''' + + +cdef extern void libgamma_crtc_information_destroy(libgamma_crtc_information_t* this) +''' +Release all resources in an information data structure for a CRTC. + +@param this The CRTC information. +''' + + + +cdef extern int libgamma_crtc_get_gamma_ramps8(libgamma_crtc_state_t* this, libgamma_gamma_ramps8_t* ramps) +''' +Get current the gamma ramps for a CRTC, 8-bit gamma-depth version. + +@param this The CRTC state. +@param ramps The gamma ramps to fill with the current values +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + +cdef extern int libgamma_crtc_set_gamma_ramps8(libgamma_crtc_state_t* this, libgamma_gamma_ramps8_t ramps) +''' +Set the gamma ramps for a CRTC, 8-bit gamma-depth version. + +@param this The CRTC state. +@param ramps The gamma ramps to apply. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + + +cdef extern int libgamma_crtc_get_gamma_ramps16(libgamma_crtc_state_t* this, libgamma_gamma_ramps16_t* ramps) +''' +Get current the gamma ramps for a CRTC, 16-bit gamma-depth version. + +@param this The CRTC state. +@param ramps The gamma ramps to fill with the current values +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + +cdef extern int libgamma_crtc_set_gamma_ramps16(libgamma_crtc_state_t* this, libgamma_gamma_ramps16_t ramps) +''' +Set the gamma ramps for a CRTC, 16-bit gamma-depth version. + +@param this The CRTC state. +@param ramps The gamma ramps to apply. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + + +cdef extern int libgamma_crtc_get_gamma_ramps32(libgamma_crtc_state_t* this, libgamma_gamma_ramps32_t* ramps) +''' +Get current the gamma ramps for a CRTC, 32-bit gamma-depth version. + +@param this The CRTC state. +@param ramps The gamma ramps to fill with the current values. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + +cdef extern int libgamma_crtc_set_gamma_ramps32(libgamma_crtc_state_t* this, libgamma_gamma_ramps32_t ramps) +''' +Set the gamma ramps for a CRTC, 32-bit gamma-depth version. + +@param this The CRTC state. +@param ramps The gamma ramps to apply. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + + +cdef extern int libgamma_crtc_get_gamma_ramps64(libgamma_crtc_state_t* this, libgamma_gamma_ramps64_t* ramps) +''' +Get current the gamma ramps for a CRTC, 64-bit gamma-depth version. + +@param this The CRTC state. +@param ramps The gamma ramps to fill with the current values. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + +cdef extern int libgamma_crtc_set_gamma_ramps64(libgamma_crtc_state_t* this, libgamma_gamma_ramps64_t ramps) +''' +Set the gamma ramps for a CRTC, 64-bit gamma-depth version. + +@param this The CRTC state. +@param ramps The gamma ramps to apply. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + + +cdef extern int libgamma_crtc_set_gamma_rampsf(libgamma_crtc_state_t* this, libgamma_gamma_rampsf_t ramps) +''' +Set the gamma ramps for a CRTC, `float` version. + +@param this The CRTC state. +@param ramps The gamma ramps to apply. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + +cdef extern int libgamma_crtc_get_gamma_rampsf(libgamma_crtc_state_t* this, libgamma_gamma_rampsf_t* ramps) +''' +Get current the gamma ramps for a CRTC, `float` version. + +@param this The CRTC state. +@param ramps The gamma ramps to fill with the current values. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + + +cdef extern int libgamma_crtc_get_gamma_rampsd(libgamma_crtc_state_t* this, libgamma_gamma_rampsd_t* ramps) +''' +Get current the gamma ramps for a CRTC, `double` version. + +@param this The CRTC state. +@param ramps The gamma ramps to fill with the current values. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + +cdef extern int libgamma_crtc_set_gamma_rampsd(libgamma_crtc_state_t* this, libgamma_gamma_rampsd_t ramps) +''' +Set the gamma ramps for a CRTC, `double` version. + +@param this The CRTC state. +@param ramps The gamma ramps to apply. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + + +def libgamma_native_list_methods(operation : int) -> list: + ''' + List available adjustment methods by their order of preference based on the environment. + + @param operation Allowed values: + 0: Methods that the environment suggests will work, excluding fake. + 1: Methods that the environment suggests will work, including fake. + 2: All real non-fake methods. + 3: All real methods. + 4: All methods. + Other values invoke undefined behaviour. + @return :list<int> A list of available adjustment methods. + ''' + cdef int* methods + cdef size_t buf_size + cdef size_t r + buf_size = 6 + methods = <int*>malloc(buf_size * sizeof(size_t)) + if methods == NULL: + raise MemoryError() + r = libgamma_list_methods(methods, buf_size, operation) + if r > buf_size: + buf_size = r + free(methods) + methods = <int*>malloc(buf_size * sizeof(size_t)) + if methods == NULL: + raise MemoryError() + libgamma_list_methods(methods, buf_size, operation) + rc = [] + for i in range(r): + rc.append(methods[i]) + free(methods) + return rc + + +def libgamma_native_is_method_available(method : int) -> int: + ''' + Check whether an adjustment method is available, non-existing (invalid) methods will be + identified as not available under the rationale that the library may be out of date. + + @param method The adjustment method. + @return Whether the adjustment method is available. + ''' + return int(libgamma_is_method_available(<int>method)) + + +def libgamma_native_method_capabilities(method : int) -> tuple: + ''' + Return the capabilities of an adjustment method. + + @param method The adjustment method (display server and protocol). + @return :(int, int) Input parameters for `MethodCapabilities.__init__` + ''' + cdef libgamma_method_capabilities_t caps + libgamma_method_capabilities(&caps, <int>method) + booleans = 0 + crtc_information = int(caps.crtc_information) + booleans |= (0 if caps.default_site_known == 0 else 1) << 0 + booleans |= (0 if caps.multiple_sites == 0 else 1) << 1 + booleans |= (0 if caps.multiple_partitions == 0 else 1) << 2 + booleans |= (0 if caps.multiple_crtcs == 0 else 1) << 3 + booleans |= (0 if caps.partitions_are_graphics_cards == 0 else 1) << 4 + booleans |= (0 if caps.site_restore == 0 else 1) << 5 + booleans |= (0 if caps.partition_restore == 0 else 1) << 6 + booleans |= (0 if caps.crtc_restore == 0 else 1) << 7 + booleans |= (0 if caps.identical_gamma_sizes == 0 else 1) << 8 + booleans |= (0 if caps.fixed_gamma_size == 0 else 1) << 9 + booleans |= (0 if caps.fixed_gamma_depth == 0 else 1) << 10 + booleans |= (0 if caps.real == 0 else 1) << 11 + booleans |= (0 if caps.fake == 0 else 1) << 12 + return (crtc_information, booleans) + + +def libgamma_native_method_default_site(method : int) -> str: + ''' + Return the capabilities of an adjustment method. + + @param method The adjustment method (display server and protocol.) + @return The default site, `None` if it cannot be determined or + if multiple sites are not supported by the adjustment + method. + ''' + cdef char* var + cdef bytes bs + var = libgamma_method_default_site(<int>method) + bs = var + return bs.decode('utf-8', 'strict') + + +def libgamma_native_method_default_site_variable(method : int) -> str: + ''' + Return the capabilities of an adjustment method. + + @param method The adjustment method (display server and protocol.) + @return The environ variables that is used to determine the + default site. `None` if there is none, that is, if + the method does not support multiple sites. + ''' + cdef const char* var + cdef bytes bs + var = libgamma_method_default_site_variable(<int>method) + bs = var + return bs.decode('utf-8', 'strict') + + + +#def int libgamma_native_site_initialise(libgamma_site_state_t* this, int method, char* site) +''' +Initialise an allocated site state. + +@param this The site state to initialise. +@param method The adjustment method (display server and protocol.) +@param site The site identifier, unless it is `NULL` it must a + `free`:able. One the state is destroyed the library + will attempt to free it. There you should not free + it yourself, and it must not be a string constant + or allocate on the stack. Note however that it will + not be `free`:d if this function fails. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + +def void libgamma_native_site_destroy(this : int): + ''' + Release all resources held by a site state. + + @param this The site state. + ''' + cdef size_t this_address + cdef libgamma_site_state_t* this_ + this_address = <size_t>this + this_ = <libgamma_site_state_t*><void*>this_address + libgamma_site_free(this_) + + +def int libgamma_native_site_restore(this : int) -> int: + ''' + Restore the gamma ramps all CRTC:s with a site to the system settings. + + @param this The site state. + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef libgamma_site_state_t* this_ + this_address = <size_t>this + this_ = <libgamma_site_state_t*><void*>this_address + return int(libgamma_site_restore(this_)) + + + +#def int libgamma_native_partition_initialise(libgamma_partition_state_t* this, libgamma_site_state_t* site, size_t partition) +''' +Initialise an allocated partition state. + +@param this The partition state to initialise. +@param site The site state for the site that the partition belongs to. +@param partition The index of the partition within the site. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + +def libgamma_native_partition_free(this : int): + ''' + Release all resources held by a partition state + and free the partition state pointer. + + @param this The partition state. + ''' + cdef size_t this_address + cdef libgamma_partition_state_t* this_ + this_address = <size_t>this + this_ = <libgamma_partition_state_t*><void*>this_address + libgamma_partition_free(this_) + + +def libgamma_native_partition_restore(this : int) -> int: + ''' + Restore the gamma ramps all CRTC:s with a partition to the system settings. + + @param this The partition state. + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef libgamma_partition_state_t* this_ + this_address = <size_t>this + this_ = <libgamma_partition_state_t*><void*>this_address + return int(libgamma_partition_restore(this_)) + + + +#def int libgamma_native_crtc_initialise(libgamma_crtc_state_t* this, libgamma_partition_state_t* partition, size_t crtc) +''' +Initialise an allocated CRTC state. + +@param this The CRTC state to initialise. +@param partition The partition state for the partition that the CRTC belongs to. +@param crtc The index of the CRTC within the partition. +@return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. +''' + + +def libgamma_native_crtc_free(this : int): + ''' + Release all resources held by a CRTC state + and free the CRTC state pointer. + + @param this The CRTC state. + ''' + cdef size_t this_address + cdef libgamma_crtc_state_t* this_ + this_address = <size_t>this + this_ = <libgamma_crtc_state_t*><void*>this_address + libgamma_crtc_free(this_) + + +def libgamma_native_crtc_restore(this : int) -> int: + ''' + Restore the gamma ramps for a CRTC to the system settings for that CRTC. + + @param this The CRTC state + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef libgamma_crtc_state_t* this_ + this_address = <size_t>this + this_ = <libgamma_crtc_state_t*><void*>this_address + return int(libgamma_crtc_restore(this_)) + + + +def libgamma_native_get_crtc_information(crtc : int, fields : int) -> tuple: + ''' + Read information about a CRTC. + + @param crtc The state of the CRTC whose information should be read. + @param field OR:ed identifiers for the information about the CRTC that should be read. + @return :(list, :int) First value: Input parametrs for `CRTCInformation.__init__` + Second value: Zero on success, -1 on error. On error refer to the error reports in the return. + ''' + cdef libgamma_crtc_information_t info + cdef size_t crtc_address + cdef libgamma_crtc_state_t* crtc_ + cdef bytes bs + crtc_address = <size_t>crtc + crtc_ = <libgamma_crtc_state_t*><void*>crtc_address + r = int(libgamma_get_crtc_information(&info, crtc_, <int32_t>fields)) + rc = [] + connector_name = None + if info.connector_name is not NULL: + bs = info.connector_name + connector_name = bs.decode('utf-8', 'strict') + edid = None + if info.edid is not NULL: + bs = info.edid[:info.edid_length] + edid = bs + rc.append(edid) + rc.append(int(info.edid_error)) + rc.append(int(info.width_mm)) + rc.append(int(info.width_mm_error)) + rc.append(int(info.height_mm)) + rc.append(int(info.height_mm_error)) + rc.append(int(info.width_mm_edid)) + rc.append(int(info.width_mm_edid_error)) + rc.append(int(info.height_mm_edid)) + rc.append(int(info.height_mm_edid_error)) + rc.append(int(info.red_gamma_size)) + rc.append(int(info.green_gamma_size)) + rc.append(int(info.blue_gamma_size)) + rc.append(int(info.gamma_size_error)) + rc.append(int(info.gamma_depth)) + rc.append(int(info.gamma_depth_error)) + rc.append(int(info.gamma_support)) + rc.append(int(info.gamma_support_error)) + rc.append(int(info.subpixel_order)) + rc.append(int(info.subpixel_order_error)) + rc.append(int(info.active)) + rc.append(int(info.active_error)) + rc.append(connector_name) + rc.append(int(info.connector_name_error)) + rc.append(int(info.connector_type)) + rc.append(int(info.connector_type_error)) + rc.append(float(info.gamma_red)) + rc.append(float(info.gamma_green)) + rc.append(float(info.gamma_blue)) + rc.append(int(info.gamma_error)) + libgamma_get_crtc_destroy(&info) + return (rc, r) + + + +def libgamma_native_crtc_get_gamma_ramps8(this : int, ramps : int) -> int: + ''' + Get current the gamma ramps for a CRTC, 8-bit gamma-depth version. + + @param this The CRTC state. + @param ramps The gamma ramps to fill with the current values. + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef size_t ramps_address + cdef libgamma_crtc_state_t* this_ + cdef libgamma_gamma_ramps8_t* ramps_ + this_address = <size_t>this + ramps_address = <size_t>ramps + this_ = <libgamma_crtc_state_t*><void*>this_address + ramps_ = <libgamma_gamma_ramps8_t*><void*>ramps_address + return int(libgamma_crtc_get_gamma_ramps8(this_, ramps_)) + + +def libgamma_native_crtc_set_gamma_ramps8(this : int, ramps : int) -> int: + ''' + Set the gamma ramps for a CRTC, 8-bit gamma-depth version. + + @param this The CRTC state. + @param ramps The gamma ramps to apply. + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef size_t ramps_address + cdef libgamma_crtc_state_t* this_ + cdef libgamma_gamma_ramps8_t* ramps_ + this_address = <size_t>this + ramps_address = <size_t>ramps + this_ = <libgamma_crtc_state_t*><void*>this_address + ramps_ = <libgamma_gamma_ramps8_t*><void*>ramps_address + return int(libgamma_crtc_set_gamma_ramps8(this_, ramps_[0])) + + + +def libgamma_native_crtc_get_gamma_ramps16(this : int, ramps : int) -> int: + ''' + Get current the gamma ramps for a CRTC, 16-bit gamma-depth version. + + @param this The CRTC state. + @param ramps The gamma ramps to fill with the current values. + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef size_t ramps_address + cdef libgamma_crtc_state_t* this_ + cdef libgamma_gamma_ramps16_t* ramps_ + this_address = <size_t>this + ramps_address = <size_t>ramps + this_ = <libgamma_crtc_state_t*><void*>this_address + ramps_ = <libgamma_gamma_ramps16_t*><void*>ramps_address + return int(libgamma_crtc_get_gamma_ramps16(this_, ramps_)) + + +def libgamma_native_crtc_set_gamma_ramps16(this : int, ramps : int) -> int: + ''' + Set the gamma ramps for a CRTC, 16-bit gamma-depth version. + + @param this The CRTC state. + @param ramps The gamma ramps to apply. + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef size_t ramps_address + cdef libgamma_crtc_state_t* this_ + cdef libgamma_gamma_ramps16_t* ramps_ + this_address = <size_t>this + ramps_address = <size_t>ramps + this_ = <libgamma_crtc_state_t*><void*>this_address + ramps_ = <libgamma_gamma_ramps16_t*><void*>ramps_address + return int(libgamma_crtc_set_gamma_ramps16(this_, ramps_[0])) + + + +def libgamma_native_crtc_get_gamma_ramps32(this : int, ramps : int) -> int: + ''' + Get current the gamma ramps for a CRTC, 32-bit gamma-depth version. + + @param this The CRTC state. + @param ramps The gamma ramps to fill with the current values. + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef size_t ramps_address + cdef libgamma_crtc_state_t* this_ + cdef libgamma_gamma_ramps32_t* ramps_ + this_address = <size_t>this + ramps_address = <size_t>ramps + this_ = <libgamma_crtc_state_t*><void*>this_address + ramps_ = <libgamma_gamma_ramps32_t*><void*>ramps_address + return int(libgamma_crtc_get_gamma_ramps32(this_, ramps_)) + + +def libgamma_native_crtc_set_gamma_ramps32(this : int, ramps : int) -> int: + ''' + Set the gamma ramps for a CRTC, 32-bit gamma-depth version. + + @param this The CRTC state. + @param ramps The gamma ramps to apply. + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef size_t ramps_address + cdef libgamma_crtc_state_t* this_ + cdef libgamma_gamma_ramps32_t* ramps_ + this_address = <size_t>this + ramps_address = <size_t>ramps + this_ = <libgamma_crtc_state_t*><void*>this_address + ramps_ = <libgamma_gamma_ramps32_t*><void*>ramps_address + return int(libgamma_crtc_set_gamma_ramps32(this_, ramps_[0])) + + + +def libgamma_native_crtc_get_gamma_ramps64(this : int, ramps : int) -> int: + ''' + Get current the gamma ramps for a CRTC, 64-bit gamma-depth version. + + @param this The CRTC state. + @param ramps The gamma ramps to fill with the current values. + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef size_t ramps_address + cdef libgamma_crtc_state_t* this_ + cdef libgamma_gamma_ramps64_t* ramps_ + this_address = <size_t>this + ramps_address = <size_t>ramps + this_ = <libgamma_crtc_state_t*><void*>this_address + ramps_ = <libgamma_gamma_ramps64_t*><void*>ramps_address + return int(libgamma_crtc_get_gamma_ramps64(this_, ramps_)) + + +def libgamma_native_crtc_set_gamma_ramps64(this : int, ramps : int) -> int: + ''' + Set the gamma ramps for a CRTC, 64-bit gamma-depth version. + + @param this The CRTC state. + @param ramps The gamma ramps to apply. + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef size_t ramps_address + cdef libgamma_crtc_state_t* this_ + cdef libgamma_gamma_ramps64_t* ramps_ + this_address = <size_t>this + ramps_address = <size_t>ramps + this_ = <libgamma_crtc_state_t*><void*>this_address + ramps_ = <libgamma_gamma_ramps64_t*><void*>ramps_address + return int(libgamma_crtc_set_gamma_ramps64(this_, ramps_[0])) + + + +def libgamma_native_crtc_get_gamma_rampsf(this : int, ramps : int) -> int: + ''' + Get current the gamma ramps for a CRTC, `float` version. + + @param this The CRTC state. + @param ramps The gamma ramps to fill with the current values. + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef size_t ramps_address + cdef libgamma_crtc_state_t* this_ + cdef libgamma_gamma_rampsf_t* ramps_ + this_address = <size_t>this + ramps_address = <size_t>ramps + this_ = <libgamma_crtc_state_t*><void*>this_address + ramps_ = <libgamma_gamma_rampsf_t*><void*>ramps_address + return int(libgamma_crtc_get_gamma_rampsf(this_, ramps_)) + + +def libgamma_native_crtc_set_gamma_rampsf(this : int, ramps : int) -> int: + ''' + Set the gamma ramps for a CRTC, `float` version. + + @param this The CRTC state. + @param ramps The gamma ramps to apply. + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef size_t ramps_address + cdef libgamma_crtc_state_t* this_ + cdef libgamma_gamma_rampsf_t* ramps_ + this_address = <size_t>this + ramps_address = <size_t>ramps + this_ = <libgamma_crtc_state_t*><void*>this_address + ramps_ = <libgamma_gamma_rampsf_t*><void*>ramps_address + return int(libgamma_crtc_set_gamma_rampsf(this_, ramps_[0])) + + + +def libgamma_native_crtc_get_gamma_rampsd(this : int, ramps : int) -> int: + ''' + Get current the gamma ramps for a CRTC, `double` version. + + @param this The CRTC state. + @param ramps The gamma ramps to fill with the current values. + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef size_t ramps_address + cdef libgamma_crtc_state_t* this_ + cdef libgamma_gamma_rampsd_t* ramps_ + this_address = <size_t>this + ramps_address = <size_t>ramps + this_ = <libgamma_crtc_state_t*><void*>this_address + ramps_ = <libgamma_gamma_rampsd_t*><void*>ramps_address + return int(libgamma_crtc_get_gamma_rampsd(this_, ramps_)) + + +def libgamma_native_crtc_set_gamma_rampsd(this : int, ramps : int) -> int: + ''' + Set the gamma ramps for a CRTC, `double` version. + + @param this The CRTC state. + @param ramps The gamma ramps to apply. + @return Zero on success, otherwise (negative) the value of an + error identifier provided by this library. + ''' + cdef size_t this_address + cdef size_t ramps_address + cdef libgamma_crtc_state_t* this_ + cdef libgamma_gamma_rampsd_t* ramps_ + this_address = <size_t>this + ramps_address = <size_t>ramps + this_ = <libgamma_crtc_state_t*><void*>this_address + ramps_ = <libgamma_gamma_rampsd_t*><void*>ramps_address + return int(libgamma_crtc_set_gamma_rampsd(this_, ramps_[0])) + |