]> www.fi.muni.cz Git - evince.git/blobdiff - ps/ps-document.c
Translation updated.
[evince.git] / ps / ps-document.c
index 4f38e6b02763d9121d98d9abf19fc8afc10d8886..34579674c302add2e07d0964c4e537ee323c0638 100644 (file)
@@ -137,8 +137,6 @@ ps_document_init (PSDocument *gs)
 
        gs->ps_export_pagelist = NULL;
        gs->ps_export_filename = NULL;
-
-       gs->orientation = GTK_GS_ORIENTATION_NONE;
 }
 
 static void
@@ -212,12 +210,17 @@ push_pixbuf (PSDocument *gs)
        GdkColormap *cmap;
        GdkPixbuf *pixbuf;
        int width, height;
+       
+       if (gs->pstarget == NULL)
+               return;
 
        cmap = gdk_window_get_colormap (gs->pstarget);
        gdk_drawable_get_size (gs->bpixmap, &width, &height);
+       LOG ("Get from drawable\n");
        pixbuf =  gdk_pixbuf_get_from_drawable (NULL, gs->bpixmap, cmap,
                                                0, 0, 0, 0,
                                                width, height);
+       LOG ("Get from drawable done\n");
        g_signal_emit_by_name (gs, "render_finished", pixbuf);
        g_object_unref (pixbuf);
 }
@@ -247,6 +250,7 @@ ps_document_widget_event (GtkWidget *widget, GdkEvent *event, gpointer data)
                gs->busy = FALSE;
 
                push_pixbuf (gs);
+               LOG ("Pixbuf pushed");
        }
 
        return TRUE;
@@ -303,17 +307,26 @@ get_ydpi (PSDocument *gs)
 }
 
 static void
-setup_pixmap (PSDocument *gs, int page, double scale)
+setup_pixmap (PSDocument *gs, int page, double scale, int rotation)
 {
        GdkGC *fill;
        GdkColor white = { 0, 0xFFFF, 0xFFFF, 0xFFFF };   /* pixel, r, g, b */
        GdkColormap *colormap;
        double width, height;
        int pixmap_width, pixmap_height;
+       
+       if (gs->pstarget == NULL)
+               return;
 
        ev_document_get_page_size (EV_DOCUMENT (gs), page, &width, &height);
-       pixmap_width = width * scale + 0.5;
-       pixmap_height = height * scale + 0.5;
+
+       if (rotation == 90 || rotation == 270) {
+               pixmap_height = width * scale + 0.5;
+               pixmap_width = height * scale + 0.5;
+       } else {
+               pixmap_width = width * scale + 0.5;
+               pixmap_height = height * scale + 0.5;
+       }
 
        if(gs->bpixmap) {
                int w, h;
@@ -430,55 +443,30 @@ get_page_box (PSDocument *gs, int page, int *urx, int *ury, int *llx, int *lly)
        *lly = new_lly;
 }
 
-static int
-get_page_orientation (PSDocument *gs, int page)
-{
-       int orientation;
-
-       orientation = GTK_GS_ORIENTATION_NONE;
-
-       if (gs->structured_doc) {
-               orientation = gs->doc->pages[page].orientation;
-       }
-       if (orientation == GTK_GS_ORIENTATION_NONE) {
-               orientation = gs->doc->default_page_orientation;
-       }
-       if (orientation == GTK_GS_ORIENTATION_NONE) {
-               orientation = gs->doc->orientation;
-       }
-       if (orientation == GTK_GS_ORIENTATION_NONE) {
-               orientation = GTK_GS_ORIENTATION_PORTRAIT;
-       }
-       if (gs->orientation != GTK_GS_ORIENTATION_NONE) {
-               orientation = gs->orientation;
-       }
-
-       return orientation;
-}
-
 static void
-setup_page (PSDocument *gs, int page, double scale)
+setup_page (PSDocument *gs, int page, double scale, int rotation)
 {
-       char buf[1024];
-       int urx, ury, llx, lly, orientation;
+       gchar *buf;
        char scaled_xdpi[G_ASCII_DTOSTR_BUF_SIZE];      
        char scaled_ydpi[G_ASCII_DTOSTR_BUF_SIZE];
+       int urx, ury, llx, lly;
 
        LOG ("Setup the page");
 
        get_page_box (gs, page, &urx, &ury, &llx, &lly);
-       orientation = get_page_orientation (gs, page);
        g_ascii_dtostr (scaled_xdpi, G_ASCII_DTOSTR_BUF_SIZE, get_xdpi (gs) * scale);
        g_ascii_dtostr (scaled_ydpi, G_ASCII_DTOSTR_BUF_SIZE, get_ydpi (gs) * scale);
 
-       g_snprintf (buf, 1024, "%ld %d %d %d %d %d %s %s %d %d %d %d",
-                   0L, orientation * 90, llx, lly, urx, ury,
-                   scaled_xdpi, scaled_ydpi,               
-                   0, 0, 0, 0);
+       buf = g_strdup_printf ("%ld %d %d %d %d %d %s %s %d %d %d %d",
+                              0L, rotation, llx, lly, urx, ury,
+                              scaled_xdpi, scaled_ydpi,
+                              0, 0, 0, 0);
        LOG ("GS property %s", buf);
 
        gdk_property_change (gs->pstarget, gs_class->gs_atom, gs_class->string_atom,
                             8, GDK_PROP_MODE_REPLACE, (guchar *)buf, strlen(buf));
+       g_free (buf);
+       
        gdk_flush ();
 }
 
@@ -634,7 +622,7 @@ start_interpreter (PSDocument *gs)
 #define NUM_GS_ARGS (NUM_ARGS - 20)
 #define NUM_ALPHA_ARGS 10
 
-       char *argv[NUM_ARGS], *dir, *gv_env;
+       char *argv[NUM_ARGS], *dir, *gv_env, *gs_path;
        char **gs_args, **alpha_args = NULL;
        int argc = 0, i;
 
@@ -646,7 +634,9 @@ start_interpreter (PSDocument *gs)
        stop_interpreter(gs);
 
        /* set up the args... */
-       gs_args = g_strsplit (gtk_gs_defaults_get_interpreter_cmd (), " ", NUM_GS_ARGS);
+       gs_path = g_find_program_in_path ("gs");
+       gs_args = g_strsplit (gs_path, " ", NUM_GS_ARGS);
+       g_free (gs_path);
        for(i = 0; i < NUM_GS_ARGS && gs_args[i]; i++, argc++) {
                argv[argc] = gs_args[i];
        }
@@ -902,10 +892,16 @@ check_filecompressed (PSDocument * gs)
                /* sucessfully uncompressed file */
                gs->gs_filename_unc = filename_unc;
        } else {
+               gchar *filename_dsp;
+               gchar *msg;
+
                /* report error */
-               g_snprintf (buf, 1024, _("Error while decompressing file %s:\n"),
-                            gs->gs_filename);
-               interpreter_failed (gs, buf);
+               filename_dsp = g_filename_display_name (gs->gs_filename);
+               msg = g_strdup_printf (_("Error while decompressing file “%s”:\n"), filename_dsp);
+               g_free (filename_dsp);
+               
+               interpreter_failed (gs, msg);
+               g_free (msg);
                unlink (filename_unc);
                g_free (filename_unc);
                filename_unc = NULL;
@@ -957,10 +953,15 @@ document_load (PSDocument *gs, const gchar *fname)
                gchar *filename = NULL;
 
                if (!file_readable(fname)) {
-                       gchar buf[1024];
-
-                       g_snprintf (buf, 1024, _("Cannot open file %s.\n"), fname);
-                       interpreter_failed (gs, buf);
+                       gchar *filename_dsp;
+                       gchar *msg;
+
+                       filename_dsp = g_filename_display_name (fname);
+                       msg = g_strdup_printf (_("Cannot open file “%s”.\n"), filename_dsp);
+                       g_free (filename_dsp);
+                       
+                       interpreter_failed (gs, msg);
+                       g_free (msg);
                        gs->gs_status = _("File is not readable.");
                } else {
                        filename = check_filecompressed(gs);
@@ -1063,26 +1064,83 @@ ps_document_load (EvDocument  *document,
                  const char  *uri,
                  GError     **error)
 {
-       gboolean result;
        char *filename;
+       char *gs_path;
+       gboolean result;
 
        filename = g_filename_from_uri (uri, NULL, error);
        if (!filename)
                return FALSE;
 
-       result = document_load (PS_DOCUMENT (document), filename);
-       if (!result) {
-               g_set_error (error, G_FILE_ERROR,
-                            G_FILE_ERROR_FAILED,
-                            "Failed to load document '%s'\n",
-                            uri);
+       gs_path = g_find_program_in_path ("gs");
+       if (!gs_path) {
+                   gchar *filename_dsp;
+                   filename_dsp = g_filename_display_name (filename);
+                   g_set_error(error,
+                               G_FILE_ERROR,
+                               G_FILE_ERROR_NOENT,
+                               _("Failed to load document “%s”. Ghostscript interpreter was not found in path"),
+                               filename);
+                   g_free (filename_dsp);
+                   result = FALSE;     
+       } else {
+               result = document_load (PS_DOCUMENT (document), filename);
+               if (!result) {
+                       gchar *filename_dsp;
+                       filename_dsp = g_filename_display_name (filename);
+                       
+                       g_set_error (error, G_FILE_ERROR,
+                                    G_FILE_ERROR_FAILED,
+                                    _("Failed to load document “%s”"),
+                                    filename_dsp);
+                       g_free (filename_dsp);
+               }
+               g_free (gs_path);
        }
-
        g_free (filename);
 
        return result;
 }
 
+static gboolean
+save_document (PSDocument *document, const char *filename)
+{
+       gboolean result = TRUE;
+       GtkGSDocSink *sink = gtk_gs_doc_sink_new ();
+       FILE *f, *src_file;
+       gchar *buf;
+
+       src_file = fopen (PS_DOCUMENT_GET_PS_FILE(document), "r");
+       if (src_file) {
+               struct stat stat_rec;
+
+               if (stat (PS_DOCUMENT_GET_PS_FILE(document), &stat_rec) == 0) {
+                       pscopy (src_file, sink, 0, stat_rec.st_size - 1);
+               }
+
+               fclose (src_file);
+       }
+       
+       buf = gtk_gs_doc_sink_get_buffer (sink);
+       if (buf == NULL) {
+               return FALSE;
+       }
+       
+       f = fopen (filename, "w");
+       if (f) {
+               fputs (buf, f);
+               fclose (f);
+       } else {
+               result = FALSE;
+       }
+
+       g_free (buf);
+       gtk_gs_doc_sink_free (sink);
+       g_free (sink);
+
+       return result;
+}
+
 static gboolean
 save_page_list (PSDocument *document, int *page_list, const char *filename)
 {
@@ -1091,7 +1149,8 @@ save_page_list (PSDocument *document, int *page_list, const char *filename)
        FILE *f;
        gchar *buf;
 
-       pscopydoc (sink, document->gs_filename, document->doc, page_list);
+       pscopydoc (sink, PS_DOCUMENT_GET_PS_FILE(document), 
+                  document->doc, page_list);
        
        buf = gtk_gs_doc_sink_get_buffer (sink);
        
@@ -1116,23 +1175,15 @@ ps_document_save (EvDocument  *document,
                  GError     **error)
 {
        PSDocument *ps = PS_DOCUMENT (document);
-       int *page_list;
        gboolean result;
-       int i;
        char *filename;
 
        filename = g_filename_from_uri (uri, NULL, error);
        if (!filename)
                return FALSE;
 
-       page_list = g_new0 (int, ps->doc->numpages);
-       for (i = 0; i < ps->doc->numpages; i++) {
-               page_list[i] = 1;
-       }
-
-       result = save_page_list (ps, page_list, filename);
+       result = save_document (ps, filename);
 
-       g_free (page_list);
        g_free (filename);
 
        return result;
@@ -1159,35 +1210,16 @@ ps_document_get_page_size (EvDocument   *document,
                           double       *height)
 {
        PSDocument *gs = PS_DOCUMENT (document);
-       int w, h;
-       int urx, ury, llx, lly, orientation;
+       int urx, ury, llx, lly;
 
        get_page_box (PS_DOCUMENT (document), page, &urx, &ury, &llx, &lly);
-       orientation = get_page_orientation (PS_DOCUMENT (document), page);
-
-       switch (orientation) {
-               case GTK_GS_ORIENTATION_PORTRAIT:
-               case GTK_GS_ORIENTATION_UPSIDEDOWN:
-                       w = (urx - llx) / 72.0 * get_xdpi (gs) + 0.5;
-                       h = (ury - lly) / 72.0 * get_ydpi (gs) + 0.5;
-                       break;
-               case GTK_GS_ORIENTATION_LANDSCAPE:
-               case GTK_GS_ORIENTATION_SEASCAPE:
-                       w = (ury - lly) / 72.0 * get_xdpi (gs) + 0.5;
-                       h = (urx - llx) / 72.0 * get_ydpi (gs) + 0.5;
-                       break;
-               default:
-                       w = h = 0;
-                       g_assert_not_reached ();
-                       break;
-       }
 
        if (width) {
-               *width = w;
+               *width = (urx - llx) / 72.0 * get_xdpi (gs) + 0.5;
        }
 
        if (height) {
-               *height = h;
+               *height = (ury - lly) / 72.0 * get_ydpi (gs) + 0.5;
        }
 }
 
@@ -1198,7 +1230,7 @@ ps_document_can_get_text (EvDocument *document)
 }
 
 static void
-ps_async_renderer_render_pixbuf (EvAsyncRenderer *renderer, int page, double scale)
+ps_async_renderer_render_pixbuf (EvAsyncRenderer *renderer, int page, double scale, int rotation)
 {
        PSDocument *gs = PS_DOCUMENT (renderer);
 
@@ -1214,8 +1246,8 @@ ps_async_renderer_render_pixbuf (EvAsyncRenderer *renderer, int page, double sca
                                  gs);
        }
 
-       setup_pixmap (gs, page, scale);
-       setup_page (gs, page, scale);
+       setup_pixmap (gs, page, scale, rotation);
+       setup_page (gs, page, scale, rotation);
 
        render_page (gs, page);
 }
@@ -1240,58 +1272,6 @@ ps_document_get_info (EvDocument *document)
        return info;
 }
 
-static EvOrientation
-ps_document_get_orientation (EvDocument *document)
-{
-       EvOrientation orientation;
-       PSDocument *ps = PS_DOCUMENT (document);
-
-       g_return_val_if_fail (ps != NULL, EV_ORIENTATION_PORTRAIT);
-
-       switch (ps->orientation) {
-               case GTK_GS_ORIENTATION_PORTRAIT:
-                       orientation = EV_ORIENTATION_PORTRAIT;
-                       break;
-               case GTK_GS_ORIENTATION_LANDSCAPE:
-                       orientation = EV_ORIENTATION_LANDSCAPE;
-                       break;
-               case GTK_GS_ORIENTATION_UPSIDEDOWN:
-                       orientation = EV_ORIENTATION_UPSIDEDOWN;
-                       break;
-               case GTK_GS_ORIENTATION_SEASCAPE:
-                       orientation = EV_ORIENTATION_SEASCAPE;
-                       break;
-               default:
-                       orientation = EV_ORIENTATION_PORTRAIT;
-                       break;
-       }
-
-       return orientation;
-}
-
-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)
 {
@@ -1301,8 +1281,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;
 }
 
 static void
@@ -1318,18 +1296,23 @@ ps_document_ps_export_begin (EvPSExporter *exporter, const char *filename,
 {
        PSDocument *document = PS_DOCUMENT (exporter);
 
-       g_free (document->ps_export_pagelist);
+       if (document->structured_doc) {
+               g_free (document->ps_export_pagelist);
        
-       document->ps_export_pagelist = g_new0 (int, document->doc->numpages);
+               document->ps_export_pagelist = g_new0 (int, document->doc->numpages);
+       }
+
        document->ps_export_filename = g_strdup (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;
+       if (document->structured_doc) {
+               document->ps_export_pagelist[rc->page] = 1;
+       }
 }
 
 static void
@@ -1337,13 +1320,16 @@ ps_document_ps_export_end (EvPSExporter *exporter)
 {
        PSDocument *document = PS_DOCUMENT (exporter);
 
-       save_page_list (document, document->ps_export_pagelist,
-                       document->ps_export_filename);
-
-       g_free (document->ps_export_pagelist);
-       g_free (document->ps_export_filename);  
-       document->ps_export_pagelist = NULL;
-       document->ps_export_filename = NULL;
+       if (!document->structured_doc) {
+               save_document (document, document->ps_export_filename);
+       } else {
+               save_page_list (document, document->ps_export_pagelist,
+                               document->ps_export_filename);
+               g_free (document->ps_export_pagelist);
+               g_free (document->ps_export_filename);  
+               document->ps_export_pagelist = NULL;
+               document->ps_export_filename = NULL;
+       }
 }
 
 static void