aboutsummaryrefslogblamecommitdiffstats
path: root/libgamma_native_facade.pyx
blob: b3e53002fcfca53473f3dae18de1a19950f188fa (plain) (tree)
1
2
3
4
5
6
7
8
                
                                                     




                                                                       
                             




                                      
                                      
 
                                                                                              

                                            
                                
                                                                                 

                                                      

                                                                           

                                                                        

                                                                      

                                    

                                                                    

                  

                                                                

                                
                                                    

                                                               
                                   

                                                                        
                                        

                                                                             
                                   

                                                                        

                                                                                
                                                                                

                                                        

                                                                                
                                                                                     

                                              
                                        
                                                                               

                                                                             
                           

                                                                         
                           

                                                                              
                                                                     
                    





                                                                      

                  

                                                              
 


                                                                


                                           




                                                                   
 









                                                                      
 
                                                                               
                         








                                                                      

                  

                                                              
 
                                 

                                            
                        

                                    



                                                             
 
                                                                     
                                           


                                                     

                                  


                                                              
 
                                           

                                            
                   

                                                    
                                                                                 


                                                                



                                                                      
 
                          

                              



                                                                  
 







                                                                      
 


                                                                  

                                                         







                                                                      
 


                                                                  

                                                         








                                                                     
 


                                                                  

                                                         








                                                                     
 


                                                                  

                                                         
                             

                                                             
                               

                                                               
                              

                                                              


                                                                  

                                                         


                                                            

                                         


                                                                  

                                                         
                         

                                                       


                                                                  

                                                         



                                                                          
 



                                                                  
 
                  

                                                           


                                                                  


                                                         

                                                                

                                   


                                                                  

                                                         
                                                

                                                                    


                                                                  

                                                         







                                                                 
 







                                                                   
 







                                                                  
 


                                                                  

                                                         
                                                                         







                                                                
                                                                           







                                                                
                                                                           







                                                                
                                                                           







                                                                
                                                                         







                                                                
                                                                         









                                                                                            
   
                                                                                       
 
                                                                                                   

                                                                                                       
                                                                                  
                                  





                                                                                       
                                                                                      
                                                                  


   
                                                              

                                                                                       
                                                                                   
 

                                                           


   
                                                                                                                      
   
                                               
 





                                                                                       


   
                                                                      
   
                                                
 
                                                                    

                                                                       
                                                          


   
                                                                               
   
                                           
                                         
 
                                                                    






                                                                    
                                                                                                 
   
                                  
 

                                                                    






                                                                      
                                                          


   
                                                                    

                                          
                               
 
                            


   
                                                                      
   
                                                                     
 
                             
                                                                    
                                                        


   
                                                                                                                                
   
                                       
 
                                                     
                                                                              
                                                              
                                                                         
                                                             


   
                                                                              

                                               
                                    
 
                                 


   
                                                                                
   
                                                                          
 
                                  
                                                                    
                                                        


   
                                                                                                                           
   
                                  
 


                                                                                  
                                                                         
                                                             


   
                                                                    

                                          
                               
 
                            


   
                                                                      
   
                                                                       


                                                                    
                                                        


   

                                                                                                         
   
                             
 
                                                                                         

                                                                                      


                                                                                            


   
                                                                                         
   
                                                                 
 
                                  


   
                                                                                                             
   
                                                                 
 
                              

                                                                     
                                                         


   
                                                                                                                   
   
                                                         
 

                                        
                                                                     
                                                         


   
                                                                                                               
   
                                                                  
 
                              

                                                                     
                                                         


   
                                                                                                                     
   
                                                          
 

                                        
                                                                     
                                                         


   
                                                                                                               
   
                                                                  
 

                                                               
                                                                     
                                                         


   
                                                                                                                     
   
                                                          
 

                                        
                                                                     
                                                         


   
                                                                                                               
   
                                                                  
 

                                                               
                                                                     
                                                         


   
                                                                                                                     
   
                                                          
 

                                        
                                                                     
                                                         


   
                                                                                                             
   
                                                       
 

                                                               
                                                                     
                                                         


   
                                                                                                                   
   
                                               
 

                                        
                                                                     
                                                         



   
                                                                                                             
   
                                                        
 

                                                               
                                                                     
                                                         


   
                                                                                                                   
   
                                                
 

                                        
                                                                     
                                                         


   

                                                          
                                                                                           

                                        






                                                                                             
       
                     
                        
                     
                
                                                      





                                                           
                                                          

                               


                                                                









                                                                                           
                                                                                       
    

                                                               





                                                               
                                                   
    

                                                                             
       



                                                                                                          



















                                                                           
                                                    
    
                                                                        

                                                                           
                           
       
                        

                                                   

                   





                                                                      
                                               
                                             
    
                                                                        



                                                                        
                        

                                                            

                   



                                       
                                                                              
       
                                  
    
                                                                                             






                                                                                             

                                                                                                    
                                                                                            
       
                                  
                    
                            
                                                                     

                           
                                       


                                                   
                                                           





                                                               
                  
                                
                                                
                                                              

 
                                          
       
                                              
                                   
    
                                

                            
                                   
                               
                                                       


                             
                                                    
       
                                                                         
    
                                 
                                                                   
                                                                 

                            
                                   
                               
                                                       

                                         

 

                                                                           
                                       
    

                                                                                                   
                                                                                             

                                                                                                    
                                                                                            
       

                                       


                               

                                                                               

                           
                                       
                                                                          
                  
                                     
                                                
                                                         




                                                   
                                        
    
                                     

                            
                                        
                               
                                                            




                                                         
                                                                              
    
                                      
                                                                   
                                                                 

                            
                                        
                               
                                                            

                                              

 
                                                                      
       
                                  
    
                                                                                         

                                                                        
                                                                                         
                                                                                       
       

                                             


                                         

                                                                      

                           
                                       
                                                                     
                  
                                

                                                




                                              
                                   
    
                                

                            
                                   
                               
                                                       




                                                    
                                                                           

                                 
                                                                   
                                                                 

                            
                                   
                               
                                                       

                                         

 

                                                                            
                                 
    

                                                                                                    
                                                                                         

                                                                                          
       
                                       
                            
                                   

                               

                                                                                                            






































                                                     
                                            


                  

                                                                          
                                                                     
    

                                                                   
                                                                    
                                                                  


                             

                                      

                                 

                                                           

                                                          



                                                                          
                                                             
    

                                            
                                                                    
                                                                  


                             

                                      

                                 


                                                           
                                       

 

                                                                           
                                                                      
    

                                                                   
                                                                    
                                                                  


                             

                                       

                                 

                                                            

                                                           



                                                                           
                                                              
    

                                            
                                                                    
                                                                  


                             

                                       

                                 


                                                            
                                       

 

                                                                           
                                                                      
    

                                                                   
                                                                    
                                                                  


                             

                                       

                                 

                                                            

                                                           



                                                                           
                                                              
    

                                            
                                                                    
                                                                  


                             

                                       

                                 


                                                            
                                       

 

                                                                           
                                                                      
    

                                                                   
                                                                    
                                                                  


                             

                                       

                                 

                                                            

                                                           



                                                                           
                                                              
    

                                            
                                                                    
                                                                  


                             

                                        

                                 


                                                            
                                       

 

                                                                          
                                                           
    

                                                                   
                                                                    
                                                                  


                             

                                      

                                 

                                                           

                                                          



                                                                          
                                                   
    

                                            
                                                                    
                                                                  


                             

                                      

                                 


                                                           
                                       

 

                                                                          
                                                            
    

                                                                   
                                                                    
                                                                  


                             

                                      

                                 

                                                           

                                                          



                                                                          
                                                    
    

                                            
                                                                    
                                                                  


                             

                                      

                                 


                                                           
                                       
