X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=pdf%2Fev-poppler.cc;h=ef95956e6a6a2225b1b1f81dbad0571979067b01;hb=65c06150e05948eb7b056b0ec5cb9c364b652cfe;hp=08b811b3418079d2526b8ef40dc9428dc49c5b8b;hpb=96ab01a78dafd62f121b11010a9857cbd9a7922c;p=evince.git diff --git a/pdf/ev-poppler.cc b/pdf/ev-poppler.cc index 08b811b3..ef95956e 100644 --- a/pdf/ev-poppler.cc +++ b/pdf/ev-poppler.cc @@ -103,6 +103,20 @@ G_DEFINE_TYPE_WITH_CODE (PdfDocument, pdf_document, G_TYPE_OBJECT, pdf_selection_iface_init); }); + +static void +set_rc_data (PdfDocument *pdf_document, + EvRenderContext *rc) +{ + if (rc->data == NULL) { + rc->data = poppler_document_get_page (pdf_document->document, + rc->page); + rc->destroy = g_object_unref; + } else { + g_assert (rc->page == poppler_page_get_index (POPPLER_PAGE (rc->data))); + } +} + static void pdf_document_search_free (PdfDocumentSearch *search) { @@ -204,24 +218,6 @@ pdf_document_save (EvDocument *document, return retval; } -static PopplerOrientation -get_document_orientation (PdfDocument *pdf_document) -{ - PopplerOrientation orientation; - PopplerPage *page; - - /* Should prolly be smarter here and check more than first page */ - page = poppler_document_get_page (pdf_document->document, 0); - if (page) { - orientation = poppler_page_get_orientation (page); - } else { - orientation = POPPLER_ORIENTATION_PORTRAIT; - } - g_object_unref (page); - - return orientation; -} - static gboolean pdf_document_load (EvDocument *document, const char *uri, @@ -247,30 +243,26 @@ pdf_document_get_n_pages (EvDocument *document) return poppler_document_get_n_pages (PDF_DOCUMENT (document)->document); } -/* FIXME This should not be necessary, poppler should rember it */ static void -set_page_orientation (PdfDocument *pdf_document, PopplerPage *page, EvOrientation orientation) +set_page_orientation (PdfDocument *pdf_document, PopplerPage *page, int rotation) { - PopplerOrientation poppler_orientation; + PopplerOrientation 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 (); + switch (rotation) { + case 90: + orientation = POPPLER_ORIENTATION_LANDSCAPE; + break; + case 180: + orientation = POPPLER_ORIENTATION_UPSIDEDOWN; + break; + case 270: + orientation = POPPLER_ORIENTATION_SEASCAPE; + break; + default: + orientation = POPPLER_ORIENTATION_PORTRAIT; } - poppler_page_set_orientation (page, poppler_orientation); + poppler_page_set_orientation (page, orientation); } static void @@ -350,17 +342,16 @@ pdf_document_render_pixbuf (EvDocument *document, EvRenderContext *rc) { PdfDocument *pdf_document; - PopplerPage *poppler_page; GdkPixbuf *pixbuf; double width_points, height_points; gint width, height; pdf_document = PDF_DOCUMENT (document); - poppler_page = poppler_document_get_page (pdf_document->document, - rc->page); - set_page_orientation (pdf_document, poppler_page, rc->orientation); - poppler_page_get_size (poppler_page, &width_points, &height_points); + set_rc_data (pdf_document, rc); + set_page_orientation (pdf_document, POPPLER_PAGE (rc->data), rc->rotation); + + poppler_page_get_size (POPPLER_PAGE (rc->data), &width_points, &height_points); width = (int) ((width_points * rc->scale) + 0.5); height = (int) ((height_points * rc->scale) + 0.5); @@ -368,13 +359,12 @@ pdf_document_render_pixbuf (EvDocument *document, FALSE, 8, width, height); - poppler_page_render_to_pixbuf (poppler_page, + poppler_page_render_to_pixbuf (POPPLER_PAGE (rc->data), 0, 0, width, height, rc->scale, pixbuf); - g_object_unref (poppler_page); return pixbuf; } @@ -568,32 +558,6 @@ pdf_document_get_text (EvDocument *document, int page, EvRectangle *rect) return text; } -static EvOrientation -pdf_document_get_orientation (EvDocument *document) -{ - EvOrientation result; - PdfDocument *pdf_document = PDF_DOCUMENT (document); - - switch (get_document_orientation (pdf_document)) { - case POPPLER_ORIENTATION_PORTRAIT: - result = EV_ORIENTATION_PORTRAIT; - break; - case POPPLER_ORIENTATION_LANDSCAPE: - result = EV_ORIENTATION_LANDSCAPE; - break; - case POPPLER_ORIENTATION_UPSIDEDOWN: - result = EV_ORIENTATION_UPSIDEDOWN; - break; - case POPPLER_ORIENTATION_SEASCAPE: - result = EV_ORIENTATION_SEASCAPE; - break; - default: - g_assert_not_reached (); - } - - return result; -} - static void pdf_document_document_iface_init (EvDocumentIface *iface) { @@ -607,7 +571,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->get_orientation = pdf_document_get_orientation; }; static void @@ -843,7 +806,7 @@ pdf_document_document_links_iface_init (EvDocumentLinksIface *iface) static GdkPixbuf * make_thumbnail_for_size (PdfDocument *pdf_document, gint page, - EvOrientation orientation, + int rotation, gint size, gboolean border) { @@ -854,7 +817,7 @@ 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, orientation); + set_page_orientation (pdf_document, poppler_page, rotation); g_return_val_if_fail (poppler_page != NULL, NULL); pdf_document_thumbnails_get_dimensions (EV_DOCUMENT_THUMBNAILS (pdf_document), page, @@ -890,7 +853,7 @@ make_thumbnail_for_size (PdfDocument *pdf_document, static GdkPixbuf * pdf_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails, gint page, - EvOrientation orientation, + gint rotation, gint size, gboolean border) { @@ -901,7 +864,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, orientation); + set_page_orientation (pdf_document, poppler_page, rotation); g_return_val_if_fail (poppler_page != NULL, NULL); pixbuf = poppler_page_get_thumbnail (poppler_page); @@ -917,7 +880,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, orientation, size, border); + pixbuf = make_thumbnail_for_size (pdf_document, page, rotation, size, border); } g_object_unref (poppler_page); @@ -1188,7 +1151,7 @@ pdf_document_ps_exporter_do_page (EvPSExporter *exporter, EvRenderContext *rc) g_return_if_fail (pdf_document->ps_file != NULL); poppler_page = poppler_document_get_page (pdf_document->document, rc->page); - set_page_orientation (pdf_document, poppler_page, rc->orientation); + set_page_orientation (pdf_document, poppler_page, rc->rotation); poppler_page_render_to_ps (poppler_page, pdf_document->ps_file); g_object_unref (poppler_page); } @@ -1216,19 +1179,20 @@ pdf_selection_render_selection (EvSelection *selection, EvRenderContext *rc, GdkPixbuf **pixbuf, EvRectangle *points, - EvRectangle *old_points) + EvRectangle *old_points, + GdkColor *text, + GdkColor *base) { PdfDocument *pdf_document; - PopplerPage *poppler_page; double width_points, height_points; gint width, height; pdf_document = PDF_DOCUMENT (selection); - poppler_page = poppler_document_get_page (pdf_document->document, - rc->page); - set_page_orientation (pdf_document, poppler_page, rc->orientation); + set_rc_data (pdf_document, rc); + + set_page_orientation (pdf_document, POPPLER_PAGE (rc->data), rc->rotation); - poppler_page_get_size (poppler_page, &width_points, &height_points); + poppler_page_get_size (POPPLER_PAGE (rc->data), &width_points, &height_points); width = (int) ((width_points * rc->scale) + 0.5); height = (int) ((height_points * rc->scale) + 0.5); @@ -1238,12 +1202,12 @@ pdf_selection_render_selection (EvSelection *selection, width, height); } - poppler_page_render_selection (poppler_page, + poppler_page_render_selection (POPPLER_PAGE (rc->data), rc->scale, *pixbuf, (PopplerRectangle *)points, - (PopplerRectangle *)old_points); - g_object_unref (poppler_page); - + (PopplerRectangle *)old_points, + text, + base); } @@ -1253,16 +1217,14 @@ pdf_selection_get_selection_region (EvSelection *selection, EvRectangle *points) { PdfDocument *pdf_document; - PopplerPage *poppler_page; GdkRegion *retval; pdf_document = PDF_DOCUMENT (selection); - poppler_page = poppler_document_get_page (pdf_document->document, - rc->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); + set_rc_data (pdf_document, rc); + set_page_orientation (pdf_document, POPPLER_PAGE (rc->data), rc->rotation); + + retval = poppler_page_get_selection_region ((PopplerPage *)rc->data, rc->scale, (PopplerRectangle *) points); return retval; } @@ -1279,7 +1241,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, rc->orientation); + set_page_orientation (pdf_document, poppler_page, rc->rotation); points.x1 = 0.0; points.y1 = 0.0;