Anti-Grain Geometry Tutorial
agg_font_freetype.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 // 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
43  {
44  public:
45  //--------------------------------------------------------------------
50 
51  //--------------------------------------------------------------------
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  //--------------------------------------------------------------------
70  template<class GammaF> void gamma(const GammaF& f)
71  {
72  m_rasterizer.gamma(f);
73  }
74 
75  // Accessors
76  //--------------------------------------------------------------------
77  int last_error() const { return m_last_error; }
78  unsigned resolution() const { return m_resolution; }
79  const char* name() const { return m_name; }
80  unsigned num_faces() const;
81  FT_Encoding char_map() const { return m_char_map; }
82  double height() const { return double(m_height) / 64.0; }
83  double width() const { return double(m_width) / 64.0; }
84  double ascender() const;
85  double descender() const;
86  bool hinting() const { return m_hinting; }
87  bool flip_y() const { return m_flip_y; }
88 
89 
90  // Interface mandatory to implement for font_cache_manager
91  //--------------------------------------------------------------------
92  const char* font_signature() const { return m_signature; }
93  int change_stamp() const { return m_change_stamp; }
94 
95  bool prepare_glyph(unsigned glyph_code);
96  unsigned glyph_index() const { return m_glyph_index; }
97  unsigned data_size() const { return m_data_size; }
98  glyph_data_type data_type() const { return m_data_type; }
99  const rect_i& bounds() const { return m_bounds; }
100  double advance_x() const { return m_advance_x; }
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:
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 
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  //
163  {
164  public:
170 
171  font_engine_freetype_int16(unsigned max_faces = 32) :
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  //
181  {
182  public:
188 
189  font_engine_freetype_int32(unsigned max_faces = 32) :
190  font_engine_freetype_base(true, max_faces) {}
191  };
192 
193 
194 }
195 
196 #endif
Definition: agg_arc.cpp:24