diff options
Diffstat (limited to 'hacks/glx/esper.c')
-rw-r--r-- | hacks/glx/esper.c | 100 |
1 files changed, 72 insertions, 28 deletions
diff --git a/hacks/glx/esper.c b/hacks/glx/esper.c index 90887a8..bbc0aa6 100644 --- a/hacks/glx/esper.c +++ b/hacks/glx/esper.c @@ -1,4 +1,4 @@ -/* esper, Copyright (c) 2017-2018 Jamie Zawinski <jwz@jwz.org> +/* esper, Copyright © 2017-2021 Jamie Zawinski <jwz@jwz.org> * Enhance 224 to 176. Pull out track right. Center in pull back. * Pull back. Wait a minute. Go right. Stop. Enhance 57 19. Track 45 left. * Gimme a hardcopy right there. @@ -126,13 +126,8 @@ /* Use a small point size to keep it nice and grainy. */ -#if defined(HAVE_COCOA) || defined(HAVE_ANDROID) -# define TITLE_FONT "OCR A Std 10, Lucida Console 10, Monaco 10" -#elif 0 /* real X11, XQueryFont() */ -# define TITLE_FONT "-*-courier-bold-r-*-*-*-100-*-*-m-*-*-*" -#else /* real X11, load_font_retry() */ -# define TITLE_FONT "-*-ocr a std-medium-r-*-*-*-100-*-*-m-*-*-*" -#endif +#define TITLE_FONT \ + "OCR A Std 10, Lucida Console 10, Monaco 10, Courier 10, monospace 10" #define DEFAULTS "*delay: 20000 \n" \ "*wireframe: False \n" \ @@ -151,9 +146,6 @@ # define release_esper 0 # include "xlockmore.h" -#undef countof -#define countof(x) (sizeof((x))/sizeof((*x))) - #undef RANDSIGN #define RANDSIGN() ((random() & 1) ? 1 : -1) #undef BELLRAND @@ -162,6 +154,7 @@ #ifdef USE_GL #undef SMOOTH +#define USE_ASYNC_LOADER # define DEF_GRID_SIZE "11" # define DEF_GRID_THICKNESS "15" @@ -189,6 +182,9 @@ typedef struct { int tw, th; /* size in pixels of the texture */ XRectangle geom; /* where in the image the bits are */ Bool loaded_p; /* whether the image has finished loading */ +# ifdef USE_ASYNC_LOADER + texture_loader_t *loader; /* asynchronous image loader */ +# endif Bool used_p; /* whether the image has yet appeared on screen */ GLuint texid; /* which texture contains the image */ @@ -388,6 +384,18 @@ alloc_image (ModeInfo *mi) # elif defined(__APPLE__) /* MacOS 10.13 "sysctl kern.sysv.shmmax" is paltry: */ shmmax = 0x400000; +# elif defined(__linux__) + { + /* Raspbian 10.6 = 0xFEFFFFFF, CentOS 7.7 = 0xFFFFFFFFFEFFFFFF */ + FILE *fp = fopen ("/proc/sys/kernel/shmmax", "r"); + if (fp) + { + int result = fscanf (fp, "%lu", &shmmax); + if (!result || result == EOF) + shmmax = 0; /* Just go with max_max. */ + fclose (fp); + } + } # endif /* !SHMMAX */ if (shmmax) @@ -407,8 +415,14 @@ alloc_image (ModeInfo *mi) if (max < MI_WIDTH(mi) || max < MI_HEIGHT(mi)) max = 0; +# ifdef USE_ASYNC_LOADER + img->loader = alloc_texture_loader (mi->xgwa.screen, mi->window, + *ss->glx_context, 0, 0, False, + img->texid); +# else load_texture_async (mi->xgwa.screen, mi->window, *ss->glx_context, max, max, False, img->texid, image_loaded_cb, img); +# endif } ss->images[ss->nimages++] = img; @@ -442,6 +456,15 @@ image_loaded_cb (const char *filename, XRectangle *geom, goto DONE; } +# ifdef USE_ASYNC_LOADER + if (img->loader) + { + texture_loader_t *loader = img->loader; + img->loader = 0; + free_texture_loader (loader); + } +# endif + if (image_width == 0 || image_height == 0) exit (1); @@ -639,8 +662,9 @@ copy_sprite (ModeInfo *mi, sprite *old) { sprite *sp = new_sprite (mi, (sprite_type) ~0L); int id; - double tt = sp->start_time; + double tt; if (!sp) abort(); + tt = sp->start_time; id = sp->id; memcpy (sp, old, sizeof(*sp)); sp->id = id; @@ -1172,7 +1196,9 @@ draw_text_sprite (ModeInfo *mi, sprite *sp) if (wire) glEnable (GL_TEXTURE_2D); +#ifndef HAVE_ANDROID /* Doesn't work -- prevents image loading? */ print_texture_string (ss->font_data, text); +# endif mi->polygon_count++; if (wire) @@ -1212,6 +1238,7 @@ draw_flash_sprite (ModeInfo *mi, sprite *sp) static void draw_sprite (ModeInfo *mi, sprite *sp) { + glEnable (GL_BLEND); switch (sp->type) { case IMAGE: draw_image_sprite (mi, sp); @@ -1238,6 +1265,22 @@ tick_sprites (ModeInfo *mi) { esper_state *ss = &sss[MI_SCREEN(mi)]; int i; + +# ifdef USE_ASYNC_LOADER + double end_by_time = ss->now + ((double) mi->pause) / 2000000; + for (i = 0; i < ss->nimages; i++) + { + image *img = ss->images[i]; + if (img->loader) + { + if (texture_loader_failed (img->loader)) + abort(); + step_texture_loader (img->loader, end_by_time - double_time(), + image_loaded_cb, img); + } + } +# endif + for (i = 0; i < ss->nsprites; i++) tick_sprite (mi, ss->sprites[i]); @@ -1602,8 +1645,9 @@ tick_animation (ModeInfo *mi) /* Only advance once an image has loaded. */ if (find_newest_sprite (mi, IMAGE)) ss->anim_state = RETICLE_ON; - else + else { ss->anim_state = IMAGE_LOAD; + } break; case RETICLE_ON: ss->anim_state = RETICLE_MOVE; @@ -2340,7 +2384,6 @@ init_esper (ModeInfo *mi) { int screen = MI_SCREEN(mi); esper_state *ss; - int wire = MI_IS_WIREFRAME(mi); MI_INIT (mi, sss); ss = &sss[screen]; @@ -2355,20 +2398,6 @@ init_esper (ModeInfo *mi) parse_color (mi, "reticleColor", ss->reticle_color); parse_color (mi, "textColor", ss->text_color); - glDisable (GL_LIGHTING); - glDisable (GL_DEPTH_TEST); - glDepthMask (GL_FALSE); - glEnable (GL_CULL_FACE); - glCullFace (GL_BACK); - - if (! wire) - { - glEnable (GL_TEXTURE_2D); - glShadeModel (GL_SMOOTH); - glEnable (GL_BLEND); - glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - } - ss->font_data = load_texture_font (mi->dpy, "titleFont"); ss->now = double_time(); @@ -2386,6 +2415,7 @@ ENTRYPOINT void draw_esper (ModeInfo *mi) { esper_state *ss = &sss[MI_SCREEN(mi)]; + int wire = MI_IS_WIREFRAME(mi); if (!ss->glx_context) return; @@ -2396,6 +2426,20 @@ draw_esper (ModeInfo *mi) ss->now = double_time(); + glDisable (GL_LIGHTING); + glDisable (GL_DEPTH_TEST); + glDepthMask (GL_FALSE); + glEnable (GL_CULL_FACE); + glCullFace (GL_BACK); + + if (! wire) + { + glEnable (GL_TEXTURE_2D); + glShadeModel (GL_SMOOTH); + glEnable (GL_BLEND); + glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + } + tick_sprites (mi); draw_sprites (mi); if (ss->now >= ss->anim_start + ss->anim_duration) |