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

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

drawing fixes and improvements, djvu plugin fixes

File size: 10.1 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
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 _System 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 * _System createObject()
67{
68    return new LuDjvuDocument;
69}
70
71extern "C" char * _System getSupportedExtensions()
72{
73    return "DJVU;DJV";
74}
75
76extern "C" char * _System getDescription()
77{
78    return "DjVu plugin, based on DjVuLibre.";
79}
80
81
82static void djvu_handle_events( ddjvu_context_t *ctx )
83{
84    const ddjvu_message_t *msg;
85
86    if ( ctx == NULL ) {
87        return;
88    }
89
90    msg = ddjvu_message_wait( ctx );
91    while ( ( msg = ddjvu_message_peek( ctx ) ) )
92    {
93        switch ( msg->m_any.tag )
94        {
95            case DDJVU_ERROR:
96                // TODO: error message
97            default:
98                break;
99        }
100        ddjvu_message_pop( ctx );
101    }
102}
103
104SOM_Scope boolean  SOMLINK loadFile(LuDjvuDocument *somSelf,
105                                     Environment *ev, string filename,
106                                    string password, string* error)
107{
108    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
109    DjvuDocument *d = (DjvuDocument *)somThis->data;
110    ddjvu_document_t *doc;
111
112    doc = ddjvu_document_create_by_filename( d->d_context, filename, TRUE );
113
114    if ( !doc ) {
115        return FALSE;
116    }
117
118    if ( d->d_document ) {
119        ddjvu_document_release( d->d_document );
120    }
121
122    d->d_document = doc;
123
124    while ( !ddjvu_document_decoding_done( d->d_document ) ) {
125        djvu_handle_events( d->d_context );
126    }
127
128    return TRUE;
129}
130
131SOM_Scope short  SOMLINK getBpp(LuDjvuDocument *somSelf,  Environment *ev)
132{
133    return 3;
134}
135
136SOM_Scope boolean  SOMLINK isScalable(LuDjvuDocument *somSelf,
137                                       Environment *ev)
138{
139    return TRUE;
140}
141
142SOM_Scope long  SOMLINK getPageCount(LuDjvuDocument *somSelf,
143                                      Environment *ev)
144{
145    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
146    DjvuDocument *d = (DjvuDocument *)somThis->data;
147    return ddjvu_document_get_pagenum( d->d_document );
148}
149
150SOM_Scope void  SOMLINK getPageSize(LuDjvuDocument *somSelf,
151                                     Environment *ev, long pagenum,
152                                    double* width, double* height)
153{
154    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
155    DjvuDocument *d = (DjvuDocument *)somThis->data;
156
157    ddjvu_pageinfo_t info = { 0 };
158
159    while ( ddjvu_document_get_pageinfo( d->d_document, pagenum, &info ) < DDJVU_JOB_OK ) {
160        djvu_handle_events( d->d_context );
161    }
162
163    if ( width != NULL ) {
164        *width = info.width * SCALE_FACTOR;
165    }
166    if ( height != NULL ) {
167        *height = info.height * SCALE_FACTOR;
168    }
169}
170
171SOM_Scope void  SOMLINK renderPageToPixbuf(LuDjvuDocument *somSelf,
172                                            Environment *ev,
173                                           long pagenum, long src_x,
174                                           long src_y, long src_width,
175                                           long src_height, double scale,
176                                           long rotation, LuPixbuf* pixbuf)
177{
178    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
179    DjvuDocument *d = (DjvuDocument *)somThis->data;
180
181    //somPrintf( "src_x: %d  src_y: %d  src_width: %d  src_height: %d\n",
182    //            src_x, src_y, src_width, src_height );
183
184    ddjvu_rect_t rrect;
185    ddjvu_rect_t prect;
186    ddjvu_page_t *d_page;
187
188    double page_width, page_height;
189
190    d_page = ddjvu_page_create_by_pageno( d->d_document, pagenum );
191
192    while ( !ddjvu_page_decoding_done( d_page ) ) {
193        djvu_handle_events( d->d_context );
194    }
195
196    page_width = ddjvu_page_get_width( d_page ) * scale * SCALE_FACTOR;
197    page_height = ddjvu_page_get_height( d_page ) * scale * SCALE_FACTOR;
198
199    prect.x = 0;
200    prect.y = 0;
201    prect.w = (int)( page_width + 0.5 );
202    prect.h = (int)( page_height + 0.5 );
203    rrect.x = src_x;
204    rrect.y = ( prect.h - src_y ) - src_height;
205    rrect.w = src_width;
206    rrect.h = src_height;
207
208    long pixbuf_rowsize = pixbuf->getRowSize( ev );
209    long pixbuf_height = pixbuf->getHeight( ev );
210    short bpp = getBpp( somSelf, ev );
211
212    LuPixbuf *pb = new LuPixbuf( ev, prect.w, prect.h, bpp );
213    long pb_rowsize = pb->getRowSize( ev );
214    long pb_height = pb->getHeight( ev );
215    char *pbbuf = (char *)pb->getDataPtr( ev );
216    ddjvu_page_render( d_page, DDJVU_RENDER_COLOR,
217                       &prect, &rrect, d->d_format,
218                       pb_rowsize, pbbuf );
219
220    char *pixbuf_data = (char *)pixbuf->getDataPtr( ev );
221    char *src, *dst;
222    int i, y;
223    int rowsize = __min( pb_rowsize, pixbuf_rowsize );
224    int height = __min( pb_height, pixbuf_height );
225    for ( y = (height-1), i = 0; i < height; y--, i++ )
226    {
227        src = pbbuf + (y * pb_rowsize);
228        dst = pixbuf_data + (i * pixbuf_rowsize);
229        memcpy( dst, src, rowsize );
230    }
231    delete pb;
232}
233
234SOM_Scope boolean  SOMLINK getThumbnailSize(LuDjvuDocument *somSelf,
235                                             Environment *ev,
236                                            long pagenum,
237                                            short suggested_width,
238                                            short* width, short* height)
239{
240    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
241
242    double page_ratio;
243    double p_width = 0, p_height = 0;
244    getPageSize( somSelf, ev, pagenum, &p_width, &p_height );
245
246    page_ratio = p_height / p_width;
247    *width = suggested_width;
248    *height = (short)( suggested_width * page_ratio );
249
250    return TRUE;
251}
252
253SOM_Scope LuPixbuf*  SOMLINK getThumbnail(LuDjvuDocument *somSelf,
254                                           Environment *ev, long pagenum,
255                                          short suggested_width)
256{
257    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
258    DjvuDocument *d = (DjvuDocument *)somThis->data;
259
260    short thumb_width = 0, thumb_height = 0;
261    getThumbnailSize( somSelf, ev, pagenum, suggested_width, &thumb_width, &thumb_height );
262
263    while ( ddjvu_thumbnail_status( d->d_document, pagenum, 1 ) < DDJVU_JOB_OK ) {
264        djvu_handle_events( d->d_context );
265    }
266
267    int t_width = thumb_width;
268    int t_height = thumb_height;
269    short bpp = getBpp( somSelf, ev );
270    LuPixbuf *tmppb = new LuPixbuf( ev, thumb_width, thumb_height, bpp );
271    char *tmppb_data = (char *)tmppb->getDataPtr( ev );
272    int tmppb_rowstride = tmppb->getRowSize( ev );
273
274    ddjvu_thumbnail_render( d->d_document, pagenum, &t_width, &t_height,
275                            d->d_format, tmppb_rowstride, tmppb_data );
276
277    LuPixbuf *pixbuf = new LuPixbuf( ev, thumb_width, thumb_height, bpp );
278    char *pixbuf_data = (char *)pixbuf->getDataPtr( ev );
279    int pixbuf_rowstride = pixbuf->getRowSize( ev );
280    char *src, *dst;
281    int i, j;
282    for ( i = 0, j = ( thumb_height - 1 ); i < thumb_height; i++, j-- )
283    {
284        src = tmppb_data + ( j * tmppb_rowstride );
285        dst = pixbuf_data + (i * pixbuf_rowstride);
286        memcpy( dst, src, pixbuf_rowstride );
287    }
288    delete tmppb;
289
290    return pixbuf;
291}
292
293SOM_Scope void SOMLINK somDefaultInit(LuDjvuDocument *somSelf,
294                                      som3InitCtrl* ctrl)
295{
296    LuDjvuDocumentData *somThis;
297    somInitCtrl globalCtrl;
298    somBooleanVector myMask;
299    LuDjvuDocument_BeginInitializer_somDefaultInit;
300    LuDjvuDocument_Init_LuDocument_somDefaultInit(somSelf, ctrl);
301
302    // local LuDjvuDocument initialization code
303    DjvuDocument *d = new DjvuDocument;
304    memset( d, 0, sizeof( DjvuDocument ) );
305    d->d_context = ddjvu_context_create("Lucide");
306    d->d_format = ddjvu_format_create( DDJVU_FORMAT_BGR24, 0, 0 );
307    ddjvu_format_set_row_order( d->d_format, 1 );
308    d->d_document = NULL;
309
310    somThis->data = d;
311}
312
313
314SOM_Scope void SOMLINK somDestruct(LuDjvuDocument *somSelf, octet doFree,
315                                   som3DestructCtrl* ctrl)
316{
317    LuDjvuDocumentData *somThis; /* set in BeginDestructor */
318    somDestructCtrl globalCtrl;
319    somBooleanVector myMask;
320    LuDjvuDocument_BeginDestructor;
321
322    // local LuDjvuDocument deinitialization code
323    DjvuDocument *d = (DjvuDocument *)somThis->data;
324    if ( d->d_document ) {
325        ddjvu_document_release( d->d_document );
326    }
327    ddjvu_context_release( d->d_context );
328    ddjvu_format_release( d->d_format );
329    delete d;
330    // end of local LuDjvuDocument deinitialization code
331
332    LuDjvuDocument_EndDestructor;
333}
334
335
Note: See TracBrowser for help on using the repository browser.