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

Last change on this file since 215 was 215, checked in by Eugene Romanenko, 14 years ago
  • If the filename does not have an extension or the extension is unknown, it will check file data to determine a suitable plugin (closes #43)
File size: 13.2 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
80LuCheckData   lcd = { 0, 8, (void *)"AT&TFORM" };
81LuCheckStruct lcs = { 1, &lcd };
82
83extern "C" LuCheckStruct * _System getCheckStruct()
84{
85        return &lcs;
86}
87
88
89extern "C" char * _System getDescription()
90{
91    return "DjVu plugin, based on DjVuLibre v3.5.19";
92}
93
94
95static void djvu_handle_events( ddjvu_context_t *ctx )
96{
97    const ddjvu_message_t *msg;
98
99    if ( ctx == NULL ) {
100        return;
101    }
102
103    msg = ddjvu_message_wait( ctx );
104    while ( ( msg = ddjvu_message_peek( ctx ) ) )
105    {
106        switch ( msg->m_any.tag )
107        {
108            case DDJVU_ERROR:
109                // TODO: error message
110                break;
111
112            default:
113                break;
114        }
115        ddjvu_message_pop( ctx );
116    }
117}
118
119
120SOM_Scope boolean  SOMLINK loadFile(LuDjvuDocument *somSelf,
121                                     Environment *ev, string filename,
122                                    string password, long* errorCode,
123                                    string* error)
124{
125    if ( errorCode != NULL ) {
126        *errorCode = LU_LDERR_NO_ERROR;
127    }
128
129    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
130    DjvuDocument *d = (DjvuDocument *)somThis->data;
131    ddjvu_document_t *doc;
132
133    doc = ddjvu_document_create_by_filename( d->d_context, filename, TRUE );
134
135    if ( !doc ) {
136        return FALSE;
137    }
138
139    if ( d->d_document ) {
140        ddjvu_document_release( d->d_document );
141    }
142
143    d->d_document = doc;
144
145    while ( !ddjvu_document_decoding_done( d->d_document ) ) {
146        djvu_handle_events( d->d_context );
147    }
148
149    if ( ddjvu_document_decoding_error( d->d_document ) ) {
150        return FALSE;
151    }
152
153    return TRUE;
154}
155
156
157SOM_Scope short  SOMLINK getBpp(LuDjvuDocument *somSelf,  Environment *ev)
158{
159    return 3;
160}
161
162
163SOM_Scope boolean  SOMLINK isScalable(LuDjvuDocument *somSelf,
164                                       Environment *ev)
165{
166    return TRUE;
167}
168
169
170SOM_Scope long  SOMLINK getPageCount(LuDjvuDocument *somSelf,
171                                      Environment *ev)
172{
173    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
174    DjvuDocument *d = (DjvuDocument *)somThis->data;
175    return ddjvu_document_get_pagenum( d->d_document );
176}
177
178
179SOM_Scope void  SOMLINK getPageSize(LuDjvuDocument *somSelf,
180                                     Environment *ev, long pagenum,
181                                    double* width, double* height)
182{
183    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
184    DjvuDocument *d = (DjvuDocument *)somThis->data;
185
186    ddjvu_pageinfo_t info = { 0 };
187
188    while ( ddjvu_document_get_pageinfo( d->d_document, pagenum, &info ) < DDJVU_JOB_OK ) {
189        djvu_handle_events( d->d_context );
190    }
191
192    if ( width != NULL ) {
193        *width = info.width * SCALE_FACTOR;
194    }
195    if ( height != NULL ) {
196        *height = info.height * SCALE_FACTOR;
197    }
198}
199
200
201SOM_Scope boolean  SOMLINK renderPageToPixbuf(LuDjvuDocument *somSelf,
202                                               Environment *ev,
203                                              long pagenum, long src_x,
204                                              long src_y, long src_width,
205                                              long src_height,
206                                              double scale, long rotation,
207                                              LuPixbuf* pixbuf,
208                                              long* errorCode,
209                                              string* error)
210{
211    if ( errorCode != NULL ) {
212        *errorCode = LU_RERR_NO_ERROR;
213    }
214
215    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
216    DjvuDocument *d = (DjvuDocument *)somThis->data;
217
218    //somPrintf( "src_x: %d  src_y: %d  src_width: %d  src_height: %d\n",
219    //            src_x, src_y, src_width, src_height );
220
221    ddjvu_rect_t rrect;
222    ddjvu_rect_t prect;
223    ddjvu_page_t *d_page;
224
225    double page_width, page_height;
226
227    d_page = ddjvu_page_create_by_pageno( d->d_document, pagenum );
228
229    while ( !ddjvu_page_decoding_done( d_page ) ) {
230        djvu_handle_events( d->d_context );
231    }
232
233    page_width = ddjvu_page_get_width( d_page ) * scale * SCALE_FACTOR;
234    page_height = ddjvu_page_get_height( d_page ) * scale * SCALE_FACTOR;
235
236    prect.x = 0;
237    prect.y = 0;
238    prect.w = (int)( page_width + 0.5 );
239    prect.h = (int)( page_height + 0.5 );
240    rrect.x = src_x;
241    rrect.y = ( prect.h - src_y ) - src_height;
242    rrect.w = src_width;
243    rrect.h = src_height;
244
245    long pixbuf_rowsize = pixbuf->getRowSize( ev );
246    long pixbuf_height = pixbuf->getHeight( ev );
247    short bpp = getBpp( somSelf, ev );
248
249    LuPixbuf *pb = new LuPixbuf( ev, rrect.w, rrect.h, bpp );
250    long pb_rowsize = pb->getRowSize( ev );
251    long pb_height = pb->getHeight( ev );
252    char *pbbuf = (char *)pb->getDataPtr( ev );
253    ddjvu_page_render( d_page, DDJVU_RENDER_COLOR,
254                       &prect, &rrect, d->d_format,
255                       pb_rowsize, pbbuf );
256
257    char *pixbuf_data = (char *)pixbuf->getDataPtr( ev );
258    char *src, *dst;
259    int i, y;
260    int rowsize = __min( pb_rowsize, pixbuf_rowsize );
261    int height = __min( pb_height, pixbuf_height );
262    for ( y = (height-1), i = 0; i < height; y--, i++ )
263    {
264        src = pbbuf + (y * pb_rowsize);
265        dst = pixbuf_data + (i * pixbuf_rowsize);
266        memcpy( dst, src, rowsize );
267    }
268    delete pb;
269
270    return TRUE;
271}
272
273
274SOM_Scope boolean  SOMLINK getThumbnailSize(LuDjvuDocument *somSelf,
275                                             Environment *ev,
276                                            long pagenum,
277                                            short suggested_width,
278                                            short* width, short* height)
279{
280    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
281
282    double page_ratio;
283    double p_width = 0, p_height = 0;
284    getPageSize( somSelf, ev, pagenum, &p_width, &p_height );
285
286    page_ratio = p_height / p_width;
287    *width = suggested_width;
288    *height = (short)( suggested_width * page_ratio );
289
290    return TRUE;
291}
292
293
294SOM_Scope LuPixbuf*  SOMLINK getThumbnail(LuDjvuDocument *somSelf,
295                                           Environment *ev, long pagenum,
296                                          short suggested_width)
297{
298    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
299    DjvuDocument *d = (DjvuDocument *)somThis->data;
300
301    short thumb_width = 0, thumb_height = 0;
302    getThumbnailSize( somSelf, ev, pagenum, suggested_width, &thumb_width, &thumb_height );
303
304    while ( ddjvu_thumbnail_status( d->d_document, pagenum, 1 ) < DDJVU_JOB_OK ) {
305        djvu_handle_events( d->d_context );
306    }
307
308    int t_width = thumb_width;
309    int t_height = thumb_height;
310    short bpp = getBpp( somSelf, ev );
311    LuPixbuf *tmppb = new LuPixbuf( ev, thumb_width, thumb_height, bpp );
312    char *tmppb_data = (char *)tmppb->getDataPtr( ev );
313    int tmppb_rowstride = tmppb->getRowSize( ev );
314
315    ddjvu_thumbnail_render( d->d_document, pagenum, &t_width, &t_height,
316                            d->d_format, tmppb_rowstride, tmppb_data );
317
318    LuPixbuf *pixbuf = new LuPixbuf( ev, thumb_width, thumb_height, bpp );
319    char *pixbuf_data = (char *)pixbuf->getDataPtr( ev );
320    int pixbuf_rowstride = pixbuf->getRowSize( ev );
321    char *src, *dst;
322    int i, j;
323    for ( i = 0, j = ( thumb_height - 1 ); i < thumb_height; i++, j-- )
324    {
325        src = tmppb_data + ( j * tmppb_rowstride );
326        dst = pixbuf_data + (i * pixbuf_rowstride);
327        memcpy( dst, src, pixbuf_rowstride );
328    }
329    delete tmppb;
330
331    return pixbuf;
332}
333
334
335SOM_Scope boolean  SOMLINK isSaveable(LuDjvuDocument *somSelf,
336                                       Environment *ev)
337{
338#ifdef __GNUC__
339    return TRUE;
340#else
341    return FALSE;
342#endif
343}
344
345
346SOM_Scope boolean  SOMLINK saveAs(LuDjvuDocument *somSelf,  Environment *ev,
347                                  string filename)
348{
349#ifdef __GNUC__
350    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
351    DjvuDocument *d = (DjvuDocument *)somThis->data;
352
353    FILE *f = NULL;
354    if ( ( f = fopen( filename, "wb" ) ) == NULL ) {
355        return FALSE;
356    }
357
358    ddjvu_job_t *job = ddjvu_document_save( d->d_document, f, 0, NULL );
359    while ( !ddjvu_job_done( job ) ) {
360        djvu_handle_events( d->d_context );
361    }
362    fclose( f );
363
364    return TRUE;
365#else
366    return FALSE;
367#endif
368}
369
370
371SOM_Scope boolean  SOMLINK isPostScriptExportable(LuDjvuDocument *somSelf,
372                                                   Environment *ev)
373{
374#ifdef __GNUC__
375    return TRUE;
376#else
377    return FALSE;
378#endif
379}
380
381
382SOM_Scope boolean  SOMLINK exportToPostScript(LuDjvuDocument *somSelf,
383                                    Environment *ev, string filename,
384                                    long first_page, long last_page,
385                                    double width, double height,
386                                    boolean* brkExport)
387{
388#ifdef __GNUC__
389    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
390    DjvuDocument *d = (DjvuDocument *)somThis->data;
391
392    FILE *f = NULL;
393    if ( ( f = fopen( filename, "wb" ) ) == NULL ) {
394        return FALSE;
395    }
396
397    char pgbuf[ 20 ];
398    snprintf( pgbuf, 20, "-page=%d-%d", first_page + 1, last_page + 1 );
399    const char *optv[] = { pgbuf };
400
401    ddjvu_job_t *job = ddjvu_document_print( d->d_document, f, 1, optv );
402    while ( !ddjvu_job_done( job ) && !(*brkExport) ) {
403        djvu_handle_events( d->d_context );
404    }
405    fclose( f );
406
407    return TRUE;
408#else
409    return FALSE;
410#endif
411}
412
413
414SOM_Scope boolean  SOMLINK isFixedImage(LuDjvuDocument *somSelf,
415                                         Environment *ev)
416{
417    return FALSE;
418}
419
420
421SOM_Scope boolean  SOMLINK isCreateFileThumbnail(LuDjvuDocument *somSelf,
422                                                  Environment *ev)
423{
424    return TRUE;
425}
426
427
428SOM_Scope void SOMLINK somDefaultInit(LuDjvuDocument *somSelf,
429                                      som3InitCtrl* ctrl)
430{
431    LuDjvuDocumentData *somThis;
432    somInitCtrl globalCtrl;
433    somBooleanVector myMask;
434    LuDjvuDocument_BeginInitializer_somDefaultInit;
435    LuDjvuDocument_Init_LuDocument_somDefaultInit(somSelf, ctrl);
436
437    // local LuDjvuDocument initialization code
438    DjvuDocument *d = new DjvuDocument;
439    memset( d, 0, sizeof( DjvuDocument ) );
440    d->d_context = ddjvu_context_create("Lucide");
441    d->d_format = ddjvu_format_create( DDJVU_FORMAT_BGR24, 0, 0 );
442    ddjvu_format_set_row_order( d->d_format, 1 );
443    d->d_document = NULL;
444
445    somThis->data = d;
446}
447
448
449SOM_Scope void SOMLINK somDestruct(LuDjvuDocument *somSelf, octet doFree,
450                                   som3DestructCtrl* ctrl)
451{
452    LuDjvuDocumentData *somThis; // set in BeginDestructor
453    somDestructCtrl globalCtrl;
454    somBooleanVector myMask;
455    LuDjvuDocument_BeginDestructor;
456
457    // local LuDjvuDocument deinitialization code
458    DjvuDocument *d = (DjvuDocument *)somThis->data;
459    if ( d->d_document ) {
460        ddjvu_document_release( d->d_document );
461    }
462    ddjvu_context_release( d->d_context );
463    ddjvu_format_release( d->d_format );
464    delete d;
465    // end of local LuDjvuDocument deinitialization code
466
467    LuDjvuDocument_EndDestructor;
468}
469
470
Note: See TracBrowser for help on using the repository browser.