16 #ifndef AGG_FONT_CACHE_MANAGER2_INCLUDED 17 #define AGG_FONT_CACHE_MANAGER2_INCLUDED 22 #include "agg_array.h" 30 glyph_data_invalid = 0,
33 glyph_data_outline = 3
45 glyph_data_type data_type;
56 enum block_size_e { block_size = 16384-16 };
60 : m_allocator(block_size)
61 { std::memset(m_glyphs, 0,
sizeof(m_glyphs)); }
64 const cached_glyph* find_glyph(
unsigned glyph_code)
const 66 unsigned msb = (glyph_code >> 8) & 0xFF;
69 return m_glyphs[msb][glyph_code & 0xFF];
80 glyph_data_type data_type,
85 unsigned msb = (glyph_code >> 8) & 0xFF;
86 if(m_glyphs[msb] == 0)
91 std::memset(m_glyphs[msb], 0,
sizeof(
cached_glyph*) * 256);
94 unsigned lsb = glyph_code & 0xFF;
95 if(m_glyphs[msb][lsb])
return 0;
101 glyph->cached_font = cached_font;
102 glyph->glyph_code = glyph_code;
103 glyph->glyph_index = glyph_index;
104 glyph->data = m_allocator.allocate(data_size);
105 glyph->data_size = data_size;
106 glyph->data_type = data_type;
107 glyph->bounds = bounds;
108 glyph->advance_x = advance_x;
109 glyph->advance_y = advance_y;
110 return m_glyphs[msb][lsb] = glyph;
123 glyph_ren_native_mono,
124 glyph_ren_native_gray8,
137 typedef FontEngine font_engine_type;
139 typedef typename font_engine_type::path_adaptor_type path_adaptor_type;
140 typedef typename font_engine_type::gray8_adaptor_type gray8_adaptor_type;
141 typedef typename gray8_adaptor_type::embedded_scanline gray8_scanline_type;
142 typedef typename font_engine_type::mono_adaptor_type mono_adaptor_type;
143 typedef typename mono_adaptor_type::embedded_scanline mono_scanline_type;
148 font_engine_type& engine,
149 typename FontEngine::loaded_face *face,
153 glyph_rendering rendering )
158 , m_hinting( hinting )
159 , m_rendering( rendering )
162 m_face_height=m_face->height();
163 m_face_width=m_face->width();
164 m_face_ascent=m_face->ascent();
165 m_face_descent=m_face->descent();
166 m_face_ascent_b=m_face->ascent_b();
167 m_face_descent_b=m_face->descent_b();
170 double height()
const 172 return m_face_height;
180 double ascent()
const 182 return m_face_ascent;
185 double descent()
const 187 return m_face_descent;
190 double ascent_b()
const 192 return m_face_ascent_b;
195 double descent_b()
const 197 return m_face_descent_b;
202 if( !first || !second )
205 return m_face->add_kerning(
206 first->glyph_index, second->glyph_index, x, y );
211 m_face->select_instance( m_height, m_width, m_hinting, m_rendering );
219 typename FontEngine::prepared_glyph prepared;
221 bool success=m_face->prepare_glyph(cp, &prepared);
224 glyph=m_glyphs.cache_glyph(
227 prepared.glyph_index,
232 prepared.advance_y );
234 m_face->write_glyph_to(&prepared,glyph->data);
240 font_engine_type& m_engine;
241 typename FontEngine::loaded_face *m_face;
245 glyph_rendering m_rendering;
246 double m_face_height;
248 double m_face_ascent;
249 double m_face_descent;
250 double m_face_ascent_b;
251 double m_face_descent_b;
267 switch(gl->data_type)
270 case glyph_data_mono:
271 m_mono_adaptor.init(gl->data, gl->data_size, x, y);
274 case glyph_data_gray8:
275 m_gray8_adaptor.init(gl->data, gl->data_size, x, y);
278 case glyph_data_outline:
279 m_path_adaptor.init(gl->data, gl->data_size, x, y, scale);
287 path_adaptor_type& path_adaptor() {
return m_path_adaptor; }
288 gray8_adaptor_type& gray8_adaptor() {
return m_gray8_adaptor; }
289 gray8_scanline_type& gray8_scanline() {
return m_gray8_scanline; }
290 mono_adaptor_type& mono_adaptor() {
return m_mono_adaptor; }
291 mono_scanline_type& mono_scanline() {
return m_mono_scanline; }
297 const self_type& operator = (
const self_type&);
299 font_engine_type& m_engine;
300 path_adaptor_type m_path_adaptor;
301 gray8_adaptor_type m_gray8_adaptor;
302 gray8_scanline_type m_gray8_scanline;
303 mono_adaptor_type m_mono_adaptor;
304 mono_scanline_type m_mono_scanline;