Submitted By: Pierre Labastie <pierre dot labastie at neuf dot fr>
Date: 2020-11-05
Initial Package Version: 2.67
Upstream Status: Committed
Origin: Upstream
Description: Fixes broken install with ghostscript-9.53.
From 3361214340d58235f4dbb8f24017d0cd5d94da72 Mon Sep 17 00:00:00 2001
From: John Bowman <bowman@ualberta.ca>
Date: Sun, 25 Oct 2020 22:24:51 -0600
Subject: [PATCH] Use ps2write instead of eps2write where possible, for
 compatibility with gs 9.53.

---
 picture.cc  |  7 +------
 runlabel.in | 44 ++++++++++++--------------------------------
 settings.cc |  2 ++
 3 files changed, 15 insertions(+), 38 deletions(-)

diff --git a/picture.cc b/picture.cc
index c4d2ecd7d..821cbc0f9 100644
--- a/picture.cc
+++ b/picture.cc
@@ -671,12 +671,7 @@ int picture::pdftoeps(const string& pdfname, const string& epsname, bool eps)
   if(safe)
     cmd.push_back("-dSAFER");
   string texengine=getSetting<string>("tex");
-
-  if(eps)
-    cmd.push_back("-sDEVICE="+getSetting<string>("epsdriver"));
-  else
-    cmd.push_back("-sDEVICE=ps2write");
-
+  cmd.push_back("-sDEVICE="+getSetting<string>(eps ? "epsdriver": "psdriver"));
   cmd.push_back("-sOutputFile="+stripDir(epsname));
   cmd.push_back(stripDir(pdfname));
 
diff --git a/runlabel.in b/runlabel.in
index 61f66bfcb..632f68df5 100644
--- a/runlabel.in
+++ b/runlabel.in
@@ -87,7 +87,7 @@ void showpath(std::ostream& ps)
   fillpath(ps);
 }
 
-array *readpath(const string& psname, bool keep, bool pdf=false,
+array *readpath(const string& psname, bool keep,
                 double hscale=1.0, double vsign=1.0)
 {
   double vscale=vsign*hscale;
@@ -111,8 +111,8 @@ array *readpath(const string& psname, bool keep, bool pdf=false,
 #else
   const string null="/dev/null";
 #endif
-  string epsdriver=getSetting<string>("epsdriver");
-  cmd.push_back("-sDEVICE="+epsdriver);
+  string psdriver=getSetting<string>("psdriver");
+  cmd.push_back("-sDEVICE="+psdriver);
   cmd.push_back("-sOutputFile="+null);
   cmd.push_back(stripDir(psname));
   iopipestream gs(cmd,"gs","Ghostscript");
@@ -120,7 +120,7 @@ array *readpath(const string& psname, bool keep, bool pdf=false,
     stringstream buf;
     string s=gs.readline();
     if(s.empty()) break;
-    if(!pdf) gs << newl;
+    gs << newl;
 
 // Workaround broken stringstream container in libc++.
 #ifdef _LIBCPP_VERSION
@@ -288,13 +288,9 @@ patharray2 *_texpath(stringarray *s, penarray *p)
   string pdfname,pdfname2,psname2;
   bool keep=getSetting<bool>("keep");
 
-  bool legacygs=false;
   if(!status) {
     if(xe) {
-// Use legacy ghostscript driver for gs-9.13 and earlier.
-      string epsdriver=getSetting<string>("epsdriver");
-      legacygs=epsdriver == "epswrite";
-
+      string psdriver=getSetting<string>("psdriver");
       pdfname=auxname(prefix,"pdf");
       pdfname2=auxname(prefix+"_","pdf");
       psname2=auxname(prefix+"_","ps");
@@ -323,28 +319,13 @@ patharray2 *_texpath(stringarray *s, penarray *p)
         cmd.push_back("-dNOPAUSE");
         cmd.push_back("-dBATCH");
         if(safe) cmd.push_back("-dSAFER");
-        cmd.push_back("-sDEVICE="+epsdriver);
-        // Work around eps2write bug that forces all postscript to first page.
-        cmd.push_back("-sOutputFile="+psname2+(legacygs ? "" : "%d"));
+        cmd.push_back("-sDEVICE="+psdriver);
+        cmd.push_back("-sOutputFile="+psname2);
         cmd.push_back(pdfname2);
         status=System(cmd,0,true,"gs");
 
-        if(legacygs) {
-          std::ifstream in(psname2.c_str());
-          ps << in.rdbuf();
-        } else {
-          for(unsigned int i=1; i <= n ; ++i) {
-            ostringstream buf;
-            buf << psname2 << i;
-            const string& s=buf.str();
-            const char *name=s.c_str();
-            std::ifstream in(name,std::ios::binary);
-            ps << in.rdbuf();
-            ps << "(>\n) print flush\n";
-            in.close();
-            if(!keep) unlink(name);
-          }
-        }
+        std::ifstream in(psname2.c_str());
+        ps << in.rdbuf();
         ps.close();
       }
     } else {
@@ -380,8 +361,7 @@ patharray2 *_texpath(stringarray *s, penarray *p)
       unlink(auxname(prefix,"tui").c_str());
     }
   }
-  return xe ? readpath(psname,keep,!legacygs,0.1) :
-    readpath(psname,keep,false,0.12,-1.0);
+  return xe ? readpath(psname,keep,0.1) : readpath(psname,keep,0.12,-1.0);
 }
 
 patharray2 *textpath(stringarray *s, penarray *p)
@@ -426,7 +406,7 @@ patharray2 *textpath(stringarray *s, penarray *p)
   cmd2.push_back("-dBATCH");
   cmd2.push_back("-P");
   if(safe) cmd2.push_back("-dSAFER");
-  cmd2.push_back("-sDEVICE="+getSetting<string>("epsdriver"));
+  cmd2.push_back("-sDEVICE="+getSetting<string>("psdriver"));
   cmd2.push_back("-sOutputFile=-");
   cmd2.push_back("-");
   iopipestream gs(cmd2,"gs","Ghostscript");
@@ -455,7 +435,7 @@ patharray2 *textpath(stringarray *s, penarray *p)
   bool keep=getSetting<bool>("keep");
   if(!keep) // Delete temporary files.
     unlink(textname.c_str());
-  return readpath(psname,keep,false,0.1);
+  return readpath(psname,keep,0.1);
 }
 
 patharray *_strokepath(path g, pen p=CURRENTPEN)
diff --git a/settings.cc b/settings.cc
index 54f41109f..b5056a89b 100644
--- a/settings.cc
+++ b/settings.cc
@@ -85,6 +85,7 @@ const bool havegl=false;
 mode_t mask;
 
 string systemDir=ASYMPTOTE_SYSDIR;
+string defaultPSdriver="ps2write";
 string defaultEPSdriver="eps2write";
 string defaultAsyGL="https://vectorgraphics.github.io/asymptote/base/webgl/asygl-"+
   string(AsyGLVersion)+".js";
@@ -1427,6 +1428,7 @@ void initSettings() {
   addOption(new envSetting("gs", defaultGhostscript));
   addOption(new envSetting("libgs", defaultGhostscriptLibrary));
   addOption(new envSetting("epsdriver", defaultEPSdriver));
+  addOption(new envSetting("psdriver", defaultPSdriver));
   addOption(new envSetting("asygl", defaultAsyGL));
   addOption(new envSetting("texpath", ""));
   addOption(new envSetting("texcommand", ""));
