X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=backend%2Fps%2Fps-document.c;h=abe819250c42dc13fa8a0b8b26140e9202aa10c4;hb=3d85ea1b45e9d6d2141df6cb797f8ad8325b4769;hp=086f082125762db12612b7c11f1b694b4ae97700;hpb=2d1cbc42b4fb22539659e4f621d2d8545d907adb;p=evince.git diff --git a/backend/ps/ps-document.c b/backend/ps/ps-document.c index 086f0821..abe81925 100644 --- a/backend/ps/ps-document.c +++ b/backend/ps/ps-document.c @@ -74,10 +74,8 @@ static void ps_interpreter_page_rendered (PSInterpreter GdkPixbuf *pixbuf, PSDocument *ps_document); -G_DEFINE_TYPE_WITH_CODE (PSDocument, ps_document, G_TYPE_OBJECT, +EV_BACKEND_REGISTER_WITH_CODE (PSDocument, ps_document, { - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT, - ps_document_document_iface_init); G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS, ps_document_document_thumbnails_iface_init); G_IMPLEMENT_INTERFACE (EV_TYPE_FILE_EXPORTER, @@ -169,7 +167,7 @@ document_load (PSDocument *ps_document, const gchar *fname, GError **error) g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT, - _("Cannot open file “%s”.\n"), /* FIXME: remove \n after freeze */ + _("Cannot open file “%s”."), filename_dsp); g_free (filename_dsp); @@ -183,7 +181,7 @@ document_load (PSDocument *ps_document, const gchar *fname, GError **error) g_set_error (error, G_FILE_ERROR, G_FILE_ERROR_NOENT, - _("Cannot open file “%s”.\n"), /* FIXME: remove \n after freeze */ + _("Cannot open file “%s”."), filename_dsp); g_free (filename_dsp); @@ -356,6 +354,29 @@ ps_document_get_n_pages (EvDocument *document) return ps->structured_doc ? ps->doc->numpages : 1; } +static gint +ps_document_get_page_rotation (PSDocument *ps_document, + int page) +{ + gint rotation = GTK_GS_ORIENTATION_NONE; + + g_assert (ps_document->doc != NULL); + + if (ps_document->structured_doc) { + if (ps_document->doc->pages[page].orientation != GTK_GS_ORIENTATION_NONE) + rotation = ps_document->doc->pages[page].orientation; + else + rotation = ps_document->doc->default_page_orientation; + } + + if (rotation == GTK_GS_ORIENTATION_NONE) + rotation = ps_document->doc->orientation; + + if (rotation == GTK_GS_ORIENTATION_NONE) + rotation = GTK_GS_ORIENTATION_PORTRAIT; + + return rotation; +} static void ps_document_get_page_size (EvDocument *document, @@ -365,24 +386,33 @@ ps_document_get_page_size (EvDocument *document, { PSDocument *ps_document = PS_DOCUMENT (document); int urx, ury, llx, lly; + gdouble pwidth, pheight; + gdouble page_width, page_height; + gint rotate; psgetpagebox (ps_document->doc, page, &urx, &ury, &llx, &lly); + pwidth = (urx - llx) + 0.5; + pheight = (ury - lly) + 0.5; + + rotate = ps_document_get_page_rotation (ps_document, page); + if (rotate == 90 || rotate == 270) { + page_height = pwidth; + page_width = pheight; + } else { + page_width = pwidth; + page_height = pheight; + } + if (width) { - *width = (urx - llx) + 0.5; + *width = page_width; } if (height) { - *height = (ury - lly) + 0.5; + *height = page_height; } } -static gboolean -ps_document_can_get_text (EvDocument *document) -{ - return FALSE; -} - static EvDocumentInfo * ps_document_get_info (EvDocument *document) { @@ -416,7 +446,6 @@ ps_document_document_iface_init (EvDocumentIface *iface) { iface->load = ps_document_load; iface->save = ps_document_save; - iface->can_get_text = ps_document_can_get_text; 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; @@ -441,6 +470,8 @@ ps_async_renderer_render_pixbuf (EvAsyncRenderer *renderer, g_return_if_fail (PS_IS_INTERPRETER (ps_document->gs)); + rotation = (rotation + ps_document_get_page_rotation (ps_document, page)) % 360; + ps_interpreter_render_page (ps_document->gs, page, scale, rotation); } @@ -476,15 +507,11 @@ ps_document_render_thumbnail (PSDocument *ps_document) static GdkPixbuf * ps_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails, - gint page, - gint rotation, - gint size, + EvRenderContext *rc, gboolean border) { PSDocument *ps_document; GdkPixbuf *pixbuf = NULL; - gdouble page_width, page_height; - gdouble scale; ps_document = PS_DOCUMENT (document_thumbnails); @@ -503,17 +530,9 @@ ps_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails, ps_document->thumbs_mutex = g_mutex_new (); ps_document->thumbs_cond = g_cond_new (); - ps_document_get_page_size (EV_DOCUMENT (ps_document), page, - &page_width, &page_height); - scale = size / page_width; - - if (!ps_document->thumbs_rc) { - ps_document->thumbs_rc = ev_render_context_new (rotation, page, scale); - } else { - ev_render_context_set_page (ps_document->thumbs_rc, page); - ev_render_context_set_scale (ps_document->thumbs_rc, scale); - ev_render_context_set_rotation (ps_document->thumbs_rc, rotation); - } + if (ps_document->thumbs_rc) + g_object_unref (ps_document->thumbs_rc); + ps_document->thumbs_rc = g_object_ref (rc); ev_document_doc_mutex_unlock (); g_mutex_lock (ps_document->thumbs_mutex); @@ -530,7 +549,7 @@ ps_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails, if (border) { GdkPixbuf *border_pixbuf; - border_pixbuf = ev_document_misc_get_thumbnail_frame (-1, -1, rotation, pixbuf); + border_pixbuf = ev_document_misc_get_thumbnail_frame (-1, -1, pixbuf); g_object_unref (pixbuf); pixbuf = border_pixbuf; } @@ -540,8 +559,7 @@ ps_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails, static void ps_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnails, - gint page, - gint size, + EvRenderContext *rc, gint *width, gint *height) { @@ -551,10 +569,16 @@ ps_document_thumbnails_get_dimensions (EvDocumentThumbnails *document_thumbnails ps_document = PS_DOCUMENT (document_thumbnails); ps_document_get_page_size (EV_DOCUMENT (ps_document), - page, + rc->page, &page_width, &page_height); - *width = size; - *height = (int) (size * page_height / page_width); + + if (rc->rotation == 90 || rc->rotation == 270) { + *width = (gint) (page_height * rc->scale); + *height = (gint) (page_width * rc->scale); + } else { + *width = (gint) (page_width * rc->scale); + *height = (gint) (page_height * rc->scale); + } } static void @@ -565,22 +589,9 @@ ps_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface) } /* EvFileExporterIface */ -static gboolean -ps_document_file_exporter_format_supported (EvFileExporter *exporter, - EvFileExporterFormat format) -{ - return (format == EV_FILE_FORMAT_PS); -} - static void -ps_document_file_exporter_begin (EvFileExporter *exporter, - EvFileExporterFormat format, - const char *filename, - int first_page, - int last_page, - double width, - double height, - gboolean duplex) +ps_document_file_exporter_begin (EvFileExporter *exporter, + EvFileExporterContext *fc) { PSDocument *document = PS_DOCUMENT (exporter); @@ -590,11 +601,12 @@ ps_document_file_exporter_begin (EvFileExporter *exporter, document->ps_export_pagelist = g_new0 (int, document->doc->numpages); } - document->ps_export_filename = g_strdup (filename); + document->ps_export_filename = g_strdup (fc->filename); } static void -ps_document_file_exporter_do_page (EvFileExporter *exporter, EvRenderContext *rc) +ps_document_file_exporter_do_page (EvFileExporter *exporter, + EvRenderContext *rc) { PSDocument *document = PS_DOCUMENT (exporter); @@ -620,11 +632,18 @@ ps_document_file_exporter_end (EvFileExporter *exporter) } } +static EvFileExporterCapabilities +ps_document_file_exporter_get_capabilities (EvFileExporter *exporter) +{ + return EV_FILE_EXPORTER_CAN_PAGE_SET | + EV_FILE_EXPORTER_CAN_GENERATE_PS; +} + static void ps_document_file_exporter_iface_init (EvFileExporterIface *iface) { - iface->format_supported = ps_document_file_exporter_format_supported; iface->begin = ps_document_file_exporter_begin; iface->do_page = ps_document_file_exporter_do_page; iface->end = ps_document_file_exporter_end; + iface->get_capabilities = ps_document_file_exporter_get_capabilities; }