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 void rewind(unsigned path_id); 58 unsigned vertex(double* x, double* y); 59 60 private: 61 // not supposed to be copied 62 gsv_text(const gsv_text&); 63 const gsv_text& operator = (const gsv_text&); 64 65 int16u value(const int8u* p) const 66 { 67 int16u v; 68 if(m_big_endian) 69 { 70 *(int8u*)&v = p[1]; 71 *((int8u*)&v + 1) = p[0]; 72 } 73 else 74 { 75 *(int8u*)&v = p[0]; 76 *((int8u*)&v + 1) = p[1]; 77 } 78 return v; 79 } 80 81 private: 82 double m_x; 83 double m_y; 84 double m_start_x; 85 double m_width; 86 double m_height; 87 double m_space; 88 double m_line_space; 89 char m_chr[2]; 90 char* m_text; 91 pod_array<char> m_text_buf; 92 char* m_cur_chr; 93 const void* m_font; 94 pod_array<char> m_loaded_font; 95 status m_status; 96 bool m_big_endian; 97 bool m_flip; 98 int8u* m_indices; 99 int8* m_glyphs; 100 int8* m_bglyph; 101 int8* m_eglyph; 102 double m_w; 103 double m_h; 104 }; 105 106 107 108 109 //--------------------------------------------------------gsv_text_outline 110 template<class Transformer = trans_affine> class gsv_text_outline 111 { 112 public: 113 gsv_text_outline(gsv_text& text, const Transformer& trans) : 114 m_polyline(text), 115 m_trans(m_polyline, trans) 116 { 117 } 118 119 void width(double w) 120 { 121 m_polyline.width(w); 122 } 123 124 void transformer(const Transformer* trans) 125 { 126 m_trans->transformer(trans); 127 } 128 129 void rewind(unsigned path_id) 130 { 131 m_trans.rewind(path_id); 132 m_polyline.line_join(round_join); 133 m_polyline.line_cap(round_cap); 134 } 135 136 unsigned vertex(double* x, double* y) 137 { 138 return m_trans.vertex(x, y); 139 } 140 141 private: 142 conv_stroke<gsv_text> m_polyline; 143 conv_transform<conv_stroke<gsv_text>, Transformer> m_trans; 144 }; 145 146 147 148 } 149 150 151 #endif 152