aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2025-03-23 14:19:23 +0100
committerMattias Andrée <m@maandree.se>2025-03-23 14:19:23 +0100
commitfbebec27e9295d3b46e7e4aec4c59e956659b9b7 (patch)
tree668d668f2d2fd54395e0b99c346ac295e3aaf86f
parentRewrite gamma-randr.c and gamma-vidmode.c to use libgamma (diff)
downloadredshift-ng-fbebec27e9295d3b46e7e4aec4c59e956659b9b7.tar.gz
redshift-ng-fbebec27e9295d3b46e7e4aec4c59e956659b9b7.tar.bz2
redshift-ng-fbebec27e9295d3b46e7e4aec4c59e956659b9b7.tar.xz
Rewrite gamma-w32gdi to use libgamma
Signed-off-by: Mattias Andrée <m@maandree.se>
-rw-r--r--src/gamma-w32gdi.c160
1 files changed, 7 insertions, 153 deletions
diff --git a/src/gamma-w32gdi.c b/src/gamma-w32gdi.c
index 6c9f458..8232c85 100644
--- a/src/gamma-w32gdi.c
+++ b/src/gamma-w32gdi.c
@@ -17,77 +17,16 @@
* You should have received a copy of the GNU General Public License
* along with redshift-ng. If not, see <http://www.gnu.org/licenses/>.
*/
-#ifndef WINVER
-# define WINVER 0x0500
-#endif
#include "common.h"
-#include <wingdi.h>
-
-#define GAMMA_RAMP_SIZE 256
-#define MAX_ATTEMPTS 10
-
-
-struct gamma_state {
- WORD *saved_ramps;
-};
-
static int
w32gdi_create(struct gamma_state **state_out)
{
- *state_out = emalloc(sizeof(**state_out));
- (*state_out)->saved_ramps = NULL;
- return 0;
+ return direct_create(state_out, LIBGAMMA_METHOD_W32_GDI, "wingdi");
}
-static int
-w32gdi_start(struct gamma_state *state)
-{
- HDC hDC;
- int cmcap;
-
- /* Open device context */
- hDC = GetDC(NULL);
- if (!hDC) {
- weprintf(_("Unable to open device context."));
- return -1;
- }
-
- /* Check support for gamma ramps */
- cmcap = GetDeviceCaps(hDC, COLORMGMTCAPS);
- if (cmcap != CM_GAMMA_RAMP) {
- weprintf(_("Display device does not support gamma ramps."));
- return -1;
- }
-
- /* Allocate space for saved gamma ramps */
- state->saved_ramps = emalloc(3 * GAMMA_RAMP_SIZE * sizeof(WORD));
-
- /* Save current gamma ramps so we can restore them at program exit */
- if (!GetDeviceGammaRamp(hDC, state->saved_ramps)) {
- weprintf(_("Unable to save current gamma ramp."));
- ReleaseDC(NULL, hDC);
- return -1;
- }
-
- /* Release device context */
- ReleaseDC(NULL, hDC);
-
- return 0;
-}
-
-
-static void
-w32gdi_free(struct gamma_state *state)
-{
- free(state->saved_ramps);
- free(state);
-}
-
-
-
static void
w32gdi_print_help(FILE *f)
{
@@ -100,102 +39,17 @@ static int
w32gdi_set_option(struct gamma_state *state, const char *key, const char *value)
{
if (!strcasecmp(key, "preserve")) {
- weprintf(_("Parameter `%s' is now always on; use the `%s' command-line option to disable."), key, "-P");
+ weprintf(_("Deprecated method parameter ignored: `%s'."), key);
+ return 0;
} else {
weprintf(_("Unknown method parameter: `%s'."), key);
return -1;
}
-
- return 0;
-}
-
-
-static void
-w32gdi_restore(struct gamma_state *state)
-{
- HDC hDC;
- int i;
-
- /* Open device context */
- hDC = GetDC(NULL);
- if (!hDC) {
- weprintf(_("Unable to open device context."));
- return;
- }
-
- /* Restore gamma ramps */
- for (i = 0; i < MAX_ATTEMPTS; i++) {
- /* We retry a few times before giving up because some
- buggy drivers fail on the first invocation of
- SetDeviceGammaRamp just to succeed on the second. */
- if (SetDeviceGammaRamp(hDC, state->saved_ramps))
- goto done;
- }
- weprintf(_("Unable to restore gamma ramps."));
-
-done:
- /* Release device context */
- ReleaseDC(NULL, hDC);
-}
-
-
-static int
-w32gdi_apply(struct gamma_state *state, const colour_setting_t *setting, int preserve)
-{
- WORD *gamma_ramps, *gamma_r, *gamma_b, *gamma_g, value;
- HDC hDC;
- int i;
-
- /* Open device context */
- hDC = GetDC(NULL);
- if (!hDC) {
- weprintf(_("Unable to open device context."));
- return -1;
- }
-
- /* Create new gamma ramps */
- gamma_ramps = emalloc(3 * GAMMA_RAMP_SIZE * sizeof(WORD));
-
- gamma_r = &gamma_ramps[0 * GAMMA_RAMP_SIZE];
- gamma_g = &gamma_ramps[1 * GAMMA_RAMP_SIZE];
- gamma_b = &gamma_ramps[2 * GAMMA_RAMP_SIZE];
-
- if (preserve) {
- /* Initialize gamma ramps from saved state */
- memcpy(gamma_ramps, state->saved_ramps, 3 * GAMMA_RAMP_SIZE * sizeof(WORD));
- } else {
- /* Initialize gamma ramps to pure state */
- for (i = 0; i < GAMMA_RAMP_SIZE; i++) {
- value = (double)i / (GAMMA_RAMP_SIZE - 1) * UINT16_MAX;
- gamma_r[i] = value;
- gamma_g[i] = value;
- gamma_b[i] = value;
- }
- }
-
- fill_ramps_u16(gamma_r, gamma_g, gamma_b, GAMMA_RAMP_SIZE, GAMMA_RAMP_SIZE, GAMMA_RAMP_SIZE, setting);
-
- /* Set new gamma ramps */
- for (i = 0; i < MAX_ATTEMPTS; i++) {
- /* We retry a few times before giving up because some
- buggy drivers fail on the first invocation of
- SetDeviceGammaRamp just to succeed on the second. */
- if (SetDeviceGammaRamp(hDC, gamma_ramps))
- goto done;
- }
- weprintf(_("Unable to set gamma ramps."));
- free(gamma_ramps);
- ReleaseDC(NULL, hDC);
- return -1;
-
-done:
- free(gamma_ramps);
-
- /* Release device context */
- ReleaseDC(NULL, hDC);
-
- return 0;
}
+#define w32gdi_start direct_start
+#define w32gdi_apply direct_apply
+#define w32gdi_restore direct_restore
+#define w32gdi_free direct_free
const struct gamma_method w32gdi_gamma_method = GAMMA_METHOD_INIT("wingdi", 1, 0, w32gdi);