#include "ev-job-queue.h"
#include "ev-document-thumbnails.h"
#include "ev-document-links.h"
+#include "ev-document-images.h"
#include "ev-document-factory.h"
#include "ev-file-helpers.h"
#include "ev-document-fonts.h"
#include "ev-selection.h"
#include "ev-async-renderer.h"
-#include "ev-ps-exporter.h"
+#include "ev-file-exporter.h"
#include "ev-window.h"
#include <glib/gstdio.h>
#include <libgnomevfs/gnome-vfs-uri.h>
#include <libgnomevfs/gnome-vfs-utils.h>
#include <libgnomevfs/gnome-vfs-ops.h>
-#include <libgnomevfs/gnome-vfs-xfer.h>
static void ev_job_init (EvJob *job);
static void ev_job_class_init (EvJobClass *class);
static void ev_job_render_class_init (EvJobRenderClass *class);
static void ev_job_thumbnail_init (EvJobThumbnail *job);
static void ev_job_thumbnail_class_init (EvJobThumbnailClass *class);
-static void ev_job_xfer_init (EvJobXfer *job);
-static void ev_job_xfer_class_init (EvJobXferClass *class);
+static void ev_job_load_init (EvJobLoad *job);
+static void ev_job_load_class_init (EvJobLoadClass *class);
static void ev_job_print_init (EvJobPrint *job);
static void ev_job_print_class_init (EvJobPrintClass *class);
G_DEFINE_TYPE (EvJobRender, ev_job_render, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobThumbnail, ev_job_thumbnail, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobFonts, ev_job_fonts, EV_TYPE_JOB)
-G_DEFINE_TYPE (EvJobXfer, ev_job_xfer, EV_TYPE_JOB)
+G_DEFINE_TYPE (EvJobLoad, ev_job_load, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobPrint, ev_job_print, EV_TYPE_JOB)
static void ev_job_init (EvJob *job) { /* Do Nothing */ }
job->thumbnail = NULL;
}
+ if (job->rc) {
+ g_object_unref (job->rc);
+ job->rc = NULL;
+ }
+
(* G_OBJECT_CLASS (ev_job_thumbnail_parent_class)->dispose) (object);
}
GdkColor *text,
GdkColor *base,
gboolean include_links,
+ gboolean include_images,
gboolean include_text,
gboolean include_selection)
{
job->text = *text;
job->base = *base;
job->include_links = include_links;
+ job->include_images = include_images;
job->include_text = include_text;
job->include_selection = include_selection;
g_signal_connect (EV_JOB (job)->document, "render_finished",
G_CALLBACK (render_finished_cb), job);
} else {
+ ev_document_fc_mutex_lock ();
+
job->pixbuf = ev_document_render_pixbuf (EV_JOB (job)->document, job->rc);
if (job->include_links && EV_IS_DOCUMENT_LINKS (EV_JOB (job)->document))
job->link_mapping =
ev_document_links_get_links (EV_DOCUMENT_LINKS (EV_JOB (job)->document),
job->rc->page);
+ if (job->include_images && EV_IS_DOCUMENT_IMAGES (EV_JOB (job)->document))
+ job->image_mapping =
+ ev_document_images_get_images (EV_DOCUMENT_IMAGES (EV_JOB (job)->document),
+ job->rc->page);
if (job->include_text && EV_IS_SELECTION (EV_JOB (job)->document))
job->text_mapping =
ev_selection_get_selection_map (EV_SELECTION (EV_JOB (job)->document),
job->rc,
&(job->selection_points));
}
-
+
+ ev_document_fc_mutex_unlock ();
EV_JOB (job)->finished = TRUE;
}
}
EvJob *
-ev_job_thumbnail_new (EvDocument *document,
- gint page,
- int rotation,
- gint requested_width)
+ev_job_thumbnail_new (EvDocument *document,
+ EvRenderContext *rc)
{
EvJobThumbnail *job;
job = g_object_new (EV_TYPE_JOB_THUMBNAIL, NULL);
EV_JOB (job)->document = g_object_ref (document);
- job->page = page;
- job->rotation = rotation;
- job->requested_width = requested_width;
+ job->rc = g_object_ref (rc);
return EV_JOB (job);
}
job->thumbnail =
ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB (job)->document),
- job->page,
- job->rotation,
- job->requested_width,
- TRUE);
+ job->rc, TRUE);
EV_JOB (job)->finished = TRUE;
ev_document_doc_mutex_unlock ();
ev_document_doc_mutex_lock ();
fonts = EV_DOCUMENT_FONTS (EV_JOB (job)->document);
+ ev_document_fc_mutex_lock ();
job->scan_completed = !ev_document_fonts_scan (fonts, 20);
+ ev_document_fc_mutex_unlock ();
EV_JOB (job)->finished = TRUE;
ev_document_doc_mutex_unlock ();
}
-static void ev_job_xfer_init (EvJobXfer *job) { /* Do Nothing */ }
+static void ev_job_load_init (EvJobLoad *job) { /* Do Nothing */ }
static void
-ev_job_xfer_dispose (GObject *object)
+ev_job_load_dispose (GObject *object)
{
- EvJobXfer *job = EV_JOB_XFER (object);
+ EvJobLoad *job = EV_JOB_LOAD (object);
if (job->uri) {
g_free (job->uri);
job->uri = NULL;
}
- if (job->local_uri) {
- g_free (job->local_uri);
- job->local_uri = NULL;
- }
-
if (job->error) {
g_error_free (job->error);
job->error = NULL;
job->dest = NULL;
}
- (* G_OBJECT_CLASS (ev_job_xfer_parent_class)->dispose) (object);
+ (* G_OBJECT_CLASS (ev_job_load_parent_class)->dispose) (object);
}
static void
-ev_job_xfer_class_init (EvJobXferClass *class)
+ev_job_load_class_init (EvJobLoadClass *class)
{
GObjectClass *oclass;
oclass = G_OBJECT_CLASS (class);
- oclass->dispose = ev_job_xfer_dispose;
+ oclass->dispose = ev_job_load_dispose;
}
EvJob *
-ev_job_xfer_new (const gchar *uri, EvLinkDest *dest, EvWindowRunMode mode)
+ev_job_load_new (const gchar *uri, EvLinkDest *dest, EvWindowRunMode mode)
{
- EvJobXfer *job;
+ EvJobLoad *job;
- job = g_object_new (EV_TYPE_JOB_XFER, NULL);
+ job = g_object_new (EV_TYPE_JOB_LOAD, NULL);
job->uri = g_strdup (uri);
if (dest)
}
void
-ev_job_xfer_run (EvJobXfer *job)
+ev_job_load_set_uri (EvJobLoad *job, const gchar *uri)
{
- GnomeVFSURI *source_uri;
- GnomeVFSURI *target_uri;
+ if (job->uri)
+ g_free (job->uri);
+ job->uri = g_strdup (uri);
+}
- g_return_if_fail (EV_IS_JOB_XFER (job));
+void
+ev_job_load_run (EvJobLoad *job)
+{
+ g_return_if_fail (EV_IS_JOB_LOAD (job));
if (job->error) {
g_error_free (job->error);
job->error = NULL;
}
+
+ ev_document_fc_mutex_lock ();
/* This job may already have a document even if the job didn't complete
because, e.g., a password is required - if so, just reload rather than
creating a new instance */
if (EV_JOB (job)->document) {
ev_document_load (EV_JOB (job)->document,
- job->local_uri ? job->local_uri : job->uri,
+ job->uri,
&job->error);
- EV_JOB (job)->finished = TRUE;
- return;
- }
-
- source_uri = gnome_vfs_uri_new (job->uri);
- if (!gnome_vfs_uri_is_local (source_uri) && !job->local_uri) {
- char *tmp_name;
- char *base_name;
-
- /* We'd like to keep extension of source uri since
- * it helps to resolve some mime types, say cbz */
-
- tmp_name = ev_tmp_filename ();
- base_name = gnome_vfs_uri_extract_short_name (source_uri);
- job->local_uri = g_strconcat ("file:", tmp_name, "-", base_name, NULL);
- g_free (base_name);
- g_free (tmp_name);
-
- target_uri = gnome_vfs_uri_new (job->local_uri);
-
- gnome_vfs_xfer_uri (source_uri, target_uri,
- GNOME_VFS_XFER_DEFAULT | GNOME_VFS_XFER_FOLLOW_LINKS,
- GNOME_VFS_XFER_ERROR_MODE_ABORT,
- GNOME_VFS_XFER_OVERWRITE_MODE_REPLACE,
- NULL,
- job);
- gnome_vfs_uri_unref (target_uri);
+ } else {
+ EV_JOB(job)->document =
+ ev_document_factory_get_document (job->uri,
+ &job->error);
}
- gnome_vfs_uri_unref (source_uri);
- EV_JOB(job)->document = ev_document_factory_get_document (job->local_uri ? job->local_uri : job->uri, &job->error);
+ ev_document_fc_mutex_unlock ();
EV_JOB (job)->finished = TRUE;
-
- return;
}
EvJob *
-ev_job_print_new (EvDocument *document,
- gdouble width,
- gdouble height,
- EvPrintRange *ranges,
- gint n_ranges,
- gint copies,
- gdouble collate,
- gdouble reverse)
+ev_job_print_new (EvDocument *document,
+ const gchar *format,
+ gdouble width,
+ gdouble height,
+ EvPrintRange *ranges,
+ gint n_ranges,
+ EvPrintPageSet page_set,
+ gint copies,
+ gdouble collate,
+ gdouble reverse)
{
EvJobPrint *job;
EV_JOB (job)->document = g_object_ref (document);
+ job->format = format;
+
job->temp_file = NULL;
job->error = NULL;
job->width = width;
job->height = height;
-
+
job->ranges = ranges;
job->n_ranges = n_ranges;
+
+ job->page_set = page_set;
job->copies = copies;
job->collate = collate;
}
static gboolean
-ev_print_job_print_page (EvJobPrint *job,
- gint page)
+ev_print_job_print_page_in_range (EvJobPrint *job,
+ gint page)
{
gint i;
return FALSE;
}
+static gboolean
+ev_print_job_print_page_in_set (EvJobPrint *job,
+ gint page)
+{
+ switch (job->page_set) {
+ case EV_PRINT_PAGE_SET_EVEN:
+ return page % 2 == 0;
+ case EV_PRINT_PAGE_SET_ODD:
+ return page % 2 != 0;
+ case EV_PRINT_PAGE_SET_ALL:
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
static void
ev_job_print_do_page (EvJobPrint *job, gint page)
{
EvRenderContext *rc;
rc = ev_render_context_new (0, page, 1.0);
- ev_ps_exporter_do_page (EV_PS_EXPORTER (document), rc);
+ ev_file_exporter_do_page (EV_FILE_EXPORTER (document), rc);
g_object_unref (rc);
}
gint last_page;
gint first_page;
gint i;
+ gchar *filename;
g_return_if_fail (EV_IS_JOB_PRINT (job));
if (job->error)
g_error_free (job->error);
job->error = NULL;
-
- fd = g_file_open_tmp ("evince_print.ps.XXXXXX", &job->temp_file, &job->error);
+
+ filename = g_strdup_printf ("evince_print.%s.XXXXXX", job->format);
+ fd = g_file_open_tmp (filename, &job->temp_file, &job->error);
+ g_free (filename);
if (fd <= -1) {
EV_JOB (job)->finished = TRUE;
return;
last_page = ev_print_job_get_last_page (job);
ev_document_doc_mutex_lock ();
- ev_ps_exporter_begin (EV_PS_EXPORTER (document),
- job->temp_file,
- MIN (first_page, last_page),
- MAX (first_page, last_page),
- job->width, job->height, FALSE);
+ ev_file_exporter_begin (EV_FILE_EXPORTER (document),
+ g_ascii_strcasecmp (job->format, "pdf") == 0 ?
+ EV_FILE_FORMAT_PDF : EV_FILE_FORMAT_PS,
+ job->temp_file,
+ MIN (first_page, last_page),
+ MAX (first_page, last_page),
+ job->width, job->height, FALSE);
+ ev_document_doc_mutex_unlock ();
for (i = 0; i < job->copies; i++) {
gint page, step;
step = job->reverse ? -1 : 1;
page = job->reverse ? last_page : first_page;
+
while ((job->reverse && (page >= first_page)) ||
(!job->reverse && (page <= last_page))) {
gint n_pages = 1;
gint j;
- if (job->n_ranges > 0 && !ev_print_job_print_page (job, page)) {
+ if (job->n_ranges > 0 &&
+ !ev_print_job_print_page_in_range (job, page)) {
+ page += step;
+ continue;
+ }
+
+ if (!ev_print_job_print_page_in_set (job, page + 1)) {
page += step;
continue;
}
n_pages = job->copies;
for (j = 0; j < n_pages; j++) {
+ ev_document_doc_mutex_lock ();
ev_job_print_do_page (job, page);
+ ev_document_doc_mutex_unlock ();
}
page += step;
break;
}
- ev_ps_exporter_end (EV_PS_EXPORTER (document));
+ ev_document_doc_mutex_lock ();
+ ev_file_exporter_end (EV_FILE_EXPORTER (document));
ev_document_doc_mutex_unlock ();
close (fd);