#include "pdf_comic.h" #if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) #undef __OBJC_BOOL_IS_BOOL #endif #import #import #import #include "QsLog.h" #include "QsLogDest.h" MacOSXPDFComic::MacOSXPDFComic() { } MacOSXPDFComic::~MacOSXPDFComic() { CGPDFDocumentRelease((CGPDFDocumentRef)document); } bool MacOSXPDFComic::openComic(const QString &path) { CFURLRef pdfFileUrl; CFStringRef str; str = CFStringCreateWithCString(kCFAllocatorDefault, path.toUtf8().data(), kCFStringEncodingUTF8); pdfFileUrl = CFURLCreateWithFileSystemPath(kCFAllocatorDefault, str, kCFURLPOSIXPathStyle, true); CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfFileUrl); document = pdf; CFRelease(str); CFRelease(pdfFileUrl); return true; } void MacOSXPDFComic::closeComic() { // CGPDFDocumentRelease((CGPDFDocumentRef)document); } unsigned int MacOSXPDFComic::numPages() { return (int)CGPDFDocumentGetNumberOfPages((CGPDFDocumentRef)document); } QImage MacOSXPDFComic::getPage(const int pageNum) { CGPDFPageRef page = CGPDFDocumentGetPage((CGPDFDocumentRef)document, pageNum + 1); // Changed this line for the line above which is a generic line // CGPDFPageRef page = [self getPage:page_number]; CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox); int width = 1200; // NSLog(@"-----%f",pageRect.size.width); CGFloat pdfScale = float(width) / pageRect.size.width; pageRect.size = CGSizeMake(pageRect.size.width * pdfScale, pageRect.size.height * pdfScale); pageRect.origin = CGPointZero; CGColorSpaceRef genericColorSpace = CGColorSpaceCreateDeviceRGB(); QImage renderImage = QImage(pageRect.size.width, pageRect.size.height, QImage::Format_ARGB32_Premultiplied); CGContextRef bitmapContext = CGBitmapContextCreate(renderImage.scanLine(0), pageRect.size.width, pageRect.size.height, 8, renderImage.bytesPerLine(), genericColorSpace, kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Little // may need to be changed to kCGBitmapByteOrder32Big ); CGContextSetInterpolationQuality(bitmapContext, kCGInterpolationHigh); CGContextSetRenderingIntent(bitmapContext, kCGRenderingIntentDefault); CGContextSetRGBFillColor(bitmapContext, 1.0, 1.0, 1.0, 1.0); CGContextFillRect(bitmapContext, CGContextGetClipBoundingBox(bitmapContext)); // CGContextTranslateCTM( bitmapContext, 0, pageRect.size.height ); // CGContextScaleCTM( bitmapContext, 1.0, -1.0 ); CGContextConcatCTM(bitmapContext, CGAffineTransformMakeScale(pdfScale, pdfScale)); /*CGAffineTransform pdfXfm = CGPDFPageGetDrawingTransform( page, kCGPDFMediaBox, CGRectMake(pageRect.origin.x, pageRect.origin.y, pageRect.size.width, pageRect.size.height) , 0, true ); */ // CGContextConcatCTM( bitmapContext, pdfXfm ); CGContextDrawPDFPage(bitmapContext, page); // CGImageRef image = CGBitmapContextCreateImage(bitmapContext); // QImage qtImage; // CFDataRef dataRef = CGDataProviderCopyData(CGImageGetDataProvider(image)); /*lastPageData = (void *)dataRef; if(!lastPageData) { QLOG_ERROR() << "Unable to extract image from PDF file using CGPDFDocument"; CGImageRelease(image); CGContextRelease(bitmapContext); CGColorSpaceRelease(genericColorSpace); return QImage(); } const uchar *bytes = (const uchar *)CFDataGetBytePtr(dataRef); qtImage = QImage(bytes, pageRect.size.width, pageRect.size.height, QImage::Format_ARGB32); */ // CGImageRelease(image); // CFRelease(dataRef); CGContextRelease(bitmapContext); // CGPDFPageRelease(page); CGColorSpaceRelease(genericColorSpace); // return qtImage; return renderImage; } /*void MacOSXPDFComic::releaseLastPageData() { CFRelease((CFDataRef)lastPageData); }*/