]> granicus.if.org Git - libass/commitdiff
Add shift_[xy] (vector that is added to the glyph before transformation) to
authoreugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Fri, 20 Apr 2007 23:19:23 +0000 (23:19 +0000)
committereugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Fri, 20 Apr 2007 23:19:23 +0000 (23:19 +0000)
bitmap glyph key. Result of rotation depends on them because of perspective
transformation. They are only set when some rotation take place.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@23046 b3059339-0415-0410-9bf9-f77b7e298cf2

libass/ass_cache.h
libass/ass_render.c

index a0403d03fbf01e7ec7bbbcc231742bce8b54baea..7ff75885b8eb8c5b1a77edad85db92c4ba1735f9 100644 (file)
@@ -39,6 +39,9 @@ typedef struct bitmap_hash_key_s {
 
        unsigned scale_x, scale_y; // 16.16
        int frx, fry, frz; // signed 16.16
+       int shift_x, shift_y; // shift vector that was added to glyph before applying rotation
+                             // = 0, if frx = fry = frx = 0
+                             // = (glyph base point) - (rotation origin), otherwise
        
        FT_Vector advance; // subpixel shift vector
 } bitmap_hash_key_t;
index 44cc272ecbc3fb05f5de1ceb1a9c07e49c6d1a01..d139c2e10909101347871bb870e5fc536ff91c4f 100644 (file)
@@ -1926,9 +1926,6 @@ static int ass_render_event(ass_event_t* event, event_images_t* event_images)
                render_context.clip_y1 = y2scr(render_context.clip_y1);
        }
 
-       for (i = 0; i < text_info.length; ++i)
-               get_bitmap_glyph(text_info.glyphs + i);
-
        // rotate glyphs if needed
        {
                FT_Vector center;
@@ -1949,6 +1946,15 @@ static int ass_render_event(ass_event_t* event, event_images_t* event_images)
                        FT_Vector shift;
                        glyph_info_t* info = text_info.glyphs + i;
 
+                       if (info->hash_key.frx || info->hash_key.fry || info->hash_key.frz) {
+                               info->hash_key.shift_x = info->pos.x + device_x - center.x;
+                               info->hash_key.shift_y = - (info->pos.y + device_y - center.y);
+                       } else {
+                               info->hash_key.shift_x = 0;
+                               info->hash_key.shift_y = 0;
+                       }
+                       get_bitmap_glyph(info);
+
                        if (info->bm == 0) {
                                // calculating shift vector
                                shift.x = int_to_d6(info->pos.x + device_x - center.x);