*
* 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 "ev-document-print.h"
#include "ev-document-annotations.h"
#include "ev-document-attachments.h"
+#include "ev-document-text.h"
#include "ev-debug.h"
#include <errno.h>
static void ev_job_links_class_init (EvJobLinksClass *class);
static void ev_job_attachments_init (EvJobAttachments *job);
static void ev_job_attachments_class_init (EvJobAttachmentsClass *class);
+static void ev_job_annots_init (EvJobAnnots *job);
+static void ev_job_annots_class_init (EvJobAnnotsClass *class);
static void ev_job_render_init (EvJobRender *job);
static void ev_job_render_class_init (EvJobRenderClass *class);
static void ev_job_page_data_init (EvJobPageData *job);
G_DEFINE_ABSTRACT_TYPE (EvJob, ev_job, G_TYPE_OBJECT)
G_DEFINE_TYPE (EvJobLinks, ev_job_links, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobAttachments, ev_job_attachments, EV_TYPE_JOB)
+G_DEFINE_TYPE (EvJobAnnots, ev_job_annots, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobRender, ev_job_render, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobPageData, ev_job_page_data, EV_TYPE_JOB)
G_DEFINE_TYPE (EvJobThumbnail, ev_job_thumbnail, EV_TYPE_JOB)
return job;
}
+/* EvJobAnnots */
+static void
+ev_job_annots_init (EvJobAnnots *job)
+{
+ EV_JOB (job)->run_mode = EV_JOB_RUN_THREAD;
+}
+
+static void
+ev_job_annots_dispose (GObject *object)
+{
+ EvJobAnnots *job;
+
+ ev_debug_message (DEBUG_JOBS, NULL);
+
+ job = EV_JOB_ANNOTS (object);
+
+ if (job->annots) {
+ g_list_foreach (job->annots, (GFunc)ev_mapping_list_unref, NULL);
+ g_list_free (job->annots);
+ job->annots = NULL;
+ }
+
+ G_OBJECT_CLASS (ev_job_annots_parent_class)->dispose (object);
+}
+
+static gboolean
+ev_job_annots_run (EvJob *job)
+{
+ EvJobAnnots *job_annots = EV_JOB_ANNOTS (job);
+ gint i;
+
+ ev_debug_message (DEBUG_JOBS, NULL);
+ ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
+
+ ev_document_doc_mutex_lock ();
+ for (i = 0; i < ev_document_get_n_pages (job->document); i++) {
+ EvMappingList *mapping_list;
+ EvPage *page;
+
+ page = ev_document_get_page (job->document, i);
+ mapping_list = ev_document_annotations_get_annotations (EV_DOCUMENT_ANNOTATIONS (job->document),
+ page);
+ g_object_unref (page);
+
+ if (mapping_list)
+ job_annots->annots = g_list_prepend (job_annots->annots, mapping_list);
+ }
+ ev_document_doc_mutex_unlock ();
+
+ job_annots->annots = g_list_reverse (job_annots->annots);
+
+ ev_job_succeeded (job);
+
+ return FALSE;
+}
+
+static void
+ev_job_annots_class_init (EvJobAnnotsClass *class)
+{
+ GObjectClass *oclass = G_OBJECT_CLASS (class);
+ EvJobClass *job_class = EV_JOB_CLASS (class);
+
+ oclass->dispose = ev_job_annots_dispose;
+ job_class->run = ev_job_annots_run;
+}
+
+EvJob *
+ev_job_annots_new (EvDocument *document)
+{
+ EvJob *job;
+
+ ev_debug_message (DEBUG_JOBS, NULL);
+
+ job = g_object_new (EV_TYPE_JOB_ANNOTS, NULL);
+ job->document = g_object_ref (document);
+
+ return job;
+}
+
/* EvJobRender */
static void
ev_job_render_init (EvJobRender *job)
job = EV_JOB_RENDER (object);
- if (job->ev_page) {
- ev_debug_message (DEBUG_JOBS, "page: %d (%p)", job->ev_page->index, job);
- g_object_unref (job->ev_page);
- job->ev_page = NULL;
- }
-
+ ev_debug_message (DEBUG_JOBS, "page: %d (%p)", job->page, job);
+
if (job->surface) {
cairo_surface_destroy (job->surface);
job->surface = NULL;
}
if (job->selection_region) {
- gdk_region_destroy (job->selection_region);
+ cairo_region_destroy (job->selection_region);
job->selection_region = NULL;
}
ev_job_render_run (EvJob *job)
{
EvJobRender *job_render = EV_JOB_RENDER (job);
+ EvPage *ev_page;
EvRenderContext *rc;
ev_debug_message (DEBUG_JOBS, "page: %d (%p)", job_render->page, job);
ev_document_fc_mutex_lock ();
- job_render->ev_page = ev_document_get_page (job->document, job_render->page);
- rc = ev_render_context_new (job_render->ev_page, job_render->rotation, job_render->scale);
-
+ ev_page = ev_document_get_page (job->document, job_render->page);
+ rc = ev_render_context_new (ev_page, job_render->rotation, job_render->scale);
+ g_object_unref (ev_page);
+
job_render->surface = ev_document_render (job->document, rc);
/* If job was cancelled during the page rendering,
* we return now, so that the thread is finished ASAP
ev_document_doc_mutex_lock ();
ev_page = ev_document_get_page (job->document, job_pd->page);
- if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_TEXT) && EV_IS_SELECTION (job->document))
+ if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_TEXT_MAPPING) && EV_IS_DOCUMENT_TEXT (job->document))
job_pd->text_mapping =
- ev_selection_get_selection_map (EV_SELECTION (job->document), ev_page);
+ ev_document_text_get_text_mapping (EV_DOCUMENT_TEXT (job->document), ev_page);
+ if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_TEXT) && EV_IS_DOCUMENT_TEXT (job->document))
+ job_pd->text =
+ ev_document_text_get_text (EV_DOCUMENT_TEXT (job->document), ev_page);
+ if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_TEXT_LAYOUT) && EV_IS_DOCUMENT_TEXT (job->document))
+ ev_document_text_get_text_layout (EV_DOCUMENT_TEXT (job->document),
+ ev_page,
+ &(job_pd->text_layout),
+ &(job_pd->text_layout_length));
if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_LINKS) && EV_IS_DOCUMENT_LINKS (job->document))
job_pd->link_mapping =
- ev_document_links_get_links (EV_DOCUMENT_LINKS (job->document), job_pd->page);
+ ev_document_links_get_links (EV_DOCUMENT_LINKS (job->document), ev_page);
if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_FORMS) && EV_IS_DOCUMENT_FORMS (job->document))
job_pd->form_field_mapping =
ev_document_forms_get_form_fields (EV_DOCUMENT_FORMS (job->document),
if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_IMAGES) && EV_IS_DOCUMENT_IMAGES (job->document))
job_pd->image_mapping =
ev_document_images_get_image_mapping (EV_DOCUMENT_IMAGES (job->document),
- job_pd->page);
+ ev_page);
if ((job_pd->flags & EV_PAGE_DATA_INCLUDE_ANNOTS) && EV_IS_DOCUMENT_ANNOTATIONS (job->document))
job_pd->annot_mapping =
ev_document_annotations_get_annotations (EV_DOCUMENT_ANNOTATIONS (job->document),
because, e.g., a password is required - if so, just reload rather than
creating a new instance */
if (job->document) {
+ const gchar *uncompressed_uri;
+
if (job_load->password) {
ev_document_security_set_password (EV_DOCUMENT_SECURITY (job->document),
job_load->password);
job->failed = FALSE;
job->finished = FALSE;
g_clear_error (&job->error);
-
+
+ uncompressed_uri = g_object_get_data (G_OBJECT (job->document),
+ "uri-uncompressed");
ev_document_load (job->document,
- job_load->uri,
+ uncompressed_uri ? uncompressed_uri : job_load->uri,
&error);
} else {
job->document = ev_document_factory_get_document (job_load->uri,
gint i;
for (i = 0; i < job->n_pages; i++) {
- g_list_foreach (job->pages[i], (GFunc)g_free, NULL);
+ g_list_foreach (job->pages[i], (GFunc)ev_rectangle_free, NULL);
g_list_free (job->pages[i]);
}