summaryrefslogtreecommitdiffstats
path: root/libass
diff options
context:
space:
mode:
authorOneric <oneric@oneric.stub>2020-10-29 22:40:43 +0100
committerOneric <oneric@oneric.stub>2020-10-31 16:13:23 +0100
commit8ea09d0f618cee9d90dec4459da1e3f38d1fd6a4 (patch)
treec5a64309003ac744bd3d05f35fce5ef9b514474f /libass
parentefd969aa8f5937debeb8471e9b2906caf82dfcee (diff)
downloadlibass-8ea09d0f618cee9d90dec4459da1e3f38d1fd6a4.tar.bz2
libass-8ea09d0f618cee9d90dec4459da1e3f38d1fd6a4.tar.xz
Treat zero-area events as explicitly positioned
VSFilter does collision by calculating the intersection of two events rectangles and treating events as colliding iff their intersection has a non-zero area. As a consequence zero-area events cannot collide with anything. https://github.com/Cyberbeing/xy-VSFilter/blob/xy_sub_filter_rc4@%7B2020-05-17%7D/src/subtitles/RTS.cpp#L1627 libass does not do collision by intersection area, but because we ignore edge-edge intersections results are identical to VSFilter for non-zero-area events. To reconcile the results for zero-area events, treat them as explicitly positioned as they effectively are in VSFilter. This allows us to keep our (probably) faster collision code and saves us from unnecessary collsion checks for zero-area events. Fixes https://github.com/libass/libass/issues/444
Diffstat (limited to 'libass')
-rw-r--r--libass/ass_render.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/libass/ass_render.c b/libass/ass_render.c
index 0130076..64fdf58 100644
--- a/libass/ass_render.c
+++ b/libass/ass_render.c
@@ -3005,7 +3005,9 @@ fix_collisions(ASS_Renderer *render_priv, EventImages *imgs, int cnt)
// fill used[] with fixed events
for (i = 0; i < cnt; ++i) {
ASS_RenderPriv *priv;
- if (!imgs[i].detect_collisions)
+ // VSFilter considers events colliding if their intersections area is non-zero,
+ // zero-area events are therefore effectively fixed as well
+ if (!imgs[i].detect_collisions || !imgs[i].height || !imgs[i].width)
continue;
priv = get_render_priv(render_priv, imgs[i].event);
if (priv && priv->height > 0) { // it's a fixed event
@@ -3044,7 +3046,7 @@ fix_collisions(ASS_Renderer *render_priv, EventImages *imgs, int cnt)
// try to fit other events in free spaces
for (i = 0; i < cnt; ++i) {
ASS_RenderPriv *priv;
- if (!imgs[i].detect_collisions)
+ if (!imgs[i].detect_collisions || !imgs[i].height || !imgs[i].width)
continue;
priv = get_render_priv(render_priv, imgs[i].event);
if (priv && priv->height == 0) { // not a fixed event