diff options
Diffstat (limited to 'Build/source/utils/asymptote/drawlabel.cc')
-rw-r--r-- | Build/source/utils/asymptote/drawlabel.cc | 114 |
1 files changed, 38 insertions, 76 deletions
diff --git a/Build/source/utils/asymptote/drawlabel.cc b/Build/source/utils/asymptote/drawlabel.cc index 5f009e1087f..e887879b52d 100644 --- a/Build/source/utils/asymptote/drawlabel.cc +++ b/Build/source/utils/asymptote/drawlabel.cc @@ -24,82 +24,44 @@ void drawLabel::labelwarning(const char *action) << "\" " << action << " to avoid overwriting" << endl; } -int wait(iopipestream &tex, const char *s, const char **abort, - bool ignore=false) -{ - int rc=tex.wait(s,abort); - if(rc > 0) { - if(fataltex[rc-1]) { - tex.pipeclose(); - ignore=false; - } else { - tex << "\n"; - tex.wait(s,abort); - tex << "\n"; - tex.wait(s,abort); - } - - if(!ignore) { - string s=tex.message(); - tex.shred(); - reportError(s); - } - } - tex.shred(); - return rc; -} - // Reads one of the dimensions from the pipe. -void texdim(iopipestream& tex, double& dest, - const string command, const string name, - const char **abort) +void texdim(iopipestream& tex, double& dest, const string command, + const string name) { - string texbuf; + string start(">dim("); + string stop(")dim"); + string expect("pt"+stop+"\n\n*"); - tex << ("\\showthe\\" + command + "\\ASYbox\n"); - tex >> texbuf; - - string cannotread="Cannot read label "+name; + // ask the tex engine for dimension + tex << "\\immediate\\write16{" << start << "\\the\\" << command << "\\ASYbox" + << stop << "}\n"; + // keep reading output until ')dim\n\n*' is read + tex.wait(expect.c_str()); + string buffer = tex.getbuffer(); - if (texbuf[0] == '>' && texbuf[1] == ' ') + size_t dim1=buffer.find(start); + size_t dim2=buffer.find("pt" + stop); + string cannotread="Cannot read label "+name; + if (dim1 != string::npos && dim2 != string::npos) { + string n=buffer.substr(dim1+start.size(),dim2-dim1-start.size()); try { - dest=lexical::cast<double>(texbuf.c_str()+2,true)*tex2ps; + dest=lexical::cast<double>(n,true)*camp::tex2ps; } catch(lexical::bad_cast&) { - reportError(cannotread); + camp::reportError(cannotread); } - else - reportError(cannotread); - - tex << "\n"; - wait(tex,"\n*",abort); + } else { + camp::reportError(cannotread); + } } -bool texbounds(double& width, double& height, double& depth, - iopipestream& tex, string& s, const char **abort, bool warn, - bool Inline) +void texbounds(double& width, double& height, double& depth, + iopipestream& tex, string& s) { - string texbuf; - tex << "\\setbox\\ASYbox=\\hbox{" << stripblanklines(s) << "}\n\n"; - int rc=wait(tex,texready.c_str(),abort,Inline); - if(rc) { - tex << "\\show 0\n"; - tex.wait("\n*"); - - if(warn && getSetting<bool>("debug")) { - ostringstream buf; - buf << "Cannot determine size of label \"" << s << "\""; - reportWarning(buf); - } - - return false; - } - - texdim(tex, width, "wd", "width", abort); - texdim(tex, height, "ht", "height", abort); - texdim(tex, depth, "dp", "depth", abort); - - return true; + tex.wait(texready.c_str()); + texdim(tex,width,"wd","width"); + texdim(tex,height,"ht","height"); + texdim(tex,depth,"dp","depth"); } inline double urand() @@ -110,15 +72,16 @@ inline double urand() void setpen(iopipestream& tex, const string& texengine, const pen& pentype) { - const char **abort=texabort(texengine); bool Latex=latex(texengine); - if(Latex) { - if(setlatexfont(tex,pentype,drawElement::lastpen)) - wait(tex,"\n*",abort); + if(Latex && setlatexfont(tex,pentype,drawElement::lastpen)) { + tex << "\n"; + tex.wait(texready.c_str()); + } + if(settexfont(tex,pentype,drawElement::lastpen,Latex)) { + tex << "\n"; + tex.wait(texready.c_str()); } - if(settexfont(tex,pentype,drawElement::lastpen,Latex)) - wait(tex,"\n*",abort); drawElement::lastpen=pentype; } @@ -128,13 +91,12 @@ void drawLabel::getbounds(iopipestream& tex, const string& texengine) if(havebounds) return; havebounds=true; - const char **abort=texabort(texengine); setpen(tex,texengine,pentype); + texbounds(width,height,depth,tex,label); - bool nullsize=size.empty(); - if(!texbounds(width,height,depth,tex,label,abort,nullsize, - getSetting<bool>("inlinetex")) && !nullsize) - texbounds(width,height,depth,tex,size,abort,false); + if(width == 0.0 && height == 0.0 && depth == 0.0 && !size.empty()) + texbounds(width,height,depth,tex,size); + enabled=true; Align=inverse(T)*align; |