File: PopplerSplashRenderer.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 (123 lines) | stat: -rw-r--r-- 4,186 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
/*
 * 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