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

Reply via email to