Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/backend
diff options
context:
space:
mode:
authorCarlos 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)
commit47aaea1c335331495e2dd94998e97a3b89c9d311 (patch)
treead495bc054c754c96bfcd835c037e3080c1decb9 /backend
parent2d1cbc42b4fb22539659e4f621d2d8545d907adb (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.h6
-rw-r--r--backend/ps/ps-document.c46
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);