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
|
/*
* 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 "PopplerSplashRenderer.h"
#import "PopplerFontManager.h"
#import "NSObject+PopplerObject.h"
#import "PopplerKitFunctions.h"
#include "bindings/poppler_splash_renderer.h"
/**
* Non-Public methods.
*/
@interface PopplerSplashRenderer (Private)
@end
@implementation PopplerSplashRenderer
- (id) initWithDocument: (PopplerDocument*)aDocument
{
NSAssert(aDocument, @"no document");
self = [super init];
if (self)
{
document = [aDocument retain];
output_dev = poppler_splash_device_create(0xff, 0xff, 0xff);
NSAssert(output_dev, @"poppler_splash_device_create failed");
poppler_splash_device_start_doc(output_dev, [document poppler_object]);
}
return self;
}
- (void) dealloc
{
if (output_dev)
{
poppler_splash_device_destroy(output_dev);
}
[document release];
[super dealloc];
}
- (id) renderPage: (PopplerPage*)aPage
srcBox: (NSRect)aBox
scale: (float)aScale
{
int rc;
NSAssert(aPage, @"no page");
NSAssert(aScale > 0.0, @"invalid scale");
double hDPI = PopplerKitDPI().width * aScale;
double vDPI = PopplerKitDPI().height * aScale;
rc = poppler_splash_device_display_slice(output_dev,
[aPage poppler_object],
[document poppler_object],
hDPI, vDPI,
0, // takes care of the page rotation itself
NSMinX(aBox), NSMinY(aBox),
NSWidth(aBox), NSHeight(aBox));
NSAssert(rc, @"poppler_splash_device_display_slice failed");
void* bitmap;
int bmp_width, bmp_height;
rc = poppler_splash_device_get_bitmap(output_dev, &bitmap, &bmp_width, &bmp_height);
NSAssert(rc, @"poppler_splash_device_get_bitmap failed");
NSBitmapImageRep* imageRep;
imageRep = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes: NULL
pixelsWide: bmp_width
pixelsHigh: bmp_height
bitsPerSample: 8
samplesPerPixel: 3
hasAlpha: NO
isPlanar: NO
colorSpaceName: NSCalibratedRGBColorSpace
bytesPerRow: 3 * bmp_width
bitsPerPixel: 8 * 3];
[imageRep autorelease];
unsigned char* repData = [imageRep bitmapData];
rc = poppler_splash_device_get_rgb(bitmap, &repData);
NSAssert(rc, @"poppler_splash_device_get_rgb failed");
return imageRep;
}
- (id) renderPage: (PopplerPage*)aPage
scale: (float)aScale
{
return [self renderPage: aPage
srcBox: NSMakeRect(-1, -1, -1, -1)
scale: aScale];
}
@end
/* ----------------------------------------------------- */
/* Category Private */
/* ----------------------------------------------------- */
@implementation PopplerSplashRenderer (Private)
@end
|