From b42f722198d74fddc1856e1717f6dab2be32523f Mon Sep 17 00:00:00 2001
From: fluxgen <fluxgen>
Date: Wed, 7 May 2003 09:31:29 +0000
Subject: fixed RENDER extension checking

---
 src/FbTk/Transparent.cc | 43 ++++++++++++++++++++++++++++++++-----------
 src/FbTk/Transparent.hh |  6 +++++-
 2 files changed, 37 insertions(+), 12 deletions(-)

diff --git a/src/FbTk/Transparent.cc b/src/FbTk/Transparent.cc
index 152e2a4..5072a81 100644
--- a/src/FbTk/Transparent.cc
+++ b/src/FbTk/Transparent.cc
@@ -19,7 +19,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: Transparent.cc,v 1.3 2003/04/26 12:44:24 fluxgen Exp $
+// $Id: Transparent.cc,v 1.4 2003/05/07 09:31:29 fluxgen Exp $
 
 #include "Transparent.hh"
 #include "App.hh"
@@ -92,15 +92,35 @@ Picture createAlphaPic(Window drawable, unsigned char alpha) {
 
 namespace FbTk {
 
+bool Transparent::s_init = false;
+bool Transparent::s_render = false;
 
 Transparent::Transparent(Drawable src, Drawable dest, unsigned char alpha, int screen_num):
     m_alpha_pic(0), m_src_pic(0), m_dest_pic(0),
     m_source(src), m_dest(dest), m_alpha(alpha) {
 
+    Display *disp = FbTk::App::instance()->display();
+
+    // check for RENDER support
+    if (!s_init) {
+        int major_opcode, first_event, first_error;
+        if (XQueryExtension(disp, "RENDER", 
+                            &major_opcode, 
+                            &first_event, &first_error) == False) {
+            s_render = false;
+        } else { // we got RENDER support
+            s_render = true;
+        }
+        s_init = true;
+    }
+
+    
 #ifdef HAVE_XRENDER
+    if (!s_render)
+        return;
+
     allocAlpha(m_alpha);
 
-    Display *disp = FbTk::App::instance()->display();
 
     XRenderPictFormat *format = 
         XRenderFindVisualFormat(disp, 
@@ -121,21 +141,21 @@ Transparent::Transparent(Drawable src, Drawable dest, unsigned char alpha, int s
 
 Transparent::~Transparent() {
 #ifdef HAVE_XRENDER
-    if (m_alpha_pic != 0)
+    if (m_alpha_pic != 0 && s_render)
         freeAlpha();
 
     Display *disp = FbTk::App::instance()->display();
 
-    if (m_dest_pic != 0)
+    if (m_dest_pic != 0 && s_render)
         XRenderFreePicture(disp, m_dest_pic);
 
-    if (m_src_pic != 0)
+    if (m_src_pic != 0  && s_render)
         XRenderFreePicture(disp, m_src_pic);
 #endif // HAVE_XRENDER
 }
 
 void Transparent::setAlpha(unsigned char alpha) {
-    if (m_source == 0)
+    if (m_source == 0 || !s_render)
         return;
 
     freeAlpha();
@@ -144,7 +164,7 @@ void Transparent::setAlpha(unsigned char alpha) {
 
 void Transparent::setDest(Drawable dest, int screen_num) {
 #ifdef HAVE_XRENDER
-    if (m_dest == dest)
+    if (m_dest == dest || !s_render)
         return;
 
     Display *disp = FbTk::App::instance()->display();
@@ -171,7 +191,7 @@ void Transparent::setDest(Drawable dest, int screen_num) {
 
 void Transparent::setSource(Drawable source, int screen_num) {
 #ifdef HAVE_XRENDER
-    if (m_source == source)
+    if (m_source == source || !s_render)
         return;
     // save old alpha value so we can recreate new later
     // with the same value
@@ -211,7 +231,7 @@ void Transparent::render(int src_x, int src_y,
                          unsigned int width, unsigned int height) const {
 #ifdef HAVE_XRENDER
     if (m_src_pic == 0 || m_dest_pic == 0 ||
-        m_alpha_pic  == 0)
+        m_alpha_pic  == 0 || !s_render)
         return;
     // render src+alpha to dest picture
     XRenderComposite(FbTk::App::instance()->display(), 
@@ -229,7 +249,7 @@ void Transparent::render(int src_x, int src_y,
 
 void Transparent::allocAlpha(unsigned char alpha) {
 #ifdef HAVE_XRENDER
-    if (m_source == 0)
+    if (m_source == 0 || !s_render)
         return;
     if (m_alpha_pic != 0)
         freeAlpha();
@@ -241,7 +261,8 @@ void Transparent::allocAlpha(unsigned char alpha) {
 
 void Transparent::freeAlpha() {
 #ifdef HAVE_XRENDER
-    XRenderFreePicture(FbTk::App::instance()->display(), m_alpha_pic);
+    if (s_render && m_alpha_pic != 0)
+        XRenderFreePicture(FbTk::App::instance()->display(), m_alpha_pic);
 #endif // HAVE_XRENDER
     m_alpha_pic = 0;
     m_alpha = 255;
diff --git a/src/FbTk/Transparent.hh b/src/FbTk/Transparent.hh
index 8652568..1b36b94 100644
--- a/src/FbTk/Transparent.hh
+++ b/src/FbTk/Transparent.hh
@@ -19,7 +19,7 @@
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-// $Id: Transparent.hh,v 1.1 2003/04/20 13:27:16 fluxgen Exp $
+// $Id: Transparent.hh,v 1.2 2003/05/07 09:30:53 fluxgen Exp $
 
 #ifndef FBTK_TRANSPARENT_HH
 #define FBTK_TRANSPARENT_HH
@@ -54,6 +54,10 @@ private:
     unsigned long m_dest_pic;
     Drawable m_source, m_dest;
     unsigned char m_alpha;
+    
+    static bool s_init;
+    static bool s_render; ///< wheter we have RENDER support
+
 };
 
 }; // end namespace  FbTk
-- 
cgit v0.11.2