*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include "config.h"
#include <libxml/xpath.h>
#include <libxml/xpathInternals.h>
-#if (defined (HAVE_POPPLER_PAGE_RENDER)) && (defined (HAVE_CAIRO_PDF) || defined (HAVE_CAIRO_PS))
+#if (defined (HAVE_CAIRO_PDF) || defined (HAVE_CAIRO_PS))
#define HAVE_CAIRO_PRINT
#endif
/* license field from Creative Commons schema, http://creativecommons.org/ns */
#define LICENSE_URI "/x:xmpmeta/rdf:RDF/rdf:Description/cc:license/@rdf:resource"
-typedef struct {
- PdfDocument *document;
- char *text;
- GList **pages;
- guint idle;
- int start_page;
- int search_page;
-} PdfDocumentSearch;
-
typedef struct {
EvFileExporterFormat format;
PopplerFontsIter *fonts_iter;
int fonts_scanned_pages;
- PdfDocumentSearch *search;
PdfPrintContext *print_ctx;
GList *layers;
};
-static void pdf_document_security_iface_init (EvDocumentSecurityIface *iface);
-static void pdf_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface);
-static void pdf_document_document_links_iface_init (EvDocumentLinksIface *iface);
-static void pdf_document_document_images_iface_init (EvDocumentImagesIface *iface);
-static void pdf_document_document_forms_iface_init (EvDocumentFormsIface *iface);
-static void pdf_document_document_fonts_iface_init (EvDocumentFontsIface *iface);
-static void pdf_document_document_layers_iface_init (EvDocumentLayersIface *iface);
-#ifdef HAVE_POPPLER_PAGE_RENDER
-static void pdf_document_document_print_iface_init (EvDocumentPrintIface *iface);
-#endif
-static void pdf_document_document_annotations_iface_init (EvDocumentAnnotationsIface *iface);
-static void pdf_document_document_attachments_iface_init (EvDocumentAttachmentsIface *iface);
-static void pdf_document_find_iface_init (EvDocumentFindIface *iface);
-static void pdf_document_file_exporter_iface_init (EvFileExporterIface *iface);
-static void pdf_selection_iface_init (EvSelectionIface *iface);
-static void pdf_document_page_transition_iface_init (EvDocumentTransitionIface *iface);
-static void pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnails,
- EvRenderContext *rc,
- gint *width,
- gint *height);
-static int pdf_document_get_n_pages (EvDocument *document);
+static void pdf_document_security_iface_init (EvDocumentSecurityInterface *iface);
+static void pdf_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface);
+static void pdf_document_document_links_iface_init (EvDocumentLinksInterface *iface);
+static void pdf_document_document_images_iface_init (EvDocumentImagesInterface *iface);
+static void pdf_document_document_forms_iface_init (EvDocumentFormsInterface *iface);
+static void pdf_document_document_fonts_iface_init (EvDocumentFontsInterface *iface);
+static void pdf_document_document_layers_iface_init (EvDocumentLayersInterface *iface);
+static void pdf_document_document_print_iface_init (EvDocumentPrintInterface *iface);
+static void pdf_document_document_annotations_iface_init (EvDocumentAnnotationsInterface *iface);
+static void pdf_document_document_attachments_iface_init (EvDocumentAttachmentsInterface *iface);
+static void pdf_document_find_iface_init (EvDocumentFindInterface *iface);
+static void pdf_document_file_exporter_iface_init (EvFileExporterInterface *iface);
+static void pdf_selection_iface_init (EvSelectionInterface *iface);
+static void pdf_document_page_transition_iface_init (EvDocumentTransitionInterface *iface);
+static void pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnails,
+ EvRenderContext *rc,
+ gint *width,
+ gint *height);
+static int pdf_document_get_n_pages (EvDocument *document);
static EvLinkDest *ev_link_dest_from_dest (PdfDocument *pdf_document,
PopplerDest *dest);
static EvLink *ev_link_from_action (PdfDocument *pdf_document,
PopplerAction *action);
-static void pdf_document_search_free (PdfDocumentSearch *search);
static void pdf_print_context_free (PdfPrintContext *ctx);
static gboolean attachment_save_to_buffer (PopplerAttachment *attachment,
gchar **buffer,
pdf_document_document_fonts_iface_init);
EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_LAYERS,
pdf_document_document_layers_iface_init);
-#ifdef HAVE_POPPLER_PAGE_RENDER
EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_PRINT,
pdf_document_document_print_iface_init);
-#endif
EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_ANNOTATIONS,
pdf_document_document_annotations_iface_init);
EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_ATTACHMENTS,
pdf_document_page_transition_iface_init);
});
-static void
-pdf_document_search_free (PdfDocumentSearch *search)
-{
- PdfDocument *pdf_document = search->document;
- int n_pages;
- int i;
-
- if (search->idle != 0)
- g_source_remove (search->idle);
-
- n_pages = pdf_document_get_n_pages (EV_DOCUMENT (pdf_document));
- for (i = 0; i < n_pages; i++) {
- g_list_foreach (search->pages[i], (GFunc) g_free, NULL);
- g_list_free (search->pages[i]);
- }
- g_free (search->pages);
-
- g_free (search->text);
- g_free (search);
-}
-
static void
pdf_document_dispose (GObject *object)
{
pdf_print_context_free (pdf_document->print_ctx);
pdf_document->print_ctx = NULL;
}
-
- if (pdf_document->search) {
- pdf_document_search_free (pdf_document->search);
- pdf_document->search = NULL;
- }
if (pdf_document->document) {
g_object_unref (pdf_document->document);
EvRenderContext *rc)
{
cairo_surface_t *surface;
-
-#ifdef HAVE_POPPLER_PAGE_RENDER
cairo_t *cr;
surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
cairo_paint (cr);
cairo_destroy (cr);
-#else /* HAVE_POPPLER_PAGE_RENDER */
- GdkPixbuf *pixbuf;
-
- pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
- FALSE, 8,
- width, height);
- poppler_page_render_to_pixbuf (page,
- 0, 0,
- width, height,
- rc->scale,
- rc->rotation,
- pixbuf);
- surface = ev_document_misc_surface_from_pixbuf (pixbuf);
- g_object_unref (pixbuf);
-#endif /* HAVE_POPPLER_PAGE_RENDER */
-
- return surface;
+ return surface;
}
static cairo_surface_t *
return info;
}
+static gboolean
+pdf_document_get_backend_info (EvDocument *document, EvDocumentBackendInfo *info)
+{
+ PopplerBackend backend;
+
+ backend = poppler_get_backend ();
+ switch (backend) {
+ case POPPLER_BACKEND_CAIRO:
+ info->name = "poppler/cairo";
+ break;
+ case POPPLER_BACKEND_SPLASH:
+ info->name = "poppler/splash";
+ break;
+ default:
+ info->name = "poppler/unknown";
+ break;
+ }
+
+ info->version = poppler_get_version ();
+
+ return TRUE;
+}
+
static void
pdf_document_class_init (PdfDocumentClass *klass)
{
ev_document_class->get_page_label = pdf_document_get_page_label;
ev_document_class->render = pdf_document_render;
ev_document_class->get_info = pdf_document_get_info;
+ ev_document_class->get_backend_info = pdf_document_get_backend_info;
}
/* EvDocumentSecurity */
}
static void
-pdf_document_security_iface_init (EvDocumentSecurityIface *iface)
+pdf_document_security_iface_init (EvDocumentSecurityInterface *iface)
{
iface->has_document_security = pdf_document_has_document_security;
iface->set_password = pdf_document_set_password;
}
static void
-pdf_document_document_fonts_iface_init (EvDocumentFontsIface *iface)
+pdf_document_document_fonts_iface_init (EvDocumentFontsInterface *iface)
{
iface->fill_model = pdf_document_fonts_fill_model;
iface->scan = pdf_document_fonts_scan;
case POPPLER_ACTION_MOVIE:
unimplemented_action = "POPPLER_ACTION_MOVIE";
break;
+#if POPPLER_CHECK_VERSION (0, 13, 2)
+ case POPPLER_ACTION_RENDITION:
+ unimplemented_action = "POPPLER_ACTION_RENDITION";
+ break;
+ case POPPLER_ACTION_OCG_STATE:
+ unimplemented_action = "POPPLER_ACTION_OCG_STATE";
+ break;
+#endif
case POPPLER_ACTION_UNKNOWN:
unimplemented_action = "POPPLER_ACTION_UNKNOWN";
}
static GList *
pdf_document_links_get_links (EvDocumentLinks *document_links,
- gint page)
+ EvPage *page)
{
PdfDocument *pdf_document;
PopplerPage *poppler_page;
double height;
pdf_document = PDF_DOCUMENT (document_links);
- poppler_page = poppler_document_get_page (pdf_document->document,
- page);
+ poppler_page = POPPLER_PAGE (page->backend_page);
mapping_list = poppler_page_get_link_mapping (poppler_page);
poppler_page_get_size (poppler_page, NULL, &height);
}
poppler_page_free_link_mapping (mapping_list);
- g_object_unref (poppler_page);
return g_list_reverse (retval);
}
}
static void
-pdf_document_document_links_iface_init (EvDocumentLinksIface *iface)
+pdf_document_document_links_iface_init (EvDocumentLinksInterface *iface)
{
iface->has_document_links = pdf_document_links_has_document_links;
iface->get_links_model = pdf_document_links_get_links_model;
static GList *
pdf_document_images_get_image_mapping (EvDocumentImages *document_images,
- gint page)
+ EvPage *page)
{
GList *retval = NULL;
PdfDocument *pdf_document;
GList *list;
pdf_document = PDF_DOCUMENT (document_images);
- poppler_page = poppler_document_get_page (pdf_document->document, page);
+ poppler_page = POPPLER_PAGE (page->backend_page);
mapping_list = poppler_page_get_image_mapping (poppler_page);
for (list = mapping_list; list; list = list->next) {
ev_image_mapping = g_new (EvMapping, 1);
- ev_image_mapping->data = ev_image_new (page, image_mapping->image_id);
+ ev_image_mapping->data = ev_image_new (page->index, image_mapping->image_id);
ev_image_mapping->area.x1 = image_mapping->area.x1;
ev_image_mapping->area.y1 = image_mapping->area.y1;
ev_image_mapping->area.x2 = image_mapping->area.x2;
}
poppler_page_free_image_mapping (mapping_list);
- g_object_unref (poppler_page);
return g_list_reverse (retval);
}
EvImage *image)
{
GdkPixbuf *retval = NULL;
-#ifdef HAVE_POPPLER_PAGE_GET_IMAGE
PdfDocument *pdf_document;
PopplerPage *poppler_page;
cairo_surface_t *surface;
}
g_object_unref (poppler_page);
-#endif
+
return retval;
}
static void
-pdf_document_document_images_iface_init (EvDocumentImagesIface *iface)
+pdf_document_document_images_iface_init (EvDocumentImagesInterface *iface)
{
iface->get_image_mapping = pdf_document_images_get_image_mapping;
iface->get_image = pdf_document_images_get_image;
}
static void
-pdf_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface)
+pdf_document_document_thumbnails_iface_init (EvDocumentThumbnailsInterface *iface)
{
iface->get_thumbnail = pdf_document_thumbnails_get_thumbnail;
iface->get_dimensions = pdf_document_thumbnails_get_dimensions;
GList *matches, *l;
PopplerPage *poppler_page;
gdouble height;
-
+ GList *retval = NULL;
+
g_return_val_if_fail (POPPLER_IS_PAGE (page->backend_page), NULL);
g_return_val_if_fail (text != NULL, NULL);
poppler_page_get_size (poppler_page, NULL, &height);
for (l = matches; l && l->data; l = g_list_next (l)) {
PopplerRectangle *rect = (PopplerRectangle *)l->data;
- gdouble tmp;
+ EvRectangle *ev_rect;
- tmp = rect->y1;
- rect->y1 = height - rect->y2;
- rect->y2 = height - tmp;
+ ev_rect = ev_rectangle_new ();
+ ev_rect->x1 = rect->x1;
+ ev_rect->x2 = rect->x2;
+ /* Invert this for X-style coordinates */
+ ev_rect->y1 = height - rect->y2;
+ ev_rect->y2 = height - rect->y1;
+
+ retval = g_list_prepend (retval, ev_rect);
}
-
- return matches;
+
+ g_list_foreach (matches, (GFunc)poppler_rectangle_free, NULL);
+ g_list_free (matches);
+
+ return g_list_reverse (retval);
}
static void
-pdf_document_find_iface_init (EvDocumentFindIface *iface)
+pdf_document_find_iface_init (EvDocumentFindInterface *iface)
{
iface->find_text = pdf_document_find_find_text;
}
EV_FILE_EXPORTER_CAN_REVERSE |
EV_FILE_EXPORTER_CAN_SCALE |
#ifdef HAVE_CAIRO_PRINT
-#ifdef HAVE_POPPLER_PAGE_RENDER
EV_FILE_EXPORTER_CAN_NUMBER_UP |
#endif
-#endif
#ifdef HAVE_CAIRO_PDF
-#ifdef HAVE_POPPLER_PAGE_RENDER
EV_FILE_EXPORTER_CAN_GENERATE_PDF |
-#endif
#endif
EV_FILE_EXPORTER_CAN_GENERATE_PS);
}
static void
-pdf_document_file_exporter_iface_init (EvFileExporterIface *iface)
+pdf_document_file_exporter_iface_init (EvFileExporterInterface *iface)
{
iface->begin = pdf_document_file_exporter_begin;
iface->begin_page = pdf_document_file_exporter_begin_page;
iface->get_capabilities = pdf_document_file_exporter_get_capabilities;
}
-#ifdef HAVE_POPPLER_PAGE_RENDER
/* EvDocumentPrint */
static void
pdf_document_print_print_page (EvDocumentPrint *document,
}
static void
-pdf_document_document_print_iface_init (EvDocumentPrintIface *iface)
+pdf_document_document_print_iface_init (EvDocumentPrintInterface *iface)
{
iface->print_page = pdf_document_print_print_page;
}
-#endif /* HAVE_POPPLER_PAGE_RENDER */
static void
pdf_selection_render_selection (EvSelection *selection,
GdkColor *base)
{
PopplerPage *poppler_page;
+ cairo_t *cr;
+ PopplerColor text_color, base_color;
double width_points, height_points;
gint width, height;
width = (int) ((width_points * rc->scale) + 0.5);
height = (int) ((height_points * rc->scale) + 0.5);
-#ifdef HAVE_POPPLER_PAGE_RENDER
- cairo_t *cr;
- PopplerColor text_color, base_color;
-
text_color.red = text->red;
text_color.green = text->green;
text_color.blue = text->blue;
&text_color,
&base_color);
cairo_destroy (cr);
-#else /* HAVE_POPPLER_PAGE_RENDER */
- GdkPixbuf *pixbuf;
-
- pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
- TRUE, 8,
- width, height);
-
- poppler_page_render_selection_to_pixbuf (poppler_page,
- rc->scale, rc->rotation, pixbuf,
- (PopplerRectangle *)points,
- (PopplerRectangle *)old_points,
- (PopplerSelectionStyle)style,
- text,
- base);
- if (*surface)
- cairo_surface_destroy (*surface);
- *surface = ev_document_misc_surface_from_pixbuf (pixbuf);
- g_object_unref (pixbuf);
-#endif /* HAVE_POPPLER_PAGE_RENDER */
}
static gchar *
pdf_selection_get_selected_text (EvSelection *selection,
- EvRenderContext *rc,
+ EvPage *page,
EvSelectionStyle style,
EvRectangle *points)
{
double height;
char *retval;
- poppler_page = POPPLER_PAGE (rc->page->backend_page);
+ poppler_page = POPPLER_PAGE (page->backend_page);
poppler_page_get_size (poppler_page, NULL, &height);
r.x1 = points->x1;
}
static GdkRegion *
-pdf_selection_get_selection_map (EvSelection *selection,
- EvRenderContext *rc)
+pdf_selection_get_selection_map (EvSelection *selection,
+ EvPage *page)
{
PopplerPage *poppler_page;
PopplerRectangle points;
GList *region;
GdkRegion *retval;
- poppler_page = POPPLER_PAGE (rc->page->backend_page);
+ poppler_page = POPPLER_PAGE (page->backend_page);
points.x1 = 0.0;
points.y1 = 0.0;
}
static void
-pdf_selection_iface_init (EvSelectionIface *iface)
+pdf_selection_iface_init (EvSelectionInterface *iface)
{
iface->render_selection = pdf_selection_render_selection;
iface->get_selected_text = pdf_selection_get_selected_text;
}
static void
-pdf_document_page_transition_iface_init (EvDocumentTransitionIface *iface)
+pdf_document_page_transition_iface_init (EvDocumentTransitionInterface *iface)
{
iface->get_page_duration = pdf_document_get_page_duration;
iface->get_effect = pdf_document_get_effect;
}
static void
-pdf_document_document_forms_iface_init (EvDocumentFormsIface *iface)
+pdf_document_document_forms_iface_init (EvDocumentFormsInterface *iface)
{
iface->get_form_fields = pdf_document_forms_get_form_fields;
iface->form_field_text_get_text = pdf_document_forms_form_field_text_get_text;
ev_annot_text->is_open = poppler_annot_text_get_is_open (poppler_text);
}
break;
-#ifdef HAVE_POPPLER_ANNOT_FILE_ATTACHMENT_GET_ATTACHMENT
case POPPLER_ANNOT_FILE_ATTACHMENT: {
PopplerAnnotFileAttachment *poppler_annot_attachment;
EvAnnotationAttachment *ev_annot_attachment;
g_object_unref (poppler_attachment);
}
break;
-#endif /* HAVE_POPPLER_ANNOT_FILE_ATTACHMENT_GET_ATTACHMENT */
case POPPLER_ANNOT_LINK:
case POPPLER_ANNOT_WIDGET:
/* Ignore link and widgets annots since they are already handled */
}
static void
-pdf_document_document_annotations_iface_init (EvDocumentAnnotationsIface *iface)
+pdf_document_document_annotations_iface_init (EvDocumentAnnotationsInterface *iface)
{
iface->get_annotations = pdf_document_annotations_get_annotations;
iface->annotation_set_contents = pdf_document_annotations_annotation_set_contents;
}
static void
-pdf_document_document_attachments_iface_init (EvDocumentAttachmentsIface *iface)
+pdf_document_document_attachments_iface_init (EvDocumentAttachmentsInterface *iface)
{
iface->has_attachments = pdf_document_attachments_has_attachments;
iface->get_attachments = pdf_document_attachments_get_attachments;
}
static void
-pdf_document_document_layers_iface_init (EvDocumentLayersIface *iface)
+pdf_document_document_layers_iface_init (EvDocumentLayersInterface *iface)
{
iface->has_layers = pdf_document_layers_has_layers;
iface->get_layers = pdf_document_layers_get_layers;