CGM Objects Library
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Pages
TextExtent.h
1 // TextExtent.h: interface for the CTextExtent class.
2 //
5 
6 #if !defined(LST_TEXTEXTENT_H__INCLUDED_)
7 #define LST_TEXTEXTENT_H__INCLUDED_
8 
9 #pragma once
10 
11 #include "Utility/DPoint.h"
12 #include "Utility/LSTException.h"
13 #include <vector>
14 
15 namespace Larson
16 {
19  {
20  public:
21  enum ExceptionCodes
22  {
23  eSubscriptOutOfRange = EXC_TEXTEXTENT
24  };
25 
26  CTextExtent()
27  {
28  extents.reserve(15);
29  extents.assign(15, DPoint(0,0));
30  capHeightFontUnits = 0;
31  };
32  CTextExtent(vector <DPoint>& pts)
33  {
34  extents.reserve(15);
35  capHeightFontUnits = 0;
36 
37  setExtents(pts);
38  };
40  {
41  extents.reserve(15);
42  capHeightFontUnits = 0;
43 
44  setExtents(pts);
45  };
46 
47  ~CTextExtent() { };
48  double capHeightFontUnits; // raw cap height in font units
49 
50  void setExtents(const vector <DPoint>& pts)
51  {
52  unsigned int i;
53  for(i = 0; i < 15; i++)
54  {
55  if (i == extents.size())
56  extents.push_back(pts[i]);
57  else
58  extents[i] = pts[i];
59  }
60  };
61 
62  void setExtents(const CTextExtent &pts)
63  {
64  unsigned int i;
65  for(i = 0; i < 15; i++)
66  {
67  if (i == extents.size())
68  extents.push_back(pts.extents[i]);
69  else
70  extents[i] = pts.extents[i];
71  }
72  };
73 
74  void invalidate()
75  {
76  unsigned int i;
77  for(i = 0; i < 15; i++)
78  extents[i] = DPoint(0,0);
79  };
80 
81  void scale(double xScale, double yScale)
82  {
83  unsigned int i;
84  for(i = 0; i < 15; i++)
85  {
86  extents[i].x = extents[i].x * xScale;
87  extents[i].y = extents[i].y * yScale;
88  }
89  };
90 
91  void rotate(double rotation, DPoint center)
92  {
93  double x, y, cosA, sinA;
94  int i;
95 
96  while(rotation > 360.) rotation -= 360.;
97  while(rotation < 0.) rotation += 360.;
98  if(rotation == 90.){
99  cosA = 0;
100  sinA = 1.;
101  }else if(rotation == 180.){
102  cosA = -1.;
103  sinA = 0.;
104  }else if(rotation == 270.){
105  cosA = 0;
106  sinA = -1.;
107  }else{
108  return;
109  }
110 
111  for (i = 0; i < 15; i++)
112  {
113  x = extents[i].x;
114  y = extents[i].y;
115 
116  extents[i].x = ((x - center.x) * cosA) + ((y - center.y) * sinA) + center.x;
117  extents[i].y = ((y - center.y) * cosA) - ((x - center.x) * sinA) + center.y;
118  }
119  }
120 
121  double getBaseLength()
122  {
123  // baseline length
124  return sqrt((extents[2].x - extents[0].x) * (extents[2].x - extents[0].x) +
125  (extents[2].y - extents[0].y) * (extents[2].y - extents[0].y) );
126  };
127 
128  double getHeight()
129  {
130  // character bottom - top distance
131  return sqrt((extents[12].x - extents[0].x) * (extents[12].x - extents[0].x) +
132  (extents[12].y - extents[0].y) * (extents[12].y - extents[0].y) );
133  };
134 
135  double getCapHeight()
136  {
137  // character baseline - cap distance
138  return sqrt((extents[9].x - extents[3].x) * (extents[9].x - extents[3].x) +
139  (extents[9].y - extents[3].y) * (extents[9].y - extents[3].y) );
140  };
141 
142  DPoint getLeftBottom() { return extents[0]; };
143  DPoint getCenterBottom() { return extents[1]; };
144  DPoint getRightBottom() { return extents[2]; };
145  DPoint getLeftBase() { return extents[3]; };
146  DPoint getCenterBase() { return extents[4]; };
147  DPoint getRightBase() { return extents[5]; };
148  DPoint getLeftHalf() { return extents[6]; };
149  DPoint getCenterHalf() { return extents[7]; };
150  DPoint getRightHalf() { return extents[8]; };
151  DPoint getLeftCap() { return extents[9]; };
152  DPoint getCenterCap() { return extents[10]; };
153  DPoint getRightCap() { return extents[11]; };
154  DPoint getLeftTop() { return extents[12]; };
155  DPoint getCenterTop() { return extents[13]; };
156  DPoint getRightTop() { return extents[14]; };
157  DPoint getIndex(int index) { return extents[index]; };
158 
159  void setLeftBottom( const DPoint &pt ) { extents[0] = pt; };
160  void setCenterBottom( const DPoint &pt ) { extents[1] = pt; };
161  void setRightBottom( const DPoint &pt ) { extents[2] = pt; };
162  void setLeftBase( const DPoint &pt ) { extents[3] = pt; };
163  void setCenterBase( const DPoint &pt ) { extents[4] = pt; };
164  void setRightBase( const DPoint &pt ) { extents[5] = pt; };
165  void setLeftHalf( const DPoint &pt ) { extents[6] = pt; };
166  void setCenterHalf( const DPoint &pt ) { extents[7] = pt; };
167  void setRightHalf( const DPoint &pt ) { extents[8] = pt; };
168  void setLeftCap( const DPoint &pt ) { extents[9] = pt; };
169  void setCenterCap( const DPoint &pt ) { extents[10] = pt; };
170  void setRightCap( const DPoint &pt ) { extents[11] = pt; };
171  void setLeftTop( const DPoint &pt ) { extents[12] = pt; };
172  void setCenterTop( const DPoint &pt ) { extents[13] = pt; };
173  void setRightTop( const DPoint &pt ) { extents[14] = pt; };
174  void setIndex( const DPoint &pt, int index ) { extents[index] = pt; };
175 
176  void setLeftBottom( const double x, const double y ) { extents[0].x = x;
177  extents[0].y = y; };
178  void setCenterBottom( const double x, const double y ) { extents[1].x = x;
179  extents[1].y = y; };
180  void setRightBottom( const double x, const double y ) { extents[2].x = x;
181  extents[2].y = y; };
182  void setLeftBase( const double x, const double y ) { extents[3].x = x;
183  extents[3].y = y; };
184  void setCenterBase( const double x, const double y ) { extents[4].x = x;
185  extents[4].y = y; };
186  void setRightBase( const double x, const double y ) { extents[5].x = x;
187  extents[5].y = y; };
188  void setLeftHalf( const double x, const double y ) { extents[6].x = x;
189  extents[6].y = y; };
190  void setCenterHalf( const double x, const double y ) { extents[7].x = x;
191  extents[7].y = y; };
192  void setRightHalf( const double x, const double y ) { extents[8].x = x;
193  extents[8].y = y; };
194  void setLeftCap( const double x, const double y ) { extents[9].x = x;
195  extents[9].y = y; };
196  void setCenterCap( const double x, const double y ) { extents[10].x = x;
197  extents[10].y = y; };
198  void setRightCap( const double x, const double y ) { extents[11].x = x;
199  extents[11].y = y; };
200  void setLeftTop( const double x, const double y ) { extents[12].x = x;
201  extents[12].y = y; };
202  void setCenterTop( const double x, const double y ) { extents[13].x = x;
203  extents[13].y = y; };
204  void setRightTop( const double x, const double y ) { extents[14].x = x;
205  extents[14].y = y; };
206  void setIndex( const double x, const double y, unsigned int i ) { extents[i].x = x;
207  extents[i].y = y; };
208 
209  void generateCenterAndRight(DPoint& right)
210  {
211  DPoint center = right;
212  center /= 2;
213 
214  unsigned int i;
215  for (i = 0; i < 15; i += 3)
216  {
217  extents[i + 1] = extents[i] + center;
218  extents[i + 2] = extents[i] + right;
219  }
220  };
221 
222  bool operator==(const CTextExtent& pts) const {
223  int i;
224  for (i = 0; i < 15; i++)
225  {
226  if (extents[i] != pts[i]) return false;
227  }
228  return true;
229  };
230 
231  bool operator!=(const CTextExtent& pts) const {
232  int i;
233  for (i = 0; i < 15; i++)
234  {
235  if (extents[i] != pts[i]) return true;
236  }
237  return false;
238  };
239 
240  DPoint& operator[](const unsigned int i)
241  {
242  if (i >= extents.size())
243  {
244  throw CLstException(CTextExtent::eSubscriptOutOfRange, L"Text Extent subscript out of range");
245  }
246  return extents[i];
247  };
248 
249  const DPoint& operator[](const unsigned int i) const
250  {
251  if (i >= extents.size())
252  {
253  throw CLstException(CTextExtent::eSubscriptOutOfRange, L"Text Extent subscript out of range");
254  }
255  return extents[i];
256  };
257 
258  void operator=(const CTextExtent& pts) { setExtents(pts); };
259  void operator=(const vector <DPoint>& pts) { setExtents(pts); };
260 
261 
262 
263  protected:
264  vector <DPoint> extents;
265  };
266 };
267 
268 #endif // LST_TEXTEXTENT_H__INCLUDED_
269 
CTextExtents – text extents container.
Definition: TextExtent.h:18