source: trunk/Lucide/plugins/ludjvu/ludjvu.cpp @ 522

Last change on this file since 522 was 367, checked in by dmik, 12 years ago

Merged bramches/kmk (r294:365) to trunk.

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