/***** * 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