xref: /haiku/src/libs/agg/font_freetype/agg_font_freetype.h (revision e39da397f5ff79f2db9f9a3ddf1852b6710578af)
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