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 // See implementation agg_font_freetype.cpp 17 // 18 //---------------------------------------------------------------------------- 19 20 #ifndef AGG_FONT_FREETYPE_INCLUDED 21 #define AGG_FONT_FREETYPE_INCLUDED 22 23 #include <ft2build.h> 24 #include FT_FREETYPE_H 25 26 27 #include "agg_scanline_storage_aa.h" 28 #include "agg_scanline_storage_bin.h" 29 #include "agg_scanline_u.h" 30 #include "agg_scanline_bin.h" 31 #include "agg_path_storage_integer.h" 32 #include "agg_rasterizer_scanline_aa.h" 33 #include "agg_conv_curve.h" 34 #include "agg_font_cache_manager.h" 35 #include "agg_trans_affine.h" 36 37 namespace agg 38 { 39 40 41 //-----------------------------------------------font_engine_freetype_base 42 class font_engine_freetype_base 43 { 44 public: 45 //-------------------------------------------------------------------- 46 typedef serialized_scanlines_adaptor_aa<int8u> gray8_adaptor_type; 47 typedef serialized_scanlines_adaptor_bin mono_adaptor_type; 48 typedef scanline_storage_aa8 scanlines_aa_type; 49 typedef scanline_storage_bin scanlines_bin_type; 50 51 //-------------------------------------------------------------------- 52 ~font_engine_freetype_base(); 53 font_engine_freetype_base(bool flag32, unsigned max_faces = 32); 54 55 // Set font parameters 56 //-------------------------------------------------------------------- 57 void resolution(unsigned dpi); 58 bool load_font(const char* font_name, unsigned face_index, glyph_rendering ren_type, 59 const char* font_mem = 0, const long font_mem_size = 0); 60 bool attach(const char* file_name); 61 bool char_map(FT_Encoding map); 62 bool height(double h); 63 bool width(double w); 64 void hinting(bool h); 65 void flip_y(bool f); 66 void transform(const trans_affine& affine); 67 68 // Set Gamma 69 //-------------------------------------------------------------------- gamma(const GammaF & f)70 template<class GammaF> void gamma(const GammaF& f) 71 { 72 m_rasterizer.gamma(f); 73 } 74 75 // Accessors 76 //-------------------------------------------------------------------- last_error()77 int last_error() const { return m_last_error; } resolution()78 unsigned resolution() const { return m_resolution; } name()79 const char* name() const { return m_name; } 80 unsigned num_faces() const; char_map()81 FT_Encoding char_map() const { return m_char_map; } height()82 double height() const { return double(m_height) / 64.0; } width()83 double width() const { return double(m_width) / 64.0; } 84 double ascender() const; 85 double descender() const; hinting()86 bool hinting() const { return m_hinting; } flip_y()87 bool flip_y() const { return m_flip_y; } 88 89 90 // Interface mandatory to implement for font_cache_manager 91 //-------------------------------------------------------------------- font_signature()92 const char* font_signature() const { return m_signature; } change_stamp()93 int change_stamp() const { return m_change_stamp; } 94 95 bool prepare_glyph(unsigned glyph_code); glyph_index()96 unsigned glyph_index() const { return m_glyph_index; } data_size()97 unsigned data_size() const { return m_data_size; } data_type()98 glyph_data_type data_type() const { return m_data_type; } bounds()99 const rect_i& bounds() const { return m_bounds; } advance_x()100 double advance_x() const { return m_advance_x; } advance_y()101 double advance_y() const { return m_advance_y; } 102 void write_glyph_to(int8u* data) const; 103 bool add_kerning(unsigned first, unsigned second, 104 double* x, double* y); 105 106 private: 107 font_engine_freetype_base(const font_engine_freetype_base&); 108 const font_engine_freetype_base& operator = (const font_engine_freetype_base&); 109 110 void update_char_size(); 111 void update_signature(); 112 int find_face(const char* face_name) const; 113 114 bool m_flag32; 115 int m_change_stamp; 116 int m_last_error; 117 char* m_name; 118 unsigned m_name_len; 119 unsigned m_face_index; 120 FT_Encoding m_char_map; 121 char* m_signature; 122 unsigned m_height; 123 unsigned m_width; 124 bool m_hinting; 125 bool m_flip_y; 126 bool m_library_initialized; 127 FT_Library m_library; // handle to library 128 FT_Face* m_faces; // A pool of font faces 129 char** m_face_names; 130 unsigned m_num_faces; 131 unsigned m_max_faces; 132 FT_Face m_cur_face; // handle to the current face object 133 int m_resolution; 134 glyph_rendering m_glyph_rendering; 135 unsigned m_glyph_index; 136 unsigned m_data_size; 137 glyph_data_type m_data_type; 138 rect_i m_bounds; 139 double m_advance_x; 140 double m_advance_y; 141 trans_affine m_affine; 142 143 path_storage_integer<int16, 6> m_path16; 144 path_storage_integer<int32, 6> m_path32; 145 conv_curve<path_storage_integer<int16, 6> > m_curves16; 146 conv_curve<path_storage_integer<int32, 6> > m_curves32; 147 scanline_u8 m_scanline_aa; 148 scanline_bin m_scanline_bin; 149 scanlines_aa_type m_scanlines_aa; 150 scanlines_bin_type m_scanlines_bin; 151 rasterizer_scanline_aa<> m_rasterizer; 152 }; 153 154 155 156 157 //------------------------------------------------font_engine_freetype_int16 158 // This class uses values of type int16 (10.6 format) for the vector cache. 159 // The vector cache is compact, but when rendering glyphs of height 160 // more that 200 there integer overflow can occur. 161 // 162 class font_engine_freetype_int16 : public font_engine_freetype_base 163 { 164 public: 165 typedef serialized_integer_path_adaptor<int16, 6> path_adaptor_type; 166 typedef font_engine_freetype_base::gray8_adaptor_type gray8_adaptor_type; 167 typedef font_engine_freetype_base::mono_adaptor_type mono_adaptor_type; 168 typedef font_engine_freetype_base::scanlines_aa_type scanlines_aa_type; 169 typedef font_engine_freetype_base::scanlines_bin_type scanlines_bin_type; 170 171 font_engine_freetype_int16(unsigned max_faces = 32) : font_engine_freetype_base(false,max_faces)172 font_engine_freetype_base(false, max_faces) {} 173 }; 174 175 //------------------------------------------------font_engine_freetype_int32 176 // This class uses values of type int32 (26.6 format) for the vector cache. 177 // The vector cache is twice larger than in font_engine_freetype_int16, 178 // but it allows you to render glyphs of very large sizes. 179 // 180 class font_engine_freetype_int32 : public font_engine_freetype_base 181 { 182 public: 183 typedef serialized_integer_path_adaptor<int32, 6> path_adaptor_type; 184 typedef font_engine_freetype_base::gray8_adaptor_type gray8_adaptor_type; 185 typedef font_engine_freetype_base::mono_adaptor_type mono_adaptor_type; 186 typedef font_engine_freetype_base::scanlines_aa_type scanlines_aa_type; 187 typedef font_engine_freetype_base::scanlines_bin_type scanlines_bin_type; 188 189 font_engine_freetype_int32(unsigned max_faces = 32) : font_engine_freetype_base(true,max_faces)190 font_engine_freetype_base(true, max_faces) {} 191 }; 192 193 194 } 195 196 #endif 197