X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fglx%2Fglmatrix.c;h=7683c39ffe614331adce6e5f4922259a18fc418a;hb=39809ded547bdbb08207d3e514950425215b4410;hp=55eda8ebc5fe472103b3616915259e8b6ad69b7b;hpb=49f5b54f312fe4ac2e9bc47581a72451bd0e8439;p=xscreensaver diff --git a/hacks/glx/glmatrix.c b/hacks/glx/glmatrix.c index 55eda8eb..7683c39f 100644 --- a/hacks/glx/glmatrix.c +++ b/hacks/glx/glmatrix.c @@ -20,7 +20,7 @@ "*showFPS: False \n" \ "*wireframe: False \n" \ -# define refresh_matrix 0 +# define free_matrix 0 # define release_matrix 0 #undef countof #define countof(x) (sizeof((x))/sizeof((*x))) @@ -51,8 +51,6 @@ #define DEF_MODE "Matrix" #define DEF_TIMEFMT " %l%M%p " -#include "gllist.h" - #define CHAR_COLS 16 #define CHAR_ROWS 13 @@ -401,15 +399,17 @@ draw_glyph (ModeInfo *mi, int glyph, Bool highlight, } { - GLfloat r, g, b, a = 1; + GLfloat r, g, b, a; if (highlight) brightness *= 2; if (!do_texture && !spinner_p) - r = b = 0, g = brightness; + r = b = 0, g = 1; else - r = g = b = brightness; + r = g = b = 1; + + a = brightness; /* If the glyph is very close to the screen (meaning it is very large, and is about to splash into the screen and vanish) then start fading @@ -424,23 +424,7 @@ draw_glyph (ModeInfo *mi, int glyph, Bool highlight, if (i < 0) i = 0; else if (i >= WAVE_SIZE) i = WAVE_SIZE-1; - a = mp->brightness_ramp[i]; -#if 1 - /* I don't understand this -- if I change the alpha on the color of - the quad, I'd expect that to make the quad more transparent. - But instead, it seems to be making the transparent parts of the - texture on the quad be *less* transparent! So as we fade out, - we fade towards a completely solid rectangle. WTF? - - So, for now, instead of changing the alpha, just make the colors - be darker. This works out ok so long as we use GL_ONE in - glBlendFunc, so that stacked glyph colors are added together. - */ - r *= a; - g *= a; - b *= a; - a = 1; -#endif + a *= mp->brightness_ramp[i]; } glColor4f (r,g,b,a); @@ -588,8 +572,15 @@ ENTRYPOINT void reshape_matrix (ModeInfo *mi, int width, int height) { GLfloat h = (GLfloat) height / (GLfloat) width; + int y = 0; - glViewport (0, 0, (GLint) width, (GLint) height); + if (width > height * 5) { /* tiny window: show middle */ + height = width * 9/16; + y = -height/2; + h = height / (GLfloat) width; + } + + glViewport (0, y, (GLint) width, (GLint) height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -648,6 +639,10 @@ bigendian (void) If this hack ever grows into something that displays full Latin1 text, well then, Something Else Will Need To Be Done. + + Since currently GLMatrix does not run textclient / xscreensaver-text, + it's not an issue. (XMatrix does that.) + */ static void spank_image (matrix_configuration *mp, XImage *xi) @@ -781,7 +776,7 @@ load_textures (ModeInfo *mi, Bool flip_p) unsigned char r = (p >> rpos) & 0xFF; unsigned char g = (p >> gpos) & 0xFF; unsigned char b = (p >> bpos) & 0xFF; - unsigned char a = ~g; + unsigned char a = g; g = 0xFF; p = (r << rpos) | (g << gpos) | (b << bpos) | (a << apos); XPutPixel (xi, x, y, p); @@ -794,7 +789,8 @@ load_textures (ModeInfo *mi, Bool flip_p) glGenTextures (1, &mp->texture); glPixelStorei (GL_UNPACK_ALIGNMENT, 4); - glPixelStorei (GL_UNPACK_ROW_LENGTH, xi->width); + /* messes up -fps */ + /* glPixelStorei (GL_UNPACK_ROW_LENGTH, xi->width);*/ glBindTexture (GL_TEXTURE_2D, mp->texture); check_gl_error ("texture init"); glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, xi->width, xi->height, 0, GL_RGBA, @@ -833,14 +829,7 @@ init_matrix (ModeInfo *mi) if (wire) do_texture = False; - if (!mps) { - mps = (matrix_configuration *) - calloc (MI_NUM_SCREENS(mi), sizeof (matrix_configuration)); - if (!mps) { - fprintf(stderr, "%s: out of memory\n", progname); - exit(1); - } - } + MI_INIT (mi, mps); mp = &mps[MI_SCREEN(mi)]; mp->glx_context = init_GL(mi); @@ -895,18 +884,7 @@ init_matrix (ModeInfo *mi) glEnable(GL_NORMALIZE); if (do_texture) - { - load_textures (mi, flip_p); - glEnable(GL_TEXTURE_2D); - glEnable(GL_BLEND); - - /* Jeff Epler points out: - By using GL_ONE instead of GL_SRC_ALPHA, glyphs are added to - each other, so that a bright glyph with a darker one in front - is a little brighter than the bright glyph alone. - */ - glBlendFunc (GL_ONE_MINUS_SRC_ALPHA, /* GL_SRC_ALPHA */ GL_ONE); - } + load_textures (mi, flip_p); /* to scale coverage-percent to strips, this number looks about right... */ mp->nstrips = (int) (density * 2.2); @@ -1018,6 +996,20 @@ draw_matrix (ModeInfo *mi) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix (); + glRotatef(current_device_rotation(), 0, 0, 1); + + if (do_texture) + { + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + + /* Jeff Epler points out: + By using GL_ONE instead of GL_SRC_ONE_MINUS_ALPHA, glyphs are + added to each other, so that a bright glyph with a darker one + in front is a little brighter than the bright glyph alone. + */ + glBlendFunc (GL_SRC_ALPHA, GL_ONE); + } if (do_rotate) {