Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/pdf/ev-poppler.cc
diff options
context:
space:
mode:
authorMarco Pesenti Gritti <mpg@redhat.com>2005-06-13 18:45:06 (GMT)
committer Marco Pesenti Gritti <marco@src.gnome.org>2005-06-13 18:45:06 (GMT)
commit7fef38d9e59026334152230f1cd847e163e8457c (patch)
tree83fb7731c11b20f6447c6e50cd62b1253acb0360 /pdf/ev-poppler.cc
parent2b426ab269babe95b051894c1484929543e19ce9 (diff)
Separate scan and fill so that we can incrementally fill from the main
2005-06-13 Marco Pesenti Gritti <mpg@redhat.com> * backend/ev-document-fonts.c: (ev_document_fonts_get_progress), (ev_document_fonts_scan), (ev_document_fonts_fill_model): * backend/ev-document-fonts.h: Separate scan and fill so that we can incrementally fill from the main thread. Add a progress api. * data/evince-properties.glade: * pdf/ev-poppler.cc: * shell/ev-jobs.c: (ev_job_fonts_new), (ev_job_fonts_run): * shell/ev-jobs.h: * shell/ev-properties.c: (update_progress_label), (job_fonts_finished_cb), (setup_fonts_view): Incrementally feel the list and show the progress percentage in a label like acrobat does.
Diffstat (limited to 'pdf/ev-poppler.cc')
-rw-r--r--pdf/ev-poppler.cc73
1 files changed, 54 insertions, 19 deletions
diff --git a/pdf/ev-poppler.cc b/pdf/ev-poppler.cc
index 8d555af..7c60d9c 100644
--- a/pdf/ev-poppler.cc
+++ b/pdf/ev-poppler.cc
@@ -56,6 +56,10 @@ struct _PdfDocument
PopplerPSFile *ps_file;
gchar *password;
+ PopplerFontInfo *font_info;
+ PopplerFontsIter *fonts_iter;
+ int fonts_scanned_pages;
+
PdfDocumentSearch *search;
};
@@ -100,6 +104,14 @@ pdf_document_dispose (GObject *object)
if (pdf_document->document) {
g_object_unref (pdf_document->document);
}
+
+ if (pdf_document->font_info) {
+ poppler_font_info_free (pdf_document->font_info);
+ }
+
+ if (pdf_document->fonts_iter) {
+ poppler_fonts_iter_free (pdf_document->fonts_iter);
+ }
}
static void
@@ -495,28 +507,55 @@ pdf_document_security_iface_init (EvDocumentSecurityIface *iface)
iface->set_password = pdf_document_set_password;
}
+static gdouble
+pdf_document_fonts_get_progress (EvDocumentFonts *document_fonts)
+{
+ PdfDocument *pdf_document = PDF_DOCUMENT (document_fonts);
+ int n_pages;
+
+ n_pages = pdf_document_get_n_pages (EV_DOCUMENT (pdf_document));
+
+ return (double)pdf_document->fonts_scanned_pages / (double)n_pages;
+}
+
static gboolean
-pdf_document_fonts_fill_model (EvDocumentFonts *document_fonts,
- GtkTreeModel *model,
- int n_pages)
+pdf_document_fonts_scan (EvDocumentFonts *document_fonts,
+ int n_pages)
{
-#ifdef POPPLER_FONT_INFO
PdfDocument *pdf_document = PDF_DOCUMENT (document_fonts);
- PopplerFontInfo *info;
- PopplerFontsIter *iter;
gboolean result;
g_return_val_if_fail (PDF_IS_DOCUMENT (document_fonts), FALSE);
- info = (PopplerFontInfo *)g_object_get_data (G_OBJECT (model), "font_info");
- if (info == NULL) {
- info = poppler_font_info_new (pdf_document->document);
- g_object_set_data_full (G_OBJECT (model), "font_info",
- (PopplerFontInfo *)info,
- (GDestroyNotify)poppler_font_info_free);
+ if (pdf_document->font_info == NULL) {
+ pdf_document->font_info = poppler_font_info_new (pdf_document->document);
+ }
+
+ if (pdf_document->fonts_iter) {
+ poppler_fonts_iter_free (pdf_document->fonts_iter);
}
- result = poppler_font_info_scan (info, n_pages, &iter);
+ pdf_document->fonts_scanned_pages += n_pages;
+
+ result = poppler_font_info_scan (pdf_document->font_info, n_pages,
+ &pdf_document->fonts_iter);
+ if (!result) {
+ pdf_document->fonts_scanned_pages = 0;
+ poppler_font_info_free (pdf_document->font_info);
+ pdf_document->font_info = NULL;
+ }
+
+ return result;
+}
+
+static void
+pdf_document_fonts_fill_model (EvDocumentFonts *document_fonts,
+ GtkTreeModel *model)
+{
+ PdfDocument *pdf_document = PDF_DOCUMENT (document_fonts);
+ PopplerFontsIter *iter = pdf_document->fonts_iter;
+
+ g_return_if_fail (PDF_IS_DOCUMENT (document_fonts));
if (iter) {
do {
@@ -530,19 +569,15 @@ pdf_document_fonts_fill_model (EvDocumentFonts *document_fonts,
EV_DOCUMENT_FONTS_COLUMN_NAME, name,
-1);
} while (poppler_fonts_iter_next (iter));
- poppler_fonts_iter_free (iter);
}
-
- return result;
-#else
- return FALSE;
-#endif
}
static void
pdf_document_document_fonts_iface_init (EvDocumentFontsIface *iface)
{
iface->fill_model = pdf_document_fonts_fill_model;
+ iface->scan = pdf_document_fonts_scan;
+ iface->get_progress = pdf_document_fonts_get_progress;
}
static gboolean