summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/drawclipbegin.h
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/utils/asymptote/drawclipbegin.h')
-rw-r--r--Build/source/utils/asymptote/drawclipbegin.h92
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