summaryrefslogtreecommitdiffstats
path: root/libass
diff options
context:
space:
mode:
Diffstat (limited to 'libass')
-rw-r--r--libass/ass_render.c68
-rw-r--r--libass/ass_render.h5
2 files changed, 34 insertions, 39 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index bda4147..c0bbb9f 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -2896,17 +2896,17 @@ static ASS_RenderPriv *get_render_priv(ASS_Renderer *render_priv,
return event->render_priv;
}
-static int overlap(Segment *s1, Segment *s2)
+static int overlap(Rect *s1, Rect *s2)
{
- if (s1->a >= s2->b || s2->a >= s1->b ||
- s1->ha >= s2->hb || s2->ha >= s1->hb)
+ if (s1->y0 >= s2->y1 || s2->y0 >= s1->y1 ||
+ s1->x0 >= s2->x1 || s2->x0 >= s1->x1)
return 0;
return 1;
}
-static int cmp_segment(const void *p1, const void *p2)
+static int cmp_rect_y0(const void *p1, const void *p2)
{
- return ((Segment *) p1)->a - ((Segment *) p2)->a;
+ return ((Rect *) p1)->y0 - ((Rect *) p2)->y0;
}
static void
@@ -2937,31 +2937,31 @@ shift_event(ASS_Renderer *render_priv, EventImages *ei, int shift)
// dir: 1 - move down
// -1 - move up
-static int fit_segment(Segment *s, Segment *fixed, int *cnt, int dir)
+static int fit_rect(Rect *s, Rect *fixed, int *cnt, int dir)
{
int i;
int shift = 0;
if (dir == 1) // move down
for (i = 0; i < *cnt; ++i) {
- if (s->b + shift <= fixed[i].a || s->a + shift >= fixed[i].b ||
- s->hb <= fixed[i].ha || s->ha >= fixed[i].hb)
+ if (s->y1 + shift <= fixed[i].y0 || s->y0 + shift >= fixed[i].y1 ||
+ s->x1 <= fixed[i].x0 || s->x0 >= fixed[i].x1)
continue;
- shift = fixed[i].b - s->a;
+ shift = fixed[i].y1 - s->y0;
} else // dir == -1, move up
for (i = *cnt - 1; i >= 0; --i) {
- if (s->b + shift <= fixed[i].a || s->a + shift >= fixed[i].b ||
- s->hb <= fixed[i].ha || s->ha >= fixed[i].hb)
+ if (s->y1 + shift <= fixed[i].y0 || s->y0 + shift >= fixed[i].y1 ||
+ s->x1 <= fixed[i].x0 || s->x0 >= fixed[i].x1)
continue;
- shift = fixed[i].a - s->b;
+ shift = fixed[i].y0 - s->y1;
}
- fixed[*cnt].a = s->a + shift;
- fixed[*cnt].b = s->b + shift;
- fixed[*cnt].ha = s->ha;
- fixed[*cnt].hb = s->hb;
+ fixed[*cnt].y0 = s->y0 + shift;
+ fixed[*cnt].y1 = s->y1 + shift;
+ fixed[*cnt].x0 = s->x0;
+ fixed[*cnt].x1 = s->x1;
(*cnt)++;
- qsort(fixed, *cnt, sizeof(Segment), cmp_segment);
+ qsort(fixed, *cnt, sizeof(*fixed), cmp_rect_y0);
return shift;
}
@@ -2969,7 +2969,7 @@ static int fit_segment(Segment *s, Segment *fixed, int *cnt, int dir)
static void
fix_collisions(ASS_Renderer *render_priv, EventImages *imgs, int cnt)
{
- Segment *used = ass_realloc_array(NULL, cnt, sizeof(*used));
+ Rect *used = ass_realloc_array(NULL, cnt, sizeof(*used));
int cnt_used = 0;
int i, j;
@@ -2983,11 +2983,11 @@ fix_collisions(ASS_Renderer *render_priv, EventImages *imgs, int cnt)
continue;
priv = get_render_priv(render_priv, imgs[i].event);
if (priv && priv->height > 0) { // it's a fixed event
- Segment s;
- s.a = priv->top;
- s.b = priv->top + priv->height;
- s.ha = priv->left;
- s.hb = priv->left + priv->width;
+ Rect s;
+ s.y0 = priv->top;
+ s.y1 = priv->top + priv->height;
+ s.x0 = priv->left;
+ s.x1 = priv->left + priv->width;
if (priv->height != imgs[i].height) { // no, it's not
ass_msg(render_priv->library, MSGL_WARN,
"Event height has changed");
@@ -3004,16 +3004,16 @@ fix_collisions(ASS_Renderer *render_priv, EventImages *imgs, int cnt)
priv->width = 0;
}
if (priv->height > 0) { // still a fixed event
- used[cnt_used].a = priv->top;
- used[cnt_used].b = priv->top + priv->height;
- used[cnt_used].ha = priv->left;
- used[cnt_used].hb = priv->left + priv->width;
+ used[cnt_used].y0 = priv->top;
+ used[cnt_used].y1 = priv->top + priv->height;
+ used[cnt_used].x0 = priv->left;
+ used[cnt_used].x1 = priv->left + priv->width;
cnt_used++;
shift_event(render_priv, imgs + i, priv->top - imgs[i].top);
}
}
}
- qsort(used, cnt_used, sizeof(Segment), cmp_segment);
+ qsort(used, cnt_used, sizeof(*used), cmp_rect_y0);
// try to fit other events in free spaces
for (i = 0; i < cnt; ++i) {
@@ -3023,12 +3023,12 @@ fix_collisions(ASS_Renderer *render_priv, EventImages *imgs, int cnt)
priv = get_render_priv(render_priv, imgs[i].event);
if (priv && priv->height == 0) { // not a fixed event
int shift;
- Segment s;
- s.a = imgs[i].top;
- s.b = imgs[i].top + imgs[i].height;
- s.ha = imgs[i].left;
- s.hb = imgs[i].left + imgs[i].width;
- shift = fit_segment(&s, used, &cnt_used, imgs[i].shift_direction);
+ Rect s;
+ s.y0 = imgs[i].top;
+ s.y1 = imgs[i].top + imgs[i].height;
+ s.x0 = imgs[i].left;
+ s.x1 = imgs[i].left + imgs[i].width;
+ shift = fit_rect(&s, used, &cnt_used, imgs[i].shift_direction);
if (shift)
shift_event(render_priv, imgs + i, shift);
// make it fixed
diff --git a/libass/ass_render.h b/libass/ass_render.h
index 359152a..5208f04 100644
--- a/libass/ass_render.h
+++ b/libass/ass_render.h
@@ -334,11 +334,6 @@ typedef struct {
int y1;
} Rect;
-typedef struct {
- int a, b; // top and height
- int ha, hb; // left and width
-} Segment;
-
void reset_render_context(ASS_Renderer *render_priv, ASS_Style *style);
void ass_frame_ref(ASS_Image *img);
void ass_frame_unref(ASS_Image *img);