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

Last change on this file since 210 was 210, checked in by Eugene Romanenko, 14 years ago

update changelog

File size: 13.0 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 * Copyright (c) 2006, Eugene Romanenko, netlabs.org
11 *
12 *----------------------------------------------------------------------
13 * This file is part of djvu plugin for Lucide (ludjvu).
14 *
15 *  ludjvu is free software; you can redistribute it and/or modify
16 *  it under the terms of the GNU General Public License as published by
17 *  the Free Software Foundation; either version 2 of the License, or
18 *  (at your option) any later version.
19 *
20 *  ludjvu is distributed in the hope that it will be useful,
21 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
22 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 *  GNU General Public License for more details.
24 *----------------------------------------------------------------------
25 */
26
27
28/*
29 *  This file was generated by the SOM Compiler and Emitter Framework.
30 *  Generated using template emitter:
31 *      SOM Emitter emitxtm: 2.23.1.9
32 */
33
34#ifndef SOM_Module_evdjvu_Source
35#define SOM_Module_evdjvu_Source
36#endif
37#define LuDjvuDocument_Class_Source
38
39#include "ludjvu.xih"
40#ifdef __WATCOMC__
41#include <ddjvuapiw.h>
42#else
43#include <ddjvuapi.h>
44#endif
45#ifdef __GNUC__
46#define __min(a,b)  (((a) < (b)) ? (a) : (b))
47#endif
48
49#define SCALE_FACTOR 0.2
50
51
52struct DjvuDocument
53{
54    ddjvu_context_t  *d_context;
55    ddjvu_document_t *d_document;
56    ddjvu_format_t   *d_format;
57};
58
59
60unsigned _System LibMain( unsigned hmod, unsigned termination )
61{
62    if ( termination ) {
63        // DLL is detaching from process
64    } else {
65        // DLL is attaching to process
66    }
67    return( 1 );
68}
69
70extern "C" LuDocument * _System createObject()
71{
72    return new LuDjvuDocument;
73}
74
75extern "C" char * _System getSupportedExtensions()
76{
77    return "DJVU;DJV";
78}
79
80extern "C" char * _System getDescription()
81{
82    return "DjVu plugin, based on DjVuLibre v3.5.19";
83}
84
85
86static void djvu_handle_events( ddjvu_context_t *ctx )
87{
88    const ddjvu_message_t *msg;
89
90    if ( ctx == NULL ) {
91        return;
92    }
93
94    msg = ddjvu_message_wait( ctx );
95    while ( ( msg = ddjvu_message_peek( ctx ) ) )
96    {
97        switch ( msg->m_any.tag )
98        {
99            case DDJVU_ERROR:
100                // TODO: error message
101                break;
102
103            default:
104                break;
105        }
106        ddjvu_message_pop( ctx );
107    }
108}
109
110
111SOM_Scope boolean  SOMLINK loadFile(LuDjvuDocument *somSelf,
112                                     Environment *ev, string filename,
113                                    string password, long* errorCode,
114                                    string* error)
115{
116    if ( errorCode != NULL ) {
117        *errorCode = LU_LDERR_NO_ERROR;
118    }
119
120    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
121    DjvuDocument *d = (DjvuDocument *)somThis->data;
122    ddjvu_document_t *doc;
123
124    doc = ddjvu_document_create_by_filename( d->d_context, filename, TRUE );
125
126    if ( !doc ) {
127        return FALSE;
128    }
129
130    if ( d->d_document ) {
131        ddjvu_document_release( d->d_document );
132    }
133
134    d->d_document = doc;
135
136    while ( !ddjvu_document_decoding_done( d->d_document ) ) {
137        djvu_handle_events( d->d_context );
138    }
139
140    if ( ddjvu_document_decoding_error( d->d_document ) ) {
141        return FALSE;
142    }
143
144    return TRUE;
145}
146
147
148SOM_Scope short  SOMLINK getBpp(LuDjvuDocument *somSelf,  Environment *ev)
149{
150    return 3;
151}
152
153
154SOM_Scope boolean  SOMLINK isScalable(LuDjvuDocument *somSelf,
155                                       Environment *ev)
156{
157    return TRUE;
158}
159
160
161SOM_Scope long  SOMLINK getPageCount(LuDjvuDocument *somSelf,
162                                      Environment *ev)
163{
164    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
165    DjvuDocument *d = (DjvuDocument *)somThis->data;
166    return ddjvu_document_get_pagenum( d->d_document );
167}
168
169
170SOM_Scope void  SOMLINK getPageSize(LuDjvuDocument *somSelf,
171                                     Environment *ev, long pagenum,
172                                    double* width, double* height)
173{
174    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
175    DjvuDocument *d = (DjvuDocument *)somThis->data;
176
177    ddjvu_pageinfo_t info = { 0 };
178
179    while ( ddjvu_document_get_pageinfo( d->d_document, pagenum, &info ) < DDJVU_JOB_OK ) {
180        djvu_handle_events( d->d_context );
181    }
182
183    if ( width != NULL ) {
184        *width = info.width * SCALE_FACTOR;
185    }
186    if ( height != NULL ) {
187        *height = info.height * SCALE_FACTOR;
188    }
189}
190
191
192SOM_Scope boolean  SOMLINK renderPageToPixbuf(LuDjvuDocument *somSelf,
193                                               Environment *ev,
194                                              long pagenum, long src_x,
195                                              long src_y, long src_width,
196                                              long src_height,
197                                              double scale, long rotation,
198                                              LuPixbuf* pixbuf,
199                                              long* errorCode,
200                                              string* error)
201{
202    if ( errorCode != NULL ) {
203        *errorCode = LU_RERR_NO_ERROR;
204    }
205
206    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
207    DjvuDocument *d = (DjvuDocument *)somThis->data;
208
209    //somPrintf( "src_x: %d  src_y: %d  src_width: %d  src_height: %d\n",
210    //            src_x, src_y, src_width, src_height );
211
212    ddjvu_rect_t rrect;
213    ddjvu_rect_t prect;
214    ddjvu_page_t *d_page;
215
216    double page_width, page_height;
217
218    d_page = ddjvu_page_create_by_pageno( d->d_document, pagenum );
219
220    while ( !ddjvu_page_decoding_done( d_page ) ) {
221        djvu_handle_events( d->d_context );
222    }
223
224    page_width = ddjvu_page_get_width( d_page ) * scale * SCALE_FACTOR;
225    page_height = ddjvu_page_get_height( d_page ) * scale * SCALE_FACTOR;
226
227    prect.x = 0;
228    prect.y = 0;
229    prect.w = (int)( page_width + 0.5 );
230    prect.h = (int)( page_height + 0.5 );
231    rrect.x = src_x;
232    rrect.y = ( prect.h - src_y ) - src_height;
233    rrect.w = src_width;
234    rrect.h = src_height;
235
236    long pixbuf_rowsize = pixbuf->getRowSize( ev );
237    long pixbuf_height = pixbuf->getHeight( ev );
238    short bpp = getBpp( somSelf, ev );
239
240    LuPixbuf *pb = new LuPixbuf( ev, rrect.w, rrect.h, bpp );
241    long pb_rowsize = pb->getRowSize( ev );
242    long pb_height = pb->getHeight( ev );
243    char *pbbuf = (char *)pb->getDataPtr( ev );
244    ddjvu_page_render( d_page, DDJVU_RENDER_COLOR,
245                       &prect, &rrect, d->d_format,
246                       pb_rowsize, pbbuf );
247
248    char *pixbuf_data = (char *)pixbuf->getDataPtr( ev );
249    char *src, *dst;
250    int i, y;
251    int rowsize = __min( pb_rowsize, pixbuf_rowsize );
252    int height = __min( pb_height, pixbuf_height );
253    for ( y = (height-1), i = 0; i < height; y--, i++ )
254    {
255        src = pbbuf + (y * pb_rowsize);
256        dst = pixbuf_data + (i * pixbuf_rowsize);
257        memcpy( dst, src, rowsize );
258    }
259    delete pb;
260
261    return TRUE;
262}
263
264
265SOM_Scope boolean  SOMLINK getThumbnailSize(LuDjvuDocument *somSelf,
266                                             Environment *ev,
267                                            long pagenum,
268                                            short suggested_width,
269                                            short* width, short* height)
270{
271    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
272
273    double page_ratio;
274    double p_width = 0, p_height = 0;
275    getPageSize( somSelf, ev, pagenum, &p_width, &p_height );
276
277    page_ratio = p_height / p_width;
278    *width = suggested_width;
279    *height = (short)( suggested_width * page_ratio );
280
281    return TRUE;
282}
283
284
285SOM_Scope LuPixbuf*  SOMLINK getThumbnail(LuDjvuDocument *somSelf,
286                                           Environment *ev, long pagenum,
287                                          short suggested_width)
288{
289    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
290    DjvuDocument *d = (DjvuDocument *)somThis->data;
291
292    short thumb_width = 0, thumb_height = 0;
293    getThumbnailSize( somSelf, ev, pagenum, suggested_width, &thumb_width, &thumb_height );
294
295    while ( ddjvu_thumbnail_status( d->d_document, pagenum, 1 ) < DDJVU_JOB_OK ) {
296        djvu_handle_events( d->d_context );
297    }
298
299    int t_width = thumb_width;
300    int t_height = thumb_height;
301    short bpp = getBpp( somSelf, ev );
302    LuPixbuf *tmppb = new LuPixbuf( ev, thumb_width, thumb_height, bpp );
303    char *tmppb_data = (char *)tmppb->getDataPtr( ev );
304    int tmppb_rowstride = tmppb->getRowSize( ev );
305
306    ddjvu_thumbnail_render( d->d_document, pagenum, &t_width, &t_height,
307                            d->d_format, tmppb_rowstride, tmppb_data );
308
309    LuPixbuf *pixbuf = new LuPixbuf( ev, thumb_width, thumb_height, bpp );
310    char *pixbuf_data = (char *)pixbuf->getDataPtr( ev );
311    int pixbuf_rowstride = pixbuf->getRowSize( ev );
312    char *src, *dst;
313    int i, j;
314    for ( i = 0, j = ( thumb_height - 1 ); i < thumb_height; i++, j-- )
315    {
316        src = tmppb_data + ( j * tmppb_rowstride );
317        dst = pixbuf_data + (i * pixbuf_rowstride);
318        memcpy( dst, src, pixbuf_rowstride );
319    }
320    delete tmppb;
321
322    return pixbuf;
323}
324
325
326SOM_Scope boolean  SOMLINK isSaveable(LuDjvuDocument *somSelf,
327                                       Environment *ev)
328{
329#ifdef __GNUC__
330    return TRUE;
331#else
332    return FALSE;
333#endif
334}
335
336
337SOM_Scope boolean  SOMLINK saveAs(LuDjvuDocument *somSelf,  Environment *ev,
338                                  string filename)
339{
340#ifdef __GNUC__
341    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
342    DjvuDocument *d = (DjvuDocument *)somThis->data;
343
344    FILE *f = NULL;
345    if ( ( f = fopen( filename, "wb" ) ) == NULL ) {
346        return FALSE;
347    }
348
349    ddjvu_job_t *job = ddjvu_document_save( d->d_document, f, 0, NULL );
350    while ( !ddjvu_job_done( job ) ) {
351        djvu_handle_events( d->d_context );
352    }
353    fclose( f );
354
355    return TRUE;
356#else
357    return FALSE;
358#endif
359}
360
361
362SOM_Scope boolean  SOMLINK isPostScriptExportable(LuDjvuDocument *somSelf,
363                                                   Environment *ev)
364{
365#ifdef __GNUC__
366    return TRUE;
367#else
368    return FALSE;
369#endif
370}
371
372
373SOM_Scope boolean  SOMLINK exportToPostScript(LuDjvuDocument *somSelf,
374                                    Environment *ev, string filename,
375                                    long first_page, long last_page,
376                                    double width, double height,
377                                    boolean* brkExport)
378{
379#ifdef __GNUC__
380    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
381    DjvuDocument *d = (DjvuDocument *)somThis->data;
382
383    FILE *f = NULL;
384    if ( ( f = fopen( filename, "wb" ) ) == NULL ) {
385        return FALSE;
386    }
387
388    char pgbuf[ 20 ];
389    snprintf( pgbuf, 20, "-page=%d-%d", first_page + 1, last_page + 1 );
390    const char *optv[] = { pgbuf };
391
392    ddjvu_job_t *job = ddjvu_document_print( d->d_document, f, 1, optv );
393    while ( !ddjvu_job_done( job ) && !(*brkExport) ) {
394        djvu_handle_events( d->d_context );
395    }
396    fclose( f );
397
398    return TRUE;
399#else
400    return FALSE;
401#endif
402}
403
404
405SOM_Scope boolean  SOMLINK isFixedImage(LuDjvuDocument *somSelf,
406                                         Environment *ev)
407{
408    return FALSE;
409}
410
411
412SOM_Scope boolean  SOMLINK isCreateFileThumbnail(LuDjvuDocument *somSelf,
413                                                  Environment *ev)
414{
415    return TRUE;
416}
417
418
419SOM_Scope void SOMLINK somDefaultInit(LuDjvuDocument *somSelf,
420                                      som3InitCtrl* ctrl)
421{
422    LuDjvuDocumentData *somThis;
423    somInitCtrl globalCtrl;
424    somBooleanVector myMask;
425    LuDjvuDocument_BeginInitializer_somDefaultInit;
426    LuDjvuDocument_Init_LuDocument_somDefaultInit(somSelf, ctrl);
427
428    // local LuDjvuDocument initialization code
429    DjvuDocument *d = new DjvuDocument;
430    memset( d, 0, sizeof( DjvuDocument ) );
431    d->d_context = ddjvu_context_create("Lucide");
432    d->d_format = ddjvu_format_create( DDJVU_FORMAT_BGR24, 0, 0 );
433    ddjvu_format_set_row_order( d->d_format, 1 );
434    d->d_document = NULL;
435
436    somThis->data = d;
437}
438
439
440SOM_Scope void SOMLINK somDestruct(LuDjvuDocument *somSelf, octet doFree,
441                                   som3DestructCtrl* ctrl)
442{
443    LuDjvuDocumentData *somThis; // set in BeginDestructor
444    somDestructCtrl globalCtrl;
445    somBooleanVector myMask;
446    LuDjvuDocument_BeginDestructor;
447
448    // local LuDjvuDocument deinitialization code
449    DjvuDocument *d = (DjvuDocument *)somThis->data;
450    if ( d->d_document ) {
451        ddjvu_document_release( d->d_document );
452    }
453    ddjvu_context_release( d->d_context );
454    ddjvu_format_release( d->d_format );
455    delete d;
456    // end of local LuDjvuDocument deinitialization code
457
458    LuDjvuDocument_EndDestructor;
459}
460
461
Note: See TracBrowser for help on using the repository browser.