From fa0d84d8d9a884b4a253fc72d2afe416231e38fa Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sat, 5 Apr 2014 13:39:50 +0200 Subject: document MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/blueshift_drm.pyx | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/blueshift_drm.pyx b/src/blueshift_drm.pyx index b0b4fdd..7de8c70 100644 --- a/src/blueshift_drm.pyx +++ b/src/blueshift_drm.pyx @@ -194,8 +194,20 @@ Get the extended display identification data for the monitor connected to a conn cdef uint16_t* r_shared +''' +Non-threadsafe storage for the red colour curve to be used in native code +''' + cdef uint16_t* g_shared +''' +Non-threadsafe storage for the green colour curve to be used in native code +''' + cdef uint16_t* b_shared +''' +Non-threadsafe storage for the blue colour curve to be used in native code +''' + r_shared = NULL g_shared = NULL b_shared = NULL @@ -207,6 +219,7 @@ def drm_close(): Free all resources, but you need to close all connections first ''' global r_shared, g_shared, b_shared + # Deallocate colour curve storage if r_shared is not NULL: free(r_shared) r_shared = NULL @@ -216,6 +229,7 @@ def drm_close(): if b_shared is not NULL: free(b_shared) b_shared = NULL + # Close all native resources blueshift_drm_close() @@ -302,32 +316,45 @@ def drm_get_gamma_ramps(int connection, int crtc_index, int gamma_size, threadsa cdef uint16_t* r cdef uint16_t* g cdef uint16_t* b + # If not running in thread-safe mode, if not threadsafe: + # allocate the shared storage space for colour curves + # if not already allocated. if r_shared is NULL: r_shared = malloc(gamma_size * sizeof(uint16_t)) if g_shared is NULL: g_shared = malloc(gamma_size * sizeof(uint16_t)) if b_shared is NULL: b_shared = malloc(gamma_size * sizeof(uint16_t)) + # If not thread-safe use those, otherwise allocate ad-hoc ones r = malloc(gamma_size * sizeof(uint16_t)) if threadsafe else r_shared g = malloc(gamma_size * sizeof(uint16_t)) if threadsafe else g_shared b = malloc(gamma_size * sizeof(uint16_t)) if threadsafe else b_shared + # Check for out-of-memory error, both for thread-safe and thread-unsafe if (r is NULL) or (g is NULL) or (b is NULL): raise MemoryError() + # Get current curves rc = blueshift_drm_get_gamma_ramps(connection, crtc_index, gamma_size, r, g, b) if rc == 0: + # If successful: + # Move the C native colour curves to Python data structures rc_r, rc_g, rc_b = [], [], [] for i in range(gamma_size): rc_r.append(r[i]) rc_g.append(g[i]) rc_b.append(b[i]) + # Then, if running in thread-safe mode, if threadsafe: + # deallocate the ad-hoc curve storage. free(r) free(g) free(b) return (rc_r, rc_g, rc_b) else: + # On failure, if threadsafe: + # deallocate the ad-hoc curve storage + # if running in thread-safe mode. free(r) free(g) free(b) @@ -352,26 +379,36 @@ def drm_set_gamma_ramps(int connection, crtc_indices, int gamma_size, r_curve, g cdef uint16_t* r cdef uint16_t* g cdef uint16_t* b + # If not running in thread-safe mode, if not threadsafe: + # allocate the shared storage space for colour curves + # if not already allocated. if r_shared is NULL: r_shared = malloc(gamma_size * sizeof(uint16_t)) if g_shared is NULL: g_shared = malloc(gamma_size * sizeof(uint16_t)) if b_shared is NULL: b_shared = malloc(gamma_size * sizeof(uint16_t)) + # If not thread-safe use those, otherwise allocate ad-hoc ones r = malloc(gamma_size * sizeof(uint16_t)) if threadsafe else r_shared g = malloc(gamma_size * sizeof(uint16_t)) if threadsafe else g_shared b = malloc(gamma_size * sizeof(uint16_t)) if threadsafe else b_shared + # Check for out-of-memory error, both for thread-safe and thread-unsafe if (r is NULL) or (g is NULL) or (b is NULL): raise MemoryError() + # Convert the Python colour curves to C native format for i in range(gamma_size): r[i] = r_curve[i] & 0xFFFF g[i] = g_curve[i] & 0xFFFF b[i] = b_curve[i] & 0xFFFF rc = 0 + # For each selected CRTC, for crtc_index in crtc_indices: + # adjust the colour curves. rc |= blueshift_drm_set_gamma_ramps(connection, crtc_index, gamma_size, r, g, b) if threadsafe: + # deallocate the ad-hoc curve storage + # if running in thread-safe mode free(r) free(g) free(b) -- cgit v1.2.3-70-g09d2