diff options
Diffstat (limited to 'Build/source/utils/asymptote/drawclipbegin.h')
-rw-r--r-- | Build/source/utils/asymptote/drawclipbegin.h | 90 |
1 files changed, 90 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..5bc2d1f7c37 --- /dev/null +++ b/Build/source/utils/asymptote/drawclipbegin.h @@ -0,0 +1,90 @@ +/***** + * 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) + : drawSuperPathPenBase(src,pentype), gsave(gsave), stroke(stroke) { + if(!stroke && !cyclic()) noncyclic(); + } + + virtual ~drawClipBegin() {} + + 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;} + + void save(bool b) { + gsave=b; + } + + bool draw(psfile *out) { + if(gsave) out->gsave(); + if(empty()) return true; + + writepath(out); + if(stroke) strokepath(out); + out->clip(pentype); + return true; + } + + bool write(texfile *out, const bbox& bpath) { + if(gsave) out->gsave(); + if(empty()) return true; + + out->verbatim(settings::beginpicture(out->texengine)); + out->verbatim("("); + double width=bpath.right-bpath.left; + double height=bpath.top-bpath.bottom; + out->write(width*ps2tex); + out->verbatim(","); + out->write(height*ps2tex); + out->verbatimline(")%"); + + out->beginspecial(); + out->beginraw(); + writeshiftedpath(out); + if(stroke) strokepath(out); + out->clip(pentype); + out->endraw(); + out->endspecial(); + + return true; + } + + drawElement *transformed(const transform& t) + { + return new drawClipBegin(transpath(t),stroke,transpen(t)); + } + +}; + +} + +#endif |