repo: rxvt-unicode-sixel
action: commit
revision: 
path_from: 
revision_from: dbdabd9177ee5860e5b807e638923bdda6ff4ace:
path_to: 
revision_to: 
git.thebackupbox.net
rxvt-unicode-sixel
git clone git://git.thebackupbox.net/rxvt-unicode-sixel
commit dbdabd9177ee5860e5b807e638923bdda6ff4ace
Author: Emanuele Giaquinta 
Date:   Mon Nov 1 14:58:44 2010 +0000

    Detect Render extension at runtime.

diff --git a/src/background.C b/src/background.C
index 732909316fd848bb78992bb578ccc9ec5d1de640..
index ..c6a4c0081f9248115413f9f2be5e95bec276f76f 100644
--- a/src/background.C
+++ b/src/background.C
@@ -731,10 +731,9 @@ bgPixmap_t::render_image (unsigned long background_flags)
   if (!pixbuf)
     return false;

-#if !XRENDER
-  if (background_flags)
+  if (background_flags
+      && !(flags & HAS_RENDER))
     return false;
-#endif

   GdkPixbuf *result;

@@ -1000,18 +999,6 @@ bgPixmap_t::set_blur_radius (const char *geom)
   else
     flags |= blurNeeded;

-#if XRENDER
-  XFilters *filters = XRenderQueryFilters (target->dpy, target->vt);
-  if (filters)
-    {
-      for (int i = 0; i < filters->nfilter; i++)
-        if (!strcmp (filters->filter[i], FilterConvolution))
-          flags |= bgPixmap_t::blurServerSide;
-
-      XFree (filters);
-    }
-#endif
-
   return (changed > 0);
 }

@@ -1044,18 +1031,6 @@ compute_tint_shade_flags (rxvt_color *tint, int shade)
         }
     }

-  if (flags & bgPixmap_t::tintNeeded)
-    {
-      if (flags & bgPixmap_t::tintWholesome)
-        flags |= bgPixmap_t::tintServerSide;
-      else
-        {
-#if XRENDER
-          flags |= bgPixmap_t::tintServerSide;
-#endif
-        }
-    }
-
   return flags;
 }

@@ -1338,28 +1313,31 @@ bgPixmap_t::make_transparency_pixmap ()
   if (root_pixmap != None && root_depth != target->depth)
     {
 #if XRENDER
-      XRenderPictureAttributes pa;
+      if (flags & HAS_RENDER)
+        {
+          XRenderPictureAttributes pa;

-      XRenderPictFormat *src_format = XRenderFindVisualFormat (dpy, DefaultVisual (dpy, screen));
-      Picture src = XRenderCreatePicture (dpy, root_pixmap, src_format, 0, &pa);
+          XRenderPictFormat *src_format = XRenderFindVisualFormat (dpy, DefaultVisual (dpy, screen));
+          Picture src = XRenderCreatePicture (dpy, root_pixmap, src_format, 0, &pa);

-      recoded_root_pmap = XCreatePixmap (dpy, target->vt, root_pmap_width, root_pmap_height, target->depth);
-      XRenderPictFormat *dst_format = XRenderFindVisualFormat (dpy, target->visual);
-      Picture dst = XRenderCreatePicture (dpy, recoded_root_pmap, dst_format, 0, &pa);
+          recoded_root_pmap = XCreatePixmap (dpy, target->vt, root_pmap_width, root_pmap_height, target->depth);
+          XRenderPictFormat *dst_format = XRenderFindVisualFormat (dpy, target->visual);
+          Picture dst = XRenderCreatePicture (dpy, recoded_root_pmap, dst_format, 0, &pa);

-      if (src && dst)
-        XRenderComposite (dpy, PictOpSrc, src, None, dst, 0, 0, 0, 0, 0, 0, root_pmap_width, root_pmap_height);
-      else
-        {
-          XFreePixmap (dpy, recoded_root_pmap);
-          root_pixmap = None;
-        }
+          if (src && dst)
+            XRenderComposite (dpy, PictOpSrc, src, None, dst, 0, 0, 0, 0, 0, 0, root_pmap_width, root_pmap_height);
+          else
+            {
+              XFreePixmap (dpy, recoded_root_pmap);
+              root_pixmap = None;
+            }

-      XRenderFreePicture (dpy, src);
-      XRenderFreePicture (dpy, dst);
-#else
-      root_pixmap = None;
+          XRenderFreePicture (dpy, src);
+          XRenderFreePicture (dpy, dst);
+        }
+      else
 #endif
+      root_pixmap = None;
     }

   if (root_pixmap == None)
@@ -1393,13 +1371,13 @@ bgPixmap_t::make_transparency_pixmap ()
       if (!need_client_side_rendering ())
         {
           if ((flags & blurNeeded)
-              && (flags & blurServerSide))
+              && (flags & HAS_RENDER_CONV))
             {
               if (blur_pixmap (tiled_root_pmap, target->visual, window_width, window_height))
                 result |= transpPmapBlurred;
             }
           if ((flags & tintNeeded)
-              && (flags & tintServerSide))
+              && (flags & (tintWholesome | HAS_RENDER)))
             {
               if (tint_pixmap (tiled_root_pmap, target->visual, window_width, window_height))
                 result |= transpPmapTinted;
@@ -1519,6 +1497,22 @@ void
 bgPixmap_t::set_target (rxvt_term *new_target)
 {
   target = new_target;
+
+  flags &= ~(HAS_RENDER | HAS_RENDER_CONV);
+#if XRENDER
+  int major, minor;
+  if (XRenderQueryVersion (target->dpy, &major, &minor))
+    flags |= HAS_RENDER;
+  XFilters *filters = XRenderQueryFilters (target->dpy, target->vt);
+  if (filters)
+    {
+      for (int i = 0; i < filters->nfilter; i++)
+        if (!strcmp (filters->filter[i], FilterConvolution))
+          flags |= HAS_RENDER_CONV;
+
+      XFree (filters);
+    }
+#endif
 }

 void
diff --git a/src/background.h b/src/background.h
index 178058d217a67abfbcdd40ee570f5cfc7b703d3f..
index ..bdb9ca5cc3ae933aaa3701d6307cc1819cf02ded 100644
--- a/src/background.h
+++ b/src/background.h
@@ -31,11 +31,12 @@ struct bgPixmap_t
     tintSet         = 1 <<  8,
     tintNeeded      = 1 <<  9,
     tintWholesome   = 1 << 10,
-    tintServerSide  = 1 << 11,
-    tintFlags       = tintSet | tintServerSide | tintNeeded | tintWholesome,
+    tintFlags       = tintSet | tintNeeded | tintWholesome,

-    blurNeeded      = 1 << 12,
-    blurServerSide  = 1 << 13,
+    blurNeeded      = 1 << 11,
+
+    HAS_RENDER      = 1 << 12,
+    HAS_RENDER_CONV = 1 << 13,

     isTransparent   = 1 << 16,
     isInvalid       = 1 << 17,

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