| Index: src/ply-gamma.c
|
| diff --git a/src/ply-gamma.c b/src/ply-gamma.c
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..1f4f7b00401bf60b0664466e2adb2f7642b4acf2
|
| --- /dev/null
|
| +++ b/src/ply-gamma.c
|
| @@ -0,0 +1,114 @@
|
| +/* ply-gamma.c - plymouth gamma setup via KMS
|
| + *
|
| + * Copyright (C) 2011, The Chromium OS Authors.
|
| + *
|
| + * This program is free software; you can redistribute it and/or modify
|
| + * it under the terms of the GNU General Public License as published by
|
| + * the Free Software Foundation; either version 2, or (at your option)
|
| + * any later version.
|
| + *
|
| + * This program 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 General Public License for more details.
|
| + *
|
| + * You should have received a copy of the GNU General Public License
|
| + * along with this program; if not, write to the Free Software
|
| + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
| + * 02111-1307, USA.
|
| + *
|
| + */
|
| +
|
| +#include "ply-gamma.h"
|
| +
|
| +#include <stdint.h>
|
| +#include <stdio.h>
|
| +#include <stdlib.h>
|
| +#include <xf86drm.h>
|
| +#include <xf86drmMode.h>
|
| +
|
| +static const int kInternalPanel = 1;
|
| +
|
| +typedef struct {
|
| + uint16_t *red;
|
| + uint16_t *green;
|
| + uint16_t *blue;
|
| +} GammaRamp;
|
| +
|
| +static GammaRamp* load_gamma_ramp(const char* file) {
|
| + const int kGammaSize = 256;
|
| + int i, r = 0;
|
| +
|
| + FILE* f = fopen(file, "rb");
|
| + if (!f)
|
| + return NULL;
|
| +
|
| + unsigned char red[kGammaSize], green[kGammaSize], blue[kGammaSize];
|
| +
|
| + r += fread(red, sizeof(red), 1, f);
|
| + r += fread(green, sizeof(green), 1, f);
|
| + r += fread(blue, sizeof(blue), 1, f);
|
| + fclose(f);
|
| +
|
| + if (r != 3)
|
| + return NULL;
|
| +
|
| + GammaRamp* ramp = (GammaRamp*)malloc(sizeof(GammaRamp));
|
| + ramp->red = (uint16_t*)malloc(sizeof(uint16_t) * kGammaSize);
|
| + ramp->green = (uint16_t*)malloc(sizeof(uint16_t) * kGammaSize);
|
| + ramp->blue = (uint16_t*)malloc(sizeof(uint16_t) * kGammaSize);
|
| +
|
| + for(i = 0; i < kGammaSize; ++i) {
|
| + ramp->red[i] = (uint16_t)red[i] * 257;
|
| + ramp->green[i] = (uint16_t)green[i] * 257;
|
| + ramp->blue[i] = (uint16_t)blue[i] * 257;
|
| + }
|
| +
|
| + return ramp;
|
| +}
|
| +
|
| +static void free_gamma_ramp(GammaRamp* ramp) {
|
| + free(ramp->red);
|
| + free(ramp->green);
|
| + free(ramp->blue);
|
| + free(ramp);
|
| +}
|
| +
|
| +bool ply_gamma_set(const char* file) {
|
| + int r;
|
| + drmModeCrtcPtr mode;
|
| + GammaRamp* ramp;
|
| +
|
| + ramp = load_gamma_ramp(file);
|
| +
|
| + if (!ramp) {
|
| + fprintf(stderr, "Unable to load gamma ramp\n");
|
| + return false;
|
| + }
|
| +
|
| + int fd = drmOpen("i915", NULL);
|
| + if (fd < 0) {
|
| + fprintf(stderr, "Unable to open i915 drm\n");
|
| + return false;
|
| + }
|
| +
|
| + drmModeRes *resources = drmModeGetResources(fd);
|
| + if (!resources) {
|
| + fprintf(stderr, "Unable to get mode resources\n");
|
| + drmClose(fd);
|
| + return false;
|
| + }
|
| +
|
| + mode = drmModeGetCrtc(fd, resources->crtcs[kInternalPanel]);
|
| + r = drmModeCrtcSetGamma(fd,
|
| + mode->crtc_id,
|
| + mode->gamma_size,
|
| + ramp->red,
|
| + ramp->green,
|
| + ramp->blue);
|
| +
|
| + drmModeFreeResources(resources);
|
| + drmClose(fd);
|
| + free_gamma_ramp(ramp);
|
| + return r >= 0;
|
| +}
|
|
|