Store outline_glyph (glyph border) in glyph cache.
authoreugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Fri, 20 Apr 2007 23:13:34 +0000 (23:13 +0000)
committereugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Fri, 20 Apr 2007 23:13:34 +0000 (23:13 +0000)
git-svn-id: svn://git.mplayerhq.hu/mplayer/trunk@23043 b3059339-0415-0410-9bf9-f77b7e298cf2

libass/ass_cache.c
libass/ass_cache.h
libass/ass_render.c

index d6d61c3..1ea9b48 100644 (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);
 }
index f4bd605..c76c357 100644 (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;
index 81ab61c..b83a9ac 100644 (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);
-               }
-       }
 }
 
 /**