summaryrefslogtreecommitdiff
path: root/Build/source/utils/asymptote/drawlabel.h
blob: 253184008d396d0c30df0f0509a5d97e6f75142d (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
/*****
 * 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)
    : 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) : 
    drawLabel(label,size,identity,pair(0.0,0.0),align,pentype),
    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);
bool texbounds(double& width, double& height, double& depth,
               iopipestream& tex, string& s, const char **abort,
               bool warn, bool Inline=false);

}

#endif