-- Leo's gemini proxy

-- Connecting to git.thebackupbox.net:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

repo: rxvt-unicode-sixel
action: commit
revision:
path_from:
revision_from: 9c6af69d83587023c7517b9d8f1679ee31305f58:
path_to:
revision_to:

git.thebackupbox.net

rxvt-unicode-sixel

git://git.thebackupbox.net/rxvt-unicode-sixel

commit 9c6af69d83587023c7517b9d8f1679ee31305f58
Author: Sasha Vasko <sashavasko@gmail.com>
Date:   Fri Aug 17 22:01:33 2007 +0000

    fixed compilation with libAfterImage but without transparency; Got rid of am_transparent stuff; added ability to render semitransparent char backgrounds over background pixmap - experimental; Added parsing of color values in #aarrggbb format

diff --git a/src/main.C b/src/main.C

index 7c5bf96c9e25a6d81f268208736d4a12594b302c..

index ..ed3a5415d7b7ecb6cd230cb541d6ad586950778d 100644

--- a/src/main.C
+++ b/src/main.C
@@ -545,7 +545,9 @@ rxvt_term::init (int argc, const char *const *argv, stringvec *envv)
         bgPixmap.set_file (rs[Rs_backgroundPixmap]);
       }
     /* do not want to render Pixmap yet if we are size/position dependant -
-     * wait for ConfigureNotify at least */
+     * wait for ConfigureNotify at least
+     * TODO: this does not work for some reason when transparency is disabled !!!!
+     */
     if (!bgPixmap.window_size_sensitive ())
       update_background();
 #endif
diff --git a/src/rxvt.h b/src/rxvt.h

index 2d3086fa2d02752192091c13ffc0c32386cb9bb2..

index ..74b85cb2e1ed5aeb20749cd406e553b1967bda6e 100644

