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