103 lines
3.1 KiB
C
103 lines
3.1 KiB
C
#include <CoreFoundation/CoreFoundation.h>
|
|
#include <CoreServices/CoreServices.h>
|
|
#include <QuickLook/QuickLook.h>
|
|
|
|
OSStatus GenerateThumbnailForURL(void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize);
|
|
void CancelThumbnailGeneration(void *thisInterface, QLThumbnailRequestRef thumbnail);
|
|
|
|
/* -----------------------------------------------------------------------------
|
|
Generate a thumbnail for file
|
|
|
|
This function's job is to create thumbnail for designated file as fast as possible
|
|
----------------------------------------------------------------------------- */
|
|
|
|
struct PPIThumb
|
|
{
|
|
int width;
|
|
int height;
|
|
int comp;
|
|
/*
|
|
bool valid()
|
|
{
|
|
return (width == 128 && height == 128 && comp == 4);
|
|
}
|
|
*/
|
|
};
|
|
|
|
struct PPIDocVersion
|
|
{
|
|
int major;
|
|
int minor;
|
|
};
|
|
|
|
struct PPISoftVersion
|
|
{
|
|
int major;
|
|
int minor;
|
|
int fix;
|
|
int build;
|
|
};
|
|
|
|
struct PPIHeader
|
|
{
|
|
char magic[4];
|
|
struct PPIDocVersion doc_version;
|
|
struct PPISoftVersion soft_version;
|
|
struct PPIThumb thumb_header;
|
|
/*
|
|
bool valid()
|
|
{
|
|
if (strcmp(magic, "PPI") != 0)
|
|
return false;
|
|
if (doc_version.major != 0 || doc_version.minor != 1)
|
|
return false;
|
|
if (!thumb_header.valid())
|
|
return false;
|
|
return true;
|
|
}
|
|
*/
|
|
};
|
|
|
|
OSStatus GenerateThumbnailForURL(void *thisInterface, QLThumbnailRequestRef thumbnail, CFURLRef url, CFStringRef contentTypeUTI, CFDictionaryRef options, CGSize maxSize)
|
|
{
|
|
// To complete your generator please implement the function GenerateThumbnailForURL in GenerateThumbnailForURL.c
|
|
//maxSize = CGSizeMake(128, 128);
|
|
CGContextRef context = QLThumbnailRequestCreateContext(thumbnail, maxSize, true, NULL);
|
|
CGRect renderRect = CGRectMake(0., 0., maxSize.width, maxSize.height);
|
|
|
|
CFStringRef path = CFURLCopyFileSystemPath(url, kCFURLPOSIXPathStyle);
|
|
const char* path_string = CFStringGetCStringPtr(path, kCFStringEncodingUTF8);
|
|
|
|
FILE* fp = fopen(path_string, "rb");
|
|
if (fp)
|
|
{
|
|
struct PPIHeader header;
|
|
fread(&header, sizeof(struct PPIHeader), 1, fp);
|
|
int w = header.thumb_header.width;
|
|
int h = header.thumb_header.height;
|
|
int c = header.thumb_header.comp;
|
|
|
|
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
|
|
CGContextRef bmp = CGBitmapContextCreate(NULL, w, h, 8, w * c, colorSpace, kCGImageAlphaPremultipliedLast);
|
|
uint8_t* data = CGBitmapContextGetData(bmp);
|
|
fread(data, w * h * c, 1, fp);
|
|
fclose(fp);
|
|
|
|
CGImageRef img = CGBitmapContextCreateImage(bmp);
|
|
CGContextDrawImage(context, renderRect, img);
|
|
}
|
|
else
|
|
{
|
|
CGContextSetRGBFillColor(context, 1, 0, 0, 1);
|
|
CGContextFillRect(context, CGRectMake(0, 0, maxSize.width, maxSize.height));
|
|
}
|
|
QLThumbnailRequestFlushContext(thumbnail, context);
|
|
CFRelease(context);
|
|
return noErr;
|
|
}
|
|
|
|
void CancelThumbnailGeneration(void *thisInterface, QLThumbnailRequestRef thumbnail)
|
|
{
|
|
// Implement only if supported
|
|
}
|