From 665d0ef43005bd1073b995d1a91516109d2906fe Mon Sep 17 00:00:00 2001 From: =?utf8?q?Felix=20Paul=20K=C3=BChne?= Date: Mon, 17 Jul 2006 12:59:46 +0000 Subject: [PATCH] * adapted the extended panel to the latest video filter changes and re-designed the interface a bit (by introducing some additional strings and moving the invert-option to the adjust image section, etc.) * src/video_output/video_output.c: small fix to insert filters on the fly --- .../English.lproj/Extended.nib/classes.nib | 7 +- .../English.lproj/Extended.nib/info.nib | 11 +- .../Extended.nib/keyedobjects.nib | Bin 20714 -> 21761 bytes modules/gui/macosx/extended.h | 10 +- modules/gui/macosx/extended.m | 192 +++++++++++++----- src/video_output/video_output.c | 7 +- 6 files changed, 162 insertions(+), 65 deletions(-) diff --git a/extras/MacOSX/Resources/English.lproj/Extended.nib/classes.nib b/extras/MacOSX/Resources/English.lproj/Extended.nib/classes.nib index 8cad7a30dd..1292aeb9c8 100644 --- a/extras/MacOSX/Resources/English.lproj/Extended.nib/classes.nib +++ b/extras/MacOSX/Resources/English.lproj/Extended.nib/classes.nib @@ -27,15 +27,18 @@ "o_btn_rstrDefaults" = id; "o_btn_vidFlts_mrInfo" = id; "o_ckb_blur" = id; - "o_ckb_distortion" = id; "o_ckb_enblAdjustImg" = id; + "o_ckb_gradient" = id; "o_ckb_hdphnVirt" = id; "o_ckb_imgClone" = id; "o_ckb_imgCrop" = id; "o_ckb_imgInvers" = id; "o_ckb_intZoom" = id; + "o_ckb_psycho" = id; + "o_ckb_ripple" = id; "o_ckb_trnsform" = id; "o_ckb_vlme_norm" = id; + "o_ckb_wave" = id; "o_expBtn_adjustImage" = id; "o_expBtn_audioFlts" = id; "o_expBtn_videoFlts" = id; @@ -47,7 +50,9 @@ "o_lbl_audioFlts" = id; "o_lbl_brightness" = id; "o_lbl_contrast" = id; + "o_lbl_distort" = id; "o_lbl_gamma" = id; + "o_lbl_general" = id; "o_lbl_hue" = id; "o_lbl_maxLevel" = id; "o_lbl_opaque" = id; diff --git a/extras/MacOSX/Resources/English.lproj/Extended.nib/info.nib b/extras/MacOSX/Resources/English.lproj/Extended.nib/info.nib index 97e8056f3c..c07740f475 100644 --- a/extras/MacOSX/Resources/English.lproj/Extended.nib/info.nib +++ b/extras/MacOSX/Resources/English.lproj/Extended.nib/info.nib @@ -3,18 +3,18 @@ IBDocumentLocation - 219 20 356 292 0 0 1440 878 + 253 122 356 292 0 0 1440 878 IBEditorPositions 13 525 535 390 138 0 0 1440 878 32 - 525 487 390 233 0 0 1440 878 + 525 476 390 255 0 0 1440 878 5 - 467 464 392 178 0 0 1440 878 + 525 489 390 230 0 0 1440 878 IBFramework Version - 443.0 + 446.1 IBLockedObjects 32 @@ -23,8 +23,9 @@ 18 5 + 32 IBSystem Version - 8I127 + 8J135 diff --git a/extras/MacOSX/Resources/English.lproj/Extended.nib/keyedobjects.nib b/extras/MacOSX/Resources/English.lproj/Extended.nib/keyedobjects.nib index f4e5259b18ebbf5509d0a51c793d6e62f12f6f0e..52f2e99ee91d12e672d9ac2e407e1b003555d8f7 100644 GIT binary patch literal 21761 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 IxBZj<0~^vI%K!iX literal 20714 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 C&}8iZ diff --git a/modules/gui/macosx/extended.h b/modules/gui/macosx/extended.h index 20660390f7..fc912cce7a 100644 --- a/modules/gui/macosx/extended.h +++ b/modules/gui/macosx/extended.h @@ -54,12 +54,17 @@ /* video filters */ IBOutlet id o_btn_vidFlts_mrInfo; IBOutlet id o_ckb_blur; - IBOutlet id o_ckb_distortion; IBOutlet id o_ckb_imgClone; IBOutlet id o_ckb_imgCrop; IBOutlet id o_ckb_imgInvers; IBOutlet id o_ckb_trnsform; IBOutlet id o_ckb_intZoom; + IBOutlet id o_ckb_wave; + IBOutlet id o_ckb_ripple; + IBOutlet id o_ckb_psycho; + IBOutlet id o_ckb_gradient; + IBOutlet id o_lbl_general; + IBOutlet id o_lbl_distort; /* audio filters */ IBOutlet id o_ckb_vlme_norm; @@ -110,7 +115,8 @@ - (void)showPanel; - (void)initStrings; -- (void)changeVFiltersString: (char *)psz_name onOrOff: (vlc_bool_t )b_add; +- (void)changeVoutFiltersString: (char *)psz_name onOrOff: (vlc_bool_t )b_add; +- (void)changeVideoFiltersString: (char *)psz_name onOrOff: (vlc_bool_t )b_add; - (void)changeAFiltersString: (char *)psz_name onOrOff: (vlc_bool_t )b_add; - (void)savePrefs; @end diff --git a/modules/gui/macosx/extended.m b/modules/gui/macosx/extended.m index 09a8aabde6..545277f61c 100644 --- a/modules/gui/macosx/extended.m +++ b/modules/gui/macosx/extended.m @@ -83,16 +83,20 @@ static VLCExtended *_o_sharedInstance = nil; [o_lbl_videoFlts setStringValue: _NS("Video filters")]; [o_lbl_adjustImage setStringValue: _NS("Image adjustment")]; [o_btn_vidFlts_mrInfo setTitle: _NS("More Info")]; - [o_ckb_blur setTitle: _NS("Blurring")]; + [o_ckb_wave setTitle: _NS("Wave")]; + [o_ckb_ripple setTitle: _NS("Ripple")]; + [o_ckb_psycho setTitle: _NS("Psychedelic")]; + [o_ckb_gradient setTitle: _NS("Gradient")]; + [o_lbl_general setStringValue: _NS("General editing filters")]; + [o_lbl_distort setStringValue: _NS("Distortion filters")]; + [o_ckb_blur setTitle: _NS("Blur")]; [o_ckb_blur setToolTip: _NS("Adds motion blurring to the image")]; - [o_ckb_distortion setTitle: _NS("Distortion")]; - [o_ckb_distortion setToolTip: _NS("Adds distortion effects")]; [o_ckb_imgClone setTitle: _NS("Image clone")]; [o_ckb_imgClone setToolTip: _NS("Creates several copies of the Video " "output window" )]; [o_ckb_imgCrop setTitle: _NS("Image cropping")]; [o_ckb_imgCrop setToolTip: _NS("Crops a defined part of the image")]; - [o_ckb_imgInvers setTitle: _NS("Image inversion")]; + [o_ckb_imgInvers setTitle: _NS("Invert colors")]; [o_ckb_imgInvers setToolTip: _NS("Inverts the colors of the image")]; [o_ckb_trnsform setTitle: _NS("Transformation")]; [o_ckb_trnsform setToolTip: _NS("Rotates or flips the image")]; @@ -148,15 +152,27 @@ static VLCExtended *_o_sharedInstance = nil; if( psz_vfilters ) { [o_ckb_blur setState: (int)strstr( psz_vfilters, "motionblur")]; - [o_ckb_distortion setState: (int)strstr( psz_vfilters, "distort")]; [o_ckb_imgClone setState: (int)strstr( psz_vfilters, "clone")]; [o_ckb_imgCrop setState: (int)strstr( psz_vfilters, "crop")]; - [o_ckb_imgInvers setState: (int)strstr( psz_vfilters, "invert")]; [o_ckb_trnsform setState: (int)strstr( psz_vfilters, "transform")]; - + free( psz_vfilters ); } + /* set the video-filter checkboxes to the correct values */ + char * psz_vifilters; + psz_vifilters = config_GetPsz( p_intf, "video-filter" ); + if( psz_vifilters ) + { + [o_ckb_wave setState: (int)strstr( psz_vifilters, "wave")]; + [o_ckb_psycho setState: (int)strstr( psz_vifilters, "psychedelic")]; + [o_ckb_ripple setState: (int)strstr( psz_vifilters, "ripple")]; + [o_ckb_gradient setState: (int)strstr( psz_vifilters, "gradient")]; + [o_ckb_imgInvers setState: (int)strstr( psz_vifilters, "invert")]; + + free( psz_vifilters ); + } + /* set the audio-filter-checkboxes to the values taken from the prefs */ char * psz_afilters; psz_afilters = config_GetPsz( p_intf, "audio-filter" ); @@ -255,7 +271,7 @@ static VLCExtended *_o_sharedInstance = nil; [o_sld_gamma setEnabled: YES]; [o_sld_hue setEnabled: YES]; [o_sld_saturation setEnabled: YES]; - [self changeVFiltersString: "adjust" onOrOff: VLC_TRUE]; + [self changeVoutFiltersString: "adjust" onOrOff: VLC_TRUE]; }else{ [o_btn_rstrDefaults setEnabled: NO]; [o_sld_brightness setEnabled: NO]; @@ -263,7 +279,7 @@ static VLCExtended *_o_sharedInstance = nil; [o_sld_gamma setEnabled: NO]; [o_sld_hue setEnabled: NO]; [o_sld_saturation setEnabled: NO]; - [self changeVFiltersString: "adjust" onOrOff: VLC_FALSE]; + [self changeVoutFiltersString: "adjust" onOrOff: VLC_FALSE]; } } @@ -437,20 +453,20 @@ static VLCExtended *_o_sharedInstance = nil; { /* move the window contents upwards (partially done through settings * inside the nib) and resize the window */ - o_win_rect.size.height = o_win_rect.size.height - 171; - o_win_rect.origin.y = [o_extended_window frame].origin.y + 171; - o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y + 171; - o_box_vidFlts_rect.origin.y = o_box_vidFlts_rect.origin.y + 171; + o_win_rect.size.height = o_win_rect.size.height - 193; + o_win_rect.origin.y = [o_extended_window frame].origin.y + 193; + o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y + 193; + o_box_vidFlts_rect.origin.y = o_box_vidFlts_rect.origin.y + 193; /* remove the inserted view */ [o_adjustImg_view removeFromSuperviewWithoutNeedingDisplay]; }else{ /* move the window contents downwards and resize the window */ - o_win_rect.size.height = o_win_rect.size.height + 171; - o_win_rect.origin.y = [o_extended_window frame].origin.y - 171; - o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y - 171; - o_box_vidFlts_rect.origin.y = o_box_vidFlts_rect.origin.y - 171; + o_win_rect.size.height = o_win_rect.size.height + 193; + o_win_rect.origin.y = [o_extended_window frame].origin.y - 193; + o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y - 193; + o_box_vidFlts_rect.origin.y = o_box_vidFlts_rect.origin.y - 193; } [o_box_audFlts setFrameFromContentFrame: o_box_audFlts_rect]; @@ -460,12 +476,12 @@ static VLCExtended *_o_sharedInstance = nil; if (o_adjImg_expanded) { - o_box_adjImg_rect.size.height = [o_box_adjImg frame].size.height - 171; + o_box_adjImg_rect.size.height = [o_box_adjImg frame].size.height - 193; o_adjImg_expanded = NO; } else { /* insert view */ - o_box_adjImg_rect.size.height = [o_box_adjImg frame].size.height + 171; - [o_adjustImg_view setFrame: NSMakeRect( 20, -10, 370, 181)]; + o_box_adjImg_rect.size.height = [o_box_adjImg frame].size.height + 193; + [o_adjustImg_view setFrame: NSMakeRect( 20, -10, 370, 203)]; [o_adjustImg_view setNeedsDisplay:YES]; [o_adjustImg_view setAutoresizesSubviews: YES]; [[o_box_adjImg contentView] addSubview: o_adjustImg_view]; @@ -525,18 +541,18 @@ static VLCExtended *_o_sharedInstance = nil; { /* move the window contents upwards (partially done through settings * inside the nib) and resize the window */ - o_win_rect.size.height = o_win_rect.size.height - 116; - o_win_rect.origin.y = [o_extended_window frame].origin.y + 116; - o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y + 116; + o_win_rect.size.height = o_win_rect.size.height - 188; + o_win_rect.origin.y = [o_extended_window frame].origin.y + 188; + o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y + 188; /* remove the inserted view */ [o_videoFilters_view removeFromSuperviewWithoutNeedingDisplay]; }else{ /* move the window contents downwards and resize the window */ - o_win_rect.size.height = o_win_rect.size.height + 116; - o_win_rect.origin.y = [o_extended_window frame].origin.y - 116; - o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y - 116; + o_win_rect.size.height = o_win_rect.size.height + 188; + o_win_rect.origin.y = [o_extended_window frame].origin.y - 188; + o_box_audFlts_rect.origin.y = o_box_audFlts_rect.origin.y - 188; } [o_box_audFlts setFrameFromContentFrame: o_box_audFlts_rect]; @@ -545,12 +561,12 @@ static VLCExtended *_o_sharedInstance = nil; if (o_vidFlts_expanded) { - o_box_vidFlts_rect.size.height = [o_box_vidFlts frame].size.height - 116; + o_box_vidFlts_rect.size.height = [o_box_vidFlts frame].size.height - 188; o_vidFlts_expanded = NO; } else { /* insert view */ - o_box_vidFlts_rect.size.height = [o_box_vidFlts frame].size.height + 116; - [o_videoFilters_view setFrame: NSMakeRect( 20, -10, 370, 116)]; + o_box_vidFlts_rect.size.height = [o_box_vidFlts frame].size.height + 188; + [o_videoFilters_view setFrame: NSMakeRect( 20, -10, 370, 188)]; [o_videoFilters_view setNeedsDisplay:YES]; [o_videoFilters_view setAutoresizesSubviews: YES]; [[o_box_vidFlts contentView] addSubview: o_videoFilters_view]; @@ -563,33 +579,36 @@ static VLCExtended *_o_sharedInstance = nil; { /* en-/disable video filters */ if (sender == o_ckb_blur) - { - [self changeVFiltersString: "motionblur" onOrOff: [o_ckb_blur state]]; - } - else if (sender == o_ckb_distortion) - { - [self changeVFiltersString: "distort" onOrOff: [o_ckb_distortion state]]; - } + [self changeVoutFiltersString: "motionblur" onOrOff: [o_ckb_blur state]]; + else if (sender == o_ckb_imgClone) - { - [self changeVFiltersString: "clone" onOrOff: [o_ckb_imgClone state]]; - } + [self changeVoutFiltersString: "clone" onOrOff: [o_ckb_imgClone state]]; + else if (sender == o_ckb_imgCrop) - { - [self changeVFiltersString: "crop" onOrOff: [o_ckb_imgCrop state]]; - } + [self changeVoutFiltersString: "crop" onOrOff: [o_ckb_imgCrop state]]; + else if (sender == o_ckb_imgInvers) - { - [self changeVFiltersString: "invert" onOrOff: [o_ckb_imgInvers state]]; - } + [self changeVideoFiltersString: "invert" onOrOff: [o_ckb_imgInvers state]]; + else if (sender == o_ckb_trnsform) - { - [self changeVFiltersString: "transform" onOrOff: [o_ckb_trnsform state]]; - } + [self changeVoutFiltersString: "transform" onOrOff: [o_ckb_trnsform state]]; + else if (sender == o_ckb_intZoom ) - { - [self changeVFiltersString: "magnify" onOrOff: [o_ckb_intZoom state]]; - } else { + [self changeVoutFiltersString: "magnify" onOrOff: [o_ckb_intZoom state]]; + + else if (sender == o_ckb_wave ) + [self changeVideoFiltersString: "wave" onOrOff: [o_ckb_wave state]]; + + else if (sender == o_ckb_gradient ) + [self changeVideoFiltersString: "gradient" onOrOff: [o_ckb_gradient state]]; + + else if (sender == o_ckb_psycho ) + [self changeVideoFiltersString: "psychedelic" onOrOff: [o_ckb_psycho state]]; + + else if (sender == o_ckb_ripple ) + [self changeVideoFiltersString: "ripple" onOrOff: [o_ckb_ripple state]]; + + else { /* this shouldn't happen */ msg_Warn (VLCIntf, "cannot find switched video-filter"); } @@ -612,10 +631,13 @@ static VLCExtended *_o_sharedInstance = nil; * methods to communicate changes to VLC's core *****************************************************************************/ -- (void)changeVFiltersString:(char *)psz_name onOrOff:(vlc_bool_t )b_add +- (void)changeVoutFiltersString:(char *)psz_name onOrOff:(vlc_bool_t )b_add { /* copied from ../wxwidgets/extrapanel.cpp * renamed to conform with Cocoa's rules */ + /* this method only changes 1st generation video filters (the ones which + * can't be used for transcoding). Have a look at changeVideoFiltersString + * for the 2nd generation filters. */ vout_thread_t *p_vout; intf_thread_t * p_intf = VLCIntf; @@ -679,6 +701,72 @@ static VLCExtended *_o_sharedInstance = nil; } +- (void)changeVideoFiltersString:(char *)psz_name onOrOff:(vlc_bool_t )b_add +{ + /* same as changeVoutFiltersString but addressing the "video-filter" + * variable which represents the video filter 2 modules */ + + vout_thread_t *p_vout; + intf_thread_t * p_intf = VLCIntf; + + char *psz_parser, *psz_string; + psz_string = config_GetPsz( p_intf, "video-filter" ); + + if( !psz_string ) psz_string = strdup(""); + + psz_parser = strstr( psz_string, psz_name ); + + if( b_add ) + { + if( !psz_parser ) + { + psz_parser = psz_string; + asprintf( &psz_string, (*psz_string) ? "%s:%s" : "%s%s", + psz_string, psz_name ); + free( psz_parser ); + } + else + { + return; + } + } + else + { + if( psz_parser ) + { + memmove( psz_parser, psz_parser + strlen(psz_name) + + (*(psz_parser + strlen(psz_name)) == ':' ? 1 : 0 ), + strlen(psz_parser + strlen(psz_name)) + 1 ); + + /* Remove trailing : : */ + if( *(psz_string+strlen(psz_string ) -1 ) == ':' ) + { + *(psz_string+strlen(psz_string ) -1 ) = '\0'; + } + } + else + { + free( psz_string ); + return; + } + } + /* Vout is not kept, so put that in the config */ + config_PutPsz( p_intf, "video-filter", psz_string ); + + /* Try to set on the fly */ + p_vout = (vout_thread_t *)vlc_object_find( p_intf, VLC_OBJECT_VOUT, + FIND_ANYWHERE ); + if( p_vout ) + { + var_SetString( p_vout, "video-filter", psz_string ); + vlc_object_release( p_vout ); + } + + free( psz_string ); + + o_config_changed = YES; +} + - (void)changeAFiltersString: (char *)psz_name onOrOff: (vlc_bool_t )b_add; { /* copied from ../wxwidgets/extrapanel.cpp diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c index fac357e6f6..f4c7ed014f 100644 --- a/src/video_output/video_output.c +++ b/src/video_output/video_output.c @@ -1584,11 +1584,8 @@ static int VideoFilter2Callback( vlc_object_t *p_this, char const *psz_cmd, { vout_thread_t *p_vout = (vout_thread_t *)p_this; - if( !strcmp( oldval.psz_string, newval.psz_string ) ) - { - ParseVideoFilter2Chain( p_vout, newval.psz_string ); - p_vout->b_vfilter_change = VLC_TRUE; - } + ParseVideoFilter2Chain( p_vout, newval.psz_string ); + p_vout->b_vfilter_change = VLC_TRUE; return VLC_SUCCESS; } -- 2.39.2