|
|
|
@ -82,46 +82,42 @@ static NSAutoreleasePool *pool = nil; |
|
|
|
|
static NSMutableDictionary *windows = nil; |
|
|
|
|
static bool wasInitialized = false; |
|
|
|
|
|
|
|
|
|
@interface CVView : NSView |
|
|
|
|
{ |
|
|
|
|
NSImage *_image; |
|
|
|
|
@interface CVView : NSView { |
|
|
|
|
NSImage *image; |
|
|
|
|
} |
|
|
|
|
@property(strong) NSImage *image; |
|
|
|
|
@property(retain) NSImage *image; |
|
|
|
|
- (void)setImageData:(CvArr *)arr; |
|
|
|
|
@end |
|
|
|
|
|
|
|
|
|
@interface CVSlider : NSView |
|
|
|
|
{ |
|
|
|
|
NSSlider *_slider; |
|
|
|
|
NSTextField *_name; |
|
|
|
|
int *_value; |
|
|
|
|
void *_userData; |
|
|
|
|
CvTrackbarCallback _callback; |
|
|
|
|
CvTrackbarCallback2 _callback2; |
|
|
|
|
@interface CVSlider : NSView { |
|
|
|
|
NSSlider *slider; |
|
|
|
|
NSTextField *name; |
|
|
|
|
int *value; |
|
|
|
|
void *userData; |
|
|
|
|
CvTrackbarCallback callback; |
|
|
|
|
CvTrackbarCallback2 callback2; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@property(strong) NSSlider *slider; |
|
|
|
|
@property(strong) NSTextField *name; |
|
|
|
|
@property(retain) NSSlider *slider; |
|
|
|
|
@property(retain) NSTextField *name; |
|
|
|
|
@property(assign) int *value; |
|
|
|
|
@property(assign) void *userData; |
|
|
|
|
@property(assign) CvTrackbarCallback callback; |
|
|
|
|
@property(assign) CvTrackbarCallback2 callback2; |
|
|
|
|
@end |
|
|
|
|
|
|
|
|
|
@interface CVWindow : NSWindow |
|
|
|
|
{ |
|
|
|
|
CvMouseCallback _mouseCallback; |
|
|
|
|
void *_mouseParam; |
|
|
|
|
BOOL _autosize; |
|
|
|
|
BOOL _firstContent; |
|
|
|
|
NSMutableDictionary *_sliders; |
|
|
|
|
int _status; |
|
|
|
|
@interface CVWindow : NSWindow { |
|
|
|
|
NSMutableDictionary *sliders; |
|
|
|
|
CvMouseCallback mouseCallback; |
|
|
|
|
void *mouseParam; |
|
|
|
|
BOOL autosize; |
|
|
|
|
BOOL firstContent; |
|
|
|
|
int status; |
|
|
|
|
} |
|
|
|
|
@property(assign) CvMouseCallback mouseCallback; |
|
|
|
|
@property(assign) void *mouseParam; |
|
|
|
|
@property(assign) BOOL autosize; |
|
|
|
|
@property(assign) BOOL firstContent; |
|
|
|
|
@property(strong) NSMutableDictionary *sliders; |
|
|
|
|
@property(retain) NSMutableDictionary *sliders; |
|
|
|
|
@property(readwrite) int status; |
|
|
|
|
- (CVView *)contentView; |
|
|
|
|
- (void)cvSendMouseEvent:(NSEvent *)event type:(int)type flags:(int)flags; |
|
|
|
@ -701,21 +697,14 @@ void cv::setWindowTitle(const String& winname, const String& title) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@implementation CVWindow |
|
|
|
|
#if defined(__LP64__) |
|
|
|
|
|
|
|
|
|
@synthesize mouseCallback; |
|
|
|
|
@synthesize mouseParam; |
|
|
|
|
@synthesize autosize; |
|
|
|
|
@synthesize firstContent; |
|
|
|
|
@synthesize sliders; |
|
|
|
|
@synthesize status; |
|
|
|
|
#else // 32-bit Obj-C does not have automatic synthesize |
|
|
|
|
@synthesize mouseCallback = _mouseCallback; |
|
|
|
|
@synthesize mouseParam = _mouseParam; |
|
|
|
|
@synthesize autosize = _autosize; |
|
|
|
|
@synthesize firstContent = _firstContent; |
|
|
|
|
@synthesize sliders = _sliders; |
|
|
|
|
@synthesize status = _status; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
- (void)cvSendMouseEvent:(NSEvent *)event type:(int)type flags:(int)flags { |
|
|
|
|
(void)event; |
|
|
|
|
//cout << "cvSendMouseEvent" << endl; |
|
|
|
@ -740,13 +729,12 @@ void cv::setWindowTitle(const String& winname, const String& title) |
|
|
|
|
mp.y = mp.y * imageSize.height / std::max(viewHeight, 1.); |
|
|
|
|
|
|
|
|
|
if( mp.x >= 0 && mp.y >= 0 && mp.x < imageSize.width && mp.y < imageSize.height ) |
|
|
|
|
_mouseCallback(type, mp.x, mp.y, flags, _mouseParam); |
|
|
|
|
mouseCallback(type, mp.x, mp.y, flags, mouseParam); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
- (void)cvMouseEvent:(NSEvent *)event { |
|
|
|
|
//cout << "cvMouseEvent" << endl; |
|
|
|
|
|
|
|
|
|
if([self mouseCallback] == nil) |
|
|
|
|
if(!mouseCallback) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
int flags = 0; |
|
|
|
@ -806,13 +794,13 @@ void cv::setWindowTitle(const String& winname, const String& title) |
|
|
|
|
|
|
|
|
|
- (void)createSliderWithName:(const char *)name maxValue:(int)max value:(int *)value callback:(CvTrackbarCallback)callback { |
|
|
|
|
//cout << "createSliderWithName" << endl; |
|
|
|
|
if(_sliders == nil) |
|
|
|
|
_sliders = [[NSMutableDictionary alloc] init]; |
|
|
|
|
if(sliders == nil) |
|
|
|
|
sliders = [[NSMutableDictionary alloc] init]; |
|
|
|
|
|
|
|
|
|
NSString *cvname = [NSString stringWithFormat:@"%s", name]; |
|
|
|
|
|
|
|
|
|
// Avoid overwriting slider |
|
|
|
|
if([_sliders valueForKey:cvname]!=nil) |
|
|
|
|
if([sliders valueForKey:cvname]!=nil) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
// Create slider |
|
|
|
@ -831,11 +819,11 @@ void cv::setWindowTitle(const String& winname, const String& title) |
|
|
|
|
[slider setCallback:callback]; |
|
|
|
|
|
|
|
|
|
// Save slider |
|
|
|
|
[_sliders setValue:slider forKey:cvname]; |
|
|
|
|
[sliders setValue:slider forKey:cvname]; |
|
|
|
|
[[self contentView] addSubview:slider]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//update contentView size to contain _sliders |
|
|
|
|
//update contentView size to contain sliders |
|
|
|
|
NSSize viewSize=[[self contentView] frame].size, |
|
|
|
|
sliderSize=[slider frame].size; |
|
|
|
|
viewSize.height += sliderSize.height; |
|
|
|
@ -845,7 +833,7 @@ void cv::setWindowTitle(const String& winname, const String& title) |
|
|
|
|
[[self contentView] setFrameSize:viewSize]; |
|
|
|
|
[[self contentView] setNeedsDisplay:YES]; |
|
|
|
|
|
|
|
|
|
//update window size to contain _sliders |
|
|
|
|
//update window size to contain sliders |
|
|
|
|
NSRect rect = [self frame]; |
|
|
|
|
rect.size.height += [slider frame].size.height; |
|
|
|
|
rect.size.width = std::max<int>(rect.size.width, MIN_SLIDER_WIDTH); |
|
|
|
@ -862,16 +850,13 @@ void cv::setWindowTitle(const String& winname, const String& title) |
|
|
|
|
@end |
|
|
|
|
|
|
|
|
|
@implementation CVView |
|
|
|
|
#if defined(__LP64__) |
|
|
|
|
|
|
|
|
|
@synthesize image; |
|
|
|
|
#else // 32-bit Obj-C does not have automatic synthesize |
|
|
|
|
@synthesize image = _image; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
- (id)init { |
|
|
|
|
//cout << "CVView init" << endl; |
|
|
|
|
[super init]; |
|
|
|
|
_image = [[NSImage alloc] init]; |
|
|
|
|
image = [[NSImage alloc] init]; |
|
|
|
|
return self; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -926,11 +911,11 @@ void cv::setWindowTitle(const String& winname, const String& title) |
|
|
|
|
dst[i * 4 + 2] = src[i * 3 + 2]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if( _image ) |
|
|
|
|
[_image release]; |
|
|
|
|
if( image ) |
|
|
|
|
[image release]; |
|
|
|
|
|
|
|
|
|
_image = [[NSImage alloc] init]; |
|
|
|
|
[_image addRepresentation:bitmap]; |
|
|
|
|
image = [[NSImage alloc] init]; |
|
|
|
|
[image addRepresentation:bitmap]; |
|
|
|
|
[bitmap release]; |
|
|
|
|
|
|
|
|
|
/*CGColorSpaceRelease(colorspace); |
|
|
|
@ -951,7 +936,7 @@ void cv::setWindowTitle(const String& winname, const String& title) |
|
|
|
|
int height = size.height; |
|
|
|
|
|
|
|
|
|
CVWindow *cvwindow = (CVWindow *)[self window]; |
|
|
|
|
if ([cvwindow respondsToSelector:@selector(_sliders)]) { |
|
|
|
|
if ([cvwindow respondsToSelector:@selector(sliders)]) { |
|
|
|
|
for(NSString *key in [cvwindow sliders]) { |
|
|
|
|
NSSlider *slider = [[cvwindow sliders] valueForKey:key]; |
|
|
|
|
NSRect r = [slider frame]; |
|
|
|
@ -971,17 +956,17 @@ void cv::setWindowTitle(const String& winname, const String& title) |
|
|
|
|
NSAutoreleasePool* localpool = [[NSAutoreleasePool alloc] init]; |
|
|
|
|
CVWindow *cvwindow = (CVWindow *)[self window]; |
|
|
|
|
int height = 0; |
|
|
|
|
if ([cvwindow respondsToSelector:@selector(_sliders)]) { |
|
|
|
|
if ([cvwindow respondsToSelector:@selector(sliders)]) { |
|
|
|
|
for(NSString *key in [cvwindow sliders]) { |
|
|
|
|
height += [[[cvwindow sliders] valueForKey:key] frame].size.height; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
NSRect imageRect = {{0,0}, {[_image size].width, [_image size].height}}; |
|
|
|
|
NSRect imageRect = {{0,0}, {[image size].width, [image size].height}}; |
|
|
|
|
|
|
|
|
|
if(_image != nil) { |
|
|
|
|
[_image drawInRect: imageRect |
|
|
|
|
if(image != nil) { |
|
|
|
|
[image drawInRect: imageRect |
|
|
|
|
fromRect: NSZeroRect |
|
|
|
|
operation: NSCompositeSourceOver |
|
|
|
|
fraction: 1.0]; |
|
|
|
@ -993,47 +978,40 @@ void cv::setWindowTitle(const String& winname, const String& title) |
|
|
|
|
@end |
|
|
|
|
|
|
|
|
|
@implementation CVSlider |
|
|
|
|
#if defined(__LP64__) |
|
|
|
|
|
|
|
|
|
@synthesize slider; |
|
|
|
|
@synthesize name; |
|
|
|
|
@synthesize value; |
|
|
|
|
@synthesize userData; |
|
|
|
|
@synthesize callback; |
|
|
|
|
@synthesize callback2; |
|
|
|
|
#else // 32-bit Obj-C does not have automatic synthesize |
|
|
|
|
@synthesize slider = _slider; |
|
|
|
|
@synthesize name = _name; |
|
|
|
|
@synthesize value = _value; |
|
|
|
|
@synthesize userData = _userData; |
|
|
|
|
@synthesize callback = _callback; |
|
|
|
|
@synthesize callback2 = _callback2; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
- (id)init { |
|
|
|
|
[super init]; |
|
|
|
|
|
|
|
|
|
_callback = NULL; |
|
|
|
|
_value = NULL; |
|
|
|
|
_userData = NULL; |
|
|
|
|
callback = NULL; |
|
|
|
|
value = NULL; |
|
|
|
|
userData = NULL; |
|
|
|
|
|
|
|
|
|
[self setFrame:NSMakeRect(0,0,200,30)]; |
|
|
|
|
|
|
|
|
|
_name = [[NSTextField alloc] initWithFrame:NSMakeRect(10, 0,110, 25)]; |
|
|
|
|
[_name setEditable:NO]; |
|
|
|
|
[_name setSelectable:NO]; |
|
|
|
|
[_name setBezeled:NO]; |
|
|
|
|
[_name setBordered:NO]; |
|
|
|
|
[_name setDrawsBackground:NO]; |
|
|
|
|
[[_name cell] setLineBreakMode:NSLineBreakByTruncatingTail]; |
|
|
|
|
[self addSubview:_name]; |
|
|
|
|
|
|
|
|
|
_slider = [[NSSlider alloc] initWithFrame:NSMakeRect(120, 0, 70, 25)]; |
|
|
|
|
[_slider setAutoresizingMask:NSViewWidthSizable]; |
|
|
|
|
[_slider setMinValue:0]; |
|
|
|
|
[_slider setMaxValue:100]; |
|
|
|
|
[_slider setContinuous:YES]; |
|
|
|
|
[_slider setTarget:self]; |
|
|
|
|
[_slider setAction:@selector(sliderChanged:)]; |
|
|
|
|
[self addSubview:_slider]; |
|
|
|
|
name = [[NSTextField alloc] initWithFrame:NSMakeRect(10, 0,110, 25)]; |
|
|
|
|
[name setEditable:NO]; |
|
|
|
|
[name setSelectable:NO]; |
|
|
|
|
[name setBezeled:NO]; |
|
|
|
|
[name setBordered:NO]; |
|
|
|
|
[name setDrawsBackground:NO]; |
|
|
|
|
[[name cell] setLineBreakMode:NSLineBreakByTruncatingTail]; |
|
|
|
|
[self addSubview:name]; |
|
|
|
|
|
|
|
|
|
slider = [[NSSlider alloc] initWithFrame:NSMakeRect(120, 0, 70, 25)]; |
|
|
|
|
[slider setAutoresizingMask:NSViewWidthSizable]; |
|
|
|
|
[slider setMinValue:0]; |
|
|
|
|
[slider setMaxValue:100]; |
|
|
|
|
[slider setContinuous:YES]; |
|
|
|
|
[slider setTarget:self]; |
|
|
|
|
[slider setAction:@selector(sliderChanged:)]; |
|
|
|
|
[self addSubview:slider]; |
|
|
|
|
|
|
|
|
|
[self setAutoresizingMask:NSViewWidthSizable]; |
|
|
|
|
|
|
|
|
@ -1044,13 +1022,13 @@ void cv::setWindowTitle(const String& winname, const String& title) |
|
|
|
|
|
|
|
|
|
- (void)sliderChanged:(NSNotification *)notification { |
|
|
|
|
(void)notification; |
|
|
|
|
int pos = [_slider intValue]; |
|
|
|
|
if(_value) |
|
|
|
|
*_value = pos; |
|
|
|
|
if(_callback) |
|
|
|
|
_callback(pos); |
|
|
|
|
if(_callback2) |
|
|
|
|
_callback2(pos, _userData); |
|
|
|
|
int pos = [slider intValue]; |
|
|
|
|
if(value) |
|
|
|
|
*value = pos; |
|
|
|
|
if(callback) |
|
|
|
|
callback(pos); |
|
|
|
|
if(callback2) |
|
|
|
|
callback2(pos, userData); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@end |
|
|
|
|