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

Last change on this file since 47 was 36, checked in by Eugene Romanenko, 16 years ago

djvu plugin should be GPL, as uses GPL code

File size: 9.9 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 *  You should have received a copy of the GNU General Public License
18 *  along with gtk-gnutella; if not, write to the Free Software
19 *  Foundation, Inc.:
20 *      59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
21 *----------------------------------------------------------------------
22 */
23
24
25/*
26 *  This file was generated by the SOM Compiler.
27 *  Generated using:
28 *     SOM incremental update: 2.24
29 */
30
31
32/*
33 *  This file was generated by the SOM Compiler and Emitter Framework.
34 *  Generated using template emitter:
35 *      SOM Emitter emitxtm: 2.23.1.9
36 */
37
38#ifndef SOM_Module_evdjvu_Source
39#define SOM_Module_evdjvu_Source
40#endif
41#define LuDjvuDocument_Class_Source
42
43#include "ludjvu.xih"
44#include <ddjvuapiw.h>
45
46
47#define SCALE_FACTOR 0.2
48
49
50struct DjvuDocument
51{
52    ddjvu_context_t  *d_context;
53    ddjvu_document_t *d_document;
54    ddjvu_format_t   *d_format;
55};
56
57
58unsigned _System LibMain( unsigned hmod, unsigned termination )
59{
60    if ( termination ) {
61        /* DLL is detaching from process */
62    } else {
63        /* DLL is attaching to process */
64    }
65    return( 1 );
66}
67
68extern "C" LuDocument * _System createObject()
69{
70    return new LuDjvuDocument;
71}
72
73extern "C" char * _System getSupportedExtensions()
74{
75    return "DJVU";
76}
77
78extern "C" char * _System getDescription()
79{
80    return "DjVu plugin, based on DjVuLibre.";
81}
82
83SOM_Scope boolean  SOMLINK loadFile(LuDjvuDocument *somSelf,
84                                     Environment *ev, string filename,
85                                    string password, string* error)
86{
87    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
88    DjvuDocument *d = (DjvuDocument *)somThis->data;
89    ddjvu_document_t *doc;
90
91    doc = ddjvu_document_create_by_filename( d->d_context, filename, TRUE );
92
93    if ( !doc ) {
94        return FALSE;
95    }
96
97    if ( d->d_document ) {
98        ddjvu_document_release( d->d_document );
99    }
100
101    d->d_document = doc;
102
103    while ( !ddjvu_document_decoding_done( d->d_document ) ) {
104        ddjvu_message_wait( d->d_context );
105        ddjvu_message_pop( d->d_context );
106    }
107
108    return TRUE;
109}
110
111SOM_Scope short  SOMLINK getBpp(LuDjvuDocument *somSelf,  Environment *ev)
112{
113    return 3;
114}
115
116SOM_Scope boolean  SOMLINK isScalable(LuDjvuDocument *somSelf,
117                                       Environment *ev)
118{
119    return TRUE;
120}
121
122SOM_Scope long  SOMLINK getPageCount(LuDjvuDocument *somSelf,
123                                      Environment *ev)
124{
125    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
126    DjvuDocument *d = (DjvuDocument *)somThis->data;
127    return ddjvu_document_get_pagenum( d->d_document );
128}
129
130SOM_Scope void  SOMLINK getPageSize(LuDjvuDocument *somSelf,
131                                     Environment *ev, long pagenum,
132                                    double* width, double* height)
133{
134    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
135    DjvuDocument *d = (DjvuDocument *)somThis->data;
136
137    ddjvu_pageinfo_t info = { 0 };
138
139    while ( ddjvu_document_get_pageinfo( d->d_document, pagenum, &info ) < DDJVU_JOB_OK ) {
140        ddjvu_message_wait( d->d_context );
141        ddjvu_message_pop( d->d_context );
142    }
143
144    if ( width != NULL ) {
145        *width = info.width * SCALE_FACTOR;
146    }
147    if ( height != NULL ) {
148        *height = info.height * SCALE_FACTOR;
149    }
150}
151
152SOM_Scope void  SOMLINK renderPageToPixbuf(LuDjvuDocument *somSelf,
153                                            Environment *ev,
154                                           long pagenum, long src_x,
155                                           long src_y, long src_width,
156                                           long src_height, double scale,
157                                           long rotation, LuPixbuf* pixbuf)
158{
159    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
160    DjvuDocument *d = (DjvuDocument *)somThis->data;
161
162    //somPrintf( "src_x: %d  src_y: %d  src_width: %d  src_height: %d\n",
163    //            src_x, src_y, src_width, src_height );
164
165    ddjvu_rect_t rrect;
166    ddjvu_rect_t prect;
167    ddjvu_page_t *d_page;
168
169    double page_width, page_height;
170
171    d_page = ddjvu_page_create_by_pageno( d->d_document, pagenum );
172
173    while ( !ddjvu_page_decoding_done( d_page ) ) {
174        ddjvu_message_wait( d->d_context );
175        ddjvu_message_pop( d->d_context );
176    }
177
178    page_width = ddjvu_page_get_width( d_page ) * scale * SCALE_FACTOR;
179    page_height = ddjvu_page_get_height( d_page ) * scale * SCALE_FACTOR;
180
181    prect.x = 0;
182    prect.y = 0;
183    prect.w = (int)( page_width + 0.5 );
184    prect.h = (int)( page_height + 0.5 );
185    rrect.x = src_x;
186    rrect.y = ( prect.h - src_y ) - src_height;
187    rrect.w = src_width;
188    rrect.h = src_height;
189
190    long pixbuf_rowsize = pixbuf->getRowSize( ev );
191    long pixbuf_height = pixbuf->getHeight( ev );
192    short bpp = getBpp( somSelf, ev );
193
194    LuPixbuf *pb = new LuPixbuf( ev, prect.w, prect.h, bpp );
195    long pb_rowsize = pb->getRowSize( ev );
196    char *pbbuf = (char *)pb->getDataPtr( ev );
197    ddjvu_page_render( d_page, DDJVU_RENDER_COLOR,
198                       &prect, &rrect, d->d_format,
199                       pb_rowsize, pbbuf );
200
201    char *pixbuf_data = (char *)pixbuf->getDataPtr( ev );
202    char *src, *dst;
203    int i, y;
204    for ( y = (src_height-1), i = 0; i < src_height; y--, i++ )
205    {
206        src = pbbuf + (y * pb_rowsize);
207        dst = pixbuf_data + (i * pixbuf_rowsize);
208        memcpy( dst, src, src_width * bpp );
209    }
210    delete pb;
211}
212
213SOM_Scope boolean  SOMLINK getThumbnailSize(LuDjvuDocument *somSelf,
214                                             Environment *ev,
215                                            long pagenum,
216                                            short suggested_width,
217                                            short* width, short* height)
218{
219    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
220   
221    double page_ratio;
222    double p_width = 0, p_height = 0;
223    getPageSize( somSelf, ev, pagenum, &p_width, &p_height );
224
225    page_ratio = p_height / p_width;
226    *width = suggested_width;
227    *height = (short)( suggested_width * page_ratio );
228
229    return TRUE;
230}
231
232SOM_Scope LuPixbuf*  SOMLINK getThumbnail(LuDjvuDocument *somSelf,
233                                           Environment *ev, long pagenum,
234                                          short suggested_width)
235{
236    LuDjvuDocumentData *somThis = LuDjvuDocumentGetData(somSelf);
237    DjvuDocument *d = (DjvuDocument *)somThis->data;
238
239    short thumb_width = 0, thumb_height = 0;
240    getThumbnailSize( somSelf, ev, pagenum, suggested_width, &thumb_width, &thumb_height );
241
242    while ( ddjvu_thumbnail_status( d->d_document, pagenum, 1 ) < DDJVU_JOB_OK ) {
243            ddjvu_message_wait( d->d_context );
244            ddjvu_message_pop( d->d_context ); 
245    }
246       
247    int t_width = thumb_width;
248    int t_height = thumb_height;
249    short bpp = getBpp( somSelf, ev );
250    LuPixbuf *tmppb = new LuPixbuf( ev, thumb_width, thumb_height, bpp );
251    char *tmppb_data = (char *)tmppb->getDataPtr( ev );
252    int tmppb_rowstride = tmppb->getRowSize( ev );
253
254    ddjvu_thumbnail_render( d->d_document, pagenum, &t_width, &t_height,
255                            d->d_format, tmppb_rowstride, tmppb_data );
256
257    LuPixbuf *pixbuf = new LuPixbuf( ev, thumb_width, thumb_height, bpp );
258    char *pixbuf_data = (char *)pixbuf->getDataPtr( ev );
259    int pixbuf_rowstride = pixbuf->getRowSize( ev );
260    char *src, *dst;
261    int i, j;
262    for ( i = 0, j = ( thumb_height - 1 ); i < thumb_height; i++, j-- )
263    {
264        src = tmppb_data + ( j * tmppb_rowstride );
265        dst = pixbuf_data + (i * pixbuf_rowstride);
266        memcpy( dst, src, pixbuf_rowstride );
267    }
268    delete tmppb;
269
270    return pixbuf;
271}
272
273SOM_Scope void SOMLINK somDefaultInit(LuDjvuDocument *somSelf,
274                                      som3InitCtrl* ctrl)
275{
276    LuDjvuDocumentData *somThis;
277    somInitCtrl globalCtrl;
278    somBooleanVector myMask;
279    LuDjvuDocument_BeginInitializer_somDefaultInit;
280    LuDjvuDocument_Init_LuDocument_somDefaultInit(somSelf, ctrl);
281
282    // local LuDjvuDocument initialization code
283    DjvuDocument *d = new DjvuDocument;
284    memset( d, 0, sizeof( DjvuDocument ) );
285    d->d_context = ddjvu_context_create("Lucide");
286    d->d_format = ddjvu_format_create( DDJVU_FORMAT_BGR24, 0, 0 );
287    ddjvu_format_set_row_order( d->d_format, 1 );
288    d->d_document = NULL;
289
290    somThis->data = d;
291}
292
293
294SOM_Scope void SOMLINK somDestruct(LuDjvuDocument *somSelf, octet doFree,
295                                   som3DestructCtrl* ctrl)
296{
297    LuDjvuDocumentData *somThis; /* set in BeginDestructor */
298    somDestructCtrl globalCtrl;
299    somBooleanVector myMask;
300    LuDjvuDocument_BeginDestructor;
301
302    // local LuDjvuDocument deinitialization code
303    DjvuDocument *d = (DjvuDocument *)somThis->data;
304    if ( d->d_document ) {
305        ddjvu_document_release( d->d_document );
306    }
307    ddjvu_context_release( d->d_context );
308    ddjvu_format_release( d->d_format );
309    delete d;
310    // end of local LuDjvuDocument deinitialization code
311
312    LuDjvuDocument_EndDestructor;
313}
314
315
Note: See TracBrowser for help on using the repository browser.