mirror of
https://github.com/dyne/FreeJ.git
synced 2026-06-16 12:59:33 +02:00
getTexture now returns an autoreleased object. Callers will retain it if necessary
refactoring the feedFrame/renderFrame/getTexture flow to make a more clever use of memory and autorelease pools started implementing CVFilter (on the way of having CoreImage filters usable from javascript)
This commit is contained in:
@@ -37,13 +37,13 @@ class CVCocoaLayer
|
||||
int height, width;
|
||||
Context *freej;
|
||||
int bufsize;
|
||||
CVPixelBufferRef pixelBuffer;
|
||||
|
||||
void set_controller(CVLayerController *vin);
|
||||
|
||||
public:
|
||||
CVLayerController *input;
|
||||
NSString *blendMode;
|
||||
void *vbuffer;
|
||||
|
||||
CVCocoaLayer(Layer *lay, CVLayerController *vin = NULL);
|
||||
|
||||
|
||||
@@ -24,7 +24,9 @@ CVCocoaLayer::CVCocoaLayer(Layer *lay, CVLayerController *vin)
|
||||
{
|
||||
input = vin;
|
||||
bufsize = 0;
|
||||
blendMode = NULL;
|
||||
blendMode = nil;
|
||||
pixelBuffer = nil;
|
||||
|
||||
layer = lay;
|
||||
if (input)
|
||||
[input setLayer:this];
|
||||
@@ -39,6 +41,8 @@ CVCocoaLayer::~CVCocoaLayer()
|
||||
deactivate();
|
||||
if (input)
|
||||
[input setLayer:nil];
|
||||
if (pixelBuffer)
|
||||
CVPixelBufferRelease(pixelBuffer);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -70,11 +74,9 @@ CVTexture *
|
||||
CVCocoaLayer::gl_texture()
|
||||
{
|
||||
CVTexture *texture = NULL;
|
||||
if (input) {
|
||||
if (input)
|
||||
texture = [input getTexture];
|
||||
if (texture)
|
||||
[input renderPreview];
|
||||
}
|
||||
|
||||
return texture;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -29,7 +29,7 @@ class CVF0rLayer : public CVLayer
|
||||
void *currentFrame;
|
||||
CVPixelBufferRef pixelBuffer;
|
||||
|
||||
public:
|
||||
public:
|
||||
CVF0rLayer(CVLayerController *controller);
|
||||
~CVF0rLayer();
|
||||
void register_generators(Linklist<Filter> *gens);
|
||||
|
||||
@@ -84,13 +84,6 @@
|
||||
[super deactivate];
|
||||
}
|
||||
|
||||
- (CVTexture *)getTexture
|
||||
{
|
||||
CVTexture *ret;
|
||||
ret = [super getTexture];
|
||||
return ret;
|
||||
}
|
||||
|
||||
- (void)freeFrame
|
||||
{
|
||||
if (currentFrame) {
|
||||
@@ -184,7 +177,6 @@
|
||||
} else {
|
||||
skipCount++;
|
||||
}
|
||||
layer->vbuffer = currentFrame;
|
||||
newFrame = YES;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
/*
|
||||
* CVFilter.cpp
|
||||
* freej
|
||||
*
|
||||
* Created by xant on 5/4/10.
|
||||
* Copyright 2010 dyne.org. All rights reserved.
|
||||
*
|
||||
* This source code is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Public License as published
|
||||
* by the Free Software Foundation; either version 2 of the License,
|
||||
* or (at your option) any later version.
|
||||
*
|
||||
* This source code is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* Please refer to the GNU Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Public License along with
|
||||
* this source code; if not, write to:
|
||||
* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
* "$Id:$"
|
||||
*
|
||||
*/
|
||||
|
||||
#include "CVFilter.h"
|
||||
|
||||
@@ -23,3 +23,61 @@
|
||||
*
|
||||
*/
|
||||
|
||||
/* FreeJ - Frei0r wrapper
|
||||
* (c) Copyright 2007 Denis Rojo <jaromil@dyne.org>
|
||||
*
|
||||
* This source code is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Public License as published
|
||||
* by the Free Software Foundation; either version 2 of the License,
|
||||
* or (at your option) any later version.
|
||||
*
|
||||
* This source code is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* Please refer to the GNU Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Public License along with
|
||||
* this source code; if not, write to:
|
||||
* Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __CVFILTER_H__
|
||||
#define __CVFILTER_H__
|
||||
|
||||
#include <config.h>
|
||||
#ifdef WITH_COCOA
|
||||
#import <QuartzCore/CIFilter.h>
|
||||
#include <filter.h>
|
||||
#include <factory.h>
|
||||
|
||||
class CVFilter: public Filter {
|
||||
|
||||
public:
|
||||
|
||||
CVFilter();
|
||||
virtual ~CVFilter();
|
||||
|
||||
int type();
|
||||
int open(char *name);
|
||||
bool apply(Layer *lay, FilterInstance *instance);
|
||||
const char *description();
|
||||
void print_info();
|
||||
char *get_parameter_description(int i);
|
||||
|
||||
bool opened;
|
||||
|
||||
protected:
|
||||
void destruct(FilterInstance *inst);
|
||||
void update(FilterInstance *inst, double time, uint32_t *inframe, uint32_t *outframe);
|
||||
|
||||
private:
|
||||
CIFilter *ciFilter;
|
||||
NSString *filterName;
|
||||
NSString *filterDescr;
|
||||
FACTORY_ALLOWED
|
||||
};
|
||||
|
||||
#endif // WITH_COCOA
|
||||
|
||||
#endif
|
||||
|
||||
@@ -216,15 +216,5 @@ error:
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (CVReturn)renderFrame
|
||||
{
|
||||
[lock lock];
|
||||
[self renderPreview];
|
||||
if (layer)
|
||||
layer->vbuffer = currentFrame;
|
||||
[lock unlock];
|
||||
return kCVReturnSuccess;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
|
||||
+21
-20
@@ -31,27 +31,28 @@
|
||||
|
||||
class CVLayer: public Layer, public CVCocoaLayer
|
||||
{
|
||||
private:
|
||||
virtual bool _init();
|
||||
virtual void *feed();
|
||||
public:
|
||||
CVLayer();
|
||||
CVLayer(CVLayerController *vin);
|
||||
public:
|
||||
CVLayer();
|
||||
CVLayer(CVLayerController *vin);
|
||||
|
||||
virtual ~CVLayer();
|
||||
virtual bool open(const char *path);
|
||||
virtual void close();
|
||||
virtual bool forward();
|
||||
virtual bool backward();
|
||||
virtual bool backward_one_keyframe();
|
||||
|
||||
virtual bool relative_seek(double increment);
|
||||
|
||||
virtual bool set_mark_in();
|
||||
virtual bool set_mark_out();
|
||||
|
||||
virtual void pause();
|
||||
|
||||
private:
|
||||
virtual bool _init();
|
||||
virtual void *feed();
|
||||
|
||||
virtual ~CVLayer();
|
||||
virtual bool open(const char *path);
|
||||
virtual void close();
|
||||
//void run();
|
||||
virtual bool forward();
|
||||
virtual bool backward();
|
||||
virtual bool backward_one_keyframe();
|
||||
|
||||
virtual bool relative_seek(double increment);
|
||||
|
||||
virtual bool set_mark_in();
|
||||
virtual bool set_mark_out();
|
||||
|
||||
virtual void pause();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
+13
-3
@@ -108,9 +108,19 @@ CVLayer::relative_seek(double increment)
|
||||
void *
|
||||
CVLayer::feed()
|
||||
{
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
lock();
|
||||
if ([input isVisible] || [input needPreview])
|
||||
[input renderFrame];
|
||||
//if ([input isVisible] || [input needPreview])
|
||||
[input renderFrame];
|
||||
CVTexture *texture = [input getTexture];
|
||||
if (pixelBuffer)
|
||||
CVPixelBufferRelease(pixelBuffer);
|
||||
pixelBuffer = CVPixelBufferRetain([texture pixelBuffer]);
|
||||
CVPixelBufferLockBaseAddress(pixelBuffer, 0);
|
||||
void *buf = CVPixelBufferGetBaseAddress(pixelBuffer);
|
||||
CVPixelBufferUnlockBaseAddress(pixelBuffer, 0);
|
||||
unlock();
|
||||
return (void *)vbuffer;
|
||||
|
||||
[pool release];
|
||||
return buf;
|
||||
}
|
||||
|
||||
+57
-50
@@ -42,10 +42,10 @@ static FilterParams fParams[FILTERS_MAX] =
|
||||
{ 3, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.01, 1000.0 } } }, // HoleDistortion
|
||||
//{ 4, { { "CenterX", 0.0, 100.0 }, { "CenterY", 0.0, 100.0 }, { "inputRadius", 0.00, 600.0 }, { "inputScale", -1.0, 1.0 } } }, // BumpDistortion
|
||||
{ 3, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 1000.0 } } }, // CircleSplashDistortion
|
||||
{ 4, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 600 }, { (char*)"inputAngle", -3.14, 3.14 } } }, // CircularWrap
|
||||
{ 4, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 600.0 }, { (char*)"inputAngle", -3.14, 3.14 } } }, // CircularWrap
|
||||
{ 4, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 1000.0 }, { (char*)"inputScale", 0.0, 1.0 } } }, // PinchDistortion
|
||||
{ 4, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 500 }, { (char*)"inputAngle", -12.57, 12.57 } } }, // TwirlDistortion
|
||||
{ 4, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 800 }, { (char*)"inputAngle", -94.25, 94.25 } } }, // VortexDistortion
|
||||
{ 4, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 500.0 }, { (char*)"inputAngle", -12.57, 12.57 } } }, // TwirlDistortion
|
||||
{ 4, { { (char*)"CenterX", 0.0, 100.0 }, { (char*)"CenterY", 0.0, 100.0 }, { (char*)"inputRadius", 0.00, 800.0 }, { (char*)"inputAngle", -94.25, 94.25 } } }, // VortexDistortion
|
||||
};
|
||||
|
||||
/* Utility to set a SInt32 value in a CFDictionary
|
||||
@@ -169,12 +169,58 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict,
|
||||
currentFrame = CVPixelBufferRetain(frame);
|
||||
newFrame = YES;
|
||||
[lock unlock];
|
||||
[self renderFrame];
|
||||
}
|
||||
|
||||
- (CVReturn)renderFrame
|
||||
{
|
||||
NSLog(@"renderFrame MUST be overridden");
|
||||
return kCVReturnError;
|
||||
CIImage *inputImage = nil;
|
||||
CIImage *renderedImage = nil;
|
||||
Layer *fjLayer = NULL;
|
||||
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
|
||||
if (layer)
|
||||
fjLayer = layer->fj_layer();
|
||||
else
|
||||
return kCVReturnError;
|
||||
|
||||
if (!filtersInitialized)
|
||||
[self initFilters]; // initialize on first use
|
||||
|
||||
if (newFrame) {
|
||||
[lock lock];
|
||||
inputImage = [CIImage imageWithCVImageBuffer:currentFrame];
|
||||
if (doFilters) {
|
||||
[colorCorrectionFilter setValue:inputImage forKey:@"inputImage"];
|
||||
[exposureAdjustFilter setValue:[colorCorrectionFilter valueForKey:@"outputImage"] forKey:@"inputImage"];
|
||||
[effectFilter setValue:[exposureAdjustFilter valueForKey:@"outputImage"]
|
||||
forKey:@"inputImage"];
|
||||
[alphaFilter setValue:[effectFilter valueForKey:@"outputImage"]
|
||||
forKey:@"inputImage"];
|
||||
[rotateFilter setValue:[alphaFilter valueForKey:@"outputImage"] forKey:@"inputImage"];
|
||||
if (fjLayer && (fjLayer->geo.x || fjLayer->geo.y)) {
|
||||
NSAffineTransform *translateTransform = [NSAffineTransform transform];
|
||||
[translateTransform translateXBy:fjLayer->geo.x yBy:fjLayer->geo.y];
|
||||
[translateFilter setValue:translateTransform forKey:@"inputTransform"];
|
||||
|
||||
[translateFilter setValue:[rotateFilter valueForKey:@"outputImage"] forKey:@"inputImage"];
|
||||
renderedImage = [translateFilter valueForKey:@"outputImage"];
|
||||
} else {
|
||||
renderedImage = [rotateFilter valueForKey:@"outputImage"];
|
||||
}
|
||||
} else {
|
||||
renderedImage = inputImage;
|
||||
}
|
||||
if (lastFrame)
|
||||
[lastFrame release];
|
||||
lastFrame = [[CVTexture alloc] initWithCIImage:renderedImage pixelBuffer:currentFrame];
|
||||
newFrame = NO;
|
||||
[lock unlock];
|
||||
[self renderPreview];
|
||||
}
|
||||
[pool release];
|
||||
return kCVReturnSuccess;
|
||||
}
|
||||
|
||||
- (IBAction)toggleFilters:(id)sender
|
||||
@@ -232,6 +278,8 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict,
|
||||
pool = [[NSAutoreleasePool alloc] init];
|
||||
if (layer)
|
||||
fjLayer = layer->fj_layer();
|
||||
else
|
||||
return;
|
||||
|
||||
// TODO - optimize the logic in this routine ... it's becoming huge!!
|
||||
// to prevent its run() method to try rendering
|
||||
@@ -469,54 +517,13 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict,
|
||||
}
|
||||
|
||||
- (CVTexture *)getTexture
|
||||
{
|
||||
CIImage *inputImage = nil;
|
||||
{
|
||||
CVTexture *texture = nil;
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
CIImage *renderedImage = nil;
|
||||
Layer *fjLayer = NULL;
|
||||
|
||||
if (layer)
|
||||
fjLayer = layer->fj_layer();
|
||||
|
||||
if (!filtersInitialized)
|
||||
[self initFilters];
|
||||
[lock lock];
|
||||
if (newFrame) {
|
||||
inputImage = [CIImage imageWithCVImageBuffer:currentFrame];
|
||||
newFrame = NO;
|
||||
if (doFilters) {
|
||||
[colorCorrectionFilter setValue:inputImage forKey:@"inputImage"];
|
||||
[exposureAdjustFilter setValue:[colorCorrectionFilter valueForKey:@"outputImage"] forKey:@"inputImage"];
|
||||
[effectFilter setValue:[exposureAdjustFilter valueForKey:@"outputImage"]
|
||||
forKey:@"inputImage"];
|
||||
[alphaFilter setValue:[effectFilter valueForKey:@"outputImage"]
|
||||
forKey:@"inputImage"];
|
||||
[rotateFilter setValue:[alphaFilter valueForKey:@"outputImage"] forKey:@"inputImage"];
|
||||
if (fjLayer && (fjLayer->geo.x || fjLayer->geo.y)) {
|
||||
NSAffineTransform *translateTransform = [NSAffineTransform transform];
|
||||
[translateTransform translateXBy:fjLayer->geo.x yBy:fjLayer->geo.y];
|
||||
[translateFilter setValue:translateTransform forKey:@"inputTransform"];
|
||||
|
||||
[translateFilter setValue:[rotateFilter valueForKey:@"outputImage"] forKey:@"inputImage"];
|
||||
renderedImage = [translateFilter valueForKey:@"outputImage"];
|
||||
} else {
|
||||
renderedImage = [rotateFilter valueForKey:@"outputImage"];
|
||||
}
|
||||
} else {
|
||||
renderedImage = inputImage;
|
||||
}
|
||||
texture = [[CVTexture alloc] initWithCIImage:renderedImage pixelBuffer:currentFrame];
|
||||
|
||||
if (lastFrame)
|
||||
[lastFrame release];
|
||||
lastFrame = [texture retain];
|
||||
} else {
|
||||
texture = [lastFrame retain];
|
||||
}
|
||||
texture = [lastFrame retain];
|
||||
[lock unlock];
|
||||
[pool release];
|
||||
return texture;
|
||||
|
||||
return [texture autorelease];
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -182,7 +182,6 @@
|
||||
//if (textureToRelease)
|
||||
// [textureToRelease release];
|
||||
}
|
||||
[texture release];
|
||||
|
||||
[pool release];
|
||||
}
|
||||
|
||||
@@ -254,18 +254,6 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict,
|
||||
return isPlaying;
|
||||
}
|
||||
|
||||
- (CVTexture *)getTexture
|
||||
{
|
||||
CVTexture *ret;
|
||||
bool gotNewFrame = newFrame;
|
||||
ret = [super getTexture];
|
||||
/*
|
||||
if (gotNewFrame) // task the qtvisualcontext if we got a new frame
|
||||
[(CVQtLayerController *)self task];
|
||||
*/
|
||||
return ret;
|
||||
}
|
||||
|
||||
- (BOOL)getFrameForTime:(const CVTimeStamp *)timeStamp
|
||||
{
|
||||
Context *ctx = [freej getContext];
|
||||
@@ -371,10 +359,8 @@ static OSStatus SetNumberValue(CFMutableDictionaryRef inDict,
|
||||
} else {
|
||||
rv = kCVReturnError;
|
||||
}
|
||||
if (layer)
|
||||
layer->vbuffer = currentFrame;
|
||||
[pool release];
|
||||
return rv;
|
||||
return [super renderFrame];
|
||||
}
|
||||
|
||||
- (void)task
|
||||
|
||||
+12
-8
@@ -437,7 +437,9 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink,
|
||||
while ([lastTextures count]) {
|
||||
CVTexture *texture = [lastTextures objectAtIndex:0];
|
||||
[lastTextures removeObjectAtIndex:0];
|
||||
[texture release];
|
||||
// removing the texture from the array makes its refcnt reach 0
|
||||
// so it will be automagically released
|
||||
//[texture release];
|
||||
}
|
||||
} else {
|
||||
needsReshape = YES;
|
||||
@@ -460,7 +462,7 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink,
|
||||
|
||||
- (void)drawLayer:(Layer *)layer
|
||||
{
|
||||
//NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
|
||||
CIFilter *blendFilter = nil;
|
||||
CVTexture *texture = nil;
|
||||
if (layer->type == Layer::GL_COCOA) {
|
||||
@@ -491,7 +493,7 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink,
|
||||
// TODO - Error Messages
|
||||
}
|
||||
CIImage *inputImage = [CIImage imageWithCVImageBuffer:pixelBufferOut];
|
||||
texture = [[CVTexture alloc] initWithCIImage:inputImage pixelBuffer:pixelBufferOut];
|
||||
texture = [CVTexture textureWithCIImage:inputImage pixelBuffer:pixelBufferOut];
|
||||
// we can release our reference to the pixelBuffer now.
|
||||
// The CVTexture will retain it as long as it is needed
|
||||
CVPixelBufferRelease(pixelBufferOut);
|
||||
@@ -509,9 +511,11 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink,
|
||||
[outFrame release];
|
||||
outFrame = [temp retain];
|
||||
}
|
||||
[lastTextures addObject:texture];
|
||||
[lastTextures addObject:texture]; // Note: we use this to keep the texture refcnt'd until necessary
|
||||
// once removed from the array it will be free'd
|
||||
}
|
||||
[lock unlock];
|
||||
[pool release];
|
||||
}
|
||||
|
||||
#define MYCGL
|
||||
@@ -916,7 +920,7 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink,
|
||||
{
|
||||
if (aTableView != layerList)
|
||||
return nil;
|
||||
return [NSArray arrayWithObjects:@"CVLayer", @"CVLayerIndex", nil];
|
||||
return [NSArray arrayWithObjects:@"CVCocoaLayer", @"CVLayerIndex", nil];
|
||||
}
|
||||
|
||||
- (BOOL)tableView:(NSTableView *)aTableView writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard *)pboard
|
||||
@@ -927,8 +931,8 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink,
|
||||
NSUInteger row = [rowIndexes firstIndex];
|
||||
Layer *lay = fjScreen->layers.pick(row+1);
|
||||
if (lay) {
|
||||
[pboard addTypes:[NSArray arrayWithObjects:@"CVLayer", @"CVLayerIndex", nil] owner:(id)self];
|
||||
[pboard setData:[NSData dataWithBytes:(void *)&lay length:sizeof(Layer *)] forType:@"CVLayer"];
|
||||
[pboard addTypes:[NSArray arrayWithObjects:@"CVCocoaLayer", @"CVLayerIndex", nil] owner:(id)self];
|
||||
[pboard setData:[NSData dataWithBytes:(void *)&lay length:sizeof(CVCocoaLayer *)] forType:@"CVCocoaLayer"];
|
||||
[pboard setData:[NSData dataWithBytes:(void *)&row length:sizeof(NSUInteger)] forType:@"CVLayerIndex"];
|
||||
return YES;
|
||||
}
|
||||
@@ -967,7 +971,7 @@ static CVReturn renderCallback(CVDisplayLinkRef displayLink,
|
||||
NSUInteger srcRow;
|
||||
|
||||
[[[info draggingPasteboard] dataForType:@"CVLayerIndex"] getBytes:&srcRow length:sizeof(NSUInteger)];
|
||||
[[[info draggingPasteboard] dataForType:@"CVLayer"] getBytes:&lay length:sizeof(Layer *)];
|
||||
[[[info draggingPasteboard] dataForType:@"CVCocoaLayer"] getBytes:&lay length:sizeof(CVCocoaLayer *)];
|
||||
if (lay) {
|
||||
lay->move((srcRow > row)?(row+1):row);
|
||||
[layerList reloadData];
|
||||
|
||||
@@ -56,14 +56,13 @@
|
||||
//NSFont * font =[NSFont fontWithName:@"Helvetica" size:32.0];
|
||||
[theString initWithString:text withAttributes:stanStringAttrib];
|
||||
[theString drawOnBuffer:currentFrame];
|
||||
layer->vbuffer = currentFrame;
|
||||
needsNewFrame = NO;
|
||||
}
|
||||
newFrame = YES;
|
||||
[lock unlock];
|
||||
[self renderPreview];
|
||||
//[self renderPreview];
|
||||
[pool release];
|
||||
return 0;
|
||||
return [super renderFrame];
|
||||
}
|
||||
|
||||
- (IBAction)setText:(NSString *)theText withAttributes:(NSDictionary *)attributes
|
||||
|
||||
@@ -29,5 +29,6 @@
|
||||
+ (id)textureWithCIImage:(CIImage *)image pixelBuffer:(CVPixelBufferRef)pixelBuffer;
|
||||
- (id)initWithCIImage:(CIImage *)image pixelBuffer:(CVPixelBufferRef)pixelBuffer;
|
||||
- (CIImage *)image;
|
||||
- (CVPixelBufferRef)pixelBuffer;
|
||||
- (void)dealloc;
|
||||
@end
|
||||
|
||||
+6
-1
@@ -29,7 +29,7 @@
|
||||
|
||||
+ (id)textureWithCIImage:(CIImage *)image pixelBuffer:(CVPixelBufferRef)pixelBuffer
|
||||
{
|
||||
id obj = [super alloc];
|
||||
id obj = [self alloc];
|
||||
[obj autorelease];
|
||||
return [obj initWithCIImage:image pixelBuffer:pixelBuffer];
|
||||
}
|
||||
@@ -56,4 +56,9 @@
|
||||
return _image;
|
||||
}
|
||||
|
||||
- (CVPixelBufferRef)pixelBuffer
|
||||
{
|
||||
return _pixelBuffer;
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -158,7 +158,7 @@
|
||||
AAD9EF6B10487BC400A3E51A /* sdl_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAD9EF6A10487BC400A3E51A /* sdl_controller.cpp */; };
|
||||
AADF7A000FD7F84500167F57 /* ipernav.icns in Resources */ = {isa = PBXBuildFile; fileRef = AADF79FF0FD7F84500167F57 /* ipernav.icns */; };
|
||||
AAE2C270103FDCDC00D62E4F /* kbd_ctrl_js.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAE2C26F103FDCDC00D62E4F /* kbd_ctrl_js.cpp */; };
|
||||
AAEB37261190019500EE9961 /* CVFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAEB37251190019500EE9961 /* CVFilter.cpp */; };
|
||||
AAEB37261190019500EE9961 /* CVFilter.mm in Sources */ = {isa = PBXBuildFile; fileRef = AAEB37251190019500EE9961 /* CVFilter.mm */; };
|
||||
AAEB376D11929F0000EE9961 /* filter_instance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = AAEB376C11929F0000EE9961 /* filter_instance.cpp */; };
|
||||
AAEE68940FC8906B007FB46B /* webcam.png in Resources */ = {isa = PBXBuildFile; fileRef = AAEE68930FC8906B007FB46B /* webcam.png */; };
|
||||
AAEE689F0FC893BC007FB46B /* frei0r.png in Resources */ = {isa = PBXBuildFile; fileRef = AAEE689E0FC893BC007FB46B /* frei0r.png */; };
|
||||
@@ -443,7 +443,7 @@
|
||||
AAE2C26F103FDCDC00D62E4F /* kbd_ctrl_js.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = kbd_ctrl_js.cpp; sourceTree = "<group>"; };
|
||||
AAE2C2B7103FE2AE00D62E4F /* factory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = factory.h; path = include/factory.h; sourceTree = "<group>"; };
|
||||
AAEB37241190019500EE9961 /* CVFilter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CVFilter.h; sourceTree = "<group>"; };
|
||||
AAEB37251190019500EE9961 /* CVFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CVFilter.cpp; sourceTree = "<group>"; };
|
||||
AAEB37251190019500EE9961 /* CVFilter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CVFilter.mm; sourceTree = "<group>"; };
|
||||
AAEB376C11929F0000EE9961 /* filter_instance.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filter_instance.cpp; sourceTree = "<group>"; };
|
||||
AAEB376E11929F0E00EE9961 /* filter_instance.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = filter_instance.h; path = include/filter_instance.h; sourceTree = "<group>"; };
|
||||
AAEE68930FC8906B007FB46B /* webcam.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = webcam.png; sourceTree = "<group>"; };
|
||||
@@ -583,7 +583,7 @@
|
||||
AAC9DB35103D2C7F00A0111E /* PreferencesPanel.h */,
|
||||
AAC9DB36103D2C7F00A0111E /* PreferencesPanel.mm */,
|
||||
AAEB37241190019500EE9961 /* CVFilter.h */,
|
||||
AAEB37251190019500EE9961 /* CVFilter.cpp */,
|
||||
AAEB37251190019500EE9961 /* CVFilter.mm */,
|
||||
);
|
||||
name = Cocoa;
|
||||
sourceTree = "<group>";
|
||||
@@ -1135,7 +1135,7 @@
|
||||
AA9D8A7D118D6E7E00B227B0 /* cairo_layer_js.cpp in Sources */,
|
||||
AA9D8A7E118D6E7E00B227B0 /* cairo_layer.cpp in Sources */,
|
||||
AA9D8ACE118D7AED00B227B0 /* color.cpp in Sources */,
|
||||
AAEB37261190019500EE9961 /* CVFilter.cpp in Sources */,
|
||||
AAEB37261190019500EE9961 /* CVFilter.mm in Sources */,
|
||||
AAEB376D11929F0000EE9961 /* filter_instance.cpp in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
|
||||
Reference in New Issue
Block a user