--- a/src/rxvt.h
+++ b/src/rxvt.h
@@ -193,6 +193,13 @@ struct  bgPixmap_t {

   unsigned long flags;

+  enum {
+    transpPmapTiled = (1UL<<0),
+    transpPmapTinted = tintNeeded,
+    transpPmapBlured = blurNeeded,
+    transpTransformations = (tintNeeded|blurNeeded)
+  }; /* this flags are returned by make_transparency_pixmap if called */
+
 # ifdef  XPM_BACKGROUND
 #  ifdef HAVE_AFTERIMAGE
   ASImage *original_asim;
@@ -232,14 +239,8 @@ struct  bgPixmap_t {
   bool unset_tint ();
   bool set_shade (const char *shade_str);
   bool set_root_pixmap ();
-
-  enum {
-    transpPmapTiled = (1UL<<0),
-    transpPmapTinted = tintNeeded,
-    transpPmapBlured = blurNeeded,
-    transpTransformations = (tintNeeded|blurNeeded)
-  };
-  unsigned long make_transparency_pixmap ();/* returns combination of the above flags */
+
+  unsigned long make_transparency_pixmap ();/* returns combination of the transpTransformations flags */
 # endif
   double invalid_since;

@@ -972,8 +973,6 @@ struct rxvt_term : zero_initialized, rxvt_vars, rxvt_screen {
   unsigned char   want_refresh:1,
 #ifdef ENABLE_TRANSPARENCY
                   want_full_refresh:1,	/* awaiting full screen refresh      */
-                  am_transparent:1,	/* is a transparent term             */
-                  am_pixmap_trans:1, 	/* transparency w/known root pixmap  */
 #endif
                   current_screen:1,	/* primary or secondary              */
                   num_scr_allow:1,
diff --git a/src/rxvtfont.C b/src/rxvtfont.C

index 14755735038a9edb23864e20575fdd3b22739389..

index ..223a5f17bae67514ef995711fe4203eea081c686 100644

--- a/src/rxvtfont.C
+++ b/src/rxvtfont.C
@@ -1274,14 +1274,15 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
   int w = term->fwidth * len;
   int h = term->fheight;

-  bool buffered = bg >= 0                         // we don't use a transparent bg
-#ifndef FORCE_UNBUFFERED_XFT
-# ifdef ENABLE_TRANSPARENCY
-                  || !term->am_transparent        // we aren't transparent
-# endif
+  /* TODO: this logic needs some more thinking, since we no longer do pseudo-transparency.
+   * Maybe make buffering into a resource flag? Compile time option doesn't seems like a
+   * good idea from the perspective of packaging for wide variety of user configs.
+   */
+  bool buffered = true
+#ifdef FORCE_UNBUFFERED_XFT
+                  && bg >= 0
 #endif
                   ;
-
   // cut trailing spaces
   while (len && text [len - 1] == ' ')
     len--;
@@ -1320,11 +1321,10 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
       if (ep != enc)
         {
           rxvt_drawable &d2 = d.screen->scratch_drawable (w, h);
+          bool back_rendered = false;

-          if (0)
-            ;
 #ifdef HAVE_BG_PIXMAP
-          else if (bg < 0 && term->bgPixmap.pixmap)
+          if (term->bgPixmap.pixmap && (bg < 0 || term->pix_colors[bg].c.color.alpha < 0x0ff00))
             {
               if (term->bgPixmap.pmap_width >= x + term->window_vt_x+w
                   && term->bgPixmap.pmap_height >= y + term->window_vt_y+h)
@@ -1356,11 +1356,22 @@ rxvt_font_xft::draw (rxvt_drawable &d, int x, int y,
                   gcv.fill_style = FillSolid;
                   XChangeGC (disp, gc, GCFillStyle, &gcv);
                   /* XFreeGC (disp, gc2); */
-
+
+                }
+              if (bg > 0)
+                {
+                  Picture dst = XftDrawPicture(d2);
+                  if (dst != 0)
+                    {
+                      Picture solid_color_pict = XftDrawSrcPicture (d2, &term->pix_colors[bg].c);
+                      XRenderComposite (disp, PictOpOver, solid_color_pict, None, dst, 0, 0, 0, 0, 0, 0, w, h);
+                    }
                 }
+              back_rendered = true;
             }
 #endif
-          else
+
+          if(bg > 0 && !back_rendered)
             XftDrawRect (d2, &term->pix_colors[bg].c, 0, 0, w, h);

           XftDrawGlyphSpec (d2, &term->pix_colors[fg].c, f, enc, ep - enc);
diff --git a/src/rxvttoolkit.C b/src/rxvttoolkit.C

index 3e9965b5ddd4df37b88661c6057008368c2a962f..

index ..8d819a63ebd3efca5b68b0d15efdddb881d411eb 100644

--- a/src/rxvttoolkit.C
+++ b/src/rxvttoolkit.C
@@ -745,8 +745,20 @@ rxvt_color::set (rxvt_screen *screen, const char *name)
   else
     c.a = rgba::MAX_CC;

+  // parse the non-standard "#aarrggbb" format
+  if (name[0] == '#' && strlen (name) == 1+2+2+2+2 && 4 == sscanf (name+1, "%2hx%2hx%2hx%2hx%c", &c.a, &c.r, &c.g, &c.b, &eos))
+    {
+      if (c.r)
+        c.r = (c.r << 8) | 0x0ff;
+      if (c.g)
+        c.g = (c.g << 8) | 0x0ff;
+      if (c.b)
+        c.b = (c.b << 8) | 0x0ff;
+      if (c.a)
+        c.a = (c.a << 8) | 0x0ff;
+    }
   // parse the non-standard "rgba:rrrr/gggg/bbbb/aaaa" format
-  if (strlen (name) != 4+5*4 || 4 != sscanf (name, "rgba:%4hx/%4hx/%4hx/%4hx%c", &c.r, &c.g, &c.b, &c.a, &eos))
+  else if (strlen (name) != 4+5*4 || 4 != sscanf (name, "rgba:%4hx/%4hx/%4hx/%4hx%c", &c.r, &c.g, &c.b, &c.a, &eos))
     {
       XColor xc, xc_exact;

diff --git a/src/xpm.C b/src/xpm.C

index 724488045e5a180524d4ff6666893392ab3a3013..

index ..4b7da6ee5f2dfcdc97c2c4cc5cef451e2406069b 100644

--- a/src/xpm.C
+++ b/src/xpm.C
@@ -95,7 +95,7 @@ bool bgPixmap_t::need_client_side_rendering ()
 # ifdef HAVE_AFTERIMAGE
   if (original_asim != NULL)
     return true;
-#endif
+# endif
 # ifdef ENABLE_TRANSPARENCY
   if (flags & isTransparent)
     {
@@ -635,17 +635,16 @@ compute_tint_shade_flags (rxvt_color *tint, int shade)
       rgba c (rgba::MAX_CC,rgba::MAX_CC,rgba::MAX_CC);
       tint->get (c);

-      flags |= bgPixmap_t::tintNeeded;
       if ((c.r > 0x000700 || c.g > 0x000700 || c.b > 0x000700)
           && (c.r < 0x00f700 || c.g < 0x00f700 || c.b < 0x00f700))
       {
          flags |= bgPixmap_t::tintNeeded;
-#define IS_COMPONENT_WHOLESOME(cmp)  ((cmp) <= 0x000700 || (cmp) >= 0x00f700)
+#  define IS_COMPONENT_WHOLESOME(cmp)  ((cmp) <= 0x000700 || (cmp) >= 0x00f700)
           if (IS_COMPONENT_WHOLESOME (c.r)
               && IS_COMPONENT_WHOLESOME (c.g)
               && IS_COMPONENT_WHOLESOME (c.b))
             flags |= bgPixmap_t::tintServerSide;
-#undef  IS_COMPONENT_WHOLESOME
+#  undef  IS_COMPONENT_WHOLESOME
       }
     }
   return flags;
@@ -814,29 +813,22 @@ bgPixmap_t::make_transparency_pixmap ()

     if (tiled_root_pmap != None)
       {
-        if (flags & tintNeeded)
+        if (flags & tintNeeded && !need_client_side_rendering ())
           {
-            if ((flags & tintServerSide)
-                && h_blurRadius <= 1  && v_blurRadius <= 1
-# ifdef HAVE_AFTERIMAGE
-                && original_asim == NULL
-# endif
-               )
-              { /* In this case we can tint image server-side getting significant
-                 * performance improvements, as we eliminate XImage transfer
-                 */
-                gcv.foreground = Pixel (tint);
-                gcv.function = GXand;
-                gcv.fill_style = FillSolid;
-                if (gc)
-                  XChangeGC (dpy, gc, GCFillStyle | GCForeground | GCFunction, &gcv);
-                else
-                  gc = XCreateGC (dpy, root, GCFillStyle | GCForeground | GCFunction, &gcv);
-                if (gc)
-                  {
-                    XFillRectangle (dpy, tiled_root_pmap, gc, 0, 0, window_width, window_height);
-                    result |= transpPmapTinted;
-                  }
+            /* In this case we can tint image server-side getting significant
+             * performance improvements, as we eliminate XImage transfer
+             */
+            gcv.foreground = Pixel (tint);
+            gcv.function = GXand;
+            gcv.fill_style = FillSolid;
+            if (gc)
+              XChangeGC (dpy, gc, GCFillStyle | GCForeground | GCFunction, &gcv);
+            else
+              gc = XCreateGC (dpy, root, GCFillStyle | GCForeground | GCFunction, &gcv);
+            if (gc)
+              {
+                XFillRectangle (dpy, tiled_root_pmap, gc, 0, 0, window_width, window_height);
+                result |= transpPmapTinted;
               }
            }
         if (pixmap)
@@ -873,7 +865,7 @@ bgPixmap_t::set_root_pixmap ()

 # ifndef HAVE_AFTERIMAGE
 static void ShadeXImage(rxvt_term *term, XImage* srcImage, int shade, int rm, int gm, int bm);
-#endif
+# endif


 bool
@@ -908,6 +900,7 @@ bgPixmap_t::render ()
       if (background_flags)
           background = pixmap2ximage (target->asv, pixmap, 0, 0, pmap_width, pmap_height, AllPlanes, 100);

+#  ifdef ENABLE_TRANSPARENCY
       if (!(background_flags & transpPmapTinted) && (flags & tintNeeded))
         {
           ShadingInfo as_shade;
@@ -922,7 +915,6 @@ bgPixmap_t::render ()

           as_tint = shading2tint32 (&as_shade);
         }
-
       if (!(background_flags & transpPmapBlured) && (flags & blurNeeded) && background != NULL)
         {
           ASImage* tmp = blur_asimage_gauss (target->asv, background, h_blurRadius, v_blurRadius, 0xFFFFFFFF,
@@ -934,6 +926,7 @@ bgPixmap_t::render ()
               background = tmp;
             }
         }
+#  endif

       if (render_asim (background, as_tint))
         flags = flags & ~isInvalid;
@@ -956,13 +949,13 @@ bgPixmap_t::render ()
           ShadeXImage (target, result, shade, c.r, c.g, c.b);
         }
     }
-# endif
+# endif /* HAVE_AFTERIMAGE */
   if (result != NULL)
     {
       GC gc = XCreateGC (target->dpy, target->vt, 0UL, NULL);
       if (gc)
         {
-          if (pmap_depth != target->depth && pixmap != None)
+          if (/*pmap_depth != target->depth &&*/ pixmap != None)
             {
               XFreePixmap (target->dpy, pixmap);
               pixmap = None;
@@ -974,7 +967,19 @@ bgPixmap_t::render ()
               pmap_height = result->height;
               pmap_depth = target->depth;
             }
-          XPutImage (target->dpy, pixmap, gc, result, 0, 0, 0, 0, result->width, result->height);
+          if (pmap_depth != result->depth)
+            { /* Bad Match error will ensue ! stupid X !!!! */
+              if( result->depth == 24 && pmap_depth == 32)
+                result->depth = 32;
+              else if( result->depth == 32 && pmap_depth == 24)
+                result->depth = 24;
+              else
+                {
+                  /* TODO: implement image recoding */
+                }
+            }
+          if (pmap_depth == result->depth)
+            XPutImage (target->dpy, pixmap, gc, result, 0, 0, 0, 0, result->width, result->height);
           XFreeGC (target->dpy, gc);
           flags = flags & ~isInvalid;
         }
@@ -988,11 +993,7 @@ bgPixmap_t::render ()
           XFreePixmap (target->dpy, pixmap);
           pixmap = None;
         }
-// TODO : we need to get rid of that garbadge :
-      target->am_transparent = target->am_pixmap_trans = 0;
     }
-  else
-    target->am_transparent = target->am_pixmap_trans = 1;

   apply ();

@@ -1058,21 +1059,22 @@ bgPixmap_t::apply()
       XClearArea (target->dpy, target->parent[0], 0, 0, 0, 0, False);
       /* do want Expose on the vt */
       XClearArea (target->dpy, target->parent[0], 0, 0, 0, 0, True);
-#if HAVE_SCROLLBARS
+# if HAVE_SCROLLBARS
       if (target->scrollBar.win)
         {
           target->scrollBar.setIdle ();
           target->scrollbar_show (0);
         }
-#endif
+# endif
       /* Is that really neccessary? we did a XClearArea to generate Expose events alreday ! */
-      target->want_refresh = target->want_full_refresh = 1;
+      target->want_refresh = 1;
+# ifdef ENABLE_TRANSPARENCY
+      target->want_full_refresh = 1;
+# endif
       /* TODO: why do we need a flush here ??? It causes segfault on resize ! */
 //      target->flush ();
     }
 }
-#endif				/* HAVE_BG_PIXMAP */
-

 void
 rxvt_term::get_window_origin (int &x, int &y)
@@ -1103,9 +1105,38 @@ rxvt_term::get_pixmap_property (int prop_id)
   return None;
 }

+/*
+ * Check our parents are still who we think they are.
+ * Do transparency updates if required
+ */
+int
+rxvt_term::update_background ()
+{
+  bgPixmap.invalidate();
+  /* no chance of real time refresh if we are blurring ! */
+  if (bgPixmap.invalid_since + 0.5 < NOW && !(bgPixmap.flags & bgPixmap_t::blurNeeded))
+    bgPixmap.render();
+  else
+    {
+      update_background_ev.stop ();
+      if (!bgPixmap.need_client_side_rendering())
+        update_background_ev.start (NOW + .05);
+      else if (bgPixmap.flags & bgPixmap_t::blurNeeded)
+        update_background_ev.start (NOW + .2); /* very slow !!! */
+      else
+        update_background_ev.start (NOW + .07);
+    }
+  return 0;
+}
+
+void
+rxvt_term::update_background_cb (time_watcher &w)
+{
+  bgPixmap.render ();
+}
+#endif    /* HAVE_BG_PIXMAP */

-#ifdef ENABLE_TRANSPARENCY
-#ifndef HAVE_AFTERIMAGE
+#if defined(ENABLE_TRANSPARENCY) && !defined(HAVE_AFTERIMAGE)
 /* taken from aterm-0.4.2 */

 typedef uint32_t RUINT32T;
@@ -1338,39 +1369,7 @@ ShadeXImage(rxvt_term *term, XImage* srcImage, int shade, int rm, int gm, int bm

   free (lookup);
 }
-#endif
-
-/*
- * Check our parents are still who we think they are.
- * Do transparency updates if required
- */
-int
-rxvt_term::update_background ()
-{
-  bgPixmap.invalidate();
-  /* no chance of real time refresh if we are blurring ! */
-  if (bgPixmap.invalid_since + 0.5 < NOW && !(bgPixmap.flags & bgPixmap_t::blurNeeded))
-    bgPixmap.render();
-  else
-    {
-      update_background_ev.stop ();
-      if (!bgPixmap.need_client_side_rendering())
-        update_background_ev.start (NOW + .05);
-      else if (bgPixmap.flags & bgPixmap_t::blurNeeded)
-        update_background_ev.start (NOW + .2); /* very slow !!! */
-      else
-        update_background_ev.start (NOW + .07);
-    }
-  return 0;
-}
-
-void
-rxvt_term::update_background_cb (time_watcher &w)
-{
-  bgPixmap.render ();
-}
-#endif    /* HAVE_BG_PIXMAP */
-
+#endif /* defined(ENABLE_TRANSPARENCY) && !defined(HAVE_AFTERIMAGE) */

 #if 0  /* replaced by a bgPixmap_t::render() - leve here temporarily for reference */
 void

-----END OF PAGE-----

-- Response ended

-- Page fetched on Sun Jun 2 10:14:10 2024