/*****
* drawlabel.h
* John Bowman 2003/03/14
*
* Add a label to a picture.
*****/

#ifndef DRAWLABEL_H
#define DRAWLABEL_H

#include "drawelement.h"
#include "path.h"
#include "angle.h"
#include "transform.h"

namespace camp {

class drawLabel : public virtual drawElement {
protected:
 string label,size;
 transform T;          // A linear (shiftless) transformation.
 pair position;
 pair align;
 pair scale;
 pen pentype;
 double width,height,depth;
 bool havebounds;
 bool suppress;
 pair Align;
 pair texAlign;
 bbox Box;
 bool enabled;

public:
 drawLabel(string label, string size, transform T, pair position,
           pair align, pen pentype, const string& key="")
   : drawElement(key), label(label), size(size), T(shiftless(T)),
     position(position), align(align), pentype(pentype), width(0.0),
     height(0.0), depth(0.0), havebounds(false), suppress(false),
     enabled(false) {}

 virtual ~drawLabel() {}

 void getbounds(iopipestream& tex, const string& texengine);

 void checkbounds();

 void bounds(bbox& b, iopipestream&, boxvector&, bboxlist&);

 bool islabel() {
   return true;
 }

 bool write(texfile *out, const bbox&);

 drawElement *transformed(const transform& t);

 void labelwarning(const char *action);
};

class drawLabelPath : public drawLabel, public drawPathPenBase {
private:
 string justify;
 pair shift;
public:
 drawLabelPath(string label, string size, path src,
               string justify, pair shift, pen pentype,
               const string& key="") :
   drawLabel(label,size,identity,pair(0.0,0.0),pair(0.0,0.0),pentype,key),
   drawPathPenBase(src,pentype), justify(justify), shift(shift) {}

 virtual ~drawLabelPath() {}

 bool svg() {return true;}
 bool svgpng() {return true;}

 void bounds(bbox& b, iopipestream& tex, boxvector&, bboxlist&);

 bool write(texfile *out, const bbox&);

 drawElement *transformed(const transform& t);
};

void setpen(iopipestream& tex, const string& texengine, const pen& pentype);
void texbounds(double& width, double& height, double& depth,
              iopipestream& tex, string& s);

}

#endif