-
- source.i_x_offset = osys->crop.x;
- source.i_y_offset = osys->crop.y;
- source.i_visible_width = osys->crop.width;
- source.i_visible_height = osys->crop.height;
-
- /* */
- const bool is_valid = source.i_x_offset < source.i_width &&
- source.i_y_offset < source.i_height &&
- source.i_x_offset + source.i_visible_width <= source.i_width &&
- source.i_y_offset + source.i_visible_height <= source.i_height &&
- source.i_visible_width > 0 && source.i_visible_height > 0;
-
- if (!is_valid || vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_CROP, &source)) {
- if (is_valid)
- msg_Err(vd, "Failed to change source crop TODO implement crop at core");
- else
- msg_Err(vd, "Invalid crop requested");
+ const int right_max = osys->source.i_x_offset + osys->source.i_visible_width;
+ const int bottom_max = osys->source.i_y_offset + osys->source.i_visible_height;
+ int left = VLC_CLIP((int)osys->source.i_x_offset + osys->crop.left,
+ 0, right_max - 1);
+ int top = VLC_CLIP((int)osys->source.i_y_offset + osys->crop.top,
+ 0, bottom_max - 1);
+ int right, bottom;
+ if (osys->crop.right <= 0)
+ right = (int)(osys->source.i_x_offset + osys->source.i_visible_width) + osys->crop.right;
+ else
+ right = (int)osys->source.i_x_offset + osys->crop.right;
+ right = VLC_CLIP(right, left + 1, right_max);
+ if (osys->crop.bottom <= 0)
+ bottom = (int)(osys->source.i_y_offset + osys->source.i_visible_height) + osys->crop.bottom;
+ else
+ bottom = (int)osys->source.i_y_offset + osys->crop.bottom;
+ bottom = VLC_CLIP(bottom, top + 1, bottom_max);
+
+ source.i_x_offset = left;
+ source.i_y_offset = top;
+ source.i_visible_width = right - left;
+ source.i_visible_height = bottom - top;
+ video_format_Print(VLC_OBJECT(vd), "SOURCE ", &osys->source);
+ video_format_Print(VLC_OBJECT(vd), "CROPPED", &source);
+ if (vout_display_Control(vd, VOUT_DISPLAY_CHANGE_SOURCE_CROP, &source)) {
+ msg_Err(vd, "Failed to change source crop TODO implement crop at core");