73 lines
2.2 KiB
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;
|
|
}
|