1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
/*
* Copyright (C) 2004 Stefan Kleine Stegemann
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#import "PopplerCairoImageRenderer.h"
#import "PopplerFontManager.h"
#import "NSObject+PopplerObject.h"
#import "PopplerKitFunctions.h"
#include "bindings/poppler_cairo_img_renderer.h"
/**
* Non-Public methods.
*/
@interface PopplerCairoImageRenderer (Private)
@end
@implementation PopplerCairoImageRenderer
+ (BOOL) isSupported
{
#ifdef HAVE_CAIRO
return YES;
#else
return NO;
#endif
}
- (id) initWithDocument: (PopplerDocument*)aDocument
{
#ifndef HAVE_CAIRO
[NSException raise: PopplerException
format: @"your version of PopplerKit does not support cairo!"];
return nil;
#else
NSAssert(aDocument, @"no document");
self = [super init];
if (self)
{
document = [aDocument retain];
output_dev = poppler_cairo_img_device_create();
NSAssert(output_dev, @"poppler_cairo_img_device_create failed");
poppler_cairo_img_device_start_doc(output_dev, [document poppler_object]);
}
return self;
#endif
}
- (void) dealloc
{
#ifdef HAVE_CAIRO
if (output_dev)
{
poppler_cairo_img_device_destroy(output_dev);
}
[document release];
#endif
[super dealloc];
}
- (id) renderPage: (PopplerPage*)aPage
srcBox: (NSRect)aBox
scale: (float)aScale
{
#ifndef HAVE_CAIRO
[NSException raise: PopplerException
format: @"your version of PopplerKit does not support cairo!"];
return nil;
#else
int rc;
NSAssert(aPage, @"no page");
NSAssert(aScale > 0.0, @"invalid scale");
double hDPI = PopplerKitDPI().width * aScale;
double vDPI = PopplerKitDPI().height * aScale;
rc = poppler_cairo_img_device_display_slice(output_dev,
[aPage poppler_object],
[document poppler_object],
hDPI, vDPI, PopplerKitDPI().width,
0, // takes care of the page rotation itself
NSMinX(aBox), NSMinY(aBox),
NSWidth(aBox), NSHeight(aBox));
NSAssert(rc, @"poppler_cairo_img_device_display_slice failed");
unsigned char* cairoData;
int cairoWidth, cairoHeight, cairoRowstride;
rc = poppler_cairo_img_device_get_data(output_dev, &cairoData, &cairoWidth,
&cairoHeight, &cairoRowstride);
NSAssert(rc, @"poppler_cairo_img_device_get_data failed");
NSBitmapImageRep* imageRep;
imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes: NULL
pixelsWide: cairoWidth
pixelsHigh: cairoHeight
bitsPerSample: 8
samplesPerPixel: 3
hasAlpha: NO
isPlanar: NO
colorSpaceName: NSCalibratedRGBColorSpace
bytesPerRow: 3 * cairoWidth
bitsPerPixel: 8 * 3];
[imageRep autorelease];
unsigned char* repData = [imageRep bitmapData];
rc = poppler_cairo_img_device_get_rgb(cairoData, &repData, cairoWidth,
cairoHeight, cairoRowstride);
NSAssert(rc, @"poppler_cairo_img_device_get_rgb failed");
return imageRep;
#endif
}
- (id) renderPage: (PopplerPage*)aPage
scale: (float)aScale
{
return [self renderPage: aPage
srcBox: NSMakeRect(-1, -1, -1, -1)
scale: aScale];
}
@end
/* ----------------------------------------------------- */
/* Category Private */
/* ----------------------------------------------------- */
@implementation PopplerCairoImageRenderer (Private)
@end
|