This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
SDL_x11gamma.c
155 lines (136 loc) · 4.12 KB
1
2
/*
SDL - Simple DirectMedia Layer
3
Copyright (C) 1997-2006 Sam Lantinga
4
5
This library is free software; you can redistribute it and/or
6
modify it under the terms of the GNU Lesser General Public
7
License as published by the Free Software Foundation; either
8
version 2.1 of the License, or (at your option) any later version.
9
10
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
Lesser General Public License for more details.
14
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
18
19
Sam Lantinga
20
slouken@libsdl.org
21
*/
22
#include "SDL_config.h"
23
24
25
#include "SDL.h"
#include "SDL_events.h"
26
#include "../../events/SDL_events_c.h"
27
28
29
30
31
32
#include "SDL_x11video.h"
/* From the X server sources... */
#define MAX_GAMMA 10.0
#define MIN_GAMMA (1.0/MAX_GAMMA)
33
static int
34
X11_SetGammaNoLock(_THIS, float red, float green, float blue)
35
{
36
#if SDL_VIDEO_DRIVER_X11_VIDMODE
37
if (use_vidmode >= 200) {
38
SDL_NAME(XF86VidModeGamma) gamma;
39
40
Bool succeeded;
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/* Clamp the gamma values */
if (red < MIN_GAMMA) {
gamma.red = MIN_GAMMA;
} else if (red > MAX_GAMMA) {
gamma.red = MAX_GAMMA;
} else {
gamma.red = red;
}
if (green < MIN_GAMMA) {
gamma.green = MIN_GAMMA;
} else if (green > MAX_GAMMA) {
gamma.green = MAX_GAMMA;
} else {
gamma.green = green;
}
if (blue < MIN_GAMMA) {
gamma.blue = MIN_GAMMA;
} else if (blue > MAX_GAMMA) {
gamma.blue = MAX_GAMMA;
} else {
gamma.blue = blue;
}
63
if (SDL_GetAppState() & SDL_APPACTIVE) {
64
succeeded =
65
66
67
SDL_NAME(XF86VidModeSetGamma) (SDL_Display, SDL_Screen,
&gamma);
XSync(SDL_Display, False);
68
69
70
71
72
73
} else {
gamma_saved[0] = gamma.red;
gamma_saved[1] = gamma.green;
gamma_saved[2] = gamma.blue;
succeeded = True;
}
74
if (succeeded) {
75
76
77
78
79
++gamma_changed;
}
return succeeded ? 0 : -1;
}
#endif
80
SDL_SetError("Gamma correction not supported");
81
82
return -1;
}
83
84
int
85
X11_SetVidModeGamma(_THIS, float red, float green, float blue)
86
87
88
{
int result;
89
90
91
SDL_Lock_EventThread();
result = X11_SetGammaNoLock(this, red, green, blue);
SDL_Unlock_EventThread();
92
93
return (result);
94
95
}
96
static int
97
X11_GetGammaNoLock(_THIS, float *red, float *green, float *blue)
98
{
99
#if SDL_VIDEO_DRIVER_X11_VIDMODE
100
if (use_vidmode >= 200) {
101
102
SDL_NAME(XF86VidModeGamma) gamma;
if (SDL_NAME(XF86VidModeGetGamma)
103
104
(SDL_Display, SDL_Screen, &gamma)) {
*red = gamma.red;
105
*green = gamma.green;
106
*blue = gamma.blue;
107
108
109
110
111
112
113
return 0;
}
return -1;
}
#endif
return -1;
}
114
115
int
116
X11_GetVidModeGamma(_THIS, float *red, float *green, float *blue)
117
118
119
{
int result;
120
121
122
SDL_Lock_EventThread();
result = X11_GetGammaNoLock(this, red, green, blue);
SDL_Unlock_EventThread();
123
124
return (result);
125
126
}
127
void
128
X11_SaveVidModeGamma(_THIS)
129
130
{
/* Try to save the current gamma, otherwise disable gamma control */
131
132
133
if (X11_GetGammaNoLock(this,
&gamma_saved[0], &gamma_saved[1],
&gamma_saved[2]) < 0) {
134
135
136
137
138
this->SetGamma = 0;
this->GetGamma = 0;
}
gamma_changed = 0;
}
139
140
void
141
X11_SwapVidModeGamma(_THIS)
142
143
144
{
float new_gamma[3];
145
if (gamma_changed) {
146
147
148
new_gamma[0] = gamma_saved[0];
new_gamma[1] = gamma_saved[1];
new_gamma[2] = gamma_saved[2];
149
150
151
X11_GetGammaNoLock(this, &gamma_saved[0], &gamma_saved[1],
&gamma_saved[2]);
X11_SetGammaNoLock(this, new_gamma[0], new_gamma[1], new_gamma[2]);
152
153
}
}
154
155
/* vi: set ts=4 sw=4 expandtab: */