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.h90
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