http://packetstormsecurity.org/UNIX/admin/xscreensaver-4.14.tar.gz
[xscreensaver] / hacks / glx / fps.c
index 7da5123b7da09eea6d468fc643d875174bb1558c..237ef1fef6daf9bab1a6d5d79e6e9af977727e7d 100644 (file)
@@ -34,6 +34,7 @@ static int fps_text_y = 10;
 static int fps_ascent, fps_descent;
 static GLuint font_dlist;
 static Bool fps_clear_p = False;
+static char fps_string[1024];
 
 static void
 fps_init (ModeInfo *mi)
@@ -71,8 +72,14 @@ fps_init (ModeInfo *mi)
 static void
 fps_print_string (ModeInfo *mi, GLfloat x, GLfloat y, const char *string)
 {
+  const char *L2 = strchr (string, '\n');
+
   if (y < 0)
-    y = mi->xgwa.height + y;
+    {
+      y = mi->xgwa.height + y;
+      if (L2)
+        y -= (fps_ascent + fps_descent);
+    }
 
 # ifdef DEBUG
   clear_gl_error ();
@@ -130,17 +137,29 @@ fps_print_string (ModeInfo *mi, GLfloat x, GLfloat y, const char *string)
         /* clear the background */
         if (fps_clear_p)
           {
+            int lines = L2 ? 2 : 1;
             glColor3f (0, 0, 0);
             glRecti (x / 2, y - fps_descent,
                      mi->xgwa.width - x,
-                     y + fps_ascent + fps_descent);
+                     y + lines * (fps_ascent + fps_descent));
           }
 
         /* draw the text */
         glColor3f (1, 1, 1);
         glRasterPos2f (x, y);
         glListBase (font_dlist);
-        glCallLists (strlen(string), GL_UNSIGNED_BYTE, string);
+
+        if (L2)
+          {
+            L2++;
+            glCallLists (strlen(L2), GL_UNSIGNED_BYTE, L2);
+            glRasterPos2f (x, y + (fps_ascent + fps_descent));
+            glCallLists (L2 - string - 1, GL_UNSIGNED_BYTE, string);
+          }
+        else
+          {
+            glCallLists (strlen(string), GL_UNSIGNED_BYTE, string);
+          }
 
 # ifdef DEBUG
         check_gl_error ("fps_print_string");
@@ -160,21 +179,21 @@ fps_print_string (ModeInfo *mi, GLfloat x, GLfloat y, const char *string)
 }
 
 
-void
-do_fps (ModeInfo *mi)
+GLfloat
+fps_1 (ModeInfo *mi)
 {
   static Bool initted_p = False;
-  static int last_ifps = 0;
+  static int last_ifps = -1;
+  static GLfloat last_fps = -1;
   static int frame_count = 0;
-  static struct timeval prev = { 0, };
-  static struct timeval now  = { 0, };
-  static char msg [1024] = { 0, };
+  static struct timeval prev = { 0, 0 };
+  static struct timeval now  = { 0, 0 };
 
   if (!initted_p)
     {
       initted_p = True;
       fps_init (mi);
-      strcpy (msg, "FPS: (accumulating...)");
+      strcpy (fps_string, "FPS: (accumulating...)");
     }
 
   /* Every N frames (where N is approximately one second's worth of frames)
@@ -205,8 +224,9 @@ do_fps (ModeInfo *mi)
       prev = now;
       frame_count = 0;
       last_ifps = fps;
+      last_fps  = fps;
 
-      sprintf (msg, "FPS: %.02f", fps);
+      sprintf (fps_string, "FPS: %.02f", fps);
 
       if (mi->pause != 0)
         {
@@ -216,12 +236,45 @@ do_fps (ModeInfo *mi)
             buf[strlen(buf)-1] = 0;
           if (buf[strlen(buf)-1] == '.')
             buf[strlen(buf)-1] = 0;
-          sprintf(msg + strlen(msg), " (including %s sec/frame delay)",
+          sprintf(fps_string + strlen(fps_string),
+                  " (including %s sec/frame delay)",
                   buf);
         }
+
+      if (mi->polygon_count > 0)
+        {
+          unsigned long p = mi->polygon_count;
+          const char *s = "";
+# if 0
+          if      (p >= (1024 * 1024)) p >>= 20, s = "M";
+          else if (p >= 2048)          p >>= 10, s = "K";
+# endif
+
+          strcat (fps_string, "\nPolys: ");
+          if (p >= 1000000)
+            sprintf (fps_string + strlen(fps_string), "%lu,%03lu,%03lu%s",
+                     (p / 1000000), ((p / 1000) % 1000), (p % 1000), s);
+          else if (p >= 1000)
+            sprintf (fps_string + strlen(fps_string), "%lu,%03lu%s",
+                     (p / 1000), (p % 1000), s);
+          else
+            sprintf (fps_string + strlen(fps_string), "%lu%s", p, s);
+        }
     }
 
-  /* Print the string every frame (or else nothing will show up.)
-   */
-  fps_print_string (mi, fps_text_x, fps_text_y, msg);
+  return last_fps;
+}
+
+void
+fps_2 (ModeInfo *mi)
+{
+  fps_print_string (mi, fps_text_x, fps_text_y, fps_string);
+}
+
+
+void
+do_fps (ModeInfo *mi)
+{
+  fps_1 (mi);   /* Lazily compute current FPS value, about once a second. */
+  fps_2 (mi);   /* Print the string every frame (else nothing shows up.) */
 }