Index: src/ply-gamma.c |
diff --git a/src/ply-gamma.c b/src/ply-gamma.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1cd1ea9a39609779f09f0e1a7ff4fef12df0c0ec |
--- /dev/null |
+++ b/src/ply-gamma.c |
@@ -0,0 +1,124 @@ |
+/* 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 <stdio.h> |
+#include <stdlib.h> |
+#include <xf86drm.h> |
+#include <xf86drmMode.h> |
+ |
+#include "ply-gamma.h" |
Daniel Erat
2011/04/19 16:46:02
nit: this include should come first
marcheu
2011/04/19 18:02:45
Done.
|
+ |
+static const char* gammaRampFile = "/usr/share/color/icc/internal_display.bin"; |
+static const int internalPanel = 1; |
Daniel Erat
2011/04/19 16:46:02
name variables like_this instead of likeThis
marcheu
2011/04/19 18:02:45
Done but differently per our discussion.
|
+ |
+typedef struct { |
+ uint16_t *red; |
+ uint16_t *green; |
+ uint16_t *blue; |
+} gamma_ramp; |
Daniel Erat
2011/04/19 16:46:02
this should be GammaRamp instead (at least, i thin
marcheu
2011/04/19 18:02:45
Done.
|
+ |
+static gamma_ramp* load_gamma_ramp(const char* file) |
+{ |
Daniel Erat
2011/04/19 16:46:02
move to end of previous line here and elsewhere
marcheu
2011/04/19 18:02:45
Done.
|
+ const int gamma_size = 256; |
Daniel Erat
2011/04/19 16:46:02
kGammaSize
marcheu
2011/04/19 18:02:45
Done.
|
+ int i, r = 0; |
+ |
+ FILE* f = fopen(file, "rb"); |
+ if (!f) |
+ return NULL; |
+ |
+ unsigned char red[gamma_size], green[gamma_size], blue[gamma_size]; |
+ |
+ r += fread(red, gamma_size, 1, f); |
Daniel Erat
2011/04/19 16:46:02
can you s/gamma_size/sizeof(red)/ here?
marcheu
2011/04/19 18:02:45
Done.
|
+ r += fread(green, gamma_size, 1, f); |
+ r += fread(blue, gamma_size, 1, f); |
+ fclose(f); |
+ |
+ if (r != 3) |
+ return NULL; |
+ |
+ gamma_ramp* ramp = (gamma_ramp*)malloc(sizeof(gamma_ramp)); |
+ ramp->red = (uint16_t*)malloc(sizeof(uint16_t) * gamma_size); |
+ ramp->green = (uint16_t*)malloc(sizeof(uint16_t) * gamma_size); |
+ ramp->blue = (uint16_t*)malloc(sizeof(uint16_t) * gamma_size); |
+ |
+ for(i = 0; i < gamma_size; ++i) |
+ { |
Daniel Erat
2011/04/19 16:46:02
you know what i'm going to say here
marcheu
2011/04/19 18:02:45
Done.
|
+ 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(gamma_ramp* ramp) |
+{ |
+ free(ramp->red); |
+ free(ramp->green); |
+ free(ramp->blue); |
+ free(ramp); |
+} |
+ |
+bool |
+ply_gamma_set() |
Daniel Erat
2011/04/19 16:46:02
return type and function name should be on same li
marcheu
2011/04/19 18:02:45
Done.
|
+{ |
+ int i, r; |
+ drmModeCrtcPtr mode; |
+ gamma_ramp* ramp; |
+ |
+ ramp = load_gamma_ramp (gammaRampFile); |
Daniel Erat
2011/04/19 16:46:02
no space between function name and opening parenth
marcheu
2011/04/19 18:02:45
Done.
|
+ |
+ 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[internalPanel]); |
+ 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; |
+} |
+ |
Daniel Erat
2011/04/19 16:46:02
remove extra newlines at end of file
marcheu
2011/04/19 18:02:45
Done.
|
+ |