summaryrefslogtreecommitdiff
path: root/graphics/asymptote/drawclipbegin.h
blob: 8bf8e30ffc4aa691b0d48d8f6088cd5407aee2fb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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