diff options
Diffstat (limited to 'Build/source/utils/asymptote/drawclipbegin.h')
-rw-r--r-- | Build/source/utils/asymptote/drawclipbegin.h | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/Build/source/utils/asymptote/drawclipbegin.h b/Build/source/utils/asymptote/drawclipbegin.h new file mode 100644 index 00000000000..8bf8e30ffc4 --- /dev/null +++ b/Build/source/utils/asymptote/drawclipbegin.h @@ -0,0 +1,92 @@ +/***** + * drawclipbegin.h + * John Bowman + * + * Begin clip of picture to specified path. + *****/ + +#ifndef DRAWCLIPBEGIN_H +#define DRAWCLIPBEGIN_H + +#include "drawelement.h" +#include "path.h" +#include "drawpath.h" + +namespace camp { + +class drawClipBegin : public drawSuperPathPenBase { + bool gsave; + bool stroke; +public: + void noncyclic() { + reportError("cannot clip to non-cyclic path"); + } + + drawClipBegin(const vm::array& src, bool stroke, pen pentype, + bool gsave=true, const string& key="") : + drawElement(key), drawSuperPathPenBase(src,pentype), gsave(gsave), + stroke(stroke) { + if(!stroke && !cyclic()) noncyclic(); + } + + virtual ~drawClipBegin() {} + + bool beginclip() {return true;} + + void bounds(bbox& b, iopipestream& iopipe, boxvector& vbox, + bboxlist& bboxstack) { + bboxstack.push_back(b); + bbox bpath; + if(stroke) strokebounds(bpath); + else drawSuperPathPenBase::bounds(bpath,iopipe,vbox,bboxstack); + bboxstack.push_back(bpath); + } + + bool begingroup() {return true;} + + bool svg() {return true;} + + void save(bool b) { + gsave=b; + } + + bool draw(psfile *out) { + if(gsave) out->gsave(); + if(empty()) return true; + out->beginclip(); + writepath(out,false); + if(stroke) strokepath(out); + out->endclip(pentype); + return true; + } + + bool write(texfile *out, const bbox& bpath) { + if(gsave) out->gsave(); + if(empty()) return true; + + if(out->toplevel()) + out->beginpicture(bpath); + + out->begingroup(); + + out->beginspecial(); + out->beginraw(); + writeshiftedpath(out); + if(stroke) strokepath(out); + out->endclip(pentype); + out->endraw(); + out->endspecial(); + + return true; + } + + drawElement *transformed(const transform& t) + { + return new drawClipBegin(transpath(t),stroke,transpen(t),gsave,KEY); + } + +}; + +} + +#endif |