]> git.saurik.com Git - uikittools.git/commitdiff
Add iomfsetgamma.
authorJay Freeman (saurik) <saurik@saurik.com>
Sun, 12 Jun 2011 19:32:54 +0000 (19:32 +0000)
committerJay Freeman (saurik) <saurik@saurik.com>
Sun, 12 Jun 2011 19:32:54 +0000 (19:32 +0000)
.gitignore
iomfsetgamma.c [new file with mode: 0644]
makefile

index 3d624b42364deafe05483424d137352f6eadcca8..c2d7f4251b7137ee166fad473e07c930969c51ff 100644 (file)
@@ -3,6 +3,7 @@ _
 cfversion
 debs
 gssc
+iomfsetgamma
 sbdidlaunch
 sbreload
 uicache
diff --git a/iomfsetgamma.c b/iomfsetgamma.c
new file mode 100644 (file)
index 0000000..8f02a4c
--- /dev/null
@@ -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;
+}
index 6d3851986291104f856219ce4a5750ec45c6cb2b..1695a7582ff42203266fdf6b72db8bbc48406f52 100644 (file)
--- 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