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

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

Writes into EA thumbnail of first page of document

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