-/* photopile, Copyright (c) 2008-2012 Jens Kilian <jjk@acm.org>
+/* photopile, Copyright (c) 2008-2015 Jens Kilian <jjk@acm.org>
* Based on carousel, Copyright (c) 2005-2008 Jamie Zawinski <jwz@jwz.org>
* Loads a sequence of images and shuffles them into a pile.
*
* implied warranty.
*/
-#define DEF_FONT "-*-helvetica-bold-r-normal-*-240-*"
+#if defined(HAVE_COCOA) || defined(HAVE_ANDROID)
+# define DEF_FONT "OCR A Std 48, Lucida Console 48, Monaco 48"
+#else
+# define DEF_FONT "-*-helvetica-bold-r-normal-*-*-480-*-*-*-*-*-*"
+#endif
+
#define DEFAULTS "*count: 7 \n" \
"*delay: 10000 \n" \
"*wireframe: False \n" \
"*font: " DEF_FONT "\n" \
"*desktopGrabber: xscreensaver-getimage -no-desktop %s\n" \
"*grabDesktopImages: False \n" \
- "*chooseRandomImages: True \n"
+ "*chooseRandomImages: True \n" \
+ "*suppressRotationAnimation: True\n" \
# define refresh_photopile 0
# define release_photopile 0
#undef countof
#define countof(x) (sizeof((x))/sizeof((*x)))
-#ifndef HAVE_COCOA
+#ifndef HAVE_JWXYZ
# include <X11/Intrinsic.h> /* for XrmDatabase in -debug mode */
#endif
#include <math.h>
# define DEF_SPEED "1.0"
# define DEF_DURATION "5"
# define DEF_MIPMAP "True"
-# define DEF_TITLES "False"
+# define DEF_TITLES "True"
# define DEF_POLAROID "True"
# define DEF_CLIP "True"
# define DEF_SHADOWS "True"
if (wire) return;
if (ss->loading_sw == 0) /* only do this once */
- ss->loading_sw = texture_string_width (ss->texfont, text, &ss->loading_sh);
+ {
+ XCharStruct e;
+ texture_string_metrics (ss->texfont, text, &e, 0, 0);
+ ss->loading_sw = e.width;
+ ss->loading_sh = e.ascent + e.descent;
+ }
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glOrtho(0, MI_WIDTH(mi), 0, MI_HEIGHT(mi), -1, 1);
+# ifdef HAVE_MOBILE /* Keep it the same relative size when rotated. */
+ {
+ GLfloat h = MI_HEIGHT(mi) / (GLfloat) MI_WIDTH(mi);
+ int o = (int) current_device_rotation();
+ if (o != 0 && o != 180 && o != -180)
+ glScalef (1/h, h, 1);
+ }
+# endif
+
glClear(GL_COLOR_BUFFER_BIT);
}
static void
hack_resources (Display *dpy)
{
-# ifndef HAVE_COCOA
+# ifndef HAVE_JWXYZ
char *res = "desktopGrabber";
char *val = get_string_resource (dpy, res, "DesktopGrabber");
char buf1[255];
value.addr = buf2;
value.size = strlen(buf2);
XrmPutResource (&db, buf1, "String", &value);
-# endif /* !HAVE_COCOA */
+# endif /* !HAVE_JWXYZ */
}
photopile_state *ss;
int wire = MI_IS_WIREFRAME(mi);
- if (sss == NULL) {
- if ((sss = (photopile_state *)
- calloc (MI_NUM_SCREENS(mi), sizeof(photopile_state))) == NULL)
- return;
- }
+ MI_INIT (mi, sss, NULL);
ss = &sss[screen];
ss->mi = mi;
*/
if (titles_p)
{
- int sw, sh;
- GLfloat scale = 0.6;
+ int sw = 0, sh = 0;
+ int ascent, descent;
+ GLfloat tw = w * 2;
+ GLfloat th = h1 - h;
+ GLfloat scale = 1;
const char *title = frame->title ? frame->title : "(untitled)";
+ XCharStruct e;
- /* #### Highly approximate, but doing real clipping is harder... */
- int max = 35;
- if (strlen(title) > max)
- title += strlen(title) - max;
+ texture_string_metrics (ss->texfont, title, &e, &ascent, &descent);
+ sw = e.width;
+ sh = ascent; /* + descent; */
- sw = texture_string_width (ss->texfont, title, &sh);
+ /* Scale the text to match the pixel size of the photo */
+ scale *= w / 150.0;
+
+# if defined(HAVE_COCOA)
+ scale /= 2;
+# endif
+
+# if defined(HAVE_MOBILE)
+ scale /= 2;
+# endif
+
+ /* Clip characters off the left end of the string until it fits. */
+ if (clip_p || polaroid_p)
+ while (sw * scale > tw && strlen (title) > 10)
+ {
+ title++;
+ texture_string_metrics (ss->texfont, title, &e, &ascent, &descent);
+ sw = e.width;
+ }
+
+ if (th <= 0) /* Non-polaroid */
+ th = -sh * 1.2;
+
+ glTranslatef (-w, -h1, 0);
+ glTranslatef ((tw - sw*scale) / 2, (th - sh*scale) / 2, 0);
- glTranslatef (-sw*scale*0.5, -h - sh*scale, z);
glScalef (scale, scale, 1);
if (wire || !polaroid_p)
}
else
{
- glColor3f (0, 0, 0);
+ glColor3f (0.5, 0.5, 0.5);
}
if (!wire)
{
glEnable (GL_TEXTURE_2D);
glEnable (GL_BLEND);
+ glDisable (GL_DEPTH_TEST);
print_texture_string (ss->texfont, title);
+ glEnable (GL_DEPTH_TEST);
}
else
{
glVertex3f (0, sh, 0);
glEnd();
}
+
}
glPopMatrix();