mirror of
https://github.com/dyne/FreeJ.git
synced 2026-06-16 12:59:33 +02:00
CVFilter are now properly created and applied
but can't be controlled from the gui (yet)
This commit is contained in:
+2
-1
@@ -79,8 +79,9 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
void destruct(FilterInstance *inst);
|
void destruct(FilterInstance *inst);
|
||||||
void update(FilterInstance *inst, double time, uint32_t *inframe, uint32_t *outframe);
|
void update(FilterInstance *inst, double time, uint32_t *inframe, uint32_t *outframe);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
FilterParams *desc;
|
||||||
FACTORY_ALLOWED
|
FACTORY_ALLOWED
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
+33
-8
@@ -33,11 +33,25 @@
|
|||||||
#define FILTERS_MAX 18
|
#define FILTERS_MAX 18
|
||||||
|
|
||||||
static char *fNames[FILTERS_MAX] = {
|
static char *fNames[FILTERS_MAX] = {
|
||||||
"ZoomBlur", "BoxBlur", "DiscBlur", "GaussianBlur", "ColorPosterize",
|
(char *)"ZoomBlur",
|
||||||
"ColorInvert", "ComicEffect", "Crystalize", "Edges", "EdgeWork",
|
(char *)"BoxBlur",
|
||||||
"HueAdjust", "HexagonalPixellate", "HoleDistorsion", //"BumpDistorsion",
|
(char *)"DiscBlur",
|
||||||
"CircleSplashDistortion", "CircularWrap", "PinchDistortion", "TwirlDistortion",
|
(char *)"GaussianBlur",
|
||||||
"VortexDistortion"
|
(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] =
|
static FilterParams fParams[FILTERS_MAX] =
|
||||||
@@ -90,6 +104,7 @@ CVFilter::~CVFilter()
|
|||||||
|
|
||||||
int CVFilter::type()
|
int CVFilter::type()
|
||||||
{
|
{
|
||||||
|
return Filter::COREIMAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CVFilter::open(char *name)
|
int CVFilter::open(char *name)
|
||||||
@@ -100,9 +115,15 @@ int CVFilter::open(char *name)
|
|||||||
}
|
}
|
||||||
//filterName = [[NSString stringWithFormat:@"CI%s", name] retain];
|
//filterName = [[NSString stringWithFormat:@"CI%s", name] retain];
|
||||||
set_name(name);
|
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]];
|
//[ciFilter setName:[[sender selectedItem] title]];
|
||||||
opened = true;
|
return 0;
|
||||||
return 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CVFilter::apply(Layer *lay, FilterInstance *instance)
|
bool CVFilter::apply(Layer *lay, FilterInstance *instance)
|
||||||
@@ -137,6 +158,9 @@ void CVFilter::print_info()
|
|||||||
|
|
||||||
char *CVFilter::get_parameter_description(int i)
|
char *CVFilter::get_parameter_description(int i)
|
||||||
{
|
{
|
||||||
|
if (i >= desc->nParams)
|
||||||
|
return NULL;
|
||||||
|
return desc->params[i].label;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CVFilter::destruct(FilterInstance *inst)
|
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) {
|
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
|
CVFilterInstance *cvInst = (CVFilterInstance *)inst; // XXX - highly unsafe ... find a proper solution
|
||||||
// first wrap the input buffer in a CVPixelBuffer
|
// first wrap the input buffer in a CVPixelBuffer
|
||||||
CVPixelBufferRef pixelBufferIn;
|
CVPixelBufferRef pixelBufferIn;
|
||||||
Layer *layer = inst->get_layer();
|
Layer *layer = inst->get_layer();
|
||||||
if (layer) {
|
if (layer) {
|
||||||
//_BGRA2ARGB(layer->buffer, layer->geo.w*layer->geo.h); // XXX - expensive conversion
|
|
||||||
CVReturn cvRet = CVPixelBufferCreateWithBytes (
|
CVReturn cvRet = CVPixelBufferCreateWithBytes (
|
||||||
NULL,
|
NULL,
|
||||||
layer->geo.w,
|
layer->geo.w,
|
||||||
@@ -185,6 +209,7 @@ void CVFilter::update(FilterInstance *inst, double time, uint32_t *inframe, uint
|
|||||||
CGColorSpaceRelease(colorSpace);
|
CGColorSpaceRelease(colorSpace);
|
||||||
CVPixelBufferRelease(pixelBufferIn);
|
CVPixelBufferRelease(pixelBufferIn);
|
||||||
}
|
}
|
||||||
|
[pool release];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,8 @@
|
|||||||
#include <Foundation/NSString.h>
|
#include <Foundation/NSString.h>
|
||||||
#ifdef WITH_COCOA
|
#ifdef WITH_COCOA
|
||||||
|
|
||||||
|
FACTORY_REGISTER_INSTANTIATOR(FilterInstance, CVFilterInstance, FilterInstance, cocoa);
|
||||||
|
|
||||||
CVFilterInstance::CVFilterInstance()
|
CVFilterInstance::CVFilterInstance()
|
||||||
: FilterInstance()
|
: FilterInstance()
|
||||||
{
|
{
|
||||||
@@ -48,7 +50,8 @@ CVFilterInstance::CVFilterInstance(Filter *fr)
|
|||||||
void CVFilterInstance::init(Filter *fr)
|
void CVFilterInstance::init(Filter *fr)
|
||||||
{
|
{
|
||||||
ciFilter = [[CIFilter filterWithName:[NSString stringWithFormat:@"CI%s", fr->name]] retain];
|
ciFilter = [[CIFilter filterWithName:[NSString stringWithFormat:@"CI%s", fr->name]] retain];
|
||||||
[ciFilter setDefaults];
|
[ciFilter setDefaults];
|
||||||
|
FilterInstance::init(fr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CVFilterInstance::set_layer(Layer *lay)
|
void CVFilterInstance::set_layer(Layer *lay)
|
||||||
|
|||||||
@@ -134,7 +134,7 @@
|
|||||||
Layer *fjLayer = cLayer->fj_layer();
|
Layer *fjLayer = cLayer->fj_layer();
|
||||||
FilterInstance *filt = fjLayer->filters.begin();
|
FilterInstance *filt = fjLayer->filters.begin();
|
||||||
while (filt) {
|
while (filt) {
|
||||||
NSTabViewItem *newItem = [[NSTabViewItem alloc] initWithIdentifier:(id)filt];
|
NSTabViewItem *newItem = [[NSTabViewItem alloc] initWithIdentifier:self];
|
||||||
[newItem setLabel:[NSString stringWithUTF8String:filt->name]];
|
[newItem setLabel:[NSString stringWithUTF8String:filt->name]];
|
||||||
if (newItem)
|
if (newItem)
|
||||||
[activeFilters addTabViewItem:newItem];
|
[activeFilters addTabViewItem:newItem];
|
||||||
@@ -157,10 +157,7 @@
|
|||||||
NSLog(@"4-filters limit reached for layer %s", [layer name]);
|
NSLog(@"4-filters limit reached for layer %s", [layer name]);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
NSTabViewItem *newItem = [[NSTabViewItem alloc] initWithIdentifier:self];
|
|
||||||
[newItem setLabel:@""];
|
|
||||||
if (newItem)
|
|
||||||
[activeFilters addTabViewItem:newItem];
|
|
||||||
NSRect frame = NSMakeRect(0, 0, 100, 20);
|
NSRect frame = NSMakeRect(0, 0, 100, 20);
|
||||||
NSView *container = [[NSView alloc] initWithFrame:[activeFilters frame]];
|
NSView *container = [[NSView alloc] initWithFrame:[activeFilters frame]];
|
||||||
NSSlider *newSlider = [[NSSlider alloc] initWithFrame:frame];
|
NSSlider *newSlider = [[NSSlider alloc] initWithFrame:frame];
|
||||||
@@ -199,7 +196,11 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
filt->apply(lay);
|
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
|
- (void)applyFilter:(CIFilter *)filter
|
||||||
{
|
{
|
||||||
|
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||||
[filter setValue:_image forKey:@"inputImage"];
|
[filter setValue:_image forKey:@"inputImage"];
|
||||||
CIImage *outputImage = [filter valueForKey:@"outputImage"];
|
CIImage *outputImage = [filter valueForKey:@"outputImage"];
|
||||||
[_image release];
|
[_image release];
|
||||||
_image = [outputImage retain];
|
_image = [outputImage retain];
|
||||||
|
[pool release];
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
Reference in New Issue
Block a user