File: PopplerCairoImageRenderer.m

package info (click to toggle)
popplerkit.framework 0.0.20051227svn-6
  • links: PTS
  • area: main
  • in suites: squeeze
  • size: 2,396 kB
  • ctags: 120
  • sloc: objc: 2,303; sh: 914; cpp: 574; ansic: 55; makefile: 24
file content (148 lines) | stat: -rw-r--r-- 4,881 bytes parent folder | download | duplicates (9)
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