# -*- python -*-
# See LICENSE file for copyright and license details.
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
from libc.errno cimport errno


ctypedef int libgamma_subpixel_order_t
ctypedef int libgamma_connector_type_t

cdef extern from "include-libgamma.h":

    ctypedef struct struct_libgamma_method_capabilities "struct libgamma_method_capabilities":
        # Capabilities of adjustment methods

        int32_t crtc_information
        # OR of the CRTC information fields in `struct libgamma_crtc_information`
        # 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 `struct libgamma_crtc_information` 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 `struct libgamma_crtc_information` will always be filled with the
        # same value for the adjustment method

        unsigned fixed_gamma_depth # : 1
        # Whether the `gamma_depth` field in `struct libgamma_crtc_information`
        # 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 "struct libgamma_site_state":
        # 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 "struct libgamma_partition_state":
        # 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 *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 "struct libgamma_crtc_state":
        # 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 *partition
        # The partition this CRTC belongs to

        size_t crtc
        # The index of the CRTC within its partition

    ctypedef struct libgamma_crtc_information "struct libgamma_crtc_information":
        # 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 "struct libgamma_gamma_ramps8":
        # 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 "struct libgamma_gamma_ramps16":
        # 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 "struct libgamma_gamma_ramps32":
        # 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 "struct libgamma_gamma_ramps64":
        # 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 "struct libgamma_gamma_rampsf":
        # 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 "struct libgamma_gamma_rampsd":
        # 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) nogil
