changeset 21097:77316737de63

Fix collision detection. The old method tried to avoid gaps between subtitles by moving the upper subtitle down. This is wrong. With this fix, a subtitle will be moved only if it overlaps with another one.
author eugeni
date Mon, 20 Nov 2006 17:10:18 +0000
parents fab53122b590
children 90ed81455c5c
files libass/ass_render.c
diffstat 1 files changed, 12 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/libass/ass_render.c	Mon Nov 20 17:08:13 2006 +0000
+++ b/libass/ass_render.c	Mon Nov 20 17:10:18 2006 +0000
@@ -2080,37 +2080,28 @@
 static int fit_segment(segment_t* s, segment_t* fixed, int* cnt, int dir)
 {
 	int i;
-	int shift;
-
-	if (*cnt == 0) {
-		*cnt = 1;
-		fixed[0].a = s->a;
-		fixed[0].b = s->b;
-		return 0;
-	}
+	int shift = 0;
 
 	if (dir == 1) { // move down
-		if (s->b <= fixed[0].a) // all ok
-			return 0;
 		for (i = 0; i < *cnt; ++i) {
+			if (s->b + shift <= fixed[i].a || s->a + shift >= fixed[i].b)
+				continue;
 			shift = fixed[i].b - s->a;
-			if (i == *cnt - 1 || fixed[i+1].a >= shift + s->b) { // here is a good place
-				fixed[i].b += s->b - s->a;
-				return shift;
-			}
 		}
 	} else { // dir == -1, move up
-		if (s->a >= fixed[*cnt-1].b) // all ok
-			return 0;
 		for (i = *cnt-1; i >= 0; --i) {
+			if (s->b + shift <= fixed[i].a || s->a + shift >= fixed[i].b)
+				continue;
 			shift = fixed[i].a - s->b;
-			if (i == 0 || fixed[i-1].b <= shift + s->a) { // here is a good place
-				fixed[i].a -= s->b - s->a;
-				return shift;
-			}
 		}
 	}
-	assert(0); // unreachable
+
+	fixed[*cnt].a = s->a + shift;
+	fixed[*cnt].b = s->b + shift;
+	(*cnt)++;
+	qsort(fixed, *cnt, sizeof(segment_t), cmp_segment);
+	
+	return shift;
 }
 
 static void fix_collisions(event_images_t* imgs, int cnt)