From cf9e2f2cb8ead7efd7751dcbfaecb36ed06cf9d6 Mon Sep 17 00:00:00 2001
From: Sven Gothel <sgothel@jausoft.com>
Date: Mon, 31 Aug 2015 08:41:07 +0200
Subject: Bug 1210 - Use manual impl. XRenderFindVisualFormat instead of buggy
 generated version

- XRenderDirectFormat XVisual2XRenderMask(..):
  - Move from JOGL's X11GLXGraphicsConfiguration -> Nativewindow X11GraphicsConfiguration
  - Always use manual impl. of XRenderFindVisualFormat

Additionally:

- Add X11GraphicsConfiguration.XVisualInfo2X11Capabilities(..)
  allowing to properly setup the resulting Capabilities instance
  as used in X11GraphicsConfigurationFactory.chooseGraphicsConfigurationImpl(..)

- XVisualInfo:
    - Add 'String toString()'
    - 'XVisualInfo create(XVisualInfo s)' uses source buffer size!
    - XGetVisualInfo: Use returned buffer-capacity/count for element-size
      and also bail out if count<=0
---
 make/config/nativewindow/x11-CustomJavaCode.java | 16 +++++++++++-----
 make/config/nativewindow/x11-lib.cfg             |  9 ++++++++-
 2 files changed, 19 insertions(+), 6 deletions(-)

(limited to 'make/config')

diff --git a/make/config/nativewindow/x11-CustomJavaCode.java b/make/config/nativewindow/x11-CustomJavaCode.java
index d1e011184..7b5d617b5 100644
--- a/make/config/nativewindow/x11-CustomJavaCode.java
+++ b/make/config/nativewindow/x11-CustomJavaCode.java
@@ -24,14 +24,20 @@
 
     if (_res == null) return null;
     Buffers.nativeOrder(_res);
-    XVisualInfo[] _retarray = new XVisualInfo[getFirstElement(arg3, arg3_offset)];
-    for (int _count = 0; _count < getFirstElement(arg3, arg3_offset); _count++) {
-      _res.position(_count * XVisualInfo.size());
-      _res.limit   ((1 + _count) * XVisualInfo.size());
+    final int count = getFirstElement(arg3, arg3_offset);
+    if (count <= 0) return null;
+    final int esize = _res.capacity() / count;
+    if( esize < XVisualInfo.size() ) {
+        throw new RuntimeException("element-size "+_res.capacity()+"/"+count+"="+esize+" < "+XVisualInfo.size());
+    }
+    XVisualInfo[] _retarray = new XVisualInfo[count];
+    for (int i = 0; i < count; i++) {
+      _res.position(i * esize); // XVisualInfo.size());
+      _res.limit   ((1 + i) * esize); // XVisualInfo.size());
       java.nio.ByteBuffer _tmp = _res.slice();
       _res.position(0);
       _res.limit(_res.capacity());
-      _retarray[_count] = XVisualInfo.create(_tmp);
+      _retarray[i] = XVisualInfo.create(_tmp);
     }
     return _retarray;
   }
diff --git a/make/config/nativewindow/x11-lib.cfg b/make/config/nativewindow/x11-lib.cfg
index 66bd19362..0bbe1c420 100644
--- a/make/config/nativewindow/x11-lib.cfg
+++ b/make/config/nativewindow/x11-lib.cfg
@@ -13,6 +13,7 @@ NativeOutputDir gensrc/native/X11
 Import java.nio.*
 Import java.util.*
 Import com.jogamp.nativewindow.util.Point
+Import com.jogamp.common.util.Bitfield
 
 # XID needs to be treated as a long for 32/64 bit compatibility
 Opaque long XID
@@ -31,6 +32,7 @@ ReturnValueCapacity XRenderFindVisualFormat sizeof(XRenderPictFormat)
 
 # We have Custom code for the following
 Ignore XGetVisualInfo
+Ignore XRenderFindVisualFormat
 
 ManuallyImplement XCloseDisplay
 ManuallyImplement XUnlockDisplay
@@ -40,7 +42,12 @@ ManuallyImplement XLockDisplay
 CustomJavaCode X11Lib private static int getFirstElement(IntBuffer buf)         { return buf.get(buf.position()); }
 CustomJavaCode X11Lib private static int getFirstElement(int[] arr, int offset) { return arr[offset]; }
 
-CustomJavaCode XVisualInfo public static XVisualInfo create(XVisualInfo s) { XVisualInfo d = XVisualInfo.create(); d.getBuffer().put(s.getBuffer()); d.getBuffer().rewind(); s.getBuffer().rewind(); return d; }
+CustomJavaCode XVisualInfo public static XVisualInfo create(XVisualInfo s) { final ByteBuffer bb = Buffers.newDirectByteBuffer(s.getBuffer().capacity()); final XVisualInfo d = XVisualInfo.create(bb); d.getBuffer().put(s.getBuffer()); d.getBuffer().rewind(); s.getBuffer().rewind(); return d; }
+CustomJavaCode XVisualInfo public String toString() {
+CustomJavaCode XVisualInfo     return "XVisualInfo[size "+size()+"/"+getBuffer().capacity()+", visual 0x"+Long.toHexString(getVisual())+
+CustomJavaCode XVisualInfo         ", visual-id  0x"+Long.toHexString(getVisualid())+", c-class "+getC_class()+", cmap-size "+getColormap_size()+", depth "+getDepth()+
+CustomJavaCode XVisualInfo         ", rgb["+Bitfield.Util.bitCount((int)getRed_mask())+", "+Bitfield.Util.bitCount((int)getRed_mask())+", "+Bitfield.Util.bitCount((int)getRed_mask())+" - "+getBits_per_rgb()+"]]";
+CustomJavaCode XVisualInfo }
 
 CustomCCode #include <gluegen_stdint.h>
 CustomCCode #include <gluegen_stddef.h>
-- 
cgit v1.2.3