CVFilter are now properly created and applied

but can't be controlled from the gui (yet)
This commit is contained in:
xant
2010-06-14 23:21:38 +02:00
parent fa51e2706d
commit 2a520b4e84
5 changed files with 48 additions and 16 deletions

View File

@@ -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
};

View File

@@ -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];
}

View File

@@ -30,6 +30,8 @@
#include <Foundation/NSString.h>
#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)

View File

@@ -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];
}
}

View File

@@ -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