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

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

better solution for ticket #43

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