]> git.sesse.net Git - vlc/blobdiff - src/video_output/vout_subpictures.c
* modules/codec/spudec/*: automatic cropping of fullscreen subpictures (most of them...
[vlc] / src / video_output / vout_subpictures.c
index f37a9325272c6cf6228379767f4e308dcb19b2a3..70761d6be0c9e0b242942b4ebbea3bce203afc83 100644 (file)
@@ -433,14 +433,37 @@ void vout_RenderSubPictures( vout_thread_t *p_vout, picture_t *p_pic_dst,
             /* Force cropping if requested */
             if( p_vout->b_force_crop )
             {
-                p_vout->p_blend->fmt_in.video.i_x_offset = p_vout->i_crop_x;
-                p_vout->p_blend->fmt_in.video.i_y_offset = p_vout->i_crop_y;
-                p_vout->p_blend->fmt_in.video.i_visible_width =
-                    p_vout->i_crop_width;
-                p_vout->p_blend->fmt_in.video.i_visible_height =
-                    p_vout->i_crop_height;
-                i_x_offset += p_vout->i_crop_x;
-                i_y_offset += p_vout->i_crop_y;
+                video_format_t *p_fmt = &p_vout->p_blend->fmt_in.video;
+
+                /* Find the intersection */
+                if( p_vout->i_crop_x + p_vout->i_crop_width <= i_x_offset ||
+                    i_x_offset + (int)p_fmt->i_visible_width <
+                        p_vout->i_crop_x ||
+                    p_vout->i_crop_y + p_vout->i_crop_height <= i_y_offset ||
+                    i_y_offset + (int)p_fmt->i_visible_height <
+                        p_vout->i_crop_y )
+                {
+                    /* No intersection */
+                    p_fmt->i_visible_width = p_fmt->i_visible_height = 0;
+                }
+                else
+                {
+                    int i_x, i_y, i_x_end, i_y_end;
+                    i_x = __MAX( p_vout->i_crop_x, i_x_offset );
+                    i_y = __MAX( p_vout->i_crop_y, i_y_offset );
+                    i_x_end = __MIN( p_vout->i_crop_x + p_vout->i_crop_width,
+                                   i_x_offset + (int)p_fmt->i_visible_width );
+                    i_y_end = __MIN( p_vout->i_crop_y + p_vout->i_crop_height,
+                                   i_y_offset + (int)p_fmt->i_visible_height );
+
+                    p_fmt->i_x_offset = i_x - i_x_offset;
+                    p_fmt->i_y_offset = i_y - i_y_offset;
+                    p_fmt->i_visible_width = i_x_end - i_x;
+                    p_fmt->i_visible_height = i_y_end - i_y;
+
+                    i_x_offset = i_x;
+                    i_y_offset = i_y;
+                }
             }
 
             /* Force palette if requested */