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

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

'Go to page' dialog, some play with djvu plugin.

File size: 10.2 KB
Line 
1/*
2 * Copyright (c) 2006, Eugene Romanenko, netlabs.org
3 *
4 *----------------------------------------------------------------------
5 * This file is part of djvu plugin for Lucide (ludjvu).
6 *
7 *  ludjvu is free software; you can redistribute it and/or modify
8 *  it under the terms of the GNU General Public License as published by
9 *  the Free Software Foundation; either version 2 of the License, or
10 *  (at your option) any later version.
11 *
12 *  ludjvu is distributed in the hope that it will be useful,
13 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 *  GNU General Public License for more details.
16 *----------------------------------------------------------------------
17 */
18
19
20/*
21 *  This file was generated by the SOM Compiler.
22 *  Generated using:
23 *     SOM incremental update: 2.24
24 */
25
26
27/*
28 *  This file was generated by the SOM Compiler and Emitter Framework.
29 *  Generated using template emitter:
30 *      SOM Emitter emitxtm: 2.23.1.9
31 */
32
33#ifndef SOM_Module_evdjvu_Source
34#define SOM_Module_evdjvu_Source
35#endif
36#define LuDjvuDocument_Class_Source
37
38#include "ludjvu.xih"
39#ifdef __WATCOMC__
40#include <ddjvuapiw.h>
41#else
42#include <ddjvuapi.h>
43#endif
44#ifdef __GNUC__
45#define __min(a,b)  (((a) < (b)) ? (a) : (b))
46#endif
47
48#define SCALE_FACTOR 0.2
49
50
51struct DjvuDocument
52{
53    ddjvu_context_t  *d_context;
54    ddjvu_document_t *d_document;
55    ddjvu_format_t   *d_format;
56};
57
58
59unsigned _System LibMain( unsigned hmod, unsigned termination )
60{
61    if ( termination ) {
62        /* DLL is detaching from process */
63    } else {
64        /* DLL is attaching to process */
65    }
66    return( 1 );
67}
68
69extern "C" LuDocument * _System createObject()
70{
71    return new LuDjvuDocument;
72}
73
74extern "C" char * _System getSupportedExtensions()
75{
76    return "DJVU;DJV";
77}
78
79extern "C" char * _System getDescription()
80{
81    return "DjVu plugin, based on DjVuLibre.";
82}
83
84
85static void djvu_handle_events( ddjvu_context_t *ctx )
86{
87    const ddjvu_message_t *msg;
88
89    if ( ctx == NULL ) {
90        return;
91    }
92
93    msg = ddjvu_message_wait( ctx );
94    while ( ( msg = ddjvu_message_peek( ctx ) ) )
95    {
96        switch ( msg->m_any.tag )
97        {
98            case DDJVU_ERROR:
99                // TODO: error message
100            default:
101                break;
102        }
103        ddjvu_message_pop( ctx );
104    }
105}
106
107SOM_Scope boolean  SOMLINK loadFile(LuDjvuDocument *somSelf,
108                                     Environment *ev, string filename,
109                                    string password, string* error)
110{
111    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
112    DjvuDocument *d = (DjvuDocument *)somThis->data;
113    ddjvu_document_t *doc;
114
115    doc = ddjvu_document_create_by_filename( d->d_context, filename, TRUE );
116
117    if ( !doc ) {
118        return FALSE;
119    }
120
121    if ( d->d_document ) {
122        ddjvu_document_release( d->d_document );
123    }
124
125    d->d_document = doc;
126
127    while ( !ddjvu_document_decoding_done( d->d_document ) ) {
128        djvu_handle_events( d->d_context );
129    }
130
131    return TRUE;
132}
133
134SOM_Scope short  SOMLINK getBpp(LuDjvuDocument *somSelf,  Environment *ev)
135{
136    return 3;
137}
138
139SOM_Scope boolean  SOMLINK isScalable(LuDjvuDocument *somSelf,
140                                       Environment *ev)
141{
142    return TRUE;
143}
144
145SOM_Scope long  SOMLINK getPageCount(LuDjvuDocument *somSelf,
146                                      Environment *ev)
147{
148    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
149    DjvuDocument *d = (DjvuDocument *)somThis->data;
150    return ddjvu_document_get_pagenum( d->d_document );
151}
152
153SOM_Scope void  SOMLINK getPageSize(LuDjvuDocument *somSelf,
154                                     Environment *ev, long pagenum,
155                                    double* width, double* height)
156{
157    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
158    DjvuDocument *d = (DjvuDocument *)somThis->data;
159
160    ddjvu_pageinfo_t info = { 0 };
161
162    while ( ddjvu_document_get_pageinfo( d->d_document, pagenum, &info ) < DDJVU_JOB_OK ) {
163        djvu_handle_events( d->d_context );
164    }
165
166    if ( width != NULL ) {
167        *width = info.width * SCALE_FACTOR;
168    }
169    if ( height != NULL ) {
170        *height = info.height * SCALE_FACTOR;
171    }
172}
173
174SOM_Scope void  SOMLINK renderPageToPixbuf(LuDjvuDocument *somSelf,
175                                            Environment *ev,
176                                           long pagenum, long src_x,
177                                           long src_y, long src_width,
178                                           long src_height, double scale,
179                                           long rotation, LuPixbuf* pixbuf)
180{
181    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
182    DjvuDocument *d = (DjvuDocument *)somThis->data;
183
184    //somPrintf( "src_x: %d  src_y: %d  src_width: %d  src_height: %d\n",
185    //            src_x, src_y, src_width, src_height );
186
187    ddjvu_rect_t rrect;
188    ddjvu_rect_t prect;
189    ddjvu_page_t *d_page;
190
191    double page_width, page_height;
192
193    d_page = ddjvu_page_create_by_pageno( d->d_document, pagenum );
194
195    while ( !ddjvu_page_decoding_done( d_page ) ) {
196        djvu_handle_events( d->d_context );
197    }
198
199    page_width = ddjvu_page_get_width( d_page ) * scale * SCALE_FACTOR;
200    page_height = ddjvu_page_get_height( d_page ) * scale * SCALE_FACTOR;
201
202    prect.x = 0;
203    prect.y = 0;
204    prect.w = (int)( page_width + 0.5 );
205    prect.h = (int)( page_height + 0.5 );
206    rrect.x = src_x;
207    rrect.y = ( prect.h - src_y ) - src_height;
208    rrect.w = src_width;
209    rrect.h = src_height;
210
211    long pixbuf_rowsize = pixbuf->getRowSize( ev );
212    long pixbuf_height = pixbuf->getHeight( ev );
213    short bpp = getBpp( somSelf, ev );
214
215    LuPixbuf *pb = new LuPixbuf( ev, prect.w, prect.h, bpp );
216    long pb_rowsize = pb->getRowSize( ev );
217    long pb_height = pb->getHeight( ev );
218    char *pbbuf = (char *)pb->getDataPtr( ev );
219    ddjvu_page_render( d_page, DDJVU_RENDER_COLOR,
220                       &prect, &rrect, d->d_format,
221                       pb_rowsize, pbbuf );
222
223    char *pixbuf_data = (char *)pixbuf->getDataPtr( ev );
224    char *src, *dst;
225    int i, y;
226    int rowsize = __min( pb_rowsize, pixbuf_rowsize );
227    int height = __min( pb_height, pixbuf_height );
228    for ( y = (height-1), i = 0; i < height; y--, i++ )
229    {
230        src = pbbuf + (y * pb_rowsize);
231        dst = pixbuf_data + (i * pixbuf_rowsize);
232        memcpy( dst, src, rowsize );
233    }
234    delete pb;
235}
236
237SOM_Scope boolean  SOMLINK getThumbnailSize(LuDjvuDocument *somSelf,
238                                             Environment *ev,
239                                            long pagenum,
240                                            short suggested_width,
241                                            short* width, short* height)
242{
243    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
244
245    double page_ratio;
246    double p_width = 0, p_height = 0;
247    getPageSize( somSelf, ev, pagenum, &p_width, &p_height );
248
249    page_ratio = p_height / p_width;
250    *width = suggested_width;
251    *height = (short)( suggested_width * page_ratio );
252
253    return TRUE;
254}
255
256SOM_Scope LuPixbuf*  SOMLINK getThumbnail(LuDjvuDocument *somSelf,
257                                           Environment *ev, long pagenum,
258                                          short suggested_width)
259{
260    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
261    DjvuDocument *d = (DjvuDocument *)somThis->data;
262
263    short thumb_width = 0, thumb_height = 0;
264    getThumbnailSize( somSelf, ev, pagenum, suggested_width, &thumb_width, &thumb_height );
265
266    while ( ddjvu_thumbnail_status( d->d_document, pagenum, 1 ) < DDJVU_JOB_OK ) {
267        djvu_handle_events( d->d_context );
268    }
269
270    int t_width = thumb_width;
271    int t_height = thumb_height;
272    short bpp = getBpp( somSelf, ev );
273    LuPixbuf *tmppb = new LuPixbuf( ev, thumb_width, thumb_height, bpp );
274    char *tmppb_data = (char *)tmppb->getDataPtr( ev );
275    int tmppb_rowstride = tmppb->getRowSize( ev );
276
277    ddjvu_thumbnail_render( d->d_document, pagenum, &t_width, &t_height,
278                            d->d_format, tmppb_rowstride, tmppb_data );
279
280    LuPixbuf *pixbuf = new LuPixbuf( ev, thumb_width, thumb_height, bpp );
281    char *pixbuf_data = (char *)pixbuf->getDataPtr( ev );
282    int pixbuf_rowstride = pixbuf->getRowSize( ev );
283    char *src, *dst;
284    int i, j;
285    for ( i = 0, j = ( thumb_height - 1 ); i < thumb_height; i++, j-- )
286    {
287        src = tmppb_data + ( j * tmppb_rowstride );
288        dst = pixbuf_data + (i * pixbuf_rowstride);
289        memcpy( dst, src, pixbuf_rowstride );
290    }
291    delete tmppb;
292
293    return pixbuf;
294}
295
296SOM_Scope void SOMLINK somDefaultInit(LuDjvuDocument *somSelf,
297                                      som3InitCtrl* ctrl)
298{
299    LuDjvuDocumentData *somThis;
300    somInitCtrl globalCtrl;
301    somBooleanVector myMask;
302    LuDjvuDocument_BeginInitializer_somDefaultInit;
303    LuDjvuDocument_Init_LuDocument_somDefaultInit(somSelf, ctrl);
304
305    // local LuDjvuDocument initialization code
306    DjvuDocument *d = new DjvuDocument;
307    memset( d, 0, sizeof( DjvuDocument ) );
308    d->d_context = ddjvu_context_create("Lucide");
309    d->d_format = ddjvu_format_create( DDJVU_FORMAT_BGR24, 0, 0 );
310    ddjvu_format_set_row_order( d->d_format, 1 );
311    d->d_document = NULL;
312
313    somThis->data = d;
314}
315
316
317SOM_Scope void SOMLINK somDestruct(LuDjvuDocument *somSelf, octet doFree,
318                                   som3DestructCtrl* ctrl)
319{
320    LuDjvuDocumentData *somThis; /* set in BeginDestructor */
321    somDestructCtrl globalCtrl;
322    somBooleanVector myMask;
323    LuDjvuDocument_BeginDestructor;
324
325    // local LuDjvuDocument deinitialization code
326    DjvuDocument *d = (DjvuDocument *)somThis->data;
327    if ( d->d_document ) {
328        ddjvu_document_release( d->d_document );
329    }
330    ddjvu_context_release( d->d_context );
331    ddjvu_format_release( d->d_format );
332    delete d;
333    // end of local LuDjvuDocument deinitialization code
334
335    LuDjvuDocument_EndDestructor;
336}
337
338
Note: See TracBrowser for help on using the repository browser.