Store outline_glyph (glyph border) in glyph cache.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@23043 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
eugeni 2007-04-20 23:13:34 +00:00
parent 05739aa046
commit 35cc43696d
3 changed files with 12 additions and 8 deletions

View File

@ -283,6 +283,7 @@ static void glyph_hash_dtor(void* key, size_t key_size, void* value, size_t valu
{
glyph_hash_val_t* v = value;
if (v->glyph) FT_Done_Glyph(v->glyph);
if (v->outline_glyph) FT_Done_Glyph(v->outline_glyph);
free(key);
free(value);
}

View File

@ -69,6 +69,7 @@ typedef struct glyph_hash_key_s {
typedef struct glyph_hash_val_s {
FT_Glyph glyph;
FT_Glyph outline_glyph;
FT_BBox bbox_scaled; // bbox after scaling, but before rotation
FT_Vector advance; // 26.6, advance distance to the next bitmap in line
} glyph_hash_val_t;

View File

@ -1243,6 +1243,7 @@ static void get_outline_glyph(int symbol, glyph_info_t* info, FT_Vector* advance
val = cache_find_glyph(&key);
if (val) {
FT_Glyph_Copy(val->glyph, &info->glyph);
FT_Glyph_Copy(val->outline_glyph, &info->outline_glyph);
info->bbox = val->bbox_scaled;
info->advance.x = val->advance.x;
info->advance.y = val->advance.y;
@ -1255,19 +1256,20 @@ static void get_outline_glyph(int symbol, glyph_info_t* info, FT_Vector* advance
info->advance.y = d16_to_d6(info->glyph->advance.y);
FT_Glyph_Get_CBox( info->glyph, FT_GLYPH_BBOX_PIXELS, &info->bbox);
if (render_context.stroker) {
info->outline_glyph = info->glyph;
error = FT_Glyph_StrokeBorder( &(info->outline_glyph), render_context.stroker, 0 , 0 ); // don't destroy original
if (error) {
mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FT_Glyph_Stroke_Error, error);
}
}
FT_Glyph_Copy(info->glyph, &v.glyph);
FT_Glyph_Copy(info->outline_glyph, &v.outline_glyph);
v.advance = info->advance;
v.bbox_scaled = info->bbox;
cache_add_glyph(&key, &v);
}
if (render_context.stroker) {
info->outline_glyph = info->glyph;
error = FT_Glyph_StrokeBorder( &(info->outline_glyph), render_context.stroker, 0 , 0 ); // don't destroy original
if (error) {
mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_FT_Glyph_Stroke_Error, error);
}
}
}
/**