[MPlayer-cvslog] r23046 - in trunk/libass: ass_cache.h ass_render.c

eugeni subversion at mplayerhq.hu
Sat Apr 21 01:19:23 CEST 2007


Author: eugeni
Date: Sat Apr 21 01:19:23 2007
New Revision: 23046

Modified:
   trunk/libass/ass_cache.h
   trunk/libass/ass_render.c

Log:
Add shift_[xy] (vector that is added to the glyph before transformation) to
bitmap glyph key. Result of rotation depends on them because of perspective
transformation. They are only set when some rotation take place.


Modified: trunk/libass/ass_cache.h
==============================================================================
--- trunk/libass/ass_cache.h	(original)
+++ trunk/libass/ass_cache.h	Sat Apr 21 01:19:23 2007
@@ -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;

Modified: trunk/libass/ass_render.c
==============================================================================
--- trunk/libass/ass_render.c	(original)
+++ trunk/libass/ass_render.c	Sat Apr 21 01:19:23 2007
@@ -1926,9 +1926,6 @@ static int ass_render_event(ass_event_t*
 		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*
 			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);



More information about the MPlayer-cvslog mailing list