'''
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) nogil
'''
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 int libgamma_method_capabilities(struct_libgamma_method_capabilities *this, size_t size, int method) nogil
'''
Return the capabilities of an adjustment method

@param   this    The data structure to fill with the method's capabilities
@param   size    Should be `sizeof(*this)`, used to let the library know which version 
                 of the structure is used so that it does not write outside of it
@param   method  The adjustment method (display server and protocol)
@return          Zero on success, otherwise (negative) the value of an
                 error identifier provided by this library
'''


cdef extern const char *libgamma_method_default_site(int method) nogil
'''
Return the default site for 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) nogil
'''
Return the default variable that determines
the default site for 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 *this, int method, char *site) nogil
'''
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 *this) nogil
'''
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 *this) nogil
'''
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 *this, libgamma_site_state* site, size_t partition) nogil
'''
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 *this) nogil
'''
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 *this) nogil
'''
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 *this, libgamma_partition_state *partition, size_t crtc) nogil
'''
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 *this) nogil
'''
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 *this) nogil
'''
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 *this, size_t size,
                                              libgamma_crtc_state *crtc, unsigned long long fields) nogil
'''
Read information about a CRTC

@param   this    Instance of a data structure to fill with the information about the CRTC
@param   size    Should be `sizeof(*this)`, used to let the library know which version
                 of the structure is used so that it does not write outside of it
@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 *this) nogil
'''
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 *this, libgamma_gamma_ramps8 *ramps) nogil
'''
Get the current 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 *this, const libgamma_gamma_ramps8 *ramps) nogil
'''
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 *this, libgamma_gamma_ramps16 *ramps) nogil
'''
Get the current 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 *this, const libgamma_gamma_ramps16 *ramps) nogil
'''
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 *this, libgamma_gamma_ramps32 *ramps) nogil
'''
Get the current 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 *this, const libgamma_gamma_ramps32 *ramps) nogil
'''
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 *this, libgamma_gamma_ramps64 *ramps) nogil
'''
Get the current 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 *this, const libgamma_gamma_ramps64 *ramps) nogil
'''
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_get_gamma_rampsf(libgamma_crtc_state *this, libgamma_gamma_rampsf *ramps) nogil
'''
Get the current 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_set_gamma_rampsf(libgamma_crtc_state *this, const libgamma_gamma_rampsf *ramps) nogil
'''
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_rampsd(libgamma_crtc_state *this, libgamma_gamma_rampsd *ramps) nogil
'''
Get the current 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 *this, const libgamma_gamma_rampsd *ramps) nogil
'''
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, r2
    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()
        r2 = libgamma_list_methods(methods, buf_size, operation)
        if r2 < r:
            r = r2
    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 struct_libgamma_method_capabilities caps
    r = int(libgamma_method_capabilities(&caps, sizeof(struct_libgamma_method_capabilities), <int>method))
    if not r == 0:
        return (0, int(errno) if r == -1 else r)
    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 default site for 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 const char *var
    cdef bytes bs
    var = libgamma_method_default_site(<int>method)
    if var is NULL:
        return None
    bs = var
    return bs.decode('utf-8', 'strict')


def libgamma_native_method_default_site_variable(method : int) -> str:
    '''
    Return the default variable that determines
    the default site for 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)
    if var is NULL:
        return None
    bs = var
    return bs.decode('utf-8', 'strict')


def libgamma_native_site_create(method : int, site : str | NoneType) -> tuple:
    '''
    Create an allocated site state
    
    @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  :(site:int, partitions:int)  First value:   The created site, zero on error
                                          Second value:  The number of partitions in the site,
                                                         on error: the value of the error identifier
                                                         provided by this library or `errno`
    '''
    cdef libgamma_site_state *this
    cdef char *site_
    cdef size_t this_address
    this = <libgamma_site_state *>malloc(sizeof(libgamma_site_state))
    if this is NULL:
        raise MemoryError()
    this_address = <size_t><void *>this
    site_ = NULL
    if site is not None:
        site_bs = site.encode('utf-8') + bytes([0])
        site_ = <char *>malloc(len(site_bs) * sizeof(char))
        if site_ is None:
            free(this)
            raise MemoryError()
        for i in range(len(site_bs)):
            site_[i] = <char>(site_bs[i])
    r = int(libgamma_site_initialise(this, <int>method, site_))
    if not r == 0:
        libgamma_site_free(this)
        return (0, int(errno) if r == -1 else r)
    return (int(this_address), int(this.partitions_available))


def libgamma_native_site_free(this : int):
    '''
    Release all resources held by a site state
    and free the CRTC state pointer
    
    @param  this  The site state
    '''
    cdef size_t this_address
    cdef libgamma_site_state *this_
    this_address = <size_t>this
    this_ = <libgamma_site_state *><void *>this_address
    libgamma_site_free(this_)


def 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 the value of an error
                   identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef libgamma_site_state *this_
    this_address = <size_t>this
    this_ = <libgamma_site_state *><void *>this_address
    r = int(libgamma_site_restore(this_))
    return int(errno) if r == -1 else r


def libgamma_native_partition_create(site : int, partition : int) -> tuple:
    '''
    Create an allocated partition state
    
    @param   site                         The site state for the site that the partition belongs to
    @param   partition                    The index of the partition within the site
    @return  :(site:int, partitions:int)  First value:   The created partition, zero on error
                                          Second value:  The number of CRTC:s in the partition,
                                                         on error: the value of the error identifier
                                                         provided by this library or `errno`
    '''
    cdef libgamma_partition_state *this
    cdef libgamma_site_state *site_
    cdef size_t this_address
    cdef size_t site_address
    site_address = <size_t>site
    site_ = <libgamma_site_state *><void *>site_address
    this = <libgamma_partition_state *>malloc(sizeof(libgamma_partition_state))
    if this is NULL:
        raise MemoryError()
    this_address = <size_t><void *>this
    r = int(libgamma_partition_initialise(this, site_, <size_t>partition))
    if not r == 0:
        libgamma_partition_free(this)
        return (0, int(errno) if r == -1 else r)
    return (int(this_address), int(this.crtcs_available))


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 *this_
    this_address = <size_t>this
    this_ = <libgamma_partition_state *><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 the value of an error
                   identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef libgamma_partition_state *this_
    this_address = <size_t>this
    this_ = <libgamma_partition_state *><void *>this_address
    r = int(libgamma_partition_restore(this_))
    return int(errno) if r == -1 else r


def libgamma_native_crtc_create(partition : int, crtc : int) -> tuple:
    '''
    Create an allocated CRTC state
    
    @param   partition    The partition state for the partition that the CRTC belongs to.
    @param   crtc         The index of the CRTC within the partition
    @return  :(int, int)  First value:   The created CRTC, zero on error
                          Second value:  Zero on success, otherwise the value of an error
                                         identifier provided by this library or `errno`
    '''
    cdef libgamma_crtc_state *this
    cdef libgamma_partition_state *partition_
    cdef size_t this_address
    cdef size_t partition_address
    partition_address = <size_t>partition
    partition_ = <libgamma_partition_state *><void *>partition_address
    this = <libgamma_crtc_state *>malloc(sizeof(libgamma_crtc_state))
    if this is NULL:
        raise MemoryError()
    this_address = <size_t><void *>this
    r = int(libgamma_crtc_initialise(this, partition_, <size_t>crtc))
    if not r == 0:
        libgamma_crtc_free(this)
        return (0, int(errno) if r == -1 else r)
    return (int(this_address), 0)


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 *this_
    this_address = <size_t>this
    this_ = <libgamma_crtc_state *><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 the value of an error
                   identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef libgamma_crtc_state *this_
    this_address = <size_t>this
    this_ = <libgamma_crtc_state *><void *>this_address
    r = int(libgamma_crtc_restore(this_))
    return int(errno) if r == -1 else r


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 info
    cdef size_t crtc_address
    cdef libgamma_crtc_state *crtc_
    cdef bytes bs
    crtc_address = <size_t>crtc
    crtc_ = <libgamma_crtc_state *><void *>crtc_address
    r = int(libgamma_get_crtc_information(&info, sizeof(libgamma_crtc_information), 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_crtc_information_destroy(&info)
    return (rc, r)


def libgamma_native_crtc_get_gamma_ramps8(this : int, ramps : int) -> int:
    '''
    Get the current 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 the value of an error
                    identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef size_t ramps_address
    cdef libgamma_crtc_state *this_
    cdef libgamma_gamma_ramps8 *ramps_
    this_address = <size_t>this
    ramps_address = <size_t>ramps
    this_ = <libgamma_crtc_state *><void *>this_address
    ramps_ = <libgamma_gamma_ramps8 *><void *>ramps_address
    r = int(libgamma_crtc_get_gamma_ramps8(this_, ramps_))
    return int(errno) if r == -1 else r


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 the value of an error
                    identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef size_t ramps_address
    cdef libgamma_crtc_state *this_
    cdef libgamma_gamma_ramps8 *ramps_
    this_address = <size_t>this
    ramps_address = <size_t>ramps
    this_ = <libgamma_crtc_state *><void *>this_address
    ramps_ = <libgamma_gamma_ramps8 *><void *>ramps_address
    r = int(libgamma_crtc_set_gamma_ramps8(this_, ramps_))
    return int(errno) if r == -1 else r


def libgamma_native_crtc_get_gamma_ramps16(this : int, ramps : int) -> int:
    '''
    Get the current 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 the value of an error
                    identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef size_t ramps_address
    cdef libgamma_crtc_state *this_
    cdef libgamma_gamma_ramps16 *ramps_
    this_address = <size_t>this
    ramps_address = <size_t>ramps
    this_ = <libgamma_crtc_state *><void *>this_address
    ramps_ = <libgamma_gamma_ramps16 *><void *>ramps_address
    r = int(libgamma_crtc_get_gamma_ramps16(this_, ramps_))
    return int(errno) if r == -1 else r


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 the value of an error
                    identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef size_t ramps_address
    cdef libgamma_crtc_state *this_
    cdef libgamma_gamma_ramps16 *ramps_
    this_address = <size_t>this
    ramps_address = <size_t>ramps
    this_ = <libgamma_crtc_state *><void *>this_address
    ramps_ = <libgamma_gamma_ramps16 *><void *>ramps_address
    r = int(libgamma_crtc_set_gamma_ramps16(this_, ramps_))
    return int(errno) if r == -1 else r


def libgamma_native_crtc_get_gamma_ramps32(this : int, ramps : int) -> int:
    '''
    Get the current 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 the value of an error
                    identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef size_t ramps_address
    cdef libgamma_crtc_state *this_
    cdef libgamma_gamma_ramps32 *ramps_
    this_address = <size_t>this
    ramps_address = <size_t>ramps
    this_ = <libgamma_crtc_state *><void *>this_address
    ramps_ = <libgamma_gamma_ramps32 *><void *>ramps_address
    r = int(libgamma_crtc_get_gamma_ramps32(this_, ramps_))
    return int(errno) if r == -1 else r


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 the value of an error
                    identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef size_t ramps_address
    cdef libgamma_crtc_state *this_
    cdef libgamma_gamma_ramps32 *ramps_
    this_address = <size_t>this
    ramps_address = <size_t>ramps
    this_ = <libgamma_crtc_state *><void *>this_address
    ramps_ = <libgamma_gamma_ramps32 *><void *>ramps_address
    r = int(libgamma_crtc_set_gamma_ramps32(this_, ramps_))
    return int(errno) if r == -1 else r


def libgamma_native_crtc_get_gamma_ramps64(this : int, ramps : int) -> int:
    '''
    Get the current 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 the value of an error
                    identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef size_t ramps_address
    cdef libgamma_crtc_state *this_
    cdef libgamma_gamma_ramps64 *ramps_
    this_address = <size_t>this
    ramps_address = <size_t>ramps
    this_ = <libgamma_crtc_state *><void *>this_address
    ramps_ = <libgamma_gamma_ramps64 *><void *>ramps_address
    r = int(libgamma_crtc_get_gamma_ramps64(this_, ramps_))
    return int(errno) if r == -1 else r


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 the value of an error
                    identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef size_t ramps_address
    cdef libgamma_crtc_state * this_
    cdef libgamma_gamma_ramps64 * ramps_
    this_address = <size_t>this
    ramps_address = <size_t>ramps
    this_ = <libgamma_crtc_state *><void *>this_address
    ramps_ = <libgamma_gamma_ramps64 *><void *>ramps_address
    r = int(libgamma_crtc_set_gamma_ramps64(this_, ramps_))
    return int(errno) if r == -1 else r


def libgamma_native_crtc_get_gamma_rampsf(this : int, ramps : int) -> int:
    '''
    Get the current 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 the value of an error
                    identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef size_t ramps_address
    cdef libgamma_crtc_state *this_
    cdef libgamma_gamma_rampsf *ramps_
    this_address = <size_t>this
    ramps_address = <size_t>ramps
    this_ = <libgamma_crtc_state *><void *>this_address
    ramps_ = <libgamma_gamma_rampsf *><void *>ramps_address
    r = int(libgamma_crtc_get_gamma_rampsf(this_, ramps_))
    return int(errno) if r == -1 else r


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 the value of an error
                    identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef size_t ramps_address
    cdef libgamma_crtc_state *this_
    cdef libgamma_gamma_rampsf *ramps_
    this_address = <size_t>this
    ramps_address = <size_t>ramps
    this_ = <libgamma_crtc_state *><void *>this_address
    ramps_ = <libgamma_gamma_rampsf *><void *>ramps_address
    r = int(libgamma_crtc_set_gamma_rampsf(this_, ramps_))
    return int(errno) if r == -1 else r


def libgamma_native_crtc_get_gamma_rampsd(this : int, ramps : int) -> int:
    '''
    Get the current 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 the value of an error
                    identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef size_t ramps_address
    cdef libgamma_crtc_state *this_
    cdef libgamma_gamma_rampsd *ramps_
    this_address = <size_t>this
    ramps_address = <size_t>ramps
    this_ = <libgamma_crtc_state *><void *>this_address
    ramps_ = <libgamma_gamma_rampsd *><void *>ramps_address
    r = int(libgamma_crtc_get_gamma_rampsd(this_, ramps_))
    return int(errno) if r == -1 else r


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 the value of an error
                    identifier provided by this library or `errno`
    '''
    cdef size_t this_address
    cdef size_t ramps_address
    cdef libgamma_crtc_state *this_
    cdef libgamma_gamma_rampsd *ramps_
    this_address = <size_t>this
    ramps_address = <size_t>ramps
    this_ = <libgamma_crtc_state *><void *>this_address
    ramps_ = <libgamma_gamma_rampsd *><void *>ramps_address
    r = int(libgamma_crtc_set_gamma_rampsd(this_, ramps_))
    return int(errno) if r == -1 else r