72
djvu_handle_events (DjvuDocument *djvu_document, int wait)
71
#define EV_DJVU_ERROR ev_djvu_error_quark ()
74
ev_djvu_error_quark (void)
78
q = g_quark_from_static_string ("ev-djvu-quark");
84
handle_message (const ddjvu_message_t *msg, GError **error)
86
switch (msg->m_any.tag) {
90
if (msg->m_error.filename) {
91
error_str = g_strdup_printf ("DjvuLibre error: %s:%d",
92
msg->m_error.filename,
95
error_str = g_strdup_printf ("DjvuLibre error: %s",
96
msg->m_error.message);
100
g_set_error_literal (error, EV_DJVU_ERROR, 0, error_str);
102
g_warning ("%s", error_str);
115
djvu_handle_events (DjvuDocument *djvu_document, int wait, GError **error)
74
117
ddjvu_context_t *ctx = djvu_document->d_context;
75
118
const ddjvu_message_t *msg;
81
msg = ddjvu_message_wait (ctx);
124
ddjvu_message_wait (ctx);
83
126
while ((msg = ddjvu_message_peek (ctx))) {
84
switch (msg->m_any.tag) {
86
g_warning ("DjvuLibre error: %s",
87
msg->m_error.message);
88
if (msg->m_error.filename)
89
g_warning ("DjvuLibre error: %s:%d",
90
msg->m_error.filename,
96
ddjvu_message_pop (ctx);
127
handle_message (msg, error);
128
ddjvu_message_pop (ctx);
135
djvu_wait_for_message (DjvuDocument *djvu_document, ddjvu_message_tag_t message, GError **error)
137
ddjvu_context_t *ctx = djvu_document->d_context;
138
const ddjvu_message_t *msg;
140
ddjvu_message_wait (ctx);
141
while ((msg = ddjvu_message_peek (ctx)) && (msg->m_any.tag != message)) {
142
handle_message (msg, error);
143
ddjvu_message_pop (ctx);
147
if (msg && msg->m_any.tag == message)
148
ddjvu_message_pop (ctx);
125
177
djvu_document->d_document = doc;
127
while (!ddjvu_document_decoding_done (djvu_document->d_document))
128
djvu_handle_events (djvu_document, TRUE);
179
djvu_wait_for_message (djvu_document, DDJVU_DOCINFO, &djvu_error);
181
g_set_error_literal (error,
183
EV_DOCUMENT_ERROR_INVALID,
184
djvu_error->message);
185
g_error_free (djvu_error);
187
ddjvu_document_release (djvu_document->d_document);
188
djvu_document->d_document = NULL;
193
if (ddjvu_document_decoding_error (djvu_document->d_document))
194
djvu_handle_events (djvu_document, TRUE, &djvu_error);
197
g_set_error_literal (error,
199
EV_DOCUMENT_ERROR_INVALID,
200
djvu_error->message);
201
g_error_free (djvu_error);
203
ddjvu_document_release (djvu_document->d_document);
204
djvu_document->d_document = NULL;
129
209
g_free (djvu_document->uri);
130
210
djvu_document->uri = g_strdup (uri);
198
djvu_document_get_page_size (EvDocument *document,
278
document_get_page_size (DjvuDocument *djvu_document,
203
DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
204
ddjvu_pageinfo_t info;
283
ddjvu_pageinfo_t info;
205
284
ddjvu_status_t r;
207
g_return_if_fail (djvu_document->d_document);
209
286
while ((r = ddjvu_document_get_pageinfo(djvu_document->d_document, page, &info)) < DDJVU_JOB_OK)
210
djvu_handle_events(djvu_document, TRUE);
287
djvu_handle_events(djvu_document, TRUE, NULL);
212
289
if (r >= DDJVU_JOB_FAILED)
213
djvu_handle_events(djvu_document, TRUE);
290
djvu_handle_events(djvu_document, TRUE, NULL);
215
292
*width = info.width * SCALE_FACTOR;
216
293
*height = info.height * SCALE_FACTOR;
297
djvu_document_get_page_size (EvDocument *document,
302
DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
304
g_return_if_fail (djvu_document->d_document);
306
document_get_page_size (djvu_document, page->index,
219
310
static cairo_surface_t *
220
311
djvu_document_render (EvDocument *document,
221
312
EvRenderContext *rc)
231
322
double page_width, page_height, tmp;
232
323
static const cairo_user_data_key_t key;
234
d_page = ddjvu_page_create_by_pageno (djvu_document->d_document, rc->page);
325
d_page = ddjvu_page_create_by_pageno (djvu_document->d_document, rc->page->index);
236
327
while (!ddjvu_page_decoding_done (d_page))
237
djvu_handle_events(djvu_document, TRUE);
328
djvu_handle_events(djvu_document, TRUE, NULL);
239
330
page_width = ddjvu_page_get_width (d_page) * rc->scale * SCALE_FACTOR + 0.5;
240
331
page_height = ddjvu_page_get_height (d_page) * rc->scale * SCALE_FACTOR + 0.5;
438
djvu_text_copy (DjvuDocument *djvu_document,
440
EvRectangle *rectangle)
446
ddjvu_document_get_pagetext (djvu_document->d_document,
447
page, "char")) == miniexp_dummy)
448
djvu_handle_events (djvu_document, TRUE, NULL);
450
if (page_text != miniexp_nil) {
451
DjvuTextPage *page = djvu_text_page_new (page_text);
453
text = djvu_text_page_copy (page, rectangle);
454
djvu_text_page_free (page);
455
ddjvu_miniexp_release (djvu_document->d_document, page_text);
350
462
djvu_selection_get_selected_text (EvSelection *selection,
351
463
EvRenderContext *rc,
352
464
EvSelectionStyle style,
423
535
gdk_pixbuf_fill (pixbuf, 0xffffffff);
424
536
pixels = gdk_pixbuf_get_pixels (pixbuf);
426
while (ddjvu_thumbnail_status (djvu_document->d_document, rc->page, 1) < DDJVU_JOB_OK)
427
djvu_handle_events(djvu_document, TRUE);
538
while (ddjvu_thumbnail_status (djvu_document->d_document, rc->page->index, 1) < DDJVU_JOB_OK)
539
djvu_handle_events(djvu_document, TRUE, NULL);
429
ddjvu_thumbnail_render (djvu_document->d_document, rc->page,
541
ddjvu_thumbnail_render (djvu_document->d_document, rc->page->index,
430
542
&thumb_width, &thumb_height,
431
543
djvu_document->thumbs_format,
432
544
gdk_pixbuf_get_rowstride (pixbuf),
536
648
djvu_document->d_document = NULL;
540
djvu_document_find_begin (EvDocumentFind *document,
542
const char *search_string,
543
gboolean case_sensitive)
652
djvu_document_find_find_text (EvDocumentFind *document,
655
gboolean case_sensitive)
545
657
DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
547
if (djvu_document->search &&
548
strcmp (search_string, djvu_text_get_text (djvu_document->search)) == 0)
551
if (djvu_document->search)
552
djvu_text_free (djvu_document->search);
554
djvu_document->search = djvu_text_new (djvu_document,
561
djvu_document_find_get_n_results (EvDocumentFind *document_find, int page)
563
DjvuText *search = DJVU_DOCUMENT (document_find)->search;
566
return djvu_text_n_results (search, page);
573
djvu_document_find_get_result (EvDocumentFind *document_find,
576
EvRectangle *rectangle)
578
DjvuDocument *djvu_document = DJVU_DOCUMENT (document_find);
579
DjvuText *search = djvu_document->search;
581
double width, height;
586
r = djvu_text_get_result (search, page, n_result);
590
djvu_document_get_page_size (EV_DOCUMENT (djvu_document),
591
page, &width, &height);
592
rectangle->x1 = r->x1 * SCALE_FACTOR;
593
rectangle->y1 = height - r->y2 * SCALE_FACTOR;
594
rectangle->x2 = r->x2 * SCALE_FACTOR;
595
rectangle->y2 = height - r->y1 * SCALE_FACTOR;
601
djvu_document_find_page_has_results (EvDocumentFind *document_find,
604
DjvuText *search = DJVU_DOCUMENT (document_find)->search;
606
return search && djvu_text_has_results (search, page);
610
djvu_document_find_get_progress (EvDocumentFind *document_find)
612
DjvuText *search = DJVU_DOCUMENT (document_find)->search;
659
gdouble width, height;
660
GList *matches = NULL, *l;
662
g_return_val_if_fail (text != NULL, NULL);
664
while ((page_text = ddjvu_document_get_pagetext (djvu_document->d_document,
666
"char")) == miniexp_dummy)
667
djvu_handle_events (djvu_document, TRUE, NULL);
669
if (page_text != miniexp_nil) {
670
DjvuTextPage *tpage = djvu_text_page_new (page_text);
672
djvu_text_page_prepare_search (tpage, case_sensitive);
673
if (tpage->links->len > 0) {
674
djvu_text_page_search (tpage, text);
675
matches = tpage->results;
677
djvu_text_page_free (tpage);
678
ddjvu_miniexp_release (djvu_document->d_document, page_text);
684
document_get_page_size (djvu_document, page->index, &width, &height);
685
for (l = matches; l && l->data; l = g_list_next (l)) {
686
EvRectangle *r = (EvRectangle *)l->data;
691
r->x1 *= SCALE_FACTOR;
692
r->x2 *= SCALE_FACTOR;
695
r->y1 = height - r->y2 * SCALE_FACTOR;
696
r->y2 = height - tmp * SCALE_FACTOR;
614
if (search == NULL) {
618
return djvu_text_get_progress (search);
622
djvu_document_find_cancel (EvDocumentFind *document)
624
DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
626
if (djvu_document->search) {
627
djvu_text_free (djvu_document->search);
628
djvu_document->search = NULL;
633
704
djvu_document_find_iface_init (EvDocumentFindIface *iface)
635
iface->begin = djvu_document_find_begin;
636
iface->get_n_results = djvu_document_find_get_n_results;
637
iface->get_result = djvu_document_find_get_result;
638
iface->page_has_results = djvu_document_find_page_has_results;
639
iface->get_progress = djvu_document_find_get_progress;
640
iface->cancel = djvu_document_find_cancel;
706
iface->find_text = djvu_document_find_find_text;