diff options
author | Carlos Garcia Campos <carlosgc@gnome.org> | 2007-02-13 18:21:24 (GMT) |
---|---|---|
committer | Carlos Garcia Campos <carlosgc@src.gnome.org> | 2007-02-13 18:21:24 (GMT) |
commit | 47aaea1c335331495e2dd94998e97a3b89c9d311 (patch) | |
tree | ad495bc054c754c96bfcd835c037e3080c1decb9 /backend | |
parent | 2d1cbc42b4fb22539659e4f621d2d8545d907adb (diff) |
Handle PostScript page orientation. Fixes bug #318568.
2007-02-13 Carlos Garcia Campos <carlosgc@gnome.org>
* backend/ps/gstypes.h:
* backend/ps/ps-document.c: (ps_document_get_page_rotation),
(ps_document_get_page_size), (ps_async_renderer_render_pixbuf),
(ps_document_thumbnails_get_thumbnail):
Handle PostScript page orientation. Fixes bug #318568.
svn path=/trunk/; revision=2324
Diffstat (limited to 'backend')
-rw-r--r-- | backend/ps/gstypes.h | 6 | ||||
-rw-r--r-- | backend/ps/ps-document.c | 46 |
2 files changed, 47 insertions, 5 deletions
diff --git a/backend/ps/gstypes.h b/backend/ps/gstypes.h index f1f5cb2..5202caa 100644 --- a/backend/ps/gstypes.h +++ b/backend/ps/gstypes.h @@ -33,9 +33,9 @@ typedef struct _GtkGSPaperSize GtkGSPaperSize; typedef enum { GTK_GS_ORIENTATION_NONE = -1, GTK_GS_ORIENTATION_PORTRAIT = 0, - GTK_GS_ORIENTATION_SEASCAPE = 3, - GTK_GS_ORIENTATION_UPSIDEDOWN = 2, - GTK_GS_ORIENTATION_LANDSCAPE = 1 + GTK_GS_ORIENTATION_SEASCAPE = 270, + GTK_GS_ORIENTATION_UPSIDEDOWN = 180, + GTK_GS_ORIENTATION_LANDSCAPE = 90 } GtkGSOrientation; struct _GtkGSPaperSize { diff --git a/backend/ps/ps-document.c b/backend/ps/ps-document.c index 086f082..d1b456d 100644 --- a/backend/ps/ps-document.c +++ b/backend/ps/ps-document.c @@ -356,6 +356,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,15 +388,30 @@ 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; } } @@ -441,6 +479,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); } @@ -506,6 +546,8 @@ ps_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document_thumbnails, ps_document_get_page_size (EV_DOCUMENT (ps_document), page, &page_width, &page_height); scale = size / page_width; + + rotation = (rotation + ps_document_get_page_rotation (ps_document, page)) % 360; if (!ps_document->thumbs_rc) { ps_document->thumbs_rc = ev_render_context_new (rotation, page, scale); |