summaryrefslogtreecommitdiff
path: root/graphics/asymptote/drawclipend.h
blob: 48c8d2de5a7890949e2b66a7a49e888e3831fc2e (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
/*****
 * drawclipend.h
 * John Bowman
 *
 * End clip of picture to specified path.
 *****/

#ifndef DRAWCLIPEND_H
#define DRAWCLIPEND_H

#include "drawclipbegin.h"
#include "path.h"

namespace camp {

class drawClipEnd : public drawElement {
  bool grestore;
  drawClipBegin *partner;
public:
  drawClipEnd(bool grestore=true, drawClipBegin *partner=NULL) :
    grestore(grestore), partner(partner) {}

  virtual ~drawClipEnd() {}

  bool endclip() {return true;}

  void bounds(bbox& b, iopipestream&, boxvector&, bboxlist& bboxstack) {
    if(bboxstack.size() < 2)
      reportError("endclip without matching beginclip");
    b.clip(bboxstack.back());
    bboxstack.pop_back();
    b += bboxstack.back();
    bboxstack.pop_back();
  }

  bool endgroup() {return true;}

  bool svg() {return true;}

  void save(bool b) {
    grestore=b;
    if(partner) partner->save(b);
  }

  bool draw(psfile *out) {
    if(grestore) out->grestore();
    return true;
  }

  bool write(texfile *out, const bbox& bpath) {
    out->endgroup();

    if(out->toplevel())
      out->endpicture(bpath);

    if(grestore) out->grestore();
    return true;
  }

};

}

GC_DECLARE_PTRFREE(camp::drawClipEnd);

#endif