summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Freeman (saurik) <saurik@saurik.com>2011-06-12 19:32:54 +0000
committerJay Freeman (saurik) <saurik@saurik.com>2011-06-12 19:32:54 +0000
commitd9e253f67bf1ec5a63fec7061a4b8899c6ba8d0e (patch)
treea93600b18855817ca6393d8edebc5965da4832e6
parente8d244d6ec1e11d862d75803f45c62b82beaac77 (diff)
Add iomfsetgamma.
-rw-r--r--.gitignore1
-rw-r--r--iomfsetgamma.c112
-rw-r--r--makefile6
3 files changed, 118 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index 3d624b4..c2d7f42 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@ _
cfversion
debs
gssc
+iomfsetgamma
sbdidlaunch
sbreload
uicache
diff --git a/iomfsetgamma.c b/iomfsetgamma.c
new file mode 100644
index 0000000..8f02a4c
--- /dev/null
+++ b/iomfsetgamma.c
@@ -0,0 +1,112 @@
+#include <mach/mach.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <dlfcn.h>
+
+#include <IOKit/IOKitLib.h>
+
+#if 0
+set -e
+
+sdk=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk
+
+/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/g++ \
+ -Wall -fmessage-length=0 \
+ -arch armv6 -miphoneos-version-min=2.0 \
+ -isysroot "${sdk}" -I. -F"${sdk}"/System/Library/PrivateFrameworks \
+ -framework IOKit -framework IOMobileFramebuffer \
+ -o iomfsetgamma iomfsetgamma.c
+
+ldid iomfsetgamma
+
+exit 0
+#endif
+
+typedef void *IOMobileFramebufferRef;
+
+kern_return_t IOMobileFramebufferOpen(io_service_t, mach_port_t, void *, IOMobileFramebufferRef *);
+kern_return_t IOMobileFramebufferSetGammaTable(IOMobileFramebufferRef, void *);
+kern_return_t (*$IOMobileFramebufferGetGammaTable)(IOMobileFramebufferRef, void *);
+
+#define _assert(test) \
+ if (!(test)) { \
+ fprintf(stderr, "_assert(%s)\n", #test); \
+ exit(-1); \
+ }
+
+int main(int argc, char *argv[]) {
+ if (argc != 4) {
+ fprintf(stderr, "usage: iomfsetgamma <red> <green> <blue>\n");
+ fprintf(stderr, " example: 1.00 0.78 0.64\n");
+ return 1;
+ }
+
+ unsigned rs = strtod(argv[1], NULL) * 0x100;
+ _assert(rs <= 0x100);
+
+ unsigned gs = strtod(argv[2], NULL) * 0x100;
+ _assert(gs <= 0x100);
+
+ unsigned bs = strtod(argv[3], NULL) * 0x100;
+ _assert(bs <= 0x100);
+
+ kern_return_t error;
+ mach_port_t self = mach_task_self();
+
+ io_service_t service = 0;
+
+ if (service == 0)
+ service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleCLCD"));
+ if (service == 0)
+ service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleH1CLCD"));
+ if (service == 0)
+ service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleM2CLCD"));
+
+ _assert(service != 0);
+
+ IOMobileFramebufferRef fb;
+ error = IOMobileFramebufferOpen(service, self, 0, &fb);
+ _assert(error == 0);
+
+ uint32_t data[0xc00 / sizeof(uint32_t)];
+ memset(data, 0, sizeof(data));
+
+ FILE *file = fopen("/tmp/.iomfgamma.dat", "r");
+ if (file == NULL) {
+ file = fopen("/tmp/.iomfgamma.dat", "wb");
+
+ $IOMobileFramebufferGetGammaTable = dlsym(RTLD_DEFAULT, "IOMobileFramebufferGetGammaTable");
+
+ _assert($IOMobileFramebufferGetGammaTable != NULL);
+ error = $IOMobileFramebufferGetGammaTable(fb, data);
+ _assert(error == 0);
+
+ fwrite(data, 1, sizeof(data), file);
+ fclose(file);
+
+ file = fopen("/tmp/.iomfgamma.dat", "r");
+ }
+
+ fread(data, 1, sizeof(data), file);
+ fclose(file);
+
+ size_t i;
+ for (i = 0; i != 256; ++i) {
+ int j = 255 - i;
+
+ int r = j * rs >> 8;
+ int g = j * gs >> 8;
+ int b = j * bs >> 8;
+
+ data[j + 0x000] = data[r + 0x000];
+ data[j + 0x100] = data[g + 0x100];
+ data[j + 0x200] = data[b + 0x200];
+ }
+
+ error = IOMobileFramebufferSetGammaTable(fb, data);
+ _assert(error == 0);
+
+ return 0;
+}
diff --git a/makefile b/makefile
index 6d38519..1695a75 100644
--- a/makefile
+++ b/makefile
@@ -1,4 +1,4 @@
-uikittools = uiduid uishoot uicache uiopen gssc sbdidlaunch sbreload cfversion
+uikittools = uiduid uishoot uicache uiopen gssc sbdidlaunch sbreload cfversion iomfsetgamma
all: $(uikittools)
@@ -15,6 +15,10 @@ clean:
$${PKG_TARG}-gcc -Wall -Werror -o $@ $< -framework CoreFoundation
ldid -S $@
+iomfsetgamma: iomfsetgamma.c
+ $${PKG_TARG}-gcc -Wall -Werror -o $@ $< -F"$${PKG_ROOT}"/System/Library/PrivateFrameworks -framework IOKit -framework IOMobileFramebuffer
+ ldid -S $@
+
package: all
rm -rf _
mkdir -p _/usr/bin