mirror of
https://github.com/dyne/FreeJ.git
synced 2026-02-05 04:29:15 +01:00
CVFilter are now properly created and applied
but can't be controlled from the gui (yet)
This commit is contained in:
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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];
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user