# HG changeset patch # User ib # Date 1398350464 0 # Node ID e8559b9913ffdc7555e4f52b8b6583e4fdc230d9 # Parent 0b0528ba3344b015d6d6f3edaeae0d4dd17a53d0 New GUI feature: Rotate a video. It is accessible from the context menu. Based on a complain by Linus about video players that don't easily allow rotating a video. (Thanks to compn for pointing that out.) Realize the feature by adding and/or removing appropriate video filters. Additionally, add new GUI message evSetRotation and update documentation. diff -r 0b0528ba3344 -r e8559b9913ff Changelog --- a/Changelog Thu Apr 24 13:51:20 2014 +0000 +++ b/Changelog Thu Apr 24 14:41:04 2014 +0000 @@ -46,6 +46,8 @@ * Updated skins (avifile, Blue, Blue-small, Clearlooks, Corelian, disappearer, mentalic, mplayer_red, nativeRed, neutron, phony, plastic, slim, softgrip, standard, trium, tvisor, xanim) + * Video can be rotated + * New GUI message: evSetRotation 1.1: "We gave up on 1.0" diff -r 0b0528ba3344 -r e8559b9913ff DOCS/xml/de/skin.xml --- a/DOCS/xml/de/skin.xml Thu Apr 24 13:51:20 2014 +0000 +++ b/DOCS/xml/de/skin.xml Thu Apr 24 14:41:04 2014 +0000 @@ -1292,6 +1292,14 @@ + + evSetRotation + + + Bringe das Video in seine Originalorientierung. + + + diff -r 0b0528ba3344 -r e8559b9913ff DOCS/xml/en/skin.xml --- a/DOCS/xml/en/skin.xml Thu Apr 24 13:51:20 2014 +0000 +++ b/DOCS/xml/en/skin.xml Thu Apr 24 14:41:04 2014 +0000 @@ -1087,6 +1087,12 @@ Set the video window to its original aspect ratio. + + evSetRotation + + Set the video to its original orientation. + + diff -r 0b0528ba3344 -r e8559b9913ff gui/app/app.c --- a/gui/app/app.c Thu Apr 24 13:51:20 2014 +0000 +++ b/gui/app/app.c Thu Apr 24 14:41:04 2014 +0000 @@ -75,6 +75,7 @@ { evFullScreen, "evFullScreen" }, { evNormalSize, "evNormalSize" }, { evSetAspect, "evSetAspect" }, + { evSetRotation, "evSetRotation" }, { evIncVolume, "evIncVolume" }, { evDecVolume, "evDecVolume" }, { evSetVolume, "evSetVolume" }, diff -r 0b0528ba3344 -r e8559b9913ff gui/app/app.h --- a/gui/app/app.h Thu Apr 24 13:51:20 2014 +0000 +++ b/gui/app/app.h Thu Apr 24 14:41:04 2014 +0000 @@ -55,6 +55,7 @@ evFullScreen, evNormalSize, evSetAspect, + evSetRotation, evIncVolume, evDecVolume, evSetVolume, diff -r 0b0528ba3344 -r e8559b9913ff gui/dialog/menu.c --- a/gui/dialog/menu.c Thu Apr 24 13:51:20 2014 +0000 +++ b/gui/dialog/menu.c Thu Apr 24 14:41:04 2014 +0000 @@ -98,6 +98,11 @@ #include "pixmaps/tv.xpm" #endif #include "pixmaps/empty1px.xpm" +#include "pixmaps/rotate.xpm" +#include "pixmaps/rotate0.xpm" +#include "pixmaps/rotate180.xpm" +#include "pixmaps/rotate90ccw.xpm" +#include "pixmaps/rotate90cw.xpm" int gtkPopupMenu; int gtkPopupMenuParam; @@ -442,6 +447,7 @@ GtkWidget * DVDAudioLanguageMenu; GtkWidget * DVDSubtitleLanguageMenu; GtkWidget * AspectMenu; +GtkWidget * RotationMenu; GtkWidget * VCDSubMenu; GtkWidget * VCDTitleMenu; GtkWidget * CDSubMenu; @@ -614,8 +620,26 @@ if ( guiInfo.VideoWindow ) { + AddSeparator( Menu ); + RotationMenu=AddSubMenu( window1, (const char*)rotate_xpm, Menu,MSGTR_GUI_Rotation ); + N=AddMenuCheckItem( window1, (const char*)rotate0_xpm, RotationMenu,MSGTR_GUI__none_, guiInfo.Rotation == -1, evSetRotation ); + D=AddMenuCheckItem( window1, (const char*)rotate90cw_xpm, RotationMenu,MSGTR_GUI_Rotation90CW, guiInfo.Rotation == 1, evSetRotation + ( 90 << 16 ) ); + F=AddMenuCheckItem( window1, (const char*)rotate90ccw_xpm, RotationMenu,MSGTR_GUI_Rotation90CCW, guiInfo.Rotation == 2, evSetRotation + ( -90 << 16 ) ); + H=AddMenuCheckItem( window1, (const char*)rotate180_xpm, RotationMenu,MSGTR_GUI_Rotation180, guiInfo.Rotation == 8, evSetRotation + ( 180 << 16 ) ); + + if ( !guiInfo.Playing ) + { + gtk_widget_set_sensitive( N,FALSE ); + gtk_widget_set_sensitive( D,FALSE ); + gtk_widget_set_sensitive( F,FALSE ); + gtk_widget_set_sensitive( H,FALSE ); + } + } + + if ( guiInfo.VideoWindow ) + { int a11 = False, a169 = False, a43 = False, a235 = False; - AddSeparator( Menu ); + if (movie_aspect == -1.0f) a11 = True; else { diff -r 0b0528ba3344 -r e8559b9913ff gui/dialog/pixmaps/rotate.xpm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gui/dialog/pixmaps/rotate.xpm Thu Apr 24 14:41:04 2014 +0000 @@ -0,0 +1,70 @@ +/* XPM */ +static const char * const rotate_xpm[] = { +"16 16 50 1 0 0", +" c #000000", +"! c #6E6E70", +"# c #8C99A6", +"$ c #929FAB", +"% c #97A2AE", +"& c #9AA4AF", +"' c #9FA8B1", +"( c #A3AAB2", +") c #A8AEB5", +"* c #A0A4AA", +"+ c #A4B4C3", +", c #A9B7C7", +"- c #ADB9C8", +". c #AFBBC8", +"/ c #B2BDC9", +"0 c #B6BEC9", +"1 c #B8C1CA", +"2 c #A0B0C2", +"3 c #A6B5C7", +"4 c #A9B7C8", +"5 c #B0BBC8", +"6 c #B1B9C3", +"7 c #9EAEC1", +"8 c #A3B4C7", +"9 c #A7B5C7", +": c #B4BDC9", +"; c #AEB7C1", +"< c #9CAEC3", +"= c #A0B1C5", +"> c #AAB7C8", +"? c #A9B4BF", +"@ c #9CAFC4", +"A c #9EB0C5", +"B c #A1B1C5", +"C c #A7B6C7", +"D c #AEBBC8", +"E c #A6B1BD", +"F c #9AAEC4", +"G c #A4B4C7", +"H c #AAB8C8", +"I c #A1AEBB", +"J c #91A2B6", +"K c #8C9EB2", +"L c #8FA0B4", +"M c #8FA0B2", +"N c #91A1B1", +"O c #95A3B2", +"P c #9AA7B5", +"Q c #95A1AD", +"R c None", +"RRRRRRRRRR RRR", +"RRRRRRRRR R !RR", +"RRRRRRRR RRRR RR", +"RRR!!!!!!!!!! RR", +"RRR!#$%&'()*! RR", +"RRR!+,-./01 ", +"RRR!234-5/06 R", +"RRR!7894-5:;! RR", +"RR !<=89>-5?!RRR", +"R @AB8C>DE!RRR", +" FA=GCHI!RRR", +"RR !JKLMNOPQ!RRR", +"RR !!!!!!!!!!RRR", +"RR RRRR RRRRRRRR", +"RR! R RRRRRRRRR", +"RRR RRRRRRRRRR" +}; diff -r 0b0528ba3344 -r e8559b9913ff gui/dialog/pixmaps/rotate0.xpm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gui/dialog/pixmaps/rotate0.xpm Thu Apr 24 14:41:04 2014 +0000 @@ -0,0 +1,23 @@ +/* XPM */ +static const char * const rotate0_xpm[] = { +"16 16 3 1 0 0", +" c #6E6E70", +"! c #4E4E50", +"# c None", +"################", +"################", +"####### #######", +"###### !! ######", +"##### !!!! #####", +"#### !!!!!! ####", +"### !!!!!!!! ###", +"####!# !! #!####", +"###### !! ######", +"###### !! ######", +"###### !! ######", +"###### !! ######", +"###### !! ######", +"###### !! ######", +"####### #######", +"################" +}; diff -r 0b0528ba3344 -r e8559b9913ff gui/dialog/pixmaps/rotate180.xpm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gui/dialog/pixmaps/rotate180.xpm Thu Apr 24 14:41:04 2014 +0000 @@ -0,0 +1,22 @@ +/* XPM */ +static const char * const rotate180_xpm[] = { +"16 16 2 1 0 0", +" c #4E4E50", +"! c None", +"!!!!!!! !!!!!!!!", +"!!!!!!! !!!!!!!", +"!!!!!!! !!!!!!", +"!!!!! ! !!", +"!!! ! !", +"!! !! !!! ", +"! !!!! !!!!! ", +" !!!! !!!!!! ", +" !!!!!! !!!! ", +" !!!!! !!!! !", +" !!! !! !!", +"! ! !!!", +"!! ! !!!!!", +"!!!!!! !!!!!!!", +"!!!!!!! !!!!!!!", +"!!!!!!!! !!!!!!!" +}; diff -r 0b0528ba3344 -r e8559b9913ff gui/dialog/pixmaps/rotate90ccw.xpm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gui/dialog/pixmaps/rotate90ccw.xpm Thu Apr 24 14:41:04 2014 +0000 @@ -0,0 +1,25 @@ +/* XPM */ +static const char * const rotate90ccw_xpm[] = { +"16 16 5 1 0 0", +" c #4E4E50", +"! c #4E4E51", +"# c #4F4F50", +"$ c #4F4F51", +"% c None", +"%%%%%%%%%%%%%%%%", +"%%%%%%%%%%%%%%%%", +"%%%%%%%% %%%%", +"%%%%%% %%", +"%%%%% %%%%!%", +"%%%% %%%%%%%%", +"%%%% #%%%%%%%%", +"%%% %%%%%%%%%", +"%%% %%%%%%%%%", +"%$% %$%%%%%%%", +"%$ $%%%%%%%", +"%% %%%%%%%%", +"%%% %%%%%%%%%", +"%%%%$$%%%%%%%%%%", +"%%%%%%%%%%%%%%%%", +"%%%%%%%%%%%%%%%%" +}; diff -r 0b0528ba3344 -r e8559b9913ff gui/dialog/pixmaps/rotate90cw.xpm --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gui/dialog/pixmaps/rotate90cw.xpm Thu Apr 24 14:41:04 2014 +0000 @@ -0,0 +1,25 @@ +/* XPM */ +static const char * const rotate90cw_xpm[] = { +"16 16 5 1 0 0", +" c #4E4E50", +"! c #4E4E51", +"# c #4F4F50", +"$ c #4F4F51", +"% c None", +"%%%%%%%%%%%%%%%%", +"%%%%%%%%%%%%%%%%", +"%%%% %%%%%%%%", +"%% %%%%%%", +"%!%%%% %%%%%", +"%%%%%%%% %%%%", +"%%%%%%%%# %%%%", +"%%%%%%%%% %%%", +"%%%%%%%%% %%%", +"%%%%%%%$% %$%", +"%%%%%%%$ $%", +"%%%%%%%% %%", +"%%%%%%%%% %%%", +"%%%%%%%%%%$$%%%%", +"%%%%%%%%%%%%%%%%", +"%%%%%%%%%%%%%%%%" +}; diff -r 0b0528ba3344 -r e8559b9913ff gui/interface.c --- a/gui/interface.c Thu Apr 24 13:51:20 2014 +0000 +++ b/gui/interface.c Thu Apr 24 14:41:04 2014 +0000 @@ -194,6 +194,7 @@ */ void guiInit(void) { + char **argvf; int ret; plItem *playlist; @@ -226,6 +227,9 @@ gtkASS.top_margin = ass_top_margin; gtkASS.bottom_margin = ass_bottom_margin; + argvf = get_vf("rotate"); + guiInfo.Rotation = (argvf && argvf[1] ? atoi(argvf[1]) : -1); + /* initialize graphical user interfaces */ wsInit(mDisplay); @@ -576,6 +580,36 @@ if (gtkVfPP) add_vf("pp", NULL); + switch (guiInfo.Rotation) { + static const char *argvf[] = { "_oldargs_", NULL, NULL }; + + case -1: + remove_vf("rotate"); + remove_vf("flip"); + remove_vf("mirror"); + break; + + case 1: + argvf[1] = "1"; + add_vf("rotate", argvf); + remove_vf("flip"); + remove_vf("mirror"); + break; + + case 2: + argvf[1] = "2"; + add_vf("rotate", argvf); + remove_vf("flip"); + remove_vf("mirror"); + break; + + case 8: + remove_vf("rotate"); + add_vf("flip", NULL); + add_vf("mirror", NULL); + break; + } + /* audio opts */ // if ( ao_plugin_cfg.plugin_list ) { free( ao_plugin_cfg.plugin_list ); ao_plugin_cfg.plugin_list=NULL; } diff -r 0b0528ba3344 -r e8559b9913ff gui/interface.h --- a/gui/interface.h Thu Apr 24 13:51:20 2014 +0000 +++ b/gui/interface.h Thu Apr 24 14:41:04 2014 +0000 @@ -103,6 +103,8 @@ int VideoWidth; int VideoHeight; + int Rotation; + char *CodecName; int StreamType; diff -r 0b0528ba3344 -r e8559b9913ff gui/ui/actions.c --- a/gui/ui/actions.c Thu Apr 24 13:51:20 2014 +0000 +++ b/gui/ui/actions.c Thu Apr 24 14:41:04 2014 +0000 @@ -466,6 +466,31 @@ break; + case evSetRotation: + + switch (iparam) { + case 90: + guiInfo.Rotation = 1; + break; + + case -90: + guiInfo.Rotation = 2; + break; + + case 180: + guiInfo.Rotation = 8; + break; + + case 0: + default: + guiInfo.Rotation = -1; + break; + } + + guiInfo.MediumChanged = GUI_MEDIUM_SAME; + + break; + /* timer events */ case ivRedraw: { diff -r 0b0528ba3344 -r e8559b9913ff gui/win32/skinload.c --- a/gui/win32/skinload.c Thu Apr 24 13:51:20 2014 +0000 +++ b/gui/win32/skinload.c Thu Apr 24 14:41:04 2014 +0000 @@ -81,6 +81,7 @@ { evFullScreen, "evFullScreen" }, { evNormalSize, "evNormalSize" }, { evSetAspect, "evSetAspect" }, + { evSetRotation, "evSetRotation" }, { evIncVolume, "evIncVolume" }, { evDecVolume, "evDecVolume" }, { evSetVolume, "evSetVolume" }, diff -r 0b0528ba3344 -r e8559b9913ff gui/win32/skinload.h --- a/gui/win32/skinload.h Thu Apr 24 13:51:20 2014 +0000 +++ b/gui/win32/skinload.h Thu Apr 24 14:41:04 2014 +0000 @@ -168,6 +168,7 @@ evFullScreen, evNormalSize, evSetAspect, + evSetRotation, evIncVolume, evDecVolume, evSetVolume, diff -r 0b0528ba3344 -r e8559b9913ff help/help_mp-de.h --- a/help/help_mp-de.h Thu Apr 24 13:51:20 2014 +0000 +++ b/help/help_mp-de.h Thu Apr 24 14:41:04 2014 +0000 @@ -979,6 +979,10 @@ #define MSGTR_GUI_RearLeft "Hinten links" #define MSGTR_GUI_RearRight "Hinten rechts" #define MSGTR_GUI_Remove "Entfernen" +#define MSGTR_GUI_Rotation "Drehung" +#define MSGTR_GUI_Rotation180 "180°" +#define MSGTR_GUI_Rotation90CCW "90° gegen den Uhrzeigersinn" +#define MSGTR_GUI_Rotation90CW "90° im Uhrzeigersinn" #define MSGTR_GUI_Saturation "Sättigung" #define MSGTR_GUI_SaveWindowPositions "Fensterpositionen speichern" #define MSGTR_GUI_ScaleMode "Skalierung" diff -r 0b0528ba3344 -r e8559b9913ff help/help_mp-en.h --- a/help/help_mp-en.h Thu Apr 24 13:51:20 2014 +0000 +++ b/help/help_mp-en.h Thu Apr 24 14:41:04 2014 +0000 @@ -770,6 +770,10 @@ #define MSGTR_GUI_RearLeft "Rear left" #define MSGTR_GUI_RearRight "Rear right" #define MSGTR_GUI_Remove "Remove" +#define MSGTR_GUI_Rotation "Rotation" +#define MSGTR_GUI_Rotation180 "180°" +#define MSGTR_GUI_Rotation90CCW "90° counterclockwise" +#define MSGTR_GUI_Rotation90CW "90° clockwise" #define MSGTR_GUI_Saturation "Saturation" #define MSGTR_GUI_SaveWindowPositions "Save window positions" #define MSGTR_GUI_ScaleMode "Scale mode"