mirror of
https://github.com/videolan/vlc.git
synced 2024-12-04 23:35:52 +08:00
video output: support rotated movies
Signed-off-by: Rémi Denis-Courmont <remi@remlab.net>
This commit is contained in:
parent
5290dabebe
commit
88660f191b
@ -436,5 +436,18 @@ typedef struct {
|
|||||||
*/
|
*/
|
||||||
VLC_API void vout_display_PlacePicture(vout_display_place_t *place, const video_format_t *source, const vout_display_cfg_t *cfg, bool do_clipping);
|
VLC_API void vout_display_PlacePicture(vout_display_place_t *place, const video_format_t *source, const vout_display_cfg_t *cfg, bool do_clipping);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper function that applies the necessary transforms to the mouse position
|
||||||
|
* and then calls vout_display_SendEventMouseMoved.
|
||||||
|
*
|
||||||
|
* \param vd vout_display_t.
|
||||||
|
* \param orient_display The orientation of the picture as seen on screen (probably ORIENT_NORMAL).
|
||||||
|
* \param m_x Mouse x position (relative to place, origin is top left).
|
||||||
|
* \param m_y Mouse y position (relative to place, origin is top left).
|
||||||
|
* \param place Place of the picture.
|
||||||
|
*/
|
||||||
|
VLC_API void vout_display_SendMouseMovedDisplayCoordinates(vout_display_t *vd, video_orientation_t orient_display, int m_x, int m_y,
|
||||||
|
vout_display_place_t *place);
|
||||||
#endif /* VLC_VOUT_DISPLAY_H */
|
#endif /* VLC_VOUT_DISPLAY_H */
|
||||||
|
|
||||||
|
@ -636,6 +636,7 @@ vout_SetDisplayAspect
|
|||||||
vout_SetDisplayCrop
|
vout_SetDisplayCrop
|
||||||
vout_display_GetDefaultDisplaySize
|
vout_display_GetDefaultDisplaySize
|
||||||
vout_display_PlacePicture
|
vout_display_PlacePicture
|
||||||
|
vout_display_SendMouseMovedDisplayCoordinates
|
||||||
xml_Create
|
xml_Create
|
||||||
text_style_Copy
|
text_style_Copy
|
||||||
text_style_Delete
|
text_style_Delete
|
||||||
|
@ -197,6 +197,13 @@ void vout_display_GetDefaultDisplaySize(unsigned *width, unsigned *height,
|
|||||||
|
|
||||||
*width = *width * cfg->zoom.num / cfg->zoom.den;
|
*width = *width * cfg->zoom.num / cfg->zoom.den;
|
||||||
*height = *height * cfg->zoom.num / cfg->zoom.den;
|
*height = *height * cfg->zoom.num / cfg->zoom.den;
|
||||||
|
|
||||||
|
if (ORIENT_IS_SWAP(source->orientation)) {
|
||||||
|
|
||||||
|
unsigned store = *width;
|
||||||
|
*width = *height;
|
||||||
|
*height = store;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* */
|
/* */
|
||||||
@ -214,6 +221,10 @@ void vout_display_PlacePicture(vout_display_place_t *place,
|
|||||||
unsigned display_width;
|
unsigned display_width;
|
||||||
unsigned display_height;
|
unsigned display_height;
|
||||||
|
|
||||||
|
video_format_t source_rot;
|
||||||
|
video_format_ApplyRotation(source, &source_rot);
|
||||||
|
source = &source_rot;
|
||||||
|
|
||||||
if (cfg->is_display_filled) {
|
if (cfg->is_display_filled) {
|
||||||
display_width = cfg->display.width;
|
display_width = cfg->display.width;
|
||||||
display_height = cfg->display.height;
|
display_height = cfg->display.height;
|
||||||
@ -273,6 +284,62 @@ void vout_display_PlacePicture(vout_display_place_t *place,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vout_display_SendMouseMovedDisplayCoordinates(vout_display_t *vd, video_orientation_t orient_display, int m_x, int m_y, vout_display_place_t *place)
|
||||||
|
{
|
||||||
|
video_format_t source_rot = vd->source;
|
||||||
|
video_format_TransformTo(&source_rot, orient_display);
|
||||||
|
|
||||||
|
if (place->width > 0 && place->height > 0) {
|
||||||
|
|
||||||
|
int x = (int)(source_rot.i_x_offset +
|
||||||
|
(int64_t)(m_x - place->x) * source_rot.i_visible_width / place->width);
|
||||||
|
int y = (int)(source_rot.i_y_offset +
|
||||||
|
(int64_t)(m_y - place->y) * source_rot.i_visible_height/ place->height);
|
||||||
|
|
||||||
|
video_transform_t transform = video_format_GetTransform(vd->source.orientation, orient_display);
|
||||||
|
|
||||||
|
int store;
|
||||||
|
|
||||||
|
switch (transform) {
|
||||||
|
|
||||||
|
case TRANSFORM_R90:
|
||||||
|
store = x;
|
||||||
|
x = y;
|
||||||
|
y = vd->source.i_visible_height - store;
|
||||||
|
break;
|
||||||
|
case TRANSFORM_R180:
|
||||||
|
x = vd->source.i_visible_width - x;
|
||||||
|
y = vd->source.i_visible_height - y;
|
||||||
|
break;
|
||||||
|
case TRANSFORM_R270:
|
||||||
|
store = x;
|
||||||
|
x = vd->source.i_visible_width - y;
|
||||||
|
y = store;
|
||||||
|
break;
|
||||||
|
case TRANSFORM_HFLIP:
|
||||||
|
x = vd->source.i_visible_width - x;
|
||||||
|
break;
|
||||||
|
case TRANSFORM_VFLIP:
|
||||||
|
y = vd->source.i_visible_height - y;
|
||||||
|
break;
|
||||||
|
case TRANSFORM_TRANSPOSE:
|
||||||
|
store = x;
|
||||||
|
x = y;
|
||||||
|
y = store;
|
||||||
|
break;
|
||||||
|
case TRANSFORM_ANTI_TRANSPOSE:
|
||||||
|
store = x;
|
||||||
|
x = vd->source.i_visible_width - y;
|
||||||
|
y = vd->source.i_visible_height - store;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
vout_display_SendEventMouseMoved (vd, x, y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct vout_display_owner_sys_t {
|
struct vout_display_owner_sys_t {
|
||||||
vout_thread_t *vout;
|
vout_thread_t *vout;
|
||||||
bool is_wrapper; /* Is the current display a wrapper */
|
bool is_wrapper; /* Is the current display a wrapper */
|
||||||
|
Loading…
Reference in New Issue
Block a user