Fixed massive stack memory usage in the gesture functions
authorSam Lantinga <slouken@libsdl.org>
Tue, 30 Nov 2010 18:07:31 -0800
changeset 4920 a4032241deb5
parent 4919 716b2cbf4c9e
child 4921 40a43c6d9220
Fixed massive stack memory usage in the gesture functions
src/events/SDL_gesture.c
--- a/src/events/SDL_gesture.c	Tue Nov 30 17:58:51 2010 -0800
+++ b/src/events/SDL_gesture.c	Tue Nov 30 18:07:31 2010 -0800
@@ -294,7 +294,7 @@
 }
 
 //DollarPath contains raw points, plus (possibly) the calculated length
-int dollarNormalize(SDL_DollarPath path,SDL_FloatPoint *points) {
+int dollarNormalize(const SDL_DollarPath *path,SDL_FloatPoint *points) {
   int i;
   float interval;
   float dist;
@@ -303,34 +303,35 @@
   float xmin,xmax,ymin,ymax;
   float ang;
   float w,h;
+  float length = path->length;
 
   //Calculate length if it hasn't already been done
-  if(path.length <= 0) {
-    for(i=1;i<path.numPoints;i++) {
-      float dx = path.p[i  ].x - 
-                 path.p[i-1].x;
-      float dy = path.p[i  ].y - 
-                 path.p[i-1].y;
-      path.length += (float)(SDL_sqrt(dx*dx+dy*dy));
+  if(length <= 0) {
+    for(i=1;i<path->numPoints;i++) {
+      float dx = path->p[i  ].x - 
+                 path->p[i-1].x;
+      float dy = path->p[i  ].y - 
+                 path->p[i-1].y;
+      length += (float)(SDL_sqrt(dx*dx+dy*dy));
     }
   }
 
   //Resample
-  interval = path.length/(DOLLARNPOINTS - 1);
+  interval = length/(DOLLARNPOINTS - 1);
   dist = interval;
 
   centroid.x = 0;centroid.y = 0;
   
-  //printf("(%f,%f)\n",path.p[path.numPoints-1].x,path.p[path.numPoints-1].y);
-  for(i = 1;i < path.numPoints;i++) {
-    float d = (float)(SDL_sqrt((path.p[i-1].x-path.p[i].x)*(path.p[i-1].x-path.p[i].x)+
-                             (path.p[i-1].y-path.p[i].y)*(path.p[i-1].y-path.p[i].y)));
+  //printf("(%f,%f)\n",path->p[path->numPoints-1].x,path->p[path->numPoints-1].y);
+  for(i = 1;i < path->numPoints;i++) {
+    float d = (float)(SDL_sqrt((path->p[i-1].x-path->p[i].x)*(path->p[i-1].x-path->p[i].x)+
+                             (path->p[i-1].y-path->p[i].y)*(path->p[i-1].y-path->p[i].y)));
     //printf("d = %f dist = %f/%f\n",d,dist,interval);
     while(dist + d > interval) {
-      points[numPoints].x = path.p[i-1].x + 
-        ((interval-dist)/d)*(path.p[i].x-path.p[i-1].x);
-      points[numPoints].y = path.p[i-1].y + 
-        ((interval-dist)/d)*(path.p[i].y-path.p[i-1].y);
+      points[numPoints].x = path->p[i-1].x + 
+        ((interval-dist)/d)*(path->p[i].x-path->p[i-1].x);
+      points[numPoints].y = path->p[i-1].y + 
+        ((interval-dist)/d)*(path->p[i].y-path->p[i-1].y);
       centroid.x += points[numPoints].x;
       centroid.y += points[numPoints].y;
       numPoints++;
@@ -344,7 +345,7 @@
     return 0;
   }
   //copy the last point
-  points[DOLLARNPOINTS-1] = path.p[path.numPoints-1];
+  points[DOLLARNPOINTS-1] = path->p[path->numPoints-1];
   numPoints = DOLLARNPOINTS;
 
   centroid.x /= numPoints;
@@ -386,7 +387,7 @@
   return numPoints;
 }
 
-float dollarRecognize(SDL_DollarPath path,int *bestTempl,SDL_GestureTouch* touch) {
+float dollarRecognize(const SDL_DollarPath *path,int *bestTempl,SDL_GestureTouch* touch) {
         
         SDL_FloatPoint points[DOLLARNPOINTS];
         int numPoints = dollarNormalize(path,points);
@@ -528,7 +529,7 @@
 #ifdef ENABLE_DOLLAR
       if(inTouch->recording) {
         inTouch->recording = SDL_FALSE;        
-        dollarNormalize(inTouch->dollarPath,path);
+        dollarNormalize(&inTouch->dollarPath,path);
         //PrintPath(path);
         if(recordAll) {
           index = SDL_AddDollarGesture(NULL,path);
@@ -549,7 +550,7 @@
       else {        
         int bestTempl;
         float error;
-        error = dollarRecognize(inTouch->dollarPath,
+        error = dollarRecognize(&inTouch->dollarPath,
                                 &bestTempl,inTouch);
         if(bestTempl >= 0){
           //Send Event