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

Last change on this file since 95 was 95, checked in by Eugene Romanenko, 15 years ago

more comments, new method isFixedImage(), fixed keyboard selection of printer in printer dialog

File size: 12.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 _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.";
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 duplex, 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 void SOMLINK somDefaultInit(LuDjvuDocument *somSelf,
393                                      som3InitCtrl* ctrl)
394{
395    LuDjvuDocumentData *somThis;
396    somInitCtrl globalCtrl;
397    somBooleanVector myMask;
398    LuDjvuDocument_BeginInitializer_somDefaultInit;
399    LuDjvuDocument_Init_LuDocument_somDefaultInit(somSelf, ctrl);
400
401    // local LuDjvuDocument initialization code
402    DjvuDocument *d = new DjvuDocument;
403    memset( d, 0, sizeof( DjvuDocument ) );
404    d->d_context = ddjvu_context_create("Lucide");
405    d->d_format = ddjvu_format_create( DDJVU_FORMAT_BGR24, 0, 0 );
406    ddjvu_format_set_row_order( d->d_format, 1 );
407    d->d_document = NULL;
408
409    somThis->data = d;
410}
411
412
413SOM_Scope void SOMLINK somDestruct(LuDjvuDocument *somSelf, octet doFree,
414                                   som3DestructCtrl* ctrl)
415{
416    LuDjvuDocumentData *somThis; // set in BeginDestructor
417    somDestructCtrl globalCtrl;
418    somBooleanVector myMask;
419    LuDjvuDocument_BeginDestructor;
420
421    // local LuDjvuDocument deinitialization code
422    DjvuDocument *d = (DjvuDocument *)somThis->data;
423    if ( d->d_document ) {
424        ddjvu_document_release( d->d_document );
425    }
426    ddjvu_context_release( d->d_context );
427    ddjvu_format_release( d->d_format );
428    delete d;
429    // end of local LuDjvuDocument deinitialization code
430
431    LuDjvuDocument_EndDestructor;
432}
433
434
Note: See TracBrowser for help on using the repository browser.