From ee2f8d006fb481383685f1f2bfba83b3db43dae9 Mon Sep 17 00:00:00 2001 From: Maksim Shabunin Date: Wed, 24 Feb 2016 19:40:50 +0300 Subject: [PATCH] Cocoa backend: added checks before accessing sliders dictionary --- modules/highgui/src/window_cocoa.mm | 47 +++++++++++++++++------------ 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/modules/highgui/src/window_cocoa.mm b/modules/highgui/src/window_cocoa.mm index 4ab1e360e..a653cd355 100644 --- a/modules/highgui/src/window_cocoa.mm +++ b/modules/highgui/src/window_cocoa.mm @@ -230,8 +230,10 @@ CV_IMPL void cvShowImage( const char* name, const CvArr* arr) //Set new view size considering sliders (reserve height and min width) NSRect vrectNew = vrectOld; int slider_height = 0; - for(NSString *key in [window sliders]) { - slider_height += [[[window sliders] valueForKey:key] frame].size.height; + if ([window respondsToSelector:@selector(sliders)]) { + for(NSString *key in [window sliders]) { + slider_height += [[[window sliders] valueForKey:key] frame].size.height; + } } vrectNew.size.height = [[[window contentView] image] size].height + slider_height; vrectNew.size.width = std::max([[[window contentView] image] size].width, MIN_SLIDER_WIDTH); @@ -331,9 +333,12 @@ CV_IMPL int cvCreateTrackbar2(const char* trackbar_name, NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init]; int res = cvCreateTrackbar(trackbar_name, window_name, val, count, NULL); if(res) { - CVSlider *slider = [[cvGetWindow(window_name) sliders] valueForKey:[NSString stringWithFormat:@"%s", trackbar_name]]; - [slider setCallback2:on_notify2]; - [slider setUserData:userdata]; + CVWindow *window = cvGetWindow(window_name); + if (window && [window respondsToSelector:@selector(sliders)]) { + CVSlider *slider = [[window sliders] valueForKey:[NSString stringWithFormat:@"%s", trackbar_name]]; + [slider setCallback2:on_notify2]; + [slider setUserData:userdata]; + } } [localpool drain]; return res; @@ -383,7 +388,7 @@ cvSetMouseCallback( const char* name, CvMouseCallback function, void* info) localpool4 = [[NSAutoreleasePool alloc] init]; window = cvGetWindow(window_name); - if(window) { + if(window && [window respondsToSelector:@selector(sliders)]) { CVSlider *slider = [[window sliders] valueForKey:[NSString stringWithFormat:@"%s", trackbar_name]]; if(slider) { pos = [[slider slider] intValue]; @@ -414,7 +419,7 @@ CV_IMPL void cvSetTrackbarPos(const char* trackbar_name, const char* window_name localpool5 = [[NSAutoreleasePool alloc] init]; window = cvGetWindow(window_name); - if(window) { + if(window && [window respondsToSelector:@selector(sliders)]) { slider = [[window sliders] valueForKey:[NSString stringWithFormat:@"%s", trackbar_name]]; if(slider) { [[slider slider] setIntValue:pos]; @@ -442,7 +447,7 @@ CV_IMPL void cvSetTrackbarMax(const char* trackbar_name, const char* window_name localpool5 = [[NSAutoreleasePool alloc] init]; window = cvGetWindow(window_name); - if(window) { + if(window && [window respondsToSelector:@selector(sliders)]) { slider = [[window sliders] valueForKey:[NSString stringWithFormat:@"%s", trackbar_name]]; if(slider) { if(maxval >= 0) { @@ -473,7 +478,7 @@ CV_IMPL void cvSetTrackbarMin(const char* trackbar_name, const char* window_name localpool5 = [[NSAutoreleasePool alloc] init]; window = cvGetWindow(window_name); - if(window) { + if(window && [window respondsToSelector:@selector(sliders)]) { slider = [[window sliders] valueForKey:[NSString stringWithFormat:@"%s", trackbar_name]]; if(slider) { if(minval >= 0) { @@ -709,9 +714,11 @@ void cv::setWindowTitle(const String& winname, const String& title) double viewHeight = [self contentView].frame.size.height; double viewWidth = [self contentView].frame.size.width; CVWindow *window = (CVWindow *)[[self contentView] window]; - for(NSString *key in [window sliders]) { - NSSlider *slider = [[window sliders] valueForKey:key]; - viewHeight = std::min(viewHeight, (double)([slider frame].origin.y)); + if ([window respondsToSelector:@selector(sliders)]) { + for(NSString *key in [window sliders]) { + NSSlider *slider = [[window sliders] valueForKey:key]; + viewHeight = std::min(viewHeight, (double)([slider frame].origin.y)); + } } viewHeight -= TOP_BORDER; mp.y = viewHeight - mp.y; @@ -929,13 +936,15 @@ void cv::setWindowTitle(const String& winname, const String& title) int height = size.height; CVWindow *cvwindow = (CVWindow *)[self window]; - for(NSString *key in [cvwindow sliders]) { - NSSlider *slider = [[cvwindow sliders] valueForKey:key]; - NSRect r = [slider frame]; - r.origin.y = height - r.size.height; - r.size.width = [[cvwindow contentView] frame].size.width; - [slider setFrame:r]; - height -= r.size.height; + if ([cvwindow respondsToSelector:@selector(sliders)]) { + for(NSString *key in [cvwindow sliders]) { + NSSlider *slider = [[cvwindow sliders] valueForKey:key]; + NSRect r = [slider frame]; + r.origin.y = height - r.size.height; + r.size.width = [[cvwindow contentView] frame].size.width; + [slider setFrame:r]; + height -= r.size.height; + } } [localpool drain]; }