127 lines
3.6 KiB
Objective-C
127 lines
3.6 KiB
Objective-C
//
|
|
// ThumbnailProvider.m
|
|
// PanoThumb
|
|
//
|
|
// Created by Omar Mohamed Ali Mudhir on 15/06/18.
|
|
// Copyright © 2018 OmixLab ltd. All rights reserved.
|
|
//
|
|
|
|
#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 {
|
|
|
|
// There are three ways to provide a thumbnail through a QLThumbnailReply. Only one of them should be used.
|
|
/*
|
|
|
|
// First way: Draw the thumbnail into the current context, set up with UIKit's coordinate system.
|
|
handler([QLThumbnailReply replyWithContextSize:request.maximumSize currentContextDrawingBlock:^BOOL {
|
|
// Draw the thumbnail here.
|
|
// Return YES if the thumbnail was successfully drawn inside this block.
|
|
return YES;
|
|
}], nil);
|
|
*/
|
|
|
|
// Second way: Draw the thumbnail into a context passed to your block, set up with Core Graphics' coordinate system.
|
|
|
|
CGRect r = CGRectMake(0, 0, 128, 128);
|
|
|
|
handler([QLThumbnailReply replyWithContextSize:r.size drawingBlock:^BOOL(CGContextRef _Nonnull context) {
|
|
// Draw the thumbnail here.
|
|
|
|
NSLog(@"thumbnail generated");
|
|
NSURL* u = [request fileURL];
|
|
FILE* fp = fopen([u fileSystemRepresentation], "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;
|
|
|
|
//uint8_t* data = (uint8_t*)malloc(h[0]*h[1]*h[2]);
|
|
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
|
|
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);
|
|
CGContextDrawImage(context, r2, img);
|
|
}
|
|
|
|
// Return YES if the thumbnail was successfully drawn inside this block.
|
|
return YES;
|
|
}], nil);
|
|
/*
|
|
// Third way: Set an image file URL.
|
|
handler([QLThumbnailReply replyWithImageFileURL:[NSBundle.mainBundle URLForResource:@"fileThumbnail" withExtension:@"jpg"]], nil);
|
|
|
|
*/
|
|
}
|
|
|
|
@end
|