diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/asymptote/base/plain_shipout.asy |
Initial commit
Diffstat (limited to 'graphics/asymptote/base/plain_shipout.asy')
-rw-r--r-- | graphics/asymptote/base/plain_shipout.asy | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/graphics/asymptote/base/plain_shipout.asy b/graphics/asymptote/base/plain_shipout.asy new file mode 100644 index 0000000000..4562205966 --- /dev/null +++ b/graphics/asymptote/base/plain_shipout.asy @@ -0,0 +1,145 @@ +// Default file prefix used for inline LaTeX mode +string defaultfilename; + +file _outpipe; +if(settings.xasy) + _outpipe=output(mode="pipe"); + +string[] file3; + +string outprefix(string prefix=defaultfilename) { + return stripextension(prefix != "" ? prefix : outname()); +} + +string outformat(string format="") +{ + if(format == "") format=settings.outformat; + if(format == "") format=nativeformat(); + return format; +} + +frame currentpatterns; + +frame Portrait(frame f) {return f;}; +frame Landscape(frame f) {return rotate(90)*f;}; +frame UpsideDown(frame f) {return rotate(180)*f;}; +frame Seascape(frame f) {return rotate(-90)*f;}; +typedef frame orientation(frame); +orientation orientation=Portrait; + +// Forward references to functions defined in module three. +object embed3(string, frame, string, string, string, light, projection); +string Embed(string name, string text="", string options="", real width=0, + real height=0); + +bool prconly(string format="") +{ + return outformat(format) == "prc"; +} + +bool prc0(string format="") +{ + return settings.prc && (outformat(format) == "pdf" || prconly() || settings.inlineimage ); +} + +bool prc(string format="") { + return prc0(format) && Embed != null; +} + +bool is3D(string format="") +{ + return prc(format) || settings.render != 0; +} + +frame enclose(string prefix=defaultfilename, object F, string format="") +{ + if(prc(format)) { + frame f; + label(f,F.L); + return f; + } return F.f; +} + +void deconstruct(picture pic=currentpicture) +{ + frame f; + transform t=pic.calculateTransform(); + if(currentpicture.fitter == null) + f=pic.fit(t); + else + f=pic.fit(); + deconstruct(f,currentpatterns,t); +} + +bool implicitshipout=false; + +void shipout(string prefix=defaultfilename, frame f, + string format="", bool wait=false, bool view=true, + string options="", string script="", + light light=currentlight, projection P=currentprojection, + transform t=identity) +{ + if(is3D(f)) { + f=enclose(prefix,embed3(prefix,f,format,options,script,light,P)); + if(settings.render != 0 && !prc(format)) { + return; + } + } + + if(settings.xasy || (!implicitshipout && prefix == defaultfilename)) { + if(prefix == defaultfilename) { + currentpicture.clear(); + add(f,group=false); + } + return; + } + + // Applications like LaTeX cannot handle large PostScript coordinates. + pair m=min(f); + int limit=2000; + if(abs(m.x) > limit || abs(m.y) > limit) f=shift(-m)*f; + + _shipout(prefix,f,currentpatterns,format,wait,view,t); +} + +void shipout(string prefix=defaultfilename, picture pic=currentpicture, + orientation orientation=orientation, + string format="", bool wait=false, bool view=true, + string options="", string script="", + light light=currentlight, projection P=currentprojection) +{ + pic.uptodate=true; + if(!uptodate()) { + bool inlinetex=settings.inlinetex; + bool prc=prc(format); + bool empty3=pic.empty3(); + if(prc && !empty3) { + if(settings.render == 0) { + string image=outprefix(prefix)+"+"+(string) file3.length; + if(settings.inlineimage) image += "_0"; + settings.inlinetex=false; + settings.prc=false; + shipout(image,pic,orientation,nativeformat(),view=false,light,P); + settings.prc=true; + } + settings.inlinetex=settings.inlineimage; + } + frame f; + transform t=pic.calculateTransform(); + if(currentpicture.fitter == null) + f=pic.fit(t); + else + f=pic.fit(prefix,format,view=view,options,script,light,P); + + if(!prconly() && (!pic.empty2() || settings.render == 0 || prc || empty3)) + shipout(prefix,orientation(f),format,wait,view,t); + settings.inlinetex=inlinetex; + } +} + +void newpage(picture pic=currentpicture) +{ + pic.add(new void(frame f, transform) { + newpage(f); + },true); +} |