Anti-Grain Geometry Tutorial
agg_gsv_text.h
1 //----------------------------------------------------------------------------
2 // Anti-Grain Geometry - Version 2.4
3 // Copyright (C) 2002-2005 Maxim Shemanarev (http://www.antigrain.com)
4 //
5 // Permission to copy, use, modify, sell and distribute this software
6 // is granted provided this copyright notice appears in all copies.
7 // This software is provided "as is" without express or implied
8 // warranty, and with no claim as to its suitability for any purpose.
9 //
10 //----------------------------------------------------------------------------
11 // Contact: mcseem@antigrain.com
12 // mcseemagg@yahoo.com
13 // http://www.antigrain.com
14 //----------------------------------------------------------------------------
15 //
16 // Class gsv_text
17 //
18 //----------------------------------------------------------------------------
19 
20 #ifndef AGG_GSV_TEXT_INCLUDED
21 #define AGG_GSV_TEXT_INCLUDED
22 
23 #include "agg_array.h"
24 #include "agg_conv_stroke.h"
25 #include "agg_conv_transform.h"
26 
27 namespace agg
28 {
29 
30 
31  //---------------------------------------------------------------gsv_text
32  //
33  // See Implementation agg_gsv_text.cpp
34  //
35  class gsv_text
36  {
37  enum status
38  {
39  initial,
40  next_char,
41  start_glyph,
42  glyph
43  };
44 
45  public:
46  gsv_text();
47 
48  void font(const void* font);
49  void flip(bool flip_y) { m_flip = flip_y; }
50  void load_font(const char* file);
51  void size(double height, double width=0.0);
52  void space(double space);
53  void line_space(double line_space);
54  void start_point(double x, double y);
55  void text(const char* text);
56 
57  double text_width();
58 
59  void rewind(unsigned path_id);
60  unsigned vertex(double* x, double* y);
61 
62  private:
63  // not supposed to be copied
64  gsv_text(const gsv_text&);
65  const gsv_text& operator = (const gsv_text&);
66 
67  int16u value(const int8u* p) const
68  {
69  int16u v;
70  if(m_big_endian)
71  {
72  *(int8u*)&v = p[1];
73  *((int8u*)&v + 1) = p[0];
74  }
75  else
76  {
77  *(int8u*)&v = p[0];
78  *((int8u*)&v + 1) = p[1];
79  }
80  return v;
81  }
82 
83  private:
84  double m_x;
85  double m_y;
86  double m_start_x;
87  double m_width;
88  double m_height;
89  double m_space;
90  double m_line_space;
91  char m_chr[2];
92  char* m_text;
93  pod_array<char> m_text_buf;
94  char* m_cur_chr;
95  const void* m_font;
96  pod_array<char> m_loaded_font;
97  status m_status;
98  bool m_big_endian;
99  bool m_flip;
100  int8u* m_indices;
101  int8* m_glyphs;
102  int8* m_bglyph;
103  int8* m_eglyph;
104  double m_w;
105  double m_h;
106  };
107 
108 
109 
110 
111  //--------------------------------------------------------gsv_text_outline
112  template<class Transformer = trans_affine> class gsv_text_outline
113  {
114  public:
115  gsv_text_outline(gsv_text& text, Transformer& trans) :
116  m_polyline(text),
117  m_trans(m_polyline, trans)
118  {
119  }
120 
121  void width(double w)
122  {
123  m_polyline.width(w);
124  }
125 
126  void transformer(const Transformer* trans)
127  {
128  m_trans->transformer(trans);
129  }
130 
131  void rewind(unsigned path_id)
132  {
133  m_trans.rewind(path_id);
134  m_polyline.line_join(round_join);
135  m_polyline.line_cap(round_cap);
136  }
137 
138  unsigned vertex(double* x, double* y)
139  {
140  return m_trans.vertex(x, y);
141  }
142 
143  private:
144  conv_stroke<gsv_text> m_polyline;
145  conv_transform<conv_stroke<gsv_text>, Transformer> m_trans;
146  };
147 
148 
149 
150 }
151 
152 
153 #endif
Definition: agg_arc.cpp:24