diff options
Diffstat (limited to 'Build/source/utils/asymptote/picture.cc')
-rw-r--r-- | Build/source/utils/asymptote/picture.cc | 186 |
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 |