source: trunk/Lucide/SOURCE/plugins/lujpeg/lujpeg.cpp @ 27

Last change on this file since 27 was 27, checked in by Eugene Romanenko, 15 years ago

poppler updated to version 0.5.2, also needed changes to be compatible with new poppler

File size: 6.1 KB
Line 
1
2/*
3 *  This file was generated by the SOM Compiler.
4 *  Generated using:
5 *     SOM incremental update: 2.24
6 */
7
8/*
9 *  This file was generated by the SOM Compiler and Emitter Framework.
10 *  Generated using template emitter:
11 *      SOM Emitter emitxtm: 2.23.1.9
12 */
13
14#ifndef SOM_Module_lujpeg_Source
15#define SOM_Module_lujpeg_Source
16#endif
17#define LuJpegDocument_Class_Source
18
19#include "lujpeg.xih"
20
21#define HAVE_BOOLEAN
22
23#include <stdio.h>
24#include <string.h>
25#include <jpeglib.h>
26
27
28unsigned _System LibMain( unsigned hmod, unsigned termination )
29{
30    if ( termination ) {
31        /* DLL is detaching from process */
32    } else {
33        /* DLL is attaching to process */
34    }
35    return( 1 );
36}
37
38extern "C" LuDocument * _System createObject()
39{
40    return new LuJpegDocument;
41}
42
43extern "C" char * _System getSupportedExtensions()
44{
45    return "JPG;JPEG;JPE";
46}
47
48extern "C" char * _System getDescription()
49{
50    return "Jpeg plugin, based on IJG JPEG Library.";
51}
52
53
54struct JpegDocument
55{
56    LuPixbuf *pb;
57    double width;
58    double height;
59};
60
61
62SOM_Scope boolean  SOMLINK loadFile(LuJpegDocument *somSelf,
63                                     Environment *ev, string filename,
64                                    string password, string* error)
65{
66    LuJpegDocumentData *somThis = LuJpegDocumentGetData(somSelf);
67    JpegDocument *d = (JpegDocument *)somThis->data;
68
69    FILE *infile = NULL;
70    if ( ( infile = fopen( filename, "rb" ) ) == NULL ) {
71        return FALSE;
72    }
73
74    short bpp = getBpp( somSelf, ev );
75    jpeg_decompress_struct cinfo;
76    jpeg_error_mgr jerr;
77    cinfo.err = jpeg_std_error( &jerr );
78    jpeg_create_decompress( &cinfo );
79    jpeg_stdio_src( &cinfo, infile );
80    jpeg_read_header( &cinfo, TRUE );
81    cinfo.out_color_space = JCS_RGB;
82    jpeg_start_decompress( &cinfo );
83
84    d->width = cinfo.output_width;
85    d->height = cinfo.output_height;
86    d->pb = new LuPixbuf( ev, cinfo.output_width, cinfo.output_height, bpp );
87
88    int pixbuf_rowstride, pixbuf_height, pixbuf_width;
89    char *pixbuf_data, *dst, *src;
90
91    pixbuf_data = (char *)d->pb->getDataPtr( ev );
92    pixbuf_width = d->pb->getWidth( ev );
93    pixbuf_height = d->pb->getHeight( ev );
94    pixbuf_rowstride = d->pb->getRowSize(ev );
95
96    JSAMPARRAY buffer;
97    int row_stride = cinfo.output_width * cinfo.output_components;
98    buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr) &cinfo, JPOOL_IMAGE, row_stride, 1);
99
100    int i, j;
101    i = cinfo.output_height;
102    while ( cinfo.output_scanline < cinfo.output_height )
103    {
104        i--;
105        jpeg_read_scanlines( &cinfo, buffer, 1 );
106        dst = pixbuf_data + i * pixbuf_rowstride;
107        for ( j = 0; j < pixbuf_rowstride; j += bpp )
108        {
109            dst[ j ] = buffer[0][ j + 2 ];
110            dst[ j + 1 ] = buffer[0][ j + 1 ];
111            dst[ j + 2 ] = buffer[0][ j ];
112        }
113    }
114
115    jpeg_finish_decompress( &cinfo );
116    jpeg_destroy_decompress( &cinfo );
117    fclose( infile );
118
119    return TRUE;
120}
121
122SOM_Scope short  SOMLINK getBpp(LuJpegDocument *somSelf,  Environment *ev)
123{
124    return 3;
125}
126
127SOM_Scope long  SOMLINK getPageCount(LuJpegDocument *somSelf,
128                                      Environment *ev)
129{
130    return 1;
131}
132
133SOM_Scope void  SOMLINK getPageSize(LuJpegDocument *somSelf,
134                                     Environment *ev, long pagenum,
135                                    double* width, double* height)
136{
137    LuJpegDocumentData *somThis = LuJpegDocumentGetData(somSelf);
138    JpegDocument *d = (JpegDocument *)somThis->data;
139
140    if ( width != NULL ) {
141        *width = d->width;
142    }
143    if ( height != NULL ) {
144        *height = d->height;
145    }
146}
147
148SOM_Scope void  SOMLINK renderPageToPixbuf(LuJpegDocument *somSelf,
149                                            Environment *ev,
150                                           long pagenum, long src_x,
151                                           long src_y, long src_width,
152                                           long src_height, double scale,
153                                           long rotation, LuPixbuf* pixbuf)
154{
155    LuJpegDocumentData *somThis = LuJpegDocumentGetData(somSelf);
156    JpegDocument *d = (JpegDocument *)somThis->data;
157
158    //somPrintf( "src_x: %d  src_y: %d  src_width: %d  src_height: %d\n",
159    //            src_x, src_y, src_width, src_height );
160
161    short bpp = getBpp( somSelf, ev );
162    int pb_rowstride = d->pb->getRowSize( ev );
163    int pb_height = d->pb->getHeight( ev );
164    int pixbuf_rowstride = pixbuf->getRowSize( ev );
165    char *pb_data = (char *)d->pb->getDataPtr( ev );
166    char *pixbuf_data = (char *)pixbuf->getDataPtr( ev );
167    char *src, *dst;
168    int i, y;
169    for ( y = pb_height-(src_y+src_height), i = 0; i < src_height; y++, i++ )
170    {
171        src = pb_data + (y * pb_rowstride) + (src_x * bpp);
172        dst = pixbuf_data + (i * pixbuf_rowstride);
173        memcpy( dst, src, src_width * bpp );
174    }
175    //long len = __min( pixbuf->getDataLen(ev), d->pb->getDataLen(ev) );
176    //memcpy( pixbuf->getDataPtr(ev), d->pb->getDataPtr(ev), len );
177}
178
179SOM_Scope void SOMLINK somDefaultInit(LuJpegDocument *somSelf,
180                                      som3InitCtrl* ctrl)
181{
182    LuJpegDocumentData *somThis;
183    somInitCtrl globalCtrl;
184    somBooleanVector myMask;
185    LuJpegDocument_BeginInitializer_somDefaultInit;
186    LuJpegDocument_Init_LuDocument_somDefaultInit(somSelf, ctrl);
187
188    // local LuJpegDocument initialization code
189    JpegDocument *d = new JpegDocument;
190    memset( d, 0, sizeof( JpegDocument ) );
191    somThis->data = d;
192}
193
194
195SOM_Scope void SOMLINK somDestruct(LuJpegDocument *somSelf, octet doFree,
196                                   som3DestructCtrl* ctrl)
197{
198    LuJpegDocumentData *somThis;
199    somDestructCtrl globalCtrl;
200    somBooleanVector myMask;
201    LuJpegDocument_BeginDestructor;
202
203    // local LuJpegDocument deinitialization code
204    JpegDocument *d = (JpegDocument *)somThis->data;
205    if ( d->pb != NULL ) {
206            delete d->pb;
207        }
208    delete d;
209    // end of local LuJpegDocument deinitialization code
210
211    LuJpegDocument_EndDestructor;
212}
213
214
Note: See TracBrowser for help on using the repository browser.