From cc0f0ef258d6540cb2a264a1a53a717d836c79d4 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Sun, 17 May 2009 14:29:16 +0000 Subject: [libview] Add a new job for printing using cairo --- (limited to 'libview') diff --git a/libview/ev-jobs.c b/libview/ev-jobs.c index b5b4282..55e76a4 100644 --- a/libview/ev-jobs.c +++ b/libview/ev-jobs.c @@ -33,6 +33,7 @@ #include "ev-document-security.h" #include "ev-document-find.h" #include "ev-document-layers.h" +#include "ev-document-print.h" #include "ev-document-annotations.h" #include "ev-debug.h" @@ -61,6 +62,8 @@ static void ev_job_layers_init (EvJobLayers *job); static void ev_job_layers_class_init (EvJobLayersClass *class); static void ev_job_export_init (EvJobExport *job); static void ev_job_export_class_init (EvJobExportClass *class); +static void ev_job_print_init (EvJobPrint *job); +static void ev_job_print_class_init (EvJobPrintClass *class); enum { CANCELLED, @@ -99,6 +102,7 @@ G_DEFINE_TYPE (EvJobSave, ev_job_save, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobFind, ev_job_find, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobLayers, ev_job_layers, EV_TYPE_JOB) G_DEFINE_TYPE (EvJobExport, ev_job_export, EV_TYPE_JOB) +G_DEFINE_TYPE (EvJobPrint, ev_job_print, EV_TYPE_JOB) /* EvJob */ static void @@ -1369,3 +1373,111 @@ ev_job_export_set_page (EvJobExport *job, { job->page = page; } + +/* EvJobPrint */ +static void +ev_job_print_init (EvJobPrint *job) +{ + EV_JOB (job)->run_mode = EV_JOB_RUN_THREAD; + job->page = -1; +} + +static void +ev_job_print_dispose (GObject *object) +{ + EvJobPrint *job; + + ev_debug_message (DEBUG_JOBS, NULL); + + job = EV_JOB_PRINT (object); + + if (job->cr) { + cairo_destroy (job->cr); + job->cr = NULL; + } + + (* G_OBJECT_CLASS (ev_job_print_parent_class)->dispose) (object); +} + +static gboolean +ev_job_print_run (EvJob *job) +{ + EvJobPrint *job_print = EV_JOB_PRINT (job); + EvPage *ev_page; + cairo_status_t cr_status; + + g_assert (job_print->page != -1); + g_assert (job_print->cr != NULL); + + ev_debug_message (DEBUG_JOBS, NULL); + ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job); + + job->failed = FALSE; + job->finished = FALSE; + g_clear_error (&job->error); + + ev_document_doc_mutex_lock (); + + ev_page = ev_document_get_page (job->document, job_print->page); + ev_document_print_print_page (EV_DOCUMENT_PRINT (job->document), + ev_page, job_print->cr); + g_object_unref (ev_page); + + ev_document_doc_mutex_unlock (); + + cr_status = cairo_status (job_print->cr); + if (cr_status == CAIRO_STATUS_SUCCESS) { + ev_job_succeeded (job); + } else { + ev_job_failed (job, + GTK_PRINT_ERROR, + GTK_PRINT_ERROR_GENERAL, + _("Failed to print page %d: %s"), + job_print->page, + cairo_status_to_string (cr_status)); + } + + return FALSE; +} + +static void +ev_job_print_class_init (EvJobPrintClass *class) +{ + GObjectClass *oclass = G_OBJECT_CLASS (class); + EvJobClass *job_class = EV_JOB_CLASS (class); + + oclass->dispose = ev_job_print_dispose; + job_class->run = ev_job_print_run; +} + +EvJob * +ev_job_print_new (EvDocument *document) +{ + EvJob *job; + + ev_debug_message (DEBUG_JOBS, NULL); + + job = g_object_new (EV_TYPE_JOB_PRINT, NULL); + job->document = g_object_ref (document); + + return job; +} + +void +ev_job_print_set_page (EvJobPrint *job, + gint page) +{ + job->page = page; +} + +void +ev_job_print_set_cairo (EvJobPrint *job, + cairo_t *cr) +{ + if (job->cr == cr) + return; + + if (job->cr) + cairo_destroy (job->cr); + job->cr = cr ? cairo_reference (cr) : NULL; +} diff --git a/libview/ev-jobs.h b/libview/ev-jobs.h index 17f1b3c..144ec06 100644 --- a/libview/ev-jobs.h +++ b/libview/ev-jobs.h @@ -27,6 +27,7 @@ #include #include +#include #include @@ -65,6 +66,9 @@ typedef struct _EvJobLayersClass EvJobLayersClass; typedef struct _EvJobExport EvJobExport; typedef struct _EvJobExportClass EvJobExportClass; +typedef struct _EvJobPrint EvJobPrint; +typedef struct _EvJobPrintClass EvJobPrintClass; + #define EV_TYPE_JOB (ev_job_get_type()) #define EV_JOB(object) (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_JOB, EvJob)) #define EV_JOB_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_TYPE_JOB, EvJobClass)) @@ -121,6 +125,11 @@ typedef struct _EvJobExportClass EvJobExportClass; #define EV_JOB_EXPORT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_TYPE_JOB_EXPORT, EvJobExportClass)) #define EV_IS_JOB_EXPORT(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_JOB_EXPORT)) +#define EV_TYPE_JOB_PRINT (ev_job_print_get_type()) +#define EV_JOB_PRINT(object) (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_JOB_PRINT, EvJobPrint)) +#define EV_JOB_PRINT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), EV_TYPE_JOB_PRINT, EvJobPrintClass)) +#define EV_IS_JOB_PRINT(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_JOB_PRINT)) + typedef enum { EV_JOB_RUN_THREAD, EV_JOB_RUN_MAIN_LOOP @@ -332,6 +341,19 @@ struct _EvJobExportClass EvJobClass parent_class; }; +struct _EvJobPrint +{ + EvJob parent; + + gint page; + cairo_t *cr; +}; + +struct _EvJobPrintClass +{ + EvJobClass parent_class; +}; + /* Base job class */ GType ev_job_get_type (void) G_GNUC_CONST; gboolean ev_job_run (EvJob *job); @@ -418,6 +440,13 @@ GType ev_job_export_get_type (void) G_GNUC_CONST; EvJob *ev_job_export_new (EvDocument *document); void ev_job_export_set_page (EvJobExport *job, gint page); +/* EvJobPrint */ +GType ev_job_print_get_type (void) G_GNUC_CONST; +EvJob *ev_job_print_new (EvDocument *document); +void ev_job_print_set_page (EvJobPrint *job, + gint page); +void ev_job_print_set_cairo (EvJobPrint *job, + cairo_t *cr); G_END_DECLS -- cgit v0.9.1