fix thumbnail generator for iOS and open document when file clicked

This commit is contained in:
2018-09-21 01:53:22 +02:00
parent 9ea1ca4fae
commit 7c7027502e
6 changed files with 94 additions and 24 deletions

View File

@@ -8,6 +8,54 @@
#import "ThumbnailProvider.h"
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;
}
*/
};
@implementation ThumbnailProvider
- (void)provideThumbnailForFileRequest:(QLFileThumbnailRequest *)request completionHandler:(void (^)(QLThumbnailReply * _Nullable, NSError * _Nullable))handler {
@@ -35,15 +83,30 @@
FILE* fp = fopen([u fileSystemRepresentation], "rb");
if (fp)
{
int h[3];
fread(h, sizeof(int), 3, 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;
//uint8_t* data = (uint8_t*)malloc(h[0]*h[1]*h[2]);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bmp = CGBitmapContextCreate(NULL, h[0], h[1], 8, h[0]*h[2], colorSpace, kCGImageAlphaPremultipliedLast);
uint8_t* data = CGBitmapContextGetData(bmp);
fread(data, h[0]*h[1]*h[2], 1, fp);
CGContextRef bmp = CGBitmapContextCreate(NULL, w, h, 8, w*c, colorSpace, kCGImageAlphaPremultipliedLast);
uint8_t* data_dst = (uint8_t*)CGBitmapContextGetData(bmp);
uint8_t* data_src = (uint8_t*)malloc(w*h*c);
fread(data_src, w*h*c, 1, fp);
fclose(fp);
for(int i = 0; i < w*h; i++)
{
data_dst[i * 4 + 0] = data_src[i * c + 0];
data_dst[i * 4 + 1] = data_src[i * c + 1];
data_dst[i * 4 + 2] = data_src[i * c + 2];
data_dst[i * 4 + 3] = 255;
}
free(data_src);
CGImageRef img = CGBitmapContextCreateImage(bmp);
CGRect r2 = CGRectMake(0, 0, 128*request.scale, 128*request.scale);