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

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

First import

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