File xscreensaver-glmatrix-boost-definition.patch of Package xscreensaver

From a990fba1192ee50bfb99942d1a5eaf33c4c6f42e Mon Sep 17 00:00:00 2001
From: v-fox <virtuousfox@gmail.com>
Date: Sat, 24 Aug 2024 00:32:43 +0500
Subject: [PATCH] glmatrix: boost definition

---
 hacks/config/glmatrix.xml |  16 ++++-
 hacks/glx/glmatrix.c      | 147 ++++++++++++++++++++++----------------
 hacks/xlockmore.c         |   8 ++-
 3 files changed, 105 insertions(+), 66 deletions(-)

diff --git a/hacks/config/glmatrix.xml b/hacks/config/glmatrix.xml
index e05456e..b2204e1 100644
--- a/hacks/config/glmatrix.xml
+++ b/hacks/config/glmatrix.xml
@@ -13,13 +13,27 @@
 
   <number id="density" type="slider" arg="--density %"
           _label="Glyph density" _low-label="Sparse" _high-label="Dense"
-          low="0" high="100" default="20"/>
+          low="0" high="200" default="20"/>
 
   <number id="speed" type="slider" arg="--speed %"
           _label="Glyph speed" _low-label="Slow" _high-label="Fast"
           low="0.1" high="8.0" default="1.0"
           convert="ratio"/>
 
+  <!--  this fucking thing just does not want to work:
+  <number id="gsize" type="slider" arg="-\-gsize %"
+          _label="Grid size" _low-label="Small" _high-label="Big"
+          low="70" high="512" default="224"/>
+
+  <number id="gdepth" type="slider" arg="-\-gdepth %"
+          _label="Grid depth" _low-label="Shallow" _high-label="Deep"
+          low="35" high="512" default="192"/>
+
+  <number id="wsize" type="slider" arg="-\-wsize %"
+          _label="Wave size" _low-label="Small" _high-label="Big"
+          low="22" high="128" default="48"/>
+  -->
+
   <select id="mode">
     <option id="matrix" _label="Matrix encoding"/>
     <option id="binary" _label="Binary encoding"      arg-set="--mode binary"/>
diff --git a/hacks/glx/glmatrix.c b/hacks/glx/glmatrix.c
index 1c85a07..afec7dd 100644
--- a/hacks/glx/glmatrix.c
+++ b/hacks/glx/glmatrix.c
@@ -43,7 +43,14 @@
 #define DEF_MODE        "Matrix"
 #define DEF_COLOR       "Green"
 #define DEF_TIMEFMT     " %l%M%p "
-
+/*  this fucking thing just does not want to work: */
+#define DEF_GRID_SIZE   224 /* width and height of the arena in 70-512 range */
+#define DEF_GRID_DEPTH  192 /* depth of the arena in 35-512 range */
+#define DEF_WAVE_SIZE   48  /* periodicity of color (brightness) waves in 22-128 range */
+#define GRID_SIZE_MAX   DEF_GRID_SIZE   /* should be 512 */
+#define GRID_DEPTH_MAX  DEF_GRID_DEPTH  /* should be 512 */
+#define WAVE_SIZE_MAX   DEF_WAVE_SIZE   /* should be 128 */
+#define SPLASH_RATIO    0.8 /* ratio of grid_depth where chars hit the screen */
 
 #define CHAR_COLS 16
 #define CHAR_ROWS 13
@@ -93,11 +100,6 @@ static const unsigned char char_map[256] = {
 
 /* #define DEBUG */
 
-#define GRID_SIZE  70     /* width and height of the arena */
-#define GRID_DEPTH 35     /* depth of the arena */
-#define WAVE_SIZE  22     /* periodicity of color (brightness) waves */
-#define SPLASH_RATIO 0.7  /* ratio of GRID_DEPTH where chars hit the screen */
-
 static const struct { GLfloat x, y; } nice_views[] = {
   {  0,     0 },
   {  0,   -20 },     /* this is a list of viewer rotations that look nice. */
@@ -118,7 +120,6 @@ static const struct { GLfloat x, y; } nice_views[] = {
   {  0,     0 },
 };
 
-
 typedef struct {
   GLfloat x, y, z;        /* position of strip */
   GLfloat dx, dy, dz;     /* velocity of strip */
@@ -129,12 +130,12 @@ typedef struct {
   GLfloat spinner_y;      /* where on the strip the bottom glyph is */
   GLfloat spinner_speed;  /* how fast the bottom glyph drops */
 
-  int glyphs[GRID_SIZE];  /* the other glyphs on the strip, which will be
+  int glyphs[GRID_SIZE_MAX];  /* the other glyphs on the strip, which will be
                              revealed by the dropping spinner.
                              0 means no glyph; negative means "spinner".
                              If non-zero, real value is abs(G)-1. */
 
-  Bool highlight[GRID_SIZE];
+  Bool highlight[GRID_SIZE_MAX];
                           /* some glyphs may be highlighted */
   
   int spin_speed;         /* Rotate all spinners every this-many frames */
@@ -165,7 +166,7 @@ typedef struct {
   int track_tick;
 
   int real_char_rows;
-  GLfloat brightness_ramp[WAVE_SIZE];
+  GLfloat brightness_ramp[WAVE_SIZE_MAX];
 
 } matrix_configuration;
 
@@ -173,6 +174,9 @@ static matrix_configuration *mps = NULL;
 
 static GLfloat speed;
 static GLfloat density;
+static int grid_size = DEF_GRID_SIZE;
+static int grid_depth = DEF_GRID_DEPTH;
+static int wave_size = DEF_WAVE_SIZE;
 static Bool do_clock;
 static char *timefmt;
 static Bool do_fog;
@@ -182,6 +186,13 @@ static Bool do_texture;
 static char *mode_str;
 static char *color_str;
 
+/*
+ this fucking thing just does not want to work:
+  { "-gsize",       ".gsize",     XrmoptionSepArg, 0 },
+  { "-gdepth",      ".gdepth",    XrmoptionSepArg, 0 },
+  { "-wsize",       ".wsize",     XrmoptionSepArg, 0 },
+*/
+
 static XrmOptionDescRec opts[] = {
   { "-speed",       ".speed",     XrmoptionSepArg, 0 },
   { "-density",     ".density",   XrmoptionSepArg, 0 },
@@ -206,6 +217,13 @@ static XrmOptionDescRec opts[] = {
   {"+texture",      ".texture",   XrmoptionNoArg, "False" },
 };
 
+/*
+ this fucking thing just does not want to work:
+  {&grid_size,  "gsize",      "GridSize", DEF_GRID_SIZE, t_Int},
+  {&grid_depth, "gdepth",     "GridDepth", DEF_GRID_DEPTH, t_Int},
+  {&wave_size,  "wsize",      "WaveSize", DEF_WAVE_SIZE, t_Int},
+*/
+
 static argtype vars[] = {
   {&mode_str,   "mode",       "Mode",    DEF_MODE,      t_String},
   {&color_str,  "color",      "Color",   DEF_COLOR,     t_String},
@@ -221,7 +239,6 @@ static argtype vars[] = {
 
 ENTRYPOINT ModeSpecOpt matrix_opts = {countof(opts), opts, countof(vars), vars, NULL};
 
-
 /* Re-randomize the state of one strip.
  */
 static void
@@ -232,9 +249,9 @@ reset_strip (ModeInfo *mi, strip *s)
   Bool time_displayed_p = False;  /* never display time twice in one strip */
 
   memset (s, 0, sizeof(*s));
-  s->x = (GLfloat) (frand(GRID_SIZE) - (GRID_SIZE/2));
-  s->y = (GLfloat) (GRID_SIZE/2 + BELLRAND(0.5));      /* shift top slightly */
-  s->z = (GLfloat) (GRID_DEPTH * 0.2) - frand (GRID_DEPTH * 0.7);
+  s->x = (GLfloat) (frand(grid_size) - (grid_size/2));
+  s->y = (GLfloat) (grid_size/2 + BELLRAND(0.5));      /* shift top slightly */
+  s->z = (GLfloat) (grid_depth * 0.2) - frand (grid_depth * 0.7);
   s->spinner_y = 0;
 
   s->dx = 0;
@@ -251,11 +268,11 @@ reset_strip (ModeInfo *mi, strip *s)
   s->wave_speed = (int) BELLRAND(3.0 / speed) + 1;
   s->wave_tick  = 0;
 
-  for (i = 0; i < GRID_SIZE; i++)
+  for (i = 0; i < grid_size; i++)
     if (do_clock &&
         !time_displayed_p &&
-        (i < GRID_SIZE-5) &&   /* display approx. once per 5 strips */
-	!(random() % ((GRID_SIZE-5)*5)))
+        (i < grid_size-5) &&   /* display approx. once per 5 strips */
+	!(random() % ((grid_size-5)*5)))
       {
 	int j;
 	char text[80];
@@ -264,7 +281,7 @@ reset_strip (ModeInfo *mi, strip *s)
 	strftime (text, sizeof(text)-1, timefmt, tm);
 
 	/* render time into the strip */
-	for (j = 0; j < strlen(text) && i < GRID_SIZE; j++, i++)
+	for (j = 0; j < strlen(text) && i < grid_size; j++, i++)
 	  {
 	    s->glyphs[i] = char_map [((unsigned char *) text)[j]] + 1;
 	    s->highlight[i] = True;
@@ -303,14 +320,14 @@ tick_strip (ModeInfo *mi, strip *s)
   s->y += s->dy;
   s->z += s->dz;
 
-  if (s->z > GRID_DEPTH * SPLASH_RATIO)  /* splashed into screen */
+  if (s->z > grid_depth * SPLASH_RATIO)  /* splashed into screen */
     {
       reset_strip (mi, s);
       return;
     }
 
   s->spinner_y += s->spinner_speed;
-  if (s->spinner_y >= GRID_SIZE)
+  if (s->spinner_y >= grid_size)
     {
       if (s->erasing_p)
         {
@@ -331,7 +348,7 @@ tick_strip (ModeInfo *mi, strip *s)
     {
       s->spin_tick = 0;
       s->spinner_glyph = - (mp->glyph_map[(random() % mp->nglyphs)] + 1);
-      for (i = 0; i < GRID_SIZE; i++)
+      for (i = 0; i < grid_size; i++)
         if (s->glyphs[i] < 0)
           {
             s->glyphs[i] = -(mp->glyph_map[(random() % mp->nglyphs)] + 1);
@@ -346,7 +363,7 @@ tick_strip (ModeInfo *mi, strip *s)
     {
       s->wave_tick = 0;
       s->wave_position++;
-      if (s->wave_position >= WAVE_SIZE)
+      if (s->wave_position >= wave_size)
         s->wave_position = 0;
     }
 }
@@ -371,7 +388,7 @@ draw_glyph (ModeInfo *mi, int glyph, Bool highlight,
   if (glyph < 0) glyph = -glyph;
 
   if (spinner_p)
-    brightness *= 1.5;
+    brightness *= 2.25;
 
   if (!do_texture)
     {
@@ -390,7 +407,7 @@ draw_glyph (ModeInfo *mi, int glyph, Bool highlight,
       if (do_fog)
         {
           GLfloat depth;
-          depth = (z / GRID_DEPTH) + 0.5;  /* z ratio from back/front      */
+          depth = (z / grid_depth) + 0.5;  /* z ratio from back/front      */
           depth = 0.2 + (depth * 0.8);     /* scale to range [0.2 - 1.0]   */
           brightness *= depth;             /* so no row goes all black.    */
         }
@@ -400,10 +417,16 @@ draw_glyph (ModeInfo *mi, int glyph, Bool highlight,
     GLfloat r, g, b, a;
 
     if (highlight)
-      brightness *= 2;
+      brightness *= 3;
 
     if (!do_texture && !spinner_p)
-      r = b = 0, g = 1;
+      {
+        if (!color_str || !*color_str || !strcasecmp(color_str, "g") ||
+           !strcasecmp (color_str, "green"))
+              r = b = 0, g = 1;
+        else
+              g = b = 0, r = 1;
+      }
     else
       r = g = b = 1;
 
@@ -413,14 +436,14 @@ draw_glyph (ModeInfo *mi, int glyph, Bool highlight,
        and is about to splash into the screen and vanish) then start fading
        it out, proportional to how close to the glass it is.
     */
-    if (z > GRID_DEPTH/2)
+    if (z > grid_depth/2)
       {
-        GLfloat ratio = ((z - GRID_DEPTH/2) /
-                         ((GRID_DEPTH * SPLASH_RATIO) - GRID_DEPTH/2));
-        int i = ratio * WAVE_SIZE;
+        GLfloat ratio = ((z - grid_depth/2) /
+                         ((grid_depth * SPLASH_RATIO) - grid_depth/2));
+        int i = ratio * wave_size;
 
         if (i < 0) i = 0;
-        else if (i >= WAVE_SIZE) i = WAVE_SIZE-1; 
+        else if (i >= wave_size) i = wave_size-1; 
 
         a *= mp->brightness_ramp[i];
       }
@@ -457,7 +480,7 @@ draw_strip (ModeInfo *mi, strip *s)
 {
   matrix_configuration *mp = &mps[MI_SCREEN(mi)];
   int i;
-  for (i = 0; i < GRID_SIZE; i++)
+  for (i = 0; i < grid_size; i++)
     {
       int g = s->glyphs[i];
       Bool below_p = (s->spinner_y >= i);
@@ -469,11 +492,11 @@ draw_strip (ModeInfo *mi, strip *s)
         {
           GLfloat brightness;
           if (!do_waves)
-            brightness = 1.0;
+            brightness = 1.25;
           else
             {
-              int j = WAVE_SIZE - ((i + (GRID_SIZE - s->wave_position))
-                                   % WAVE_SIZE);
+              int j = wave_size - ((i + (grid_size - s->wave_position))
+                                   % wave_size);
               brightness = mp->brightness_ramp[j];
             }
 
@@ -913,9 +936,9 @@ init_matrix (ModeInfo *mi)
     load_textures (mi, flip_p);
 
   /* to scale coverage-percent to strips, this number looks about right... */
-  mp->nstrips = (int) (density * 2.2);
+  mp->nstrips = (int) (density * 4.0);
   if      (mp->nstrips < 1)    mp->nstrips = 1;
-  else if (mp->nstrips > 2000) mp->nstrips = 2000;
+  else if (mp->nstrips > 4096) mp->nstrips = 4096;
 
 
   mp->strips = calloc (mp->nstrips, sizeof(strip));
@@ -930,15 +953,15 @@ init_matrix (ModeInfo *mi)
          As these die off at random speeds and are re-created, we'll get a
          more consistent density. */
       s->erasing_p = True;
-      s->spinner_y = frand(GRID_SIZE);
+      s->spinner_y = frand(grid_size);
       memset (s->glyphs, 0, sizeof(s->glyphs));  /* no visible glyphs */
     }
 
   /* Compute the brightness ramp.
    */
-  for (i = 0; i < WAVE_SIZE; i++)
+  for (i = 0; i < wave_size; i++)
     {
-      GLfloat j = ((WAVE_SIZE - i) / (GLfloat) (WAVE_SIZE - 1));
+      GLfloat j = ((wave_size - i) / (GLfloat) (wave_size - 1));
       j *= (M_PI / 2);       /* j ranges from 0.0 - PI/2  */
       j = sin (j);           /* j ranges from 0.0 - 1.0   */
       j = 0.2 + (j * 0.8);   /* j ranges from 0.2 - 1.0   */
@@ -965,36 +988,36 @@ draw_grid (ModeInfo *mi)
 
   glColor3f(1, 1, 1);
   glBegin(GL_LINES);
-  glVertex3f(-GRID_SIZE, 0, 0); glVertex3f(GRID_SIZE, 0, 0);
-  glVertex3f(0, -GRID_SIZE, 0); glVertex3f(0, GRID_SIZE, 0);
+  glVertex3f(-grid_size, 0, 0); glVertex3f(grid_size, 0, 0);
+  glVertex3f(0, -grid_size, 0); glVertex3f(0, grid_size, 0);
   glEnd();
   glBegin(GL_LINE_LOOP);
-  glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, 0);
-  glVertex3f(-GRID_SIZE/2,  GRID_SIZE/2, 0);
-  glVertex3f( GRID_SIZE/2,  GRID_SIZE/2, 0);
-  glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, 0);
+  glVertex3f(-grid_size/2, -grid_size/2, 0);
+  glVertex3f(-grid_size/2,  grid_size/2, 0);
+  glVertex3f( grid_size/2,  grid_size/2, 0);
+  glVertex3f( grid_size/2, -grid_size/2, 0);
   glEnd();
   glBegin(GL_LINE_LOOP);
-  glVertex3f(-GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
-  glVertex3f(-GRID_SIZE/2, GRID_SIZE/2,  GRID_DEPTH/2);
-  glVertex3f( GRID_SIZE/2, GRID_SIZE/2,  GRID_DEPTH/2);
-  glVertex3f( GRID_SIZE/2, GRID_SIZE/2, -GRID_DEPTH/2);
+  glVertex3f(-grid_size/2, grid_size/2, -grid_depth/2);
+  glVertex3f(-grid_size/2, grid_size/2,  grid_depth/2);
+  glVertex3f( grid_size/2, grid_size/2,  grid_depth/2);
+  glVertex3f( grid_size/2, grid_size/2, -grid_depth/2);
   glEnd();
   glBegin(GL_LINE_LOOP);
-  glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
-  glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2,  GRID_DEPTH/2);
-  glVertex3f( GRID_SIZE/2, -GRID_SIZE/2,  GRID_DEPTH/2);
-  glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
+  glVertex3f(-grid_size/2, -grid_size/2, -grid_depth/2);
+  glVertex3f(-grid_size/2, -grid_size/2,  grid_depth/2);
+  glVertex3f( grid_size/2, -grid_size/2,  grid_depth/2);
+  glVertex3f( grid_size/2, -grid_size/2, -grid_depth/2);
   glEnd();
   glBegin(GL_LINES);
-  glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
-  glVertex3f(-GRID_SIZE/2,  GRID_SIZE/2, -GRID_DEPTH/2);
-  glVertex3f(-GRID_SIZE/2, -GRID_SIZE/2,  GRID_DEPTH/2);
-  glVertex3f(-GRID_SIZE/2,  GRID_SIZE/2,  GRID_DEPTH/2);
-  glVertex3f( GRID_SIZE/2, -GRID_SIZE/2, -GRID_DEPTH/2);
-  glVertex3f( GRID_SIZE/2,  GRID_SIZE/2, -GRID_DEPTH/2);
-  glVertex3f( GRID_SIZE/2, -GRID_SIZE/2,  GRID_DEPTH/2);
-  glVertex3f( GRID_SIZE/2,  GRID_SIZE/2,  GRID_DEPTH/2);
+  glVertex3f(-grid_size/2, -grid_size/2, -grid_depth/2);
+  glVertex3f(-grid_size/2,  grid_size/2, -grid_depth/2);
+  glVertex3f(-grid_size/2, -grid_size/2,  grid_depth/2);
+  glVertex3f(-grid_size/2,  grid_size/2,  grid_depth/2);
+  glVertex3f( grid_size/2, -grid_size/2, -grid_depth/2);
+  glVertex3f( grid_size/2,  grid_size/2, -grid_depth/2);
+  glVertex3f( grid_size/2, -grid_size/2,  grid_depth/2);
+  glVertex3f( grid_size/2,  grid_size/2,  grid_depth/2);
   glEnd();
   glPopMatrix();
   if (!MI_IS_WIREFRAME(mi))
diff --git a/hacks/xlockmore.c b/hacks/xlockmore.c
index 2b513dd..b5729a3 100644
--- a/hacks/xlockmore.c
+++ b/hacks/xlockmore.c
@@ -25,6 +25,7 @@
 
 #include <assert.h>
 #include <float.h>
+#include <stdint.h>
 
 #define MAX_COLORS (1L<<13)
 
@@ -156,7 +157,7 @@ xlockmore_setup (struct xscreensaver_function_table *xsft, void *arg)
    */
   i = 0;
 
-  new_defaults = (char **) calloc (1, xlockmore_opts->numvarsdesc * 10 + 1000);
+  new_defaults = (char **) calloc (1, xlockmore_opts->numvarsdesc * 10 + 1536);
 
   /* Put on the PROGCLASS.background/foreground resources. */
   s = (char *) malloc(50);
@@ -191,8 +192,9 @@ xlockmore_setup (struct xscreensaver_function_table *xsft, void *arg)
       const char *def = xlockmore_opts->vars[j].def;
 
       if (!def) abort();
-      if (!*def) abort();
-      if (strlen(def) > 1000) abort();
+      // this thing blows-up addition of new params for incomprehensible reason
+      //if (!*def) abort();
+      if (strlen(def) > 2048) abort();
 
       s = (char *) malloc (strlen (xlockmore_opts->vars[j].name) +
 			   strlen (def) + 10);
-- 
2.46.0

openSUSE Build Service is sponsored by