From 96ab01a78dafd62f121b11010a9857cbd9a7922c Mon Sep 17 00:00:00 2001 From: Marco Pesenti Gritti Date: Fri, 29 Jul 2005 14:17:57 +0000 Subject: Really make use of the orientation bit of the render context. Use the 2005-07-29 Marco Pesenti Gritti * backend/ev-document-thumbnails.c: (ev_document_thumbnails_get_thumbnail): * backend/ev-document-thumbnails.h: * backend/ev-document.c: * backend/ev-document.h: * backend/ev-ps-exporter.c: (ev_ps_exporter_do_page): * backend/ev-ps-exporter.h: * pdf/ev-poppler.cc: * ps/ps-document.c: (ps_document_document_iface_init), (ps_document_ps_export_do_page): * shell/ev-jobs.c: (ev_job_thumbnail_new), (ev_job_thumbnail_run): * shell/ev-jobs.h: * shell/ev-page-cache.c: (ev_page_cache_get_size), (ev_page_cache_get): * shell/ev-page-cache.h: * shell/ev-pixbuf-cache.c: (check_job_size_and_unref), (add_job_if_needed), (ev_pixbuf_cache_add_jobs_if_needed), (ev_pixbuf_cache_set_page_range), (new_selection_pixbuf_needed): * shell/ev-pixbuf-cache.h: * shell/ev-print-job.c: (idle_print_handler): * shell/ev-sidebar-thumbnails.c: (add_range): * shell/ev-view.c: (view_update_range_and_current_page), (get_page_extents), (ev_view_size_request_dual_page), (ev_view_size_request_single_page), (draw_one_page), (clear_caches), (ev_view_set_orientation), (ev_view_rotate_right), (ev_view_rotate_left), (ev_view_zoom_for_size_presentation), (ev_view_zoom_for_size_dual_page), (ev_view_zoom_for_size_single_page), (compute_new_selection_text), (ev_view_select_all): * thumbnailer/evince-thumbnailer.c: (evince_thumbnail_pngenc_get): * tiff/tiff-document.c: (tiff_document_get_page_size), (tiff_document_get_orientation), (rotate_pixbuf), (tiff_document_render_pixbuf), (tiff_document_document_iface_init), (tiff_document_thumbnails_get_thumbnail), (tiff_document_ps_export_do_page), (tiff_document_init): Really make use of the orientation bit of the render context. Use the render context in a few more places in the backend API. This regress orientation, but now it's done right. Will try to fix it up asap... --- diff --git a/ChangeLog b/ChangeLog index 779e564..b6d26dc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,48 @@ 2005-07-29 Marco Pesenti Gritti + * backend/ev-document-thumbnails.c: + (ev_document_thumbnails_get_thumbnail): + * backend/ev-document-thumbnails.h: + * backend/ev-document.c: + * backend/ev-document.h: + * backend/ev-ps-exporter.c: (ev_ps_exporter_do_page): + * backend/ev-ps-exporter.h: + * pdf/ev-poppler.cc: + * ps/ps-document.c: (ps_document_document_iface_init), + (ps_document_ps_export_do_page): + * shell/ev-jobs.c: (ev_job_thumbnail_new), (ev_job_thumbnail_run): + * shell/ev-jobs.h: + * shell/ev-page-cache.c: (ev_page_cache_get_size), + (ev_page_cache_get): + * shell/ev-page-cache.h: + * shell/ev-pixbuf-cache.c: (check_job_size_and_unref), + (add_job_if_needed), (ev_pixbuf_cache_add_jobs_if_needed), + (ev_pixbuf_cache_set_page_range), (new_selection_pixbuf_needed): + * shell/ev-pixbuf-cache.h: + * shell/ev-print-job.c: (idle_print_handler): + * shell/ev-sidebar-thumbnails.c: (add_range): + * shell/ev-view.c: (view_update_range_and_current_page), + (get_page_extents), (ev_view_size_request_dual_page), + (ev_view_size_request_single_page), (draw_one_page), + (clear_caches), (ev_view_set_orientation), (ev_view_rotate_right), + (ev_view_rotate_left), (ev_view_zoom_for_size_presentation), + (ev_view_zoom_for_size_dual_page), + (ev_view_zoom_for_size_single_page), (compute_new_selection_text), + (ev_view_select_all): + * thumbnailer/evince-thumbnailer.c: (evince_thumbnail_pngenc_get): + * tiff/tiff-document.c: (tiff_document_get_page_size), + (tiff_document_get_orientation), (rotate_pixbuf), + (tiff_document_render_pixbuf), (tiff_document_document_iface_init), + (tiff_document_thumbnails_get_thumbnail), + (tiff_document_ps_export_do_page), (tiff_document_init): + + Really make use of the orientation bit of the render context. + Use the render context in a few more places in the backend API. + This regress orientation, but now it's done right. Will try to + fix it up asap... + +2005-07-29 Marco Pesenti Gritti + * shell/ev-view.c: (ensure_rectangle_is_visible): Patch by Nickolay V. Shmyrev to fix find flickering diff --git a/backend/ev-document-thumbnails.c b/backend/ev-document-thumbnails.c index 260d623..9bf1695 100644 --- a/backend/ev-document-thumbnails.c +++ b/backend/ev-document-thumbnails.c @@ -47,6 +47,7 @@ ev_document_thumbnails_get_type (void) GdkPixbuf * ev_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document, gint page, + EvOrientation orientation, gint size, gboolean border) { @@ -55,7 +56,8 @@ ev_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document, g_return_val_if_fail (EV_IS_DOCUMENT_THUMBNAILS (document), NULL); iface = EV_DOCUMENT_THUMBNAILS_GET_IFACE (document); - return iface->get_thumbnail (document, page, size, border); + + return iface->get_thumbnail (document, page, orientation, size, border); } void diff --git a/backend/ev-document-thumbnails.h b/backend/ev-document-thumbnails.h index c84e426..ea77629 100644 --- a/backend/ev-document-thumbnails.h +++ b/backend/ev-document-thumbnails.h @@ -23,6 +23,8 @@ #include +#include "ev-render-context.h" + G_BEGIN_DECLS #define EV_TYPE_DOCUMENT_THUMBNAILS (ev_document_thumbnails_get_type ()) @@ -42,6 +44,7 @@ struct _EvDocumentThumbnailsIface /* Methods */ GdkPixbuf * (* get_thumbnail) (EvDocumentThumbnails *document, gint page, + EvOrientation orientation, gint size, gboolean border); void (* get_dimensions) (EvDocumentThumbnails *document, @@ -60,6 +63,7 @@ GType ev_document_thumbnails_get_type (void); GdkPixbuf *ev_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document, gint page, + EvOrientation orientation, gint size, gboolean border); void ev_document_thumbnails_get_dimensions (EvDocumentThumbnails *document, diff --git a/backend/ev-document.c b/backend/ev-document.c index 3395bf7..2778f77 100644 --- a/backend/ev-document.c +++ b/backend/ev-document.c @@ -226,15 +226,6 @@ ev_document_get_orientation (EvDocument *document) } void -ev_document_set_orientation (EvDocument *document, - EvOrientation orientation) -{ - EvDocumentIface *iface = EV_DOCUMENT_GET_IFACE (document); - - iface->set_orientation (document, orientation); -} - -void ev_document_info_free (EvDocumentInfo *info) { if (info == NULL) diff --git a/backend/ev-ps-exporter.c b/backend/ev-ps-exporter.c index 09ed17c..56944a6 100644 --- a/backend/ev-ps-exporter.c +++ b/backend/ev-ps-exporter.c @@ -58,11 +58,11 @@ ev_ps_exporter_begin (EvPSExporter *exporter, const char *filename, } void -ev_ps_exporter_do_page (EvPSExporter *exporter, int page) +ev_ps_exporter_do_page (EvPSExporter *exporter, EvRenderContext *rc) { EvPSExporterIface *iface = EV_PS_EXPORTER_GET_IFACE (exporter); - iface->do_page (exporter, page); + iface->do_page (exporter, rc); } void diff --git a/backend/ev-ps-exporter.h b/backend/ev-ps-exporter.h index 36d2613..4115e3a 100644 --- a/backend/ev-ps-exporter.h +++ b/backend/ev-ps-exporter.h @@ -25,6 +25,8 @@ #include +#include "ev-render-context.h" + G_BEGIN_DECLS #define EV_TYPE_PS_EXPORTER (ev_ps_exporter_get_type ()) @@ -41,16 +43,16 @@ struct _EvPSExporterIface { GTypeInterface base_iface; /* Methods */ - void (* begin) (EvPSExporter *exporter, - const char *filename, - int first_page, - int last_page, - double paper_width, - double paper_height, - gboolean duplex); - void (* do_page) (EvPSExporter *exporter, - int page); - void (* end) (EvPSExporter *exporter); + void (* begin) (EvPSExporter *exporter, + const char *filename, + int first_page, + int last_page, + double paper_width, + double paper_height, + gboolean duplex); + void (* do_page) (EvPSExporter *exporter, + EvRenderContext *rc); + void (* end) (EvPSExporter *exporter); }; GType ev_ps_exporter_get_type (void); @@ -58,7 +60,7 @@ void ev_ps_exporter_begin (EvPSExporter *exporter, const char *filename, int first_page, int last_page, double paper_width, double paper_height, gboolean duplex); -void ev_ps_exporter_do_page (EvPSExporter *exporter, int page); +void ev_ps_exporter_do_page (EvPSExporter *exporter, EvRenderContext *rc); void ev_ps_exporter_end (EvPSExporter *exporter); G_END_DECLS diff --git a/pdf/ev-poppler.cc b/pdf/ev-poppler.cc index 2695e86..08b811b 100644 --- a/pdf/ev-poppler.cc +++ b/pdf/ev-poppler.cc @@ -57,9 +57,6 @@ struct _PdfDocument PopplerPSFile *ps_file; gchar *password; - PopplerOrientation orientation; - gboolean orientation_set; - PopplerFontInfo *font_info; PopplerFontsIter *fonts_iter; int fonts_scanned_pages; @@ -252,11 +249,28 @@ pdf_document_get_n_pages (EvDocument *document) /* FIXME This should not be necessary, poppler should rember it */ static void -set_page_orientation (PdfDocument *pdf_document, PopplerPage *page) +set_page_orientation (PdfDocument *pdf_document, PopplerPage *page, EvOrientation orientation) { - if (pdf_document->orientation_set) { - poppler_page_set_orientation (page, pdf_document->orientation); + PopplerOrientation poppler_orientation; + + switch (orientation) { + case EV_ORIENTATION_PORTRAIT: + poppler_orientation = POPPLER_ORIENTATION_PORTRAIT; + break; + case EV_ORIENTATION_LANDSCAPE: + poppler_orientation = POPPLER_ORIENTATION_LANDSCAPE; + break; + case EV_ORIENTATION_UPSIDEDOWN: + poppler_orientation = POPPLER_ORIENTATION_UPSIDEDOWN; + break; + case EV_ORIENTATION_SEASCAPE: + poppler_orientation = POPPLER_ORIENTATION_SEASCAPE; + break; + default: + g_assert_not_reached (); } + + poppler_page_set_orientation (page, poppler_orientation); } static void @@ -269,7 +283,6 @@ pdf_document_get_page_size (EvDocument *document, PopplerPage *poppler_page; poppler_page = poppler_document_get_page (pdf_document->document, page); - set_page_orientation (pdf_document, poppler_page); poppler_page_get_size (poppler_page, width, height); g_object_unref (poppler_page); } @@ -345,7 +358,7 @@ pdf_document_render_pixbuf (EvDocument *document, pdf_document = PDF_DOCUMENT (document); poppler_page = poppler_document_get_page (pdf_document->document, rc->page); - set_page_orientation (pdf_document, poppler_page); + set_page_orientation (pdf_document, poppler_page, rc->orientation); poppler_page_get_size (poppler_page, &width_points, &height_points); width = (int) ((width_points * rc->scale) + 0.5); @@ -540,7 +553,6 @@ pdf_document_get_text (EvDocument *document, int page, EvRectangle *rect) char *text; poppler_page = poppler_document_get_page (pdf_document->document, page); - set_page_orientation (pdf_document, poppler_page); g_return_val_if_fail (poppler_page != NULL, NULL); poppler_page_get_size (poppler_page, NULL, &height); @@ -562,11 +574,7 @@ pdf_document_get_orientation (EvDocument *document) EvOrientation result; PdfDocument *pdf_document = PDF_DOCUMENT (document); - if (!pdf_document->orientation_set) { - pdf_document->orientation = get_document_orientation (pdf_document); - } - - switch (pdf_document->orientation) { + switch (get_document_orientation (pdf_document)) { case POPPLER_ORIENTATION_PORTRAIT: result = EV_ORIENTATION_PORTRAIT; break; @@ -587,33 +595,6 @@ pdf_document_get_orientation (EvDocument *document) } static void -pdf_document_set_orientation (EvDocument *document, EvOrientation orientation) -{ - PdfDocument *pdf_document = PDF_DOCUMENT (document); - PopplerOrientation poppler_orientation; - - switch (orientation) { - case EV_ORIENTATION_PORTRAIT: - poppler_orientation = POPPLER_ORIENTATION_PORTRAIT; - break; - case EV_ORIENTATION_LANDSCAPE: - poppler_orientation = POPPLER_ORIENTATION_LANDSCAPE; - break; - case EV_ORIENTATION_UPSIDEDOWN: - poppler_orientation = POPPLER_ORIENTATION_UPSIDEDOWN; - break; - case EV_ORIENTATION_SEASCAPE: - poppler_orientation = POPPLER_ORIENTATION_SEASCAPE; - break; - default: - g_assert_not_reached (); - } - - pdf_document->orientation = poppler_orientation; - pdf_document->orientation_set = TRUE; -} - -static void pdf_document_document_iface_init (EvDocumentIface *iface) { iface->save = pdf_document_save; @@ -626,7 +607,6 @@ pdf_document_document_iface_init (EvDocumentIface *iface) iface->get_text = pdf_document_get_text; iface->can_get_text = pdf_document_can_get_text; iface->get_info = pdf_document_get_info; - iface->set_orientation = pdf_document_set_orientation; iface->get_orientation = pdf_document_get_orientation; }; @@ -861,10 +841,11 @@ pdf_document_document_links_iface_init (EvDocumentLinksIface *iface) } static GdkPixbuf * -make_thumbnail_for_size (PdfDocument *pdf_document, - gint page, - gint size, - gboolean border) +make_thumbnail_for_size (PdfDocument *pdf_document, + gint page, + EvOrientation orientation, + gint size, + gboolean border) { PopplerPage *poppler_page; GdkPixbuf *pixbuf, *sub_pixbuf; @@ -873,10 +854,11 @@ make_thumbnail_for_size (PdfDocument *pdf_document, gdouble unscaled_width, unscaled_height; poppler_page = poppler_document_get_page (pdf_document->document, page); - set_page_orientation (pdf_document, poppler_page); + set_page_orientation (pdf_document, poppler_page, orientation); g_return_val_if_fail (poppler_page != NULL, NULL); - pdf_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (pdf_document), page, size, &width, &height); + pdf_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (pdf_document), page, + size, &width, &height); poppler_page_get_size (poppler_page, &unscaled_width, &unscaled_height); scale = width / unscaled_width; @@ -908,6 +890,7 @@ make_thumbnail_for_size (PdfDocument *pdf_document, static GdkPixbuf * pdf_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails, gint page, + EvOrientation orientation, gint size, gboolean border) { @@ -918,7 +901,7 @@ pdf_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails pdf_document = PDF_DOCUMENT (document_thumbnails); poppler_page = poppler_document_get_page (pdf_document->document, page); - set_page_orientation (pdf_document, poppler_page); + set_page_orientation (pdf_document, poppler_page, orientation); g_return_val_if_fail (poppler_page != NULL, NULL); pixbuf = poppler_page_get_thumbnail (poppler_page); @@ -934,7 +917,7 @@ pdf_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails } } else { /* There is no provided thumbnail. We need to make one. */ - pixbuf = make_thumbnail_for_size (pdf_document, page, size, border); + pixbuf = make_thumbnail_for_size (pdf_document, page, orientation, size, border); } g_object_unref (poppler_page); @@ -955,7 +938,6 @@ pdf_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnail pdf_document = PDF_DOCUMENT (document_thumbnails); poppler_page = poppler_document_get_page (pdf_document->document, page); - set_page_orientation (pdf_document, poppler_page); g_return_if_fail (width != NULL); g_return_if_fail (height != NULL); @@ -997,7 +979,6 @@ pdf_document_search_idle_callback (void *data) page = poppler_document_get_page (search->document->document, search->search_page); - set_page_orientation (pdf_document, page); ev_document_doc_mutex_lock (); matches = poppler_page_find_text (page, search->text); @@ -1117,7 +1098,6 @@ pdf_document_find_get_result (EvDocumentFind *document_find, return FALSE; poppler_page = poppler_document_get_page (pdf_document->document, page); - set_page_orientation (pdf_document, poppler_page); poppler_page_get_size (poppler_page, NULL, &height); rectangle->x1 = r->x1; rectangle->y1 = height - r->y2; @@ -1200,15 +1180,15 @@ pdf_document_ps_exporter_begin (EvPSExporter *exporter, const char *filename, } static void -pdf_document_ps_exporter_do_page (EvPSExporter *exporter, int page) +pdf_document_ps_exporter_do_page (EvPSExporter *exporter, EvRenderContext *rc) { PdfDocument *pdf_document = PDF_DOCUMENT (exporter); PopplerPage *poppler_page; g_return_if_fail (pdf_document->ps_file != NULL); - poppler_page = poppler_document_get_page (pdf_document->document, page); - set_page_orientation (pdf_document, poppler_page); + poppler_page = poppler_document_get_page (pdf_document->document, rc->page); + set_page_orientation (pdf_document, poppler_page, rc->orientation); poppler_page_render_to_ps (poppler_page, pdf_document->ps_file); g_object_unref (poppler_page); } @@ -1246,7 +1226,7 @@ pdf_selection_render_selection (EvSelection *selection, pdf_document = PDF_DOCUMENT (selection); poppler_page = poppler_document_get_page (pdf_document->document, rc->page); - set_page_orientation (pdf_document, poppler_page); + set_page_orientation (pdf_document, poppler_page, rc->orientation); poppler_page_get_size (poppler_page, &width_points, &height_points); width = (int) ((width_points * rc->scale) + 0.5); @@ -1279,7 +1259,7 @@ pdf_selection_get_selection_region (EvSelection *selection, pdf_document = PDF_DOCUMENT (selection); poppler_page = poppler_document_get_page (pdf_document->document, rc->page); - set_page_orientation (pdf_document, poppler_page); + set_page_orientation (pdf_document, poppler_page, rc->orientation); retval = poppler_page_get_selection_region (poppler_page, rc->scale, (PopplerRectangle *) points); g_object_unref (poppler_page); @@ -1299,7 +1279,7 @@ pdf_selection_get_selection_map (EvSelection *selection, pdf_document = PDF_DOCUMENT (selection); poppler_page = poppler_document_get_page (pdf_document->document, rc->page); - set_page_orientation (pdf_document, poppler_page); + set_page_orientation (pdf_document, poppler_page, rc->orientation); points.x1 = 0.0; points.y1 = 0.0; diff --git a/ps/ps-document.c b/ps/ps-document.c index 4f38e6b..28c4374 100644 --- a/ps/ps-document.c +++ b/ps/ps-document.c @@ -1270,29 +1270,6 @@ ps_document_get_orientation (EvDocument *document) } static void -ps_document_set_orientation (EvDocument *document, EvOrientation orientation) -{ - PSDocument *ps = PS_DOCUMENT (document); - - g_return_if_fail (ps != NULL); - - switch (orientation) { - case EV_ORIENTATION_PORTRAIT: - ps->orientation = GTK_GS_ORIENTATION_PORTRAIT; - break; - case EV_ORIENTATION_LANDSCAPE: - ps->orientation = GTK_GS_ORIENTATION_LANDSCAPE; - break; - case EV_ORIENTATION_UPSIDEDOWN: - ps->orientation = GTK_GS_ORIENTATION_UPSIDEDOWN; - break; - case EV_ORIENTATION_SEASCAPE: - ps->orientation = GTK_GS_ORIENTATION_SEASCAPE; - break; - } -} - -static void ps_document_document_iface_init (EvDocumentIface *iface) { iface->load = ps_document_load; @@ -1301,7 +1278,6 @@ ps_document_document_iface_init (EvDocumentIface *iface) iface->get_n_pages = ps_document_get_n_pages; iface->get_page_size = ps_document_get_page_size; iface->get_info = ps_document_get_info; - iface->set_orientation = ps_document_set_orientation; iface->get_orientation = ps_document_get_orientation; } @@ -1325,11 +1301,11 @@ ps_document_ps_export_begin (EvPSExporter *exporter, const char *filename, } static void -ps_document_ps_export_do_page (EvPSExporter *exporter, int page) +ps_document_ps_export_do_page (EvPSExporter *exporter, EvRenderContext *rc) { PSDocument *document = PS_DOCUMENT (exporter); - document->ps_export_pagelist[page] = 1; + document->ps_export_pagelist[rc->page] = 1; } static void diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c index 4cc0c25..677b39f 100644 --- a/shell/ev-jobs.c +++ b/shell/ev-jobs.c @@ -299,9 +299,10 @@ ev_job_render_run (EvJobRender *job) } EvJob * -ev_job_thumbnail_new (EvDocument *document, - gint page, - gint requested_width) +ev_job_thumbnail_new (EvDocument *document, + gint page, + EvOrientation orientation, + gint requested_width) { EvJobThumbnail *job; @@ -309,6 +310,7 @@ ev_job_thumbnail_new (EvDocument *document, EV_JOB (job)->document = g_object_ref (document); job->page = page; + job->orientation = orientation; job->requested_width = requested_width; return EV_JOB (job); @@ -324,6 +326,7 @@ ev_job_thumbnail_run (EvJobThumbnail *job) job->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB (job)->document), job->page, + job->orientation, job->requested_width, TRUE); EV_JOB (job)->finished = TRUE; diff --git a/shell/ev-jobs.h b/shell/ev-jobs.h index 263f9a1..070fd4d 100644 --- a/shell/ev-jobs.h +++ b/shell/ev-jobs.h @@ -135,6 +135,7 @@ struct _EvJobThumbnail EvJob parent; gint page; + EvOrientation orientation; gint requested_width; GdkPixbuf *thumbnail; }; @@ -192,6 +193,7 @@ void ev_job_render_run (EvJobRender *thumbnail); GType ev_job_thumbnail_get_type (void); EvJob *ev_job_thumbnail_new (EvDocument *document, gint page, + EvOrientation orientation, gint requested_width); void ev_job_thumbnail_run (EvJobThumbnail *thumbnail); diff --git a/shell/ev-page-cache.c b/shell/ev-page-cache.c index 936328f..41acecf 100644 --- a/shell/ev-page-cache.c +++ b/shell/ev-page-cache.c @@ -322,11 +322,12 @@ ev_page_cache_get_title (EvPageCache *page_cache) } void -ev_page_cache_get_size (EvPageCache *page_cache, - gint page, - gfloat scale, - gint *width, - gint *height) +ev_page_cache_get_size (EvPageCache *page_cache, + gint page, + EvOrientation orientation, + gfloat scale, + gint *width, + gint *height) { g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); g_return_if_fail (page >= 0 && page < page_cache->n_pages); @@ -481,11 +482,3 @@ ev_page_cache_get (EvDocument *document) return page_cache; } - -void -ev_page_cache_clear (EvDocument *document) -{ - g_return_if_fail (EV_IS_DOCUMENT (document)); - - g_object_set_data (G_OBJECT (document), PAGE_CACHE_STRING, NULL); -} diff --git a/shell/ev-page-cache.h b/shell/ev-page-cache.h index 2b270b0..af8532e 100644 --- a/shell/ev-page-cache.h +++ b/shell/ev-page-cache.h @@ -31,28 +31,29 @@ G_BEGIN_DECLS GType ev_page_cache_get_type (void) G_GNUC_CONST; /* Used by ev-document.c only */ -EvPageCache *ev_page_cache_new (EvDocument *document); -gint ev_page_cache_get_n_pages (EvPageCache *page_cache); -const char *ev_page_cache_get_title (EvPageCache *page_cache); -void ev_page_cache_get_size (EvPageCache *page_cache, - gint page, - gfloat scale, - gint *width, - gint *height); -void ev_page_cache_get_max_width (EvPageCache *page_cache, - gfloat scale, - gint *width); -void ev_page_cache_get_max_height (EvPageCache *page_cache, - gfloat scale, - gint *height); -void ev_page_cache_get_height_to_page (EvPageCache *page_cache, - gint page, - gfloat scale, - gint *height, - gint *dual_height); -gint ev_page_cache_get_max_label_chars (EvPageCache *page_cache); -char *ev_page_cache_get_page_label (EvPageCache *page_cache, - gint page); +EvPageCache *ev_page_cache_new (EvDocument *document); +gint ev_page_cache_get_n_pages (EvPageCache *page_cache); +const char *ev_page_cache_get_title (EvPageCache *page_cache); +void ev_page_cache_get_size (EvPageCache *page_cache, + gint page, + EvOrientation orientation, + gfloat scale, + gint *width, + gint *height); +void ev_page_cache_get_max_width (EvPageCache *page_cache, + gfloat scale, + gint *width); +void ev_page_cache_get_max_height (EvPageCache *page_cache, + gfloat scale, + gint *height); +void ev_page_cache_get_height_to_page (EvPageCache *page_cache, + gint page, + gfloat scale, + gint *height, + gint *dual_height); +gint ev_page_cache_get_max_label_chars (EvPageCache *page_cache); +char *ev_page_cache_get_page_label (EvPageCache *page_cache, + gint page); gboolean ev_page_cache_has_nonnumeric_page_labels (EvPageCache *page_cache); const EvDocumentInfo *ev_page_cache_get_info (EvPageCache *page_cache); @@ -68,7 +69,6 @@ gboolean ev_page_cache_next_page (EvPageCache *page_cache); gboolean ev_page_cache_prev_page (EvPageCache *page_cache); EvPageCache *ev_page_cache_get (EvDocument *document); -void ev_page_cache_clear (EvDocument *document); G_END_DECLS diff --git a/shell/ev-pixbuf-cache.c b/shell/ev-pixbuf-cache.c index 0d1507d..00d71d4 100644 --- a/shell/ev-pixbuf-cache.c +++ b/shell/ev-pixbuf-cache.c @@ -255,6 +255,7 @@ check_job_size_and_unref (CacheJobInfo *job_info, ev_page_cache_get_size (page_cache, EV_JOB_RENDER (job_info->job)->rc->page, + EV_JOB_RENDER (job_info->job)->rc->orientation, scale, &width, &height); @@ -478,6 +479,7 @@ add_job_if_needed (EvPixbufCache *pixbuf_cache, CacheJobInfo *job_info, EvPageCache *page_cache, gint page, + EvOrientation orientation, gfloat scale, EvJobPriority priority) { @@ -489,9 +491,8 @@ add_job_if_needed (EvPixbufCache *pixbuf_cache, if (job_info->job) return; - ev_page_cache_get_size (page_cache, - page, scale, - &width, &height); + ev_page_cache_get_size (page_cache, page, orientation, + scale, &width, &height); if (job_info->pixbuf && gdk_pixbuf_get_width (job_info->pixbuf) == width && @@ -500,11 +501,11 @@ add_job_if_needed (EvPixbufCache *pixbuf_cache, /* make a new job now */ if (job_info->rc == NULL) { - job_info->rc = ev_render_context_new (EV_ORIENTATION_PORTRAIT, - page, scale); + job_info->rc = ev_render_context_new (orientation, page, scale); } else { ev_render_context_set_page (job_info->rc, page); ev_render_context_set_scale (job_info->rc, scale); + ev_render_context_set_orientation (job_info->rc, orientation); } /* Figure out what else we need for this job */ @@ -530,6 +531,7 @@ add_job_if_needed (EvPixbufCache *pixbuf_cache, static void ev_pixbuf_cache_add_jobs_if_needed (EvPixbufCache *pixbuf_cache, + EvOrientation orientation, gfloat scale) { EvPageCache *page_cache; @@ -544,7 +546,7 @@ ev_pixbuf_cache_add_jobs_if_needed (EvPixbufCache *pixbuf_cache, page = pixbuf_cache->start_page + i; add_job_if_needed (pixbuf_cache, job_info, - page_cache, page, scale, + page_cache, page, orientation, scale, EV_JOB_PRIORITY_HIGH); } @@ -553,7 +555,7 @@ ev_pixbuf_cache_add_jobs_if_needed (EvPixbufCache *pixbuf_cache, page = pixbuf_cache->start_page - pixbuf_cache->preload_cache_size + i; add_job_if_needed (pixbuf_cache, job_info, - page_cache, page, scale, + page_cache, page, orientation, scale, EV_JOB_PRIORITY_LOW); } @@ -562,7 +564,7 @@ ev_pixbuf_cache_add_jobs_if_needed (EvPixbufCache *pixbuf_cache, page = pixbuf_cache->end_page + 1 + i; add_job_if_needed (pixbuf_cache, job_info, - page_cache, page, scale, + page_cache, page, orientation, scale, EV_JOB_PRIORITY_LOW); } @@ -572,6 +574,7 @@ void ev_pixbuf_cache_set_page_range (EvPixbufCache *pixbuf_cache, gint start_page, gint end_page, + EvOrientation orientation, gfloat scale, GList *selection_list) { @@ -598,7 +601,7 @@ ev_pixbuf_cache_set_page_range (EvPixbufCache *pixbuf_cache, /* Finally, we add the new jobs for all the sizes that don't have a * pixbuf */ - ev_pixbuf_cache_add_jobs_if_needed (pixbuf_cache, scale); + ev_pixbuf_cache_add_jobs_if_needed (pixbuf_cache, orientation, scale); } GdkPixbuf * @@ -651,8 +654,8 @@ new_selection_pixbuf_needed (EvPixbufCache *pixbuf_cache, if (job_info->selection) { page_cache = ev_page_cache_get (pixbuf_cache->document); - ev_page_cache_get_size (page_cache, page, scale, - &width, &height); + ev_page_cache_get_size (page_cache, page, job_info->rc->orientation, + scale, &width, &height); if (width != gdk_pixbuf_get_width (job_info->selection) || height != gdk_pixbuf_get_height (job_info->selection)) diff --git a/shell/ev-pixbuf-cache.h b/shell/ev-pixbuf-cache.h index 3081c3b..7af7243 100644 --- a/shell/ev-pixbuf-cache.h +++ b/shell/ev-pixbuf-cache.h @@ -52,6 +52,7 @@ EvPixbufCache *ev_pixbuf_cache_new (EvDocument *document); void ev_pixbuf_cache_set_page_range (EvPixbufCache *pixbuf_cache, gint start_page, gint end_page, + EvOrientation orientation, gfloat scale, GList *selection_list); GdkPixbuf *ev_pixbuf_cache_get_pixbuf (EvPixbufCache *pixbuf_cache, diff --git a/shell/ev-print-job.c b/shell/ev-print-job.c index 1f215c7..b9aded8 100644 --- a/shell/ev-print-job.c +++ b/shell/ev-print-job.c @@ -269,13 +269,19 @@ idle_print_handler (EvPrintJob *job) } if (job->next_page <= job->last_page) { + EvRenderContext *rc; #if 0 g_printerr ("Printing page %d\n", job->next_page); #endif + rc = ev_render_context_new (EV_ORIENTATION_PORTRAIT, + job->next_page, 1.0); + ev_document_doc_mutex_lock (); - ev_ps_exporter_do_page (EV_PS_EXPORTER (job->document), - job->next_page); + ev_ps_exporter_do_page (EV_PS_EXPORTER (job->document), rc); ev_document_doc_mutex_unlock (); + + g_object_unref (rc); + job->next_page++; return TRUE; } else { /* no more pages */ diff --git a/shell/ev-sidebar-thumbnails.c b/shell/ev-sidebar-thumbnails.c index c2c07c8..f992d87 100644 --- a/shell/ev-sidebar-thumbnails.c +++ b/shell/ev-sidebar-thumbnails.c @@ -229,7 +229,8 @@ add_range (EvSidebarThumbnails *sidebar_thumbnails, -1); if (job == NULL && !thumbnail_set) { - job = (EvJobThumbnail *)ev_job_thumbnail_new (priv->document, page, THUMBNAIL_WIDTH); + job = (EvJobThumbnail *)ev_job_thumbnail_new (priv->document, page, THUMBNAIL_WIDTH, + EV_ORIENTATION_PORTRAIT); ev_job_queue_add_job (EV_JOB (job), EV_JOB_PRIORITY_HIGH); g_object_set_data_full (G_OBJECT (job), "tree_iter", gtk_tree_iter_copy (&iter), diff --git a/shell/ev-view.c b/shell/ev-view.c index 9ddabf7..3d24c50 100644 --- a/shell/ev-view.c +++ b/shell/ev-view.c @@ -149,6 +149,7 @@ struct _EvView { int find_result; int spacing; + EvOrientation orientation; double scale; gboolean continuous; @@ -531,6 +532,7 @@ view_update_range_and_current_page (EvView *view) ev_pixbuf_cache_set_page_range (view->pixbuf_cache, view->start_page, view->end_page, + view->orientation, view->scale, view->selection_info.selections); } @@ -786,6 +788,7 @@ get_page_extents (EvView *view, /* Get the size of the page */ ev_page_cache_get_size (view->page_cache, page, + view->orientation, view->scale, &width, &height); compute_border (view, width, height, border); @@ -831,6 +834,7 @@ get_page_extents (EvView *view, if (other_page < ev_page_cache_get_n_pages (view->page_cache)) { ev_page_cache_get_size (view->page_cache, other_page, + view->orientation, view->scale, &width_2, &height_2); if (width_2 > width) @@ -1116,12 +1120,14 @@ ev_view_size_request_dual_page (EvView *view, /* Find the largest of the two. */ ev_page_cache_get_size (view->page_cache, view->current_page, + view->orientation, view->scale, &width, &height); if (view->current_page + 1 < ev_page_cache_get_n_pages (view->page_cache)) { gint width_2, height_2; ev_page_cache_get_size (view->page_cache, view->current_page + 1, + view->orientation, view->scale, &width_2, &height_2); if (width_2 > width) { @@ -1153,6 +1159,7 @@ ev_view_size_request_single_page (EvView *view, ev_page_cache_get_size (view->page_cache, view->current_page, + view->orientation, view->scale, &width, &height); compute_border (view, width, height, &border); @@ -1605,7 +1612,8 @@ draw_one_page (EvView *view, selection = find_selection_for_page (view, page); ev_page_cache_get_size (view->page_cache, - page, view->scale, + page, view->orientation, + view->scale, &width, &height); /* Render the document itself */ real_page_area = *page_area; @@ -2041,8 +2049,9 @@ clear_caches (EvView *view) view->pixbuf_cache = NULL; } - if (view->document) { - ev_page_cache_clear (view->document); + if (view->page_cache) { + g_object_unref (view->page_cache); + view->page_cache = NULL; } } @@ -2290,10 +2299,7 @@ static void ev_view_set_orientation (EvView *view, EvOrientation orientation) { - ev_document_set_orientation (view->document, orientation); - - clear_caches (view); - setup_caches (view); + view->orientation = orientation; gtk_widget_queue_resize (GTK_WIDGET (view)); } @@ -2301,37 +2307,37 @@ ev_view_set_orientation (EvView *view, void ev_view_rotate_right (EvView *view) { - EvOrientation orientation, new_orientation; + EvOrientation orientation; - orientation = ev_document_get_orientation (view->document); - if (orientation == EV_ORIENTATION_PORTRAIT) { - new_orientation = EV_ORIENTATION_LANDSCAPE; - } else if (orientation == EV_ORIENTATION_LANDSCAPE) { - new_orientation = EV_ORIENTATION_UPSIDEDOWN; - } else if (orientation == EV_ORIENTATION_UPSIDEDOWN) { - new_orientation = EV_ORIENTATION_SEASCAPE; + if (view->orientation == EV_ORIENTATION_PORTRAIT) { + orientation = EV_ORIENTATION_LANDSCAPE; + } else if (view->orientation == EV_ORIENTATION_LANDSCAPE) { + orientation = EV_ORIENTATION_UPSIDEDOWN; + } else if (view->orientation == EV_ORIENTATION_UPSIDEDOWN) { + orientation = EV_ORIENTATION_SEASCAPE; } else { - new_orientation = EV_ORIENTATION_PORTRAIT; + orientation = EV_ORIENTATION_PORTRAIT; } - ev_view_set_orientation (view, new_orientation); + + ev_view_set_orientation (view, orientation); } void ev_view_rotate_left (EvView *view) { - EvOrientation orientation, new_orientation; + EvOrientation orientation; - orientation = ev_document_get_orientation (view->document); - if (orientation == EV_ORIENTATION_PORTRAIT) { - new_orientation = EV_ORIENTATION_SEASCAPE; - } else if (orientation == EV_ORIENTATION_SEASCAPE) { - new_orientation = EV_ORIENTATION_UPSIDEDOWN; - } else if (orientation == EV_ORIENTATION_UPSIDEDOWN) { - new_orientation = EV_ORIENTATION_LANDSCAPE; + if (view->orientation == EV_ORIENTATION_PORTRAIT) { + orientation = EV_ORIENTATION_SEASCAPE; + } else if (view->orientation == EV_ORIENTATION_SEASCAPE) { + orientation = EV_ORIENTATION_UPSIDEDOWN; + } else if (view->orientation == EV_ORIENTATION_UPSIDEDOWN) { + orientation = EV_ORIENTATION_LANDSCAPE; } else { - new_orientation = EV_ORIENTATION_PORTRAIT; + orientation = EV_ORIENTATION_PORTRAIT; } - ev_view_set_orientation (view, new_orientation); + + ev_view_set_orientation (view, orientation); } static double @@ -2384,6 +2390,7 @@ ev_view_zoom_for_size_presentation (EvView *view, ev_page_cache_get_size (view->page_cache, view->current_page, + view->orientation, 1.0, &doc_width, &doc_height); @@ -2479,6 +2486,7 @@ ev_view_zoom_for_size_dual_page (EvView *view, /* Find the largest of the two. */ ev_page_cache_get_size (view->page_cache, view->current_page, + view->orientation, 1.0, &doc_width, &doc_height); @@ -2486,6 +2494,7 @@ ev_view_zoom_for_size_dual_page (EvView *view, gint width_2, height_2; ev_page_cache_get_size (view->page_cache, other_page, + view->orientation, 1.0, &width_2, &height_2); if (width_2 > doc_width) @@ -2522,6 +2531,7 @@ ev_view_zoom_for_size_single_page (EvView *view, ev_page_cache_get_size (view->page_cache, view->current_page, + view->orientation, 1.0, &doc_width, &doc_height); @@ -2866,6 +2876,7 @@ compute_new_selection_text (EvView *view, GdkPoint *point; ev_page_cache_get_size (view->page_cache, i, + view->orientation, 1.0, &width, &height); selection = g_new0 (EvViewSelection, 1); @@ -2963,6 +2974,7 @@ ev_view_select_all (EvView *view) EvViewSelection *selection; ev_page_cache_get_size (view->page_cache, + view->orientation, i, 1.0, &width, &height); selection = g_new0 (EvViewSelection, 1); diff --git a/thumbnailer/evince-thumbnailer.c b/thumbnailer/evince-thumbnailer.c index 4e9f300..9c9bff2 100644 --- a/thumbnailer/evince-thumbnailer.c +++ b/thumbnailer/evince-thumbnailer.c @@ -86,7 +86,8 @@ evince_thumbnail_pngenc_get (const char *uri, const char *thumbnail, int size) } pixbuf = ev_document_thumbnails_get_thumbnail - (EV_DOCUMENT_THUMBNAILS (document), 0, size, FALSE); + (EV_DOCUMENT_THUMBNAILS (document), 0, + EV_ORIENTATION_PORTRAIT, size, FALSE); if (pixbuf != NULL) { const char *overlaid_icon_name = NULL; diff --git a/tiff/tiff-document.c b/tiff/tiff-document.c index aef7aaa..aba8851 100644 --- a/tiff/tiff-document.c +++ b/tiff/tiff-document.c @@ -41,7 +41,6 @@ struct _TiffDocument TIFF *tiff; gint n_pages; - EvOrientation orientation; TIFF2PSContext *ps_export_ctx; }; @@ -171,40 +170,24 @@ tiff_document_get_page_size (EvDocument *document, TIFFGetField (tiff_document->tiff, TIFFTAG_YRESOLUTION, &y_res); h = h * (x_res / y_res); - if (tiff_document->orientation == EV_ORIENTATION_PORTRAIT || - tiff_document->orientation == EV_ORIENTATION_UPSIDEDOWN) { - *width = w; - *height = h; - } else { - *width = h; - *height = w; - } + *width = w; + *height = h; + pop_handlers (); } static EvOrientation tiff_document_get_orientation (EvDocument *document) { - TiffDocument *tiff_document = TIFF_DOCUMENT (document); - - return tiff_document->orientation; -} - -static void -tiff_document_set_orientation (EvDocument *document, - EvOrientation orientation) -{ - TiffDocument *tiff_document = TIFF_DOCUMENT (document); - - tiff_document->orientation = orientation; + return EV_ORIENTATION_PORTRAIT; } static GdkPixbuf * -rotate_pixbuf (EvDocument *document, GdkPixbuf *pixbuf) +rotate_pixbuf (EvDocument *document, EvOrientation orientation, GdkPixbuf *pixbuf) { TiffDocument *tiff_document = TIFF_DOCUMENT (document); - switch (tiff_document->orientation) + switch (orientation) { case EV_ORIENTATION_LANDSCAPE: return gdk_pixbuf_rotate_simple (pixbuf, 90); @@ -298,7 +281,7 @@ tiff_document_render_pixbuf (EvDocument *document, GDK_INTERP_BILINEAR); g_object_unref (pixbuf); - rotated_pixbuf = rotate_pixbuf (document, scaled_pixbuf); + rotated_pixbuf = rotate_pixbuf (document, rc->orientation, scaled_pixbuf); g_object_unref (scaled_pixbuf); return rotated_pixbuf; @@ -350,12 +333,12 @@ tiff_document_document_iface_init (EvDocumentIface *iface) iface->render_pixbuf = tiff_document_render_pixbuf; iface->get_info = tiff_document_get_info; iface->get_orientation = tiff_document_get_orientation; - iface->set_orientation = tiff_document_set_orientation; } static GdkPixbuf * tiff_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document, gint page, + EvOrientation orientation, gint size, gboolean border) { @@ -420,13 +403,13 @@ tiff_document_ps_export_begin (EvPSExporter *exporter, const char *filename, } static void -tiff_document_ps_export_do_page (EvPSExporter *exporter, int page) +tiff_document_ps_export_do_page (EvPSExporter *exporter, EvRenderContext *rc) { TiffDocument *document = TIFF_DOCUMENT (exporter); if (document->ps_export_ctx == NULL) return; - if (TIFFSetDirectory (document->tiff, page) != 1) + if (TIFFSetDirectory (document->tiff, rc->page) != 1) return; tiff2ps_process_page (document->ps_export_ctx, document->tiff, 0, 0, 0, 0, 0); @@ -454,5 +437,4 @@ static void tiff_document_init (TiffDocument *tiff_document) { tiff_document->n_pages = -1; - tiff_document->orientation = EV_ORIENTATION_PORTRAIT; } -- cgit v0.9.1