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

Last change on this file since 227 was 227, checked in by Eugene Romanenko, 13 years ago

comment

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