diff --git a/xcode/CVFilter.h b/xcode/CVFilter.h index 4fba121a..e5adc585 100644 --- a/xcode/CVFilter.h +++ b/xcode/CVFilter.h @@ -79,8 +79,9 @@ public: protected: void destruct(FilterInstance *inst); void update(FilterInstance *inst, double time, uint32_t *inframe, uint32_t *outframe); + private: - + FilterParams *desc; FACTORY_ALLOWED }; diff --git a/xcode/CVFilter.mm b/xcode/CVFilter.mm index 4dfc9c8d..d6a3bc24 100644 --- a/xcode/CVFilter.mm +++ b/xcode/CVFilter.mm @@ -33,11 +33,25 @@ #define FILTERS_MAX 18 static char *fNames[FILTERS_MAX] = { - "ZoomBlur", "BoxBlur", "DiscBlur", "GaussianBlur", "ColorPosterize", - "ColorInvert", "ComicEffect", "Crystalize", "Edges", "EdgeWork", - "HueAdjust", "HexagonalPixellate", "HoleDistorsion", //"BumpDistorsion", - "CircleSplashDistortion", "CircularWrap", "PinchDistortion", "TwirlDistortion", - "VortexDistortion" + (char *)"ZoomBlur", + (char *)"BoxBlur", + (char *)"DiscBlur", + (char *)"GaussianBlur", + (char *)"ColorPosterize", + (char *)"ColorInvert", + (char *)"ComicEffect", + (char *)"Crystalize", + (char *)"Edges", + (char *)"EdgeWork", + (char *)"HueAdjust", + (char *)"HexagonalPixellate", + (char *)"HoleDistorsion", + //(char *)"BumpDistorsion", + (char *)"CircleSplashDistortion", + (char *)"CircularWrap", + (char *)"PinchDistortion", + (char *)"TwirlDistortion", + (char *)"VortexDistortion" }; static FilterParams fParams[FILTERS_MAX] = @@ -90,6 +104,7 @@ CVFilter::~CVFilter() int CVFilter::type() { + return Filter::COREIMAGE; } int CVFilter::open(char *name) @@ -100,9 +115,15 @@ int CVFilter::open(char *name) } //filterName = [[NSString stringWithFormat:@"CI%s", name] retain]; set_name(name); + for (int i = 0; i < FILTERS_MAX; i++) { + if (strcmp(fNames[i], name) == 0) { + desc = &fParams[i]; + opened = true; + return 1; + } + } //[ciFilter setName:[[sender selectedItem] title]]; - opened = true; - return 1; + return 0; } bool CVFilter::apply(Layer *lay, FilterInstance *instance) @@ -137,6 +158,9 @@ void CVFilter::print_info() char *CVFilter::get_parameter_description(int i) { + if (i >= desc->nParams) + return NULL; + return desc->params[i].label; } void CVFilter::destruct(FilterInstance *inst) @@ -144,12 +168,12 @@ void CVFilter::destruct(FilterInstance *inst) } void CVFilter::update(FilterInstance *inst, double time, uint32_t *inframe, uint32_t *outframe) { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; CVFilterInstance *cvInst = (CVFilterInstance *)inst; // XXX - highly unsafe ... find a proper solution // first wrap the input buffer in a CVPixelBuffer CVPixelBufferRef pixelBufferIn; Layer *layer = inst->get_layer(); if (layer) { - //_BGRA2ARGB(layer->buffer, layer->geo.w*layer->geo.h); // XXX - expensive conversion CVReturn cvRet = CVPixelBufferCreateWithBytes ( NULL, layer->geo.w, @@ -185,6 +209,7 @@ void CVFilter::update(FilterInstance *inst, double time, uint32_t *inframe, uint CGColorSpaceRelease(colorSpace); CVPixelBufferRelease(pixelBufferIn); } + [pool release]; } diff --git a/xcode/CVFilterInstance.mm b/xcode/CVFilterInstance.mm index cd79a5d2..4edf5230 100644 --- a/xcode/CVFilterInstance.mm +++ b/xcode/CVFilterInstance.mm @@ -30,6 +30,8 @@ #include #ifdef WITH_COCOA +FACTORY_REGISTER_INSTANTIATOR(FilterInstance, CVFilterInstance, FilterInstance, cocoa); + CVFilterInstance::CVFilterInstance() : FilterInstance() { @@ -48,7 +50,8 @@ CVFilterInstance::CVFilterInstance(Filter *fr) void CVFilterInstance::init(Filter *fr) { ciFilter = [[CIFilter filterWithName:[NSString stringWithFormat:@"CI%s", fr->name]] retain]; - [ciFilter setDefaults]; + [ciFilter setDefaults]; + FilterInstance::init(fr); } void CVFilterInstance::set_layer(Layer *lay) diff --git a/xcode/CVFilterPanel.mm b/xcode/CVFilterPanel.mm index 20499b7c..707aae4a 100644 --- a/xcode/CVFilterPanel.mm +++ b/xcode/CVFilterPanel.mm @@ -134,7 +134,7 @@ Layer *fjLayer = cLayer->fj_layer(); FilterInstance *filt = fjLayer->filters.begin(); while (filt) { - NSTabViewItem *newItem = [[NSTabViewItem alloc] initWithIdentifier:(id)filt]; + NSTabViewItem *newItem = [[NSTabViewItem alloc] initWithIdentifier:self]; [newItem setLabel:[NSString stringWithUTF8String:filt->name]]; if (newItem) [activeFilters addTabViewItem:newItem]; @@ -157,10 +157,7 @@ NSLog(@"4-filters limit reached for layer %s", [layer name]); return; } - NSTabViewItem *newItem = [[NSTabViewItem alloc] initWithIdentifier:self]; - [newItem setLabel:@""]; - if (newItem) - [activeFilters addTabViewItem:newItem]; + NSRect frame = NSMakeRect(0, 0, 100, 20); NSView *container = [[NSView alloc] initWithFrame:[activeFilters frame]]; NSSlider *newSlider = [[NSSlider alloc] initWithFrame:frame]; @@ -199,7 +196,11 @@ return; } filt->apply(lay); - // NSString *filterName = [NSString stringWithFormat:@"CI%@", [[sender selectedItem] title]]; + NSTabViewItem *newItem = [[NSTabViewItem alloc] initWithIdentifier:self]; + [newItem setLabel:filterName]; + if (newItem) + [activeFilters addTabViewItem:newItem]; + [newItem release]; } } diff --git a/xcode/CVTexture.m b/xcode/CVTexture.m index 64065830..5b1b9077 100644 --- a/xcode/CVTexture.m +++ b/xcode/CVTexture.m @@ -63,10 +63,12 @@ - (void)applyFilter:(CIFilter *)filter { + NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; [filter setValue:_image forKey:@"inputImage"]; CIImage *outputImage = [filter valueForKey:@"outputImage"]; [_image release]; _image = [outputImage retain]; + [pool release]; } @end