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

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

fontconfig replacement fixes, removed wrong text in file headers

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