aboutsummaryrefslogblamecommitdiffstats
path: root/xorg-server-hwcursor-gamma/0001-When-an-cursor-is-set-it-is-adjusted-to-use-the.patch
blob: 5eeb826c65686ad0f15bf4a741307fc481fc88f4 (plain) (tree)






















































                                                                                           
From e63b5656a6509ece2d5ffb1fb962911519163988 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mattias=20Andr=C3=A9e?= <maandree@operamail.com>
Date: Tue, 15 Apr 2014 02:45:25 +0200
Subject: [PATCH 1/3] When an cursor is set, it is adjusted to use the gamma
 ramps of the CRTC:s that it is loaded on.

This could be improved to be done in
`crtc->funcs->load_cursor_argb` with more
accurate adjustments. But I was not able to
find where `crtc->funcs->load_cursor_argb`
is implement.

Additionally, `xf86_reload_cursors` should be
called when the gamma settings changes. This
way the cursor's colours are adjusted to use
the gamma settings directly when the gamma
is modified rather than the next time its
image changes.
---
 hw/xfree86/modes/xf86Cursors.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/hw/xfree86/modes/xf86Cursors.c b/hw/xfree86/modes/xf86Cursors.c
index 2b0db34..3cb499f 100644
--- a/hw/xfree86/modes/xf86Cursors.c
+++ b/hw/xfree86/modes/xf86Cursors.c
@@ -242,6 +242,12 @@ xf86_crtc_convert_cursor_to_argb(xf86CrtcPtr crtc, unsigned char *src)
             }
             else
                 bits = 0;
+            if (crtc->gamma_red && crtc->gamma_size == 256) {
+                bits = (bits & 0xFF000000) |
+                       ((crtc->gamma_red[(bits >> 16) & 255] >> 8) << 16) |
+                       (crtc->gamma_green[(bits >> 8) & 255] & 0xFF00) |
+                       (crtc->gamma_blue[bits & 255] >> 8);
+            }
             cursor_image[y * cursor_info->MaxWidth + x] = bits;
         }
     crtc->funcs->load_cursor_argb(crtc, cursor_image);
@@ -541,6 +547,12 @@ xf86_crtc_load_cursor_argb(xf86CrtcPtr crtc, CursorPtr cursor)
                 bits = cursor_source[yin * source_width + xin];
             else
                 bits = 0;
+            if (crtc->gamma_red && crtc->gamma_size == 256) {
+                bits = (bits & 0xFF000000) |
+                       ((crtc->gamma_red[(bits >> 16) & 255] >> 8) << 16) |
+                       (crtc->gamma_green[(bits >> 8) & 255] & 0xFF00) |
+                       (crtc->gamma_blue[bits & 255] >> 8);
+            }
             cursor_image[y * image_width + x] = bits;
         }
 
-- 
1.9.2