summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/picture.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/picture.cc')
-rw-r--r--Build/source/utils/asymptote/picture.cc186
1 files changed, 107 insertions, 79 deletions
diff --git a/Build/source/utils/asymptote/picture.cc b/Build/source/utils/asymptote/picture.cc
index de844a2410c..c23b2ac58aa 100644
--- a/Build/source/utils/asymptote/picture.cc
+++ b/Build/source/utils/asymptote/picture.cc
@@ -52,7 +52,8 @@ picture::~picture()
{
}
-bool picture::epsformat,picture::pdfformat,picture::xobject, picture::pdf;
+bool picture::epsformat,picture::pdfformat, picture::svgformat;
+bool picture::xobject, picture::pdf;
bool picture::Labels;
double picture::paperWidth,picture::paperHeight;
@@ -215,11 +216,10 @@ void texinit()
}
bool context=settings::context(getSetting<string>("tex"));
- string name;
- if(!context)
- name=stripFile(outname());
- name += "texput";
- string logname=name+".log";
+ string dir=stripFile(outname());
+ string logname;
+ if(!context) logname=dir;
+ logname += "texput.log";
const char *cname=logname.c_str();
ofstream writeable(cname);
if(!writeable)
@@ -238,7 +238,6 @@ void texinit()
cmd.push_back("--scrollmode");
cmd.push_back(texput);
} else {
- string dir=stripFile(outname());
if(!dir.empty())
cmd.push_back("-output-directory="+dir);
cmd.push_back("\\scrollmode");
@@ -260,16 +259,17 @@ int opentex(const string& texname, const string& prefix)
bool context=settings::context(getSetting<string>("tex"));
mem::vector<string> cmd;
cmd.push_back(texprogram());
- if(context)
+ if(context) {
cmd.push_back("--nonstopmode");
- else {
- string dir=stripFile(outname());
+ cmd.push_back(texname);
+ } else {
+ string dir=stripFile(texname);
if(!dir.empty())
cmd.push_back("-output-directory="+dir);
cmd.push_back("\\nonstopmode\\input");
+ cmd.push_back(stripDir(texname));
}
- cmd.push_back(texname);
bool quiet=verbose <= 1;
int status=System(cmd,quiet ? 1 : 0,true,"texpath",texpathmessage());
if(!status && getSetting<bool>("twice"))
@@ -297,74 +297,86 @@ bool picture::texprocess(const string& texname, const string& outname,
if(opentex(texname,prefix)) return false;
string texengine=getSetting<string>("tex");
- if(!pdf) {
- string dviname=auxname(prefix,"dvi");
- string psname=auxname(prefix,"ps");
+ string dviname=auxname(prefix,"dvi");
- double height=b.top-b.bottom+1.0;
+ if(svgformat) {
+ mem::vector<string> cmd;
+ cmd.push_back(getSetting<string>("dvisvgm"));
+ cmd.push_back("-n");
+ cmd.push_back("--verbosity=3");
+ push_split(cmd,getSetting<string>("dvisvgmOptions"));
+ cmd.push_back("-o"+outname);
+ cmd.push_back(dviname);
+ status=System(cmd,0,true,"dvisvgm");
+ if(status != 0) return false;
+ } else {
+ if(!pdf) {
+ string psname=auxname(prefix,"ps");
+ double height=b.top-b.bottom+1.0;
- // Magic dvips offsets:
- double hoffset=-128.4;
- double vertical=height;
- if(!latex(texengine)) vertical += 2.0;
- double voffset=(vertical < 13.0) ? -137.8+vertical : -124.8;
-
- hoffset += b.left+bboxshift.getx();
- voffset += paperHeight-height-b.bottom-bboxshift.gety();
+ // Magic dvips offsets:
+ double hoffset=-128.4;
+ double vertical=height;
+ if(!latex(texengine)) vertical += 2.0;
+ double voffset=(vertical < 13.0) ? -137.8+vertical : -124.8;
+
+ hoffset += b.left+bboxshift.getx();
+ voffset += paperHeight-height-b.bottom-bboxshift.gety();
- string dvipsrc=getSetting<string>("dir");
- if(dvipsrc.empty()) dvipsrc=systemDir;
- dvipsrc += dirsep+"nopapersize.ps";
- setenv("DVIPSRC",dvipsrc.c_str(),1);
- string papertype=getSetting<string>("papertype") == "letter" ?
- "letterSize" : "a4size";
- mem::vector<string> dcmd;
- dcmd.push_back(getSetting<string>("dvips"));
- dcmd.push_back("-R");
- dcmd.push_back("-Pdownload35");
- dcmd.push_back("-D600");
- dcmd.push_back("-O"+String(hoffset)+"bp,"+String(voffset)+"bp");
- dcmd.push_back("-T"+String(paperWidth)+"bp,"+String(paperHeight)+"bp");
- push_split(dcmd,getSetting<string>("dvipsOptions"));
- dcmd.push_back("-t"+papertype);
- if(verbose <= 1) dcmd.push_back("-q");
- dcmd.push_back("-o"+psname);
- dcmd.push_back(dviname);
- status=System(dcmd,0,true,"dvips");
- if(status != 0) return false;
+ string dvipsrc=getSetting<string>("dir");
+ if(dvipsrc.empty()) dvipsrc=systemDir;
+ dvipsrc += dirsep+"nopapersize.ps";
+ setenv("DVIPSRC",dvipsrc.c_str(),1);
+ string papertype=getSetting<string>("papertype") == "letter" ?
+ "letterSize" : "a4size";
+ mem::vector<string> dcmd;
+ dcmd.push_back(getSetting<string>("dvips"));
+ dcmd.push_back("-R");
+ dcmd.push_back("-Pdownload35");
+ dcmd.push_back("-D600");
+ dcmd.push_back("-O"+String(hoffset)+"bp,"+String(voffset)+"bp");
+ dcmd.push_back("-T"+String(paperWidth)+"bp,"+String(paperHeight)+"bp");
+ push_split(dcmd,getSetting<string>("dvipsOptions"));
+ dcmd.push_back("-t"+papertype);
+ if(verbose <= 1) dcmd.push_back("-q");
+ dcmd.push_back("-o"+psname);
+ dcmd.push_back(dviname);
+ status=System(dcmd,0,true,"dvips");
+ if(status != 0) return false;
- ifstream fin(psname.c_str());
- psfile fout(outname,false);
+ ifstream fin(psname.c_str());
+ psfile fout(outname,false);
- string s;
- bool first=true;
- transform t=shift(bboxshift)*T;
- bool shift=!t.isIdentity();
- string beginspecial="TeXDict begin @defspecial";
- string endspecial="@fedspecial end";
- while(getline(fin,s)) {
- if(s.find("%%DocumentPaperSizes:") == 0) continue;
- if(s.find("%!PS-Adobe-") == 0) {
- fout.header();
- } else if(first && s.find("%%BoundingBox:") == 0) {
- bbox box=b;
- box.shift(bboxshift);
- if(verbose > 2) BoundingBox(cout,box);
- fout.BoundingBox(box);
- first=false;
- } else if(shift && s.find(beginspecial) == 0) {
- fout.verbatimline(s);
- fout.gsave();
- fout.concat(t);
- } else if(shift && s.find(endspecial) == 0) {
- fout.grestore();
- fout.verbatimline(s);
- } else
- fout.verbatimline(s);
- }
- if(!getSetting<bool>("keep")) { // Delete temporary files.
- unlink(dviname.c_str());
- unlink(psname.c_str());
+ string s;
+ bool first=true;
+ transform t=shift(bboxshift)*T;
+ bool shift=!t.isIdentity();
+ string beginspecial="TeXDict begin @defspecial";
+ string endspecial="@fedspecial end";
+ while(getline(fin,s)) {
+ if(s.find("%%DocumentPaperSizes:") == 0) continue;
+ if(s.find("%!PS-Adobe-") == 0) {
+ fout.header();
+ } else if(first && s.find("%%BoundingBox:") == 0) {
+ bbox box=b;
+ box.shift(bboxshift);
+ if(verbose > 2) BoundingBox(cout,box);
+ fout.BoundingBox(box);
+ first=false;
+ } else if(shift && s.find(beginspecial) == 0) {
+ fout.verbatimline(s);
+ fout.gsave();
+ fout.concat(t);
+ } else if(shift && s.find(endspecial) == 0) {
+ fout.grestore();
+ fout.verbatimline(s);
+ } else
+ fout.verbatimline(s);
+ }
+ if(!getSetting<bool>("keep")) { // Delete temporary files.
+ unlink(dviname.c_str());
+ unlink(psname.c_str());
+ }
}
}
@@ -413,8 +425,8 @@ int picture::epstopdf(const string& epsname, const string& pdfname)
cmd.push_back("-sOutputFile="+stripDir(pdfname));
cmd.push_back(stripDir(epsname));
- string dir=stripFile(pdfname);
char *oldPath=NULL;
+ string dir=stripFile(pdfname);
if(!dir.empty()) {
oldPath=getPath();
setPath(dir.c_str());
@@ -470,7 +482,7 @@ bool picture::postprocess(const string& prename, const string& outname,
if(status != 0)
reportError("Cannot rename "+prename+" to "+outname);
} else status=epstopdf(prename,outname);
- } else {
+ } else if(!svgformat) {
mem::vector<string> cmd;
double render=fabs(getSetting<double>("render"));
if(render == 0) render=1.0;
@@ -569,7 +581,6 @@ bool picture::shipout(picture *preamble, const string& Prefix,
bool TeXmode=getSetting<bool>("inlinetex") &&
getSetting<string>("tex") != "none";
- Labels=labels || TeXmode;
string texengine=getSetting<string>("tex");
pdf=settings::pdf(texengine);
@@ -580,10 +591,16 @@ bool picture::shipout(picture *preamble, const string& Prefix,
string outputformat=format.empty() ? defaultformat() : format;
epsformat=outputformat == "eps";
pdfformat=outputformat == "pdf";
+ svgformat=outputformat == "svg" && !pdf &&
+ (!have3D() || getSetting<double>("render") == 0.0);
+
xobject=magnification > 0;
string outname=Outname(prefix,outputformat,standardout);
string epsname=epsformat ? (standardout ? "" : outname) :
auxname(prefix,"eps");
+
+ Labels=labels || TeXmode || svgformat;
+
if(Labels)
spaceToUnderscore(prefix);
string prename=((epsformat && !pdf) || !Labels) ? epsname :
@@ -731,7 +748,8 @@ bool picture::shipout(picture *preamble, const string& Prefix,
if(Labels) {
tex->epilogue();
if(context) prefix=stripDir(prefix);
- status=texprocess(texname,prename,prefix,bboxshift);
+ status=texprocess(texname,svgformat ? outname : prename,prefix,
+ bboxshift);
delete tex;
if(!getSetting<bool>("keep")) {
for(mem::list<string>::iterator p=psnameStack.begin();
@@ -813,6 +831,8 @@ bool picture::shipout3(const string& prefix, const string& format,
triple *lights, double *diffuse, double *ambient,
double *specular, bool viewportlighting, bool view)
{
+ if(getSetting<bool>("interrupt"))
+ return true;
#ifdef HAVE_LIBGL
bounds3();
@@ -825,7 +845,8 @@ bool picture::shipout3(const string& prefix, const string& format,
getSetting<string>("outformat") : format;
bool View=settings::view() && view;
static int oldpid=0;
- bool Wait=!interact::interactive || !View;
+ bool animating=getSetting<bool>("animating");
+ bool Wait=!interact::interactive || !View || animating;
if(glthread) {
#ifdef HAVE_LIBPTHREAD
@@ -892,6 +913,13 @@ bool picture::shipout3(const string& prefix, const string& format,
pthread_cond_wait(&readySignal,&readyLock);
pthread_mutex_unlock(&readyLock);
}
+ if(!glthread || (Wait && !animating)) {
+ delete[] specular;
+ delete[] ambient;
+ delete[] diffuse;
+ delete[] lights;
+ }
+
return true;
#endif
#else