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

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

First import

File size: 8.7 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/*
10 *  This file was generated by the SOM Compiler and Emitter Framework.
11 *  Generated using template emitter:
12 *      SOM Emitter emitxtm: 2.23.1.9
13 */
14
15#ifndef SOM_Module_evdjvu_Source
16#define SOM_Module_evdjvu_Source
17#endif
18#define LuDjvuDocument_Class_Source
19
20#include "ludjvu.xih"
21#include <ddjvuapiw.h>
22
23
24#define SCALE_FACTOR 0.2
25
26
27struct DjvuDocument
28{
29    ddjvu_context_t  *d_context;
30    ddjvu_document_t *d_document;
31    ddjvu_format_t   *d_format;
32};
33
34
35unsigned _System LibMain( unsigned hmod, unsigned termination )
36{
37    if ( termination ) {
38        /* DLL is detaching from process */
39    } else {
40        /* DLL is attaching to process */
41    }
42    return( 1 );
43}
44
45extern "C" LuDocument * _System createObject()
46{
47    return new LuDjvuDocument;
48}
49
50extern "C" char * _System getSupportedExtensions()
51{
52    return "DJVU";
53}
54
55extern "C" char * _System getDescription()
56{
57    return "DjVu plugin, based on DjVuLibre.";
58}
59
60SOM_Scope boolean  SOMLINK loadFile(LuDjvuDocument *somSelf,
61                                     Environment *ev, string filename,
62                                    string password, string* error)
63{
64    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
65    DjvuDocument *d = (DjvuDocument *)somThis->data;
66    ddjvu_document_t *doc;
67
68    doc = ddjvu_document_create_by_filename( d->d_context, filename, TRUE );
69
70    if ( !doc ) {
71        return FALSE;
72    }
73
74    if ( d->d_document ) {
75        ddjvu_document_release( d->d_document );
76    }
77
78    d->d_document = doc;
79
80    while ( !ddjvu_document_decoding_done( d->d_document ) ) {
81        ddjvu_message_wait( d->d_context );
82        ddjvu_message_pop( d->d_context );
83    }
84
85    return TRUE;
86}
87
88SOM_Scope boolean  SOMLINK isScalable(LuDjvuDocument *somSelf,
89                                       Environment *ev)
90{
91    return TRUE;
92}
93
94SOM_Scope long  SOMLINK getPageCount(LuDjvuDocument *somSelf,
95                                      Environment *ev)
96{
97    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
98    DjvuDocument *d = (DjvuDocument *)somThis->data;
99    return ddjvu_document_get_pagenum( d->d_document );
100}
101
102SOM_Scope void  SOMLINK getPageSize(LuDjvuDocument *somSelf,
103                                     Environment *ev, long pagenum,
104                                    double* width, double* height)
105{
106    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
107    DjvuDocument *d = (DjvuDocument *)somThis->data;
108
109    ddjvu_pageinfo_t info = { 0 };
110
111    while ( ddjvu_document_get_pageinfo( d->d_document, pagenum, &info ) < DDJVU_JOB_OK ) {
112        ddjvu_message_wait( d->d_context );
113        ddjvu_message_pop( d->d_context );
114    }
115
116    if ( width != NULL ) {
117        *width = info.width * SCALE_FACTOR;
118    }
119    if ( height != NULL ) {
120        *height = info.height * SCALE_FACTOR;
121    }
122}
123
124SOM_Scope void  SOMLINK renderPageToPixbuf(LuDjvuDocument *somSelf,
125                                            Environment *ev,
126                                           long pagenum, long src_x,
127                                           long src_y, long src_width,
128                                           long src_height, double scale,
129                                           long rotation, LuPixbuf* pixbuf)
130{
131    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
132    DjvuDocument *d = (DjvuDocument *)somThis->data;
133
134    //somPrintf( "src_x: %d  src_y: %d  src_width: %d  src_height: %d\n",
135    //            src_x, src_y, src_width, src_height );
136
137    ddjvu_rect_t rrect;
138    ddjvu_rect_t prect;
139    ddjvu_page_t *d_page;
140
141    double page_width, page_height;
142
143    d_page = ddjvu_page_create_by_pageno( d->d_document, pagenum );
144
145    while ( !ddjvu_page_decoding_done( d_page ) ) {
146        ddjvu_message_wait( d->d_context );
147        ddjvu_message_pop( d->d_context );
148    }
149
150    page_width = ddjvu_page_get_width( d_page ) * scale * SCALE_FACTOR;
151    page_height = ddjvu_page_get_height( d_page ) * scale * SCALE_FACTOR;
152
153    prect.x = 0;
154    prect.y = 0;
155    prect.w = (int)( page_width + 0.5 );
156    prect.h = (int)( page_height + 0.5 );
157    rrect.x = src_x;
158    rrect.y = ( prect.h - src_y ) - src_height;
159    rrect.w = src_width;
160    rrect.h = src_height;
161
162    long pixbuf_rowsize = pixbuf->getRowSize( ev );
163    long pixbuf_height = pixbuf->getHeight( ev );
164
165    LuPixbuf *pb = new LuPixbuf( ev, prect.w, prect.h );
166    long pb_rowsize = pb->getRowSize( ev );
167    char *pbbuf = (char *)pb->getDataPtr( ev );
168    ddjvu_page_render( d_page, DDJVU_RENDER_COLOR,
169                       &prect, &rrect, d->d_format,
170                       pb_rowsize, pbbuf );
171
172    char *pixbuf_data = (char *)pixbuf->getDataPtr( ev );
173    char *src, *dst;
174    int i, y;
175    for ( y = (src_height-1), i = 0; i < src_height; y--, i++ )
176    {
177        src = pbbuf + (y * pb_rowsize);
178        dst = pixbuf_data + (i * pixbuf_rowsize);
179        memcpy( dst, src, src_width * 3 );
180    }
181    delete pb;
182}
183
184SOM_Scope boolean  SOMLINK getThumbnailSize(LuDjvuDocument *somSelf,
185                                             Environment *ev,
186                                            long pagenum,
187                                            short suggested_width,
188                                            short* width, short* height)
189{
190    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
191   
192    double page_ratio;
193    double p_width = 0, p_height = 0;
194    getPageSize( somSelf, ev, pagenum, &p_width, &p_height );
195
196    page_ratio = p_height / p_width;
197    *width = suggested_width;
198    *height = (short)( suggested_width * page_ratio );
199
200    return TRUE;
201}
202
203SOM_Scope LuPixbuf*  SOMLINK getThumbnail(LuDjvuDocument *somSelf,
204                                           Environment *ev, long pagenum,
205                                          short suggested_width)
206{
207    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
208    DjvuDocument *d = (DjvuDocument *)somThis->data;
209
210    short thumb_width = 0, thumb_height = 0;
211    getThumbnailSize( somSelf, ev, pagenum, suggested_width, &thumb_width, &thumb_height );
212
213    while ( ddjvu_thumbnail_status( d->d_document, pagenum, 1 ) < DDJVU_JOB_OK ) {
214            ddjvu_message_wait( d->d_context );
215            ddjvu_message_pop( d->d_context ); 
216    }
217       
218    int t_width = thumb_width;
219    int t_height = thumb_height;
220    LuPixbuf *tmppb = new LuPixbuf( ev, thumb_width, thumb_height );
221    char *tmppb_data = (char *)tmppb->getDataPtr( ev );
222    int tmppb_rowstride = tmppb->getRowSize( ev );
223
224    ddjvu_thumbnail_render( d->d_document, pagenum, &t_width, &t_height,
225                            d->d_format, tmppb_rowstride, tmppb_data );
226
227    LuPixbuf *pixbuf = new LuPixbuf( ev, thumb_width, thumb_height );
228    char *pixbuf_data = (char *)pixbuf->getDataPtr( ev );
229    int pixbuf_rowstride = pixbuf->getRowSize( ev );
230    char *src, *dst;
231    int i, j;
232    for ( i = 0, j = ( thumb_height - 1 ); i < thumb_height; i++, j-- )
233    {
234        src = tmppb_data + ( j * tmppb_rowstride );
235        dst = pixbuf_data + (i * pixbuf_rowstride);
236        memcpy( dst, src, pixbuf_rowstride );
237    }
238    delete tmppb;
239
240    return pixbuf;
241}
242
243SOM_Scope void SOMLINK somDefaultInit(LuDjvuDocument *somSelf,
244                                      som3InitCtrl* ctrl)
245{
246    LuDjvuDocumentData *somThis;
247    somInitCtrl globalCtrl;
248    somBooleanVector myMask;
249    LuDjvuDocument_BeginInitializer_somDefaultInit;
250    LuDjvuDocument_Init_LuDocument_somDefaultInit(somSelf, ctrl);
251
252    // local LuDjvuDocument initialization code
253    DjvuDocument *d = new DjvuDocument;
254    memset( d, 0, sizeof( DjvuDocument ) );
255    d->d_context = ddjvu_context_create("Lucide");
256    d->d_format = ddjvu_format_create( DDJVU_FORMAT_BGR24, 0, 0 );
257    ddjvu_format_set_row_order( d->d_format, 1 );
258    d->d_document = NULL;
259
260    somThis->data = d;
261}
262
263
264SOM_Scope void SOMLINK somDestruct(LuDjvuDocument *somSelf, octet doFree,
265                                   som3DestructCtrl* ctrl)
266{
267    LuDjvuDocumentData *somThis; /* set in BeginDestructor */
268    somDestructCtrl globalCtrl;
269    somBooleanVector myMask;
270    LuDjvuDocument_BeginDestructor;
271
272    // local LuDjvuDocument deinitialization code
273    DjvuDocument *d = (DjvuDocument *)somThis->data;
274    if ( d->d_document ) {
275        ddjvu_document_release( d->d_document );
276    }
277    ddjvu_context_release( d->d_context );
278    ddjvu_format_release( d->d_format );
279    delete d;
280    // end of local LuDjvuDocument deinitialization code
281
282    LuDjvuDocument_EndDestructor;
283}
284
285
Note: See TracBrowser for help on using the repository browser.