Author: filipzelic
Date: Thu Jul 2 22:24:18 2015
New Revision: 38740
URL: http://svn.gna.org/viewcvs/gnustep?rev=38740&view=rev
Log:
Notifying host application about a change in next frame's time.
Change-Id: Id77a0e5d515290f197aab3d19a76689726cd30cf
Modified:
libs/quartzcore/trunk/ChangeLog
libs/quartzcore/trunk/Headers/QuartzCore/CAAnimation.h
libs/quartzcore/trunk/Headers/QuartzCore/CALayer.h
libs/quartzcore/trunk/Headers/QuartzCore/CARenderer.h
libs/quartzcore/trunk/Source/CAAnimation+FrameworkPrivate.h
libs/quartzcore/trunk/Source/CAAnimation.m
libs/quartzcore/trunk/Source/CALayer+FrameworkPrivate.h
libs/quartzcore/trunk/Source/CALayer.m
libs/quartzcore/trunk/Source/CARenderer.m
libs/quartzcore/trunk/Tests/hello_animation.m
Modified: libs/quartzcore/trunk/ChangeLog
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/ChangeLog?rev=38740&r1=38739&r2=38740&view=diff
==============================================================================
--- libs/quartzcore/trunk/ChangeLog (original)
+++ libs/quartzcore/trunk/ChangeLog Thu Jul 2 22:24:18 2015
@@ -1,3 +1,20 @@
+2015-07-02 Filip Zelic <[email protected]>
+
+ * Headers/QuartzCore/CAAnimation.h
+ * Headers/QuartzCore/CALayer.h
+ * Headers/QuartzCore/CARenderer.h
+ * Source/CAAnimation+FrameworkPrivate.h
+ * Source/CAAnimation.m
+ * Source/CALayer+FrameworkPrivate.h
+ * Source/CALayer.m
+ * Source/CARenderer+FrameworkPrivate.h
+ * Source/CARenderer.m
+ Layers and animations now can notify renderer about changes that
+ have influence on the next frame time
+
+ * Tests/hello_animation.m
+ Added delegation method that is notified when next frame time changes
+
2012-10-18 Ivan VuÄica <[email protected]>
* Demo/DemoOpenGLView.m:
Modified: libs/quartzcore/trunk/Headers/QuartzCore/CAAnimation.h
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Headers/QuartzCore/CAAnimation.h?rev=38740&r1=38739&r2=38740&view=diff
==============================================================================
--- libs/quartzcore/trunk/Headers/QuartzCore/CAAnimation.h (original)
+++ libs/quartzcore/trunk/Headers/QuartzCore/CAAnimation.h Thu Jul 2
22:24:18 2015
@@ -53,6 +53,7 @@
NSString* _fillMode;
CFTimeInterval _duration;
float _speed;
+ NSPointerArray * _layers;
}
Modified: libs/quartzcore/trunk/Headers/QuartzCore/CALayer.h
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Headers/QuartzCore/CALayer.h?rev=38740&r1=38739&r2=38740&view=diff
==============================================================================
--- libs/quartzcore/trunk/Headers/QuartzCore/CALayer.h (original)
+++ libs/quartzcore/trunk/Headers/QuartzCore/CALayer.h Thu Jul 2 22:24:18 2015
@@ -49,6 +49,7 @@
NSString *const kCATransition;
@class CAAnimation;
+@class CARenderer;
#import "QuartzCore/CAAction.h"
@@ -67,6 +68,7 @@
id _delegate;
id _contents;
id _layoutManager;
+ CARenderer * _renderer;
CALayer * _superlayer;
NSArray * _sublayers;
CGRect _frame;
Modified: libs/quartzcore/trunk/Headers/QuartzCore/CARenderer.h
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Headers/QuartzCore/CARenderer.h?rev=38740&r1=38739&r2=38740&view=diff
==============================================================================
--- libs/quartzcore/trunk/Headers/QuartzCore/CARenderer.h (original)
+++ libs/quartzcore/trunk/Headers/QuartzCore/CARenderer.h Thu Jul 2
22:24:18 2015
@@ -34,6 +34,12 @@
@class CALayer;
@class NSOpenGLContext;
+@protocol GSCARendererDelegate <NSObject>
+
+- (void) nextFrameTimeDidChange;
+
+@end
+
typedef struct _CVTimeStamp
{
uint32_t version; /* zero */
@@ -59,7 +65,7 @@
CFTimeInterval _firstRender;
CFTimeInterval _currentTime;
CFTimeInterval _nextFrameTime;
-
+
NSMutableArray * _rasterizationSchedule;
/* a temporary optimization hack */
@@ -69,13 +75,16 @@
CAGLProgram * _simpleProgram;
CAGLProgram * _blurHorizProgram;
CAGLProgram * _blurVertProgram;
+
+ id<GSCARendererDelegate> delegate;
}
+ (CARenderer*)rendererWithNSOpenGLContext: (NSOpenGLContext *)context
options: (NSDictionary *)options;
-@property (retain) CALayer *layer; /* root layer */
+@property (nonatomic, retain) CALayer *layer; /* root layer */
@property (nonatomic, assign) CGRect bounds;
+@property (assign) id<GSCARendererDelegate> delegate;
- (void) addUpdateRect: (CGRect)updateRect;
- (void) beginFrameAtTime: (CFTimeInterval)timeInterval
Modified: libs/quartzcore/trunk/Source/CAAnimation+FrameworkPrivate.h
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Source/CAAnimation%2BFrameworkPrivate.h?rev=38740&r1=38739&r2=38740&view=diff
==============================================================================
--- libs/quartzcore/trunk/Source/CAAnimation+FrameworkPrivate.h (original)
+++ libs/quartzcore/trunk/Source/CAAnimation+FrameworkPrivate.h Thu Jul 2
22:24:18 2015
@@ -28,6 +28,11 @@
@class CALayer;
+@interface CAAnimation (FrameworkPrivate)
+- (void) handleAddedToLayer: (CALayer *)layer;
+- (void) handleRemovedFromLayer: (CALayer *)layer;
+@end
+
@interface CAPropertyAnimation (FrameworkPrivate)
- (void) applyToLayer: (CALayer *)layer;
@end
Modified: libs/quartzcore/trunk/Source/CAAnimation.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Source/CAAnimation.m?rev=38740&r1=38739&r2=38740&view=diff
==============================================================================
--- libs/quartzcore/trunk/Source/CAAnimation.m (original)
+++ libs/quartzcore/trunk/Source/CAAnimation.m Thu Jul 2 22:24:18 2015
@@ -39,6 +39,7 @@
NSString *const kCAAnimationDiscrete = @"CAAnimationDiscrete";
@interface CAAnimation ()
+@property (retain) NSPointerArray *layers;
- (id) init;
@end
@@ -55,6 +56,43 @@
@synthesize fillMode=_fillMode;
@synthesize duration=_duration;
@synthesize speed=_speed;
+@synthesize layers=_layers;
+
+- (void) setBeginTime: (CFTimeInterval)beginTime
+{
+ _beginTime = beginTime;
+ [self takeNoteThatNextFrameTimeChanged];
+}
+
+- (void) handleAddedToLayer: (CALayer *)layer
+{
+ for (int index = 0, len = [_layers count]; index < len; index++)
+ {
+ if(layer == [_layers pointerAtIndex: index])
+ [NSException raise:NSGenericException
+ format:@"Animation already added to this layer"];
+ }
+
+ [_layers addPointer:layer];
+}
+
+- (void) handleRemovedFromLayer: (CALayer *)layer
+{
+ for (int index = 0, len = [_layers count]; index < len; index++)
+ {
+ if(layer == [_layers pointerAtIndex: index])
+ [_layers removePointerAtIndex: index];
+ }
+}
+
+- (void) takeNoteThatNextFrameTimeChanged
+{
+ for (int index = 0, len = [_layers count]; index < len; index++)
+ {
+ CALayer *layer = [_layers pointerAtIndex: index];
+ [layer takeNoteThatNextFrameTimeChanged];
+ }
+}
+ (id) animation
{
@@ -122,7 +160,9 @@
forKey:keys[i]];
}
}
-
+
+ _layers = [[NSPointerArray weakObjectsPointerArray] retain];
+
return self;
}
@@ -131,7 +171,7 @@
self = [self init];
if (!self)
return nil;
-
+
static NSString * keys[] = {
@"delegate", @"removedOnCompletion", @"timingFunction",
@"duration", @"speed", @"autoreverses", @"repeatCount"};
@@ -143,7 +183,7 @@
forKey: keys[i]];
}
}
-
+
return self;
}
@@ -187,7 +227,8 @@
{
[_timingFunction release];
[_fillMode release];
-
+ [_layers release];
+
[super dealloc];
}
@@ -195,7 +236,7 @@
{
/* Slides */
CFTimeInterval activeTime = (timeAuthorityLocalTime - [self beginTime]) *
[self speed] + [self timeOffset];
-
+
/* FIXME: should not be necessary */
if (activeTime < 0)
activeTime = 0;
Modified: libs/quartzcore/trunk/Source/CALayer+FrameworkPrivate.h
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Source/CALayer%2BFrameworkPrivate.h?rev=38740&r1=38739&r2=38740&view=diff
==============================================================================
--- libs/quartzcore/trunk/Source/CALayer+FrameworkPrivate.h (original)
+++ libs/quartzcore/trunk/Source/CALayer+FrameworkPrivate.h Thu Jul 2
22:24:18 2015
@@ -32,6 +32,8 @@
CARenderer) */
+ (void) setCurrentFrameBeginTime: (CFTimeInterval)frameTime;
+- (void) takeNoteThatNextFrameTimeChanged;
+
- (CALayer *) rootLayer;
- (NSArray *) allAncestorLayers;
- (CALayer *) nextAncestorOf: (CALayer *)layer;
@@ -45,4 +47,5 @@
- (CFTimeInterval) localTime;
@property (retain) CABackingStore * backingStore;
+@property (assign) CARenderer * renderer;
@end
Modified: libs/quartzcore/trunk/Source/CALayer.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Source/CALayer.m?rev=38740&r1=38739&r2=38740&view=diff
==============================================================================
--- libs/quartzcore/trunk/Source/CALayer.m (original)
+++ libs/quartzcore/trunk/Source/CALayer.m Thu Jul 2 22:24:18 2015
@@ -38,6 +38,7 @@
#import "CALayer+DynamicProperties.h"
#import "QuartzCore/CATransaction.h"
#import "CABackingStore.h"
+#import "CARenderer+FrameworkPrivate.h"
#if GNUSTEP
#import <CoreGraphics/CoreGraphics.h>
@@ -64,6 +65,7 @@
@property (nonatomic, retain) NSMutableDictionary * animations;
@property (retain) NSMutableArray * animationKeys;
@property (retain) CABackingStore * backingStore;
+@property (nonatomic, assign) CARenderer * renderer;
- (void)setModelLayer: (id)modelLayer;
@end
@@ -73,6 +75,7 @@
@synthesize delegate=_delegate;
@synthesize contents=_contents;
@synthesize layoutManager=_layoutManager;
+@synthesize renderer=_renderer;
@synthesize superlayer=_superlayer;
@synthesize sublayers=_sublayers;
@synthesize frame=_frame;
@@ -115,6 +118,30 @@
@synthesize animations=_animations;
@synthesize animationKeys=_animationKeys;
@synthesize backingStore=_backingStore;
+
+- (void) setBeginTime: (CFTimeInterval)beginTime
+{
+ _beginTime = beginTime;
+ [self takeNoteThatNextFrameTimeChanged];
+}
+
+- (void) takeNoteThatNextFrameTimeChanged
+{
+ if (_renderer != nil)
+ [_renderer takeNoteThatNextFrameTimeChanged];
+ else
+ [_superlayer takeNoteThatNextFrameTimeChanged];
+}
+
+- (void) setRenderer: (CARenderer *)renderer
+{
+ if(renderer != _renderer)
+ {
+ CARenderer * temp = _renderer;
+ _renderer = renderer;
+ [temp release];
+ }
+}
/* *** dynamic synthesis of properties *** */
#if 0
@@ -639,6 +666,8 @@
[_animationKeys removeObject: key];
[_animationKeys addObject: key];
[key release];
+
+ [anim handleAddedToLayer: self];
if (![anim duration])
[anim setDuration: [CATransaction animationDuration]];
@@ -664,6 +693,7 @@
- (void) removeAnimationForKey: (NSString *)key
{
+ [[self animationForKey:key] handleRemovedFromLayer: self];
[_animations removeObjectForKey: key];
[_animationKeys removeObject: key];
}
Modified: libs/quartzcore/trunk/Source/CARenderer.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Source/CARenderer.m?rev=38740&r1=38739&r2=38740&view=diff
==============================================================================
--- libs/quartzcore/trunk/Source/CARenderer.m (original)
+++ libs/quartzcore/trunk/Source/CARenderer.m Thu Jul 2 22:24:18 2015
@@ -32,6 +32,7 @@
#import "CALayer+FrameworkPrivate.h"
#import "CATransaction+FrameworkPrivate.h"
#import "CABackingStore.h"
+#import "CARenderer+FrameworkPrivate.h"
#if !(__APPLE__)
#define GL_GLEXT_PROTOTYPES 1
#import <GL/gl.h>
@@ -70,15 +71,33 @@
@implementation CARenderer
@synthesize layer=_layer;
@synthesize bounds=_bounds;
+@synthesize delegate;
@synthesize GLContext=_GLContext;
+
+- (void) setLayer: (CALayer *)layer
+{
+ if (_layer != layer)
+ {
+ [_layer setRenderer: nil];
+ [layer setRenderer:self];
+
+ [_layer release];
+ _layer = [layer retain];
+ }
+}
+
+- (void) takeNoteThatNextFrameTimeChanged
+{
+ [self.delegate nextFrameTimeDidChange];
+}
/* *** class methods *** */
/* Creates a renderer which renders into an OpenGL context. */
+ (CARenderer*) rendererWithNSOpenGLContext: (NSOpenGLContext*)ctx
options: (NSDictionary*)options;
{
- return [[[self alloc] initWithNSOpenGLContext: ctx
+ return [[[self alloc] initWithNSOpenGLContext: ctx
options: options] autorelease];
}
Modified: libs/quartzcore/trunk/Tests/hello_animation.m
URL:
http://svn.gna.org/viewcvs/gnustep/libs/quartzcore/trunk/Tests/hello_animation.m?rev=38740&r1=38739&r2=38740&view=diff
==============================================================================
--- libs/quartzcore/trunk/Tests/hello_animation.m (original)
+++ libs/quartzcore/trunk/Tests/hello_animation.m Thu Jul 2 22:24:18 2015
@@ -116,7 +116,7 @@
/* ******************** */
-@interface HelloAnimationOpenGLView : QCTestOpenGLView
+@interface HelloAnimationOpenGLView : QCTestOpenGLView <GSCARendererDelegate>
{
CARenderer * _renderer;
HelloAnimationLayerDelegate * _layerDelegate;
@@ -197,9 +197,9 @@
[animation setDuration: 1];
[animation setFromValue: [NSValue valueWithPoint: NSMakePoint(400, 150)]];
[animation setToValue: [NSValue valueWithPoint: NSMakePoint(400, 250)]];
-
+
[[_renderer layer] addAnimation: animation forKey:@"thePositionAnimation"];
-
+
[self printPos: [_renderer layer]];
[self performSelector:@selector(printPos:) withObject: [_renderer layer]
afterDelay:0.5];
}
@@ -342,7 +342,8 @@
[_renderer retain];
[_renderer setLayer: layer];
[_renderer setBounds: NSRectToCGRect([self bounds])];
-
+ [_renderer setDelegate:self];
+
CALayer * layer2 = [CALayer layer];
[layer2 setDelegate: _layerDelegate];
[layer2 setBounds: CGRectMake (0, 0, 100, 100)];
@@ -424,6 +425,11 @@
repeats: NO];
}
+-(void) nextFrameTimeDidChange
+{
+ NSLog(@"GSCARendererDelegate - next frame time did change: next frame time
is %g", [_renderer nextFrameTime]);
+}
+
@end
_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs