From http://www.jwz.org/xscreensaver/xscreensaver-5.16.tar.gz
[xscreensaver] / hacks / glx / glslideshow.c
index 0cdf14d34065700d992be9787586471a9ab4d5e9..5b48a383936ce7a42acfb0027e14969e99ad311f 100644 (file)
@@ -1,4 +1,4 @@
-/* glslideshow, Copyright (c) 2003-2008 Jamie Zawinski <jwz@jwz.org>
+/* glslideshow, Copyright (c) 2003-2012 Jamie Zawinski <jwz@jwz.org>
  * Loads a sequence of images and smoothly pans around them; crossfades
  * when loading new images.
  *
@@ -160,8 +160,12 @@ typedef struct {
   Bool checked_fps_p;          /* Whether we have checked for a low
                                    frame rate. */
 
+# ifdef HAVE_GLBITMAP
   XFontStruct *xfont;          /* for printing image file names */
   GLuint font_dlist;
+# else
+  texture_font_data *font_data;
+# endif
 
   int sprite_id, image_id;      /* debugging id counters */
 
@@ -358,10 +362,16 @@ image_loaded_cb (const char *filename, XRectangle *geom,
       img->geom.height *= scale;
     }
 
-  if (img->title)   /* strip filename to part after last /. */
+  /* xscreensaver-getimage returns paths relative to the image directory
+     now, so leave the sub-directory part in.  Unless it's an absolute path.
+  */
+  if (img->title && img->title[0] == '/')
     {
+      /* strip filename to part between last "/" and last ".". */
       char *s = strrchr (img->title, '/');
       if (s) strcpy (img->title, s+1);
+      s = strrchr (img->title, '.');
+      if (s) *s = 0;
     }
 
   if (debug_p)
@@ -468,30 +478,22 @@ randomize_sprite (ModeInfo *mi, sprite *sp)
   int vp_h = MI_HEIGHT(mi);
   int img_w = sp->img->geom.width;
   int img_h = sp->img->geom.height;
-  int min_w, min_h, max_w, max_h;
+  int min_w, max_w;
   double ratio = (double) img_h / img_w;
 
   if (letterbox_p)
     {
       min_w = img_w;
-      min_h = img_h;
     }
   else
     {
       if (img_w < vp_w)
-        {
-          min_w = vp_w;
-          min_h = img_h * (float) vp_w / img_w;
-        }
+        min_w = vp_w;
       else
-        {
-          min_w = img_w * (float) vp_h / img_h;
-          min_h = vp_h;
-        }
+        min_w = img_w * (float) vp_h / img_h;
     }
 
   max_w = min_w * 100 / zoom;
-  max_h = min_h * 100 / zoom;
 
   sp->from.w = min_w + frand ((max_w - min_w) * 0.4);
   sp->to.w   = max_w - frand ((max_w - min_w) * 0.4);
@@ -814,12 +816,22 @@ draw_sprite (ModeInfo *mi, sprite *sp)
         int x = 10;
         int y = mi->xgwa.height - 10;
         glColor4f (0, 0, 0, sp->opacity);   /* cheap-assed dropshadow */
-        print_gl_string (mi->dpy, ss->xfont, ss->font_dlist,
+        print_gl_string (mi->dpy,
+# ifdef HAVE_GLBITMAP
+                         ss->xfont, ss->font_dlist,
+# else
+                         ss->font_data,
+# endif
                          mi->xgwa.width, mi->xgwa.height, x, y,
                          img->title, False);
         x++; y++;
         glColor4f (1, 1, 1, sp->opacity);
-        print_gl_string (mi->dpy, ss->xfont, ss->font_dlist,
+        print_gl_string (mi->dpy,
+# ifdef HAVE_GLBITMAP
+                         ss->xfont, ss->font_dlist,
+# else
+                         ss->font_data,
+# endif
                          mi->xgwa.width, mi->xgwa.height, x, y,
                          img->title, False);
       }
@@ -875,6 +887,20 @@ draw_sprites (ModeInfo *mi)
   glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
   glPushMatrix();
+
+  {
+    GLfloat rot = current_device_rotation();
+    glTranslatef (0.5, 0.5, 0);
+    glRotatef(rot, 0, 0, 1);
+    if ((rot >  45 && rot <  135) ||
+        (rot < -45 && rot > -135))
+      {
+        GLfloat s = MI_WIDTH(mi) / (GLfloat) MI_HEIGHT(mi);
+        glScalef (s, 1/s, 1);
+      }
+    glTranslatef (-0.5, -0.5, 0);
+  }
+
   for (i = 0; i < ss->nsprites; i++)
     draw_sprite (mi, ss->sprites[i]);
   glPopMatrix();
@@ -1122,7 +1148,11 @@ init_slideshow (ModeInfo *mi)
 
   if (debug_p) glLineWidth (3);
 
+#ifdef HAVE_GLBITMAP
   load_font (mi->dpy, "titleFont", &ss->xfont, &ss->font_dlist);
+#else
+  ss->font_data = load_texture_font (mi->dpy, "Font");
+#endif
 
   if (debug_p)
     hack_resources();
@@ -1216,7 +1246,6 @@ draw_slideshow (ModeInfo *mi)
 
   draw_sprites (mi);
 
-  ss->fps = fps_compute (mi->fpst, 0);
   if (mi->fps_p) do_fps (mi);
 
   glFinish();