hacks/dump-imessages/iphone-dataprotection/ramdisk_tools/image.c

73 lines
2.2 KiB
C

#include <stdio.h>
#include <string.h>
#include <CoreGraphics/CoreGraphics.h>
#include <IOKit/IOKitLib.h>
int screenWidth, screenHeight;
CGContextRef context = NULL;
CGContextRef fb_open() {
io_connect_t conn = NULL;
int bytesPerRow;
void *surfaceBuffer;
void *frameBuffer;
CGColorSpaceRef colorSpace;
if (context != NULL)
return context;
io_service_t fb_service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleCLCD"));
if (!fb_service) {
fb_service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("AppleM2CLCD"));
if (!fb_service) {
printf("Couldn't find framebuffer.\n");
return NULL;
}
}
IOMobileFramebufferOpen(fb_service, mach_task_self(), 0, &conn);
IOMobileFramebufferGetLayerDefaultSurface(conn, 0, &surfaceBuffer);
screenHeight = CoreSurfaceBufferGetHeight(surfaceBuffer);
screenWidth = CoreSurfaceBufferGetWidth(surfaceBuffer);
bytesPerRow = CoreSurfaceBufferGetBytesPerRow(surfaceBuffer);
CoreSurfaceBufferLock(surfaceBuffer, 3);
frameBuffer = CoreSurfaceBufferGetBaseAddress(surfaceBuffer);
CoreSurfaceBufferUnlock(surfaceBuffer);
// create bitmap context
colorSpace = CGColorSpaceCreateDeviceRGB();
context = CGBitmapContextCreate(frameBuffer, screenWidth, screenHeight, 8, bytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast);
if(context == NULL) {
printf("Couldn't create screen context!\n");
return NULL;
}
CGColorSpaceRelease(colorSpace);
return context;
}
int drawImage(const char* pngFileName)
{
CGContextRef c = fb_open();
if (c == NULL)
return -1;
CFURLRef url = CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, pngFileName, strlen(pngFileName), 0);
void* imageSource = CGImageSourceCreateWithURL(url, NULL);
CFRelease(url);
if (imageSource != NULL)
{
CGImageRef img = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL);
if (img != NULL)
{
CGContextClearRect (c, CGRectMake(0, 0, screenWidth, screenHeight));
CGContextDrawImage(c, CGRectMake(0, 0, screenWidth, screenHeight), img);
}
}
return 0;
}