X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=ps%2Fps-document.c;h=2fabd2613347e094508b0a2a836b75839bc7e171;hb=a61c4406e2cd4dc8f2d3a981e73dc09ae21e6ece;hp=91acc9ac89e8333281f32fbe9a299b51ac24af14;hpb=5b672303731cbcb76973d46046ee3580ed5f5a5c;p=evince.git diff --git a/ps/ps-document.c b/ps/ps-document.c index 91acc9ac..2fabd261 100644 --- a/ps/ps-document.c +++ b/ps/ps-document.c @@ -210,6 +210,9 @@ 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); @@ -311,6 +314,9 @@ setup_pixmap (PSDocument *gs, int page, double scale, int rotation) 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); @@ -616,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; @@ -628,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]; } @@ -1056,28 +1064,79 @@ 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) { - gchar *filename_dsp; + 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; - filename_dsp = g_filename_display_name (filename); + src_file = fopen (PS_DOCUMENT_GET_PS_FILE(document), "r"); + if (src_file) { + struct stat stat_rec; - g_set_error (error, G_FILE_ERROR, - G_FILE_ERROR_FAILED, - _("Failed to load document '%s'"), - filename_dsp); + if (stat (PS_DOCUMENT_GET_PS_FILE(document), &stat_rec) == 0) { + pscopy (src_file, sink, 0, stat_rec.st_size - 1); + } - g_free (filename_dsp); + 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 (filename); + g_free (buf); + gtk_gs_doc_sink_free (sink); + g_free (sink); return result; } @@ -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; @@ -1245,9 +1296,12 @@ 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); } @@ -1256,7 +1310,9 @@ ps_document_ps_export_do_page (EvPSExporter *exporter, EvRenderContext *rc) { PSDocument *document = PS_DOCUMENT (exporter); - document->ps_export_pagelist[rc->page] = 1; + if (document->structured_doc) { + document->ps_export_pagelist[rc->page] = 1; + } } static void @@ -1264,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