[Kde-bindings] KDE/kdebindings/csharp/qyoto

Arno Rehn kde at arnorehn.de
Sun Nov 23 21:37:59 UTC 2008


SVN commit 888147 by arnorehn:

* Convert uchar* to Pointer<byte>
* Add marshallers for uchar*
* Implicitly convert an array of valuetypes to Pointer<T>

Thanks to Eric Butler for reporting the bug.

CCMAIL: kde-bindings at kde.org
CCMAIL: eric at extremeboredom.net



 M  +2 -2      core/QTranslator.cs  
 M  +4 -4      gui/QBitmap.cs  
 M  +16 -16    gui/QImage.cs  
 M  +6 -6      gui/QPixmap.cs  
 M  +52 -1     src/Qyoto.cs  
 M  +27 -0     src/handlers.cpp  


--- trunk/KDE/kdebindings/csharp/qyoto/core/QTranslator.cs #888146:888147
@@ -46,8 +46,8 @@
         public bool Load(string filename) {
             return (bool) interceptor.Invoke("load$", "load(const QString&)", typeof(bool), typeof(string), filename);
         }
-        public bool Load(char[] data, int len) {
-            return (bool) interceptor.Invoke("load$$", "load(const uchar*, int)", typeof(bool), typeof(char[]), data, typeof(int), len);
+        public bool Load(Pointer<byte> data, int len) {
+            return (bool) interceptor.Invoke("load$$", "load(const uchar*, int)", typeof(bool), typeof(Pointer<byte>), data, typeof(int), len);
         }
         ~QTranslator() {
             interceptor.Invoke("~QTranslator", "~QTranslator()", typeof(void));
--- trunk/KDE/kdebindings/csharp/qyoto/gui/QBitmap.cs #888146:888147
@@ -57,11 +57,11 @@
         public static new QBitmap FromImage(QImage image) {
             return (QBitmap) staticInterceptor.Invoke("fromImage#", "fromImage(const QImage&)", typeof(QBitmap), typeof(QImage), image);
         }
-        public static QBitmap FromData(QSize size, char[] bits, QImage.Format monoFormat) {
-            return (QBitmap) staticInterceptor.Invoke("fromData#$$", "fromData(const QSize&, const uchar*, QImage::Format)", typeof(QBitmap), typeof(QSize), size, typeof(char[]), bits, typeof(QImage.Format), monoFormat);
+        public static QBitmap FromData(QSize size, Pointer<byte> bits, QImage.Format monoFormat) {
+            return (QBitmap) staticInterceptor.Invoke("fromData#$$", "fromData(const QSize&, const uchar*, QImage::Format)", typeof(QBitmap), typeof(QSize), size, typeof(Pointer<byte>), bits, typeof(QImage.Format), monoFormat);
         }
-        public static QBitmap FromData(QSize size, char[] bits) {
-            return (QBitmap) staticInterceptor.Invoke("fromData#$", "fromData(const QSize&, const uchar*)", typeof(QBitmap), typeof(QSize), size, typeof(char[]), bits);
+        public static QBitmap FromData(QSize size, Pointer<byte> bits) {
+            return (QBitmap) staticInterceptor.Invoke("fromData#$", "fromData(const QSize&, const uchar*)", typeof(QBitmap), typeof(QSize), size, typeof(Pointer<byte>), bits);
         }
     }
 }
--- trunk/KDE/kdebindings/csharp/qyoto/gui/QImage.cs #888146:888147
@@ -52,13 +52,13 @@
             CreateProxy();
             interceptor.Invoke("QImage$$$", "QImage(int, int, QImage::Format)", typeof(void), typeof(int), width, typeof(int), height, typeof(QImage.Format), format);
         }
-        public QImage(char[] data, int width, int height, QImage.Format format) : this((Type) null) {
+        public QImage(Pointer<byte> data, int width, int height, QImage.Format format) : this((Type) null) {
             CreateProxy();
-            interceptor.Invoke("QImage$$$$", "QImage(uchar*, int, int, QImage::Format)", typeof(void), typeof(char[]), data, typeof(int), width, typeof(int), height, typeof(QImage.Format), format);
+            interceptor.Invoke("QImage$$$$", "QImage(uchar*, int, int, QImage::Format)", typeof(void), typeof(Pointer<byte>), data, typeof(int), width, typeof(int), height, typeof(QImage.Format), format);
         }
-        public QImage(char[] data, int width, int height, int bytesPerLine, QImage.Format format) : this((Type) null) {
+        public QImage(Pointer<byte> data, int width, int height, int bytesPerLine, QImage.Format format) : this((Type) null) {
             CreateProxy();
-            interceptor.Invoke("QImage$$$$$", "QImage(uchar*, int, int, int, QImage::Format)", typeof(void), typeof(char[]), data, typeof(int), width, typeof(int), height, typeof(int), bytesPerLine, typeof(QImage.Format), format);
+            interceptor.Invoke("QImage$$$$$", "QImage(uchar*, int, int, int, QImage::Format)", typeof(void), typeof(Pointer<byte>), data, typeof(int), width, typeof(int), height, typeof(int), bytesPerLine, typeof(QImage.Format), format);
         }
         public QImage(string fileName, string format) : this((Type) null) {
             CreateProxy();
@@ -149,14 +149,14 @@
         public bool IsGrayscale() {
             return (bool) interceptor.Invoke("isGrayscale", "isGrayscale() const", typeof(bool));
         }
-        public char[] Bits() {
-            return (char[]) interceptor.Invoke("bits", "bits()", typeof(char[]));
+        public Pointer<byte> Bits() {
+            return (Pointer<byte>) interceptor.Invoke("bits", "bits()", typeof(Pointer<byte>));
         }
         public int NumBytes() {
             return (int) interceptor.Invoke("numBytes", "numBytes() const", typeof(int));
         }
-        public char[] ScanLine(int arg1) {
-            return (char[]) interceptor.Invoke("scanLine$", "scanLine(int)", typeof(char[]), typeof(int), arg1);
+        public Pointer<byte> ScanLine(int arg1) {
+            return (Pointer<byte>) interceptor.Invoke("scanLine$", "scanLine(int)", typeof(Pointer<byte>), typeof(int), arg1);
         }
         public int BytesPerLine() {
             return (int) interceptor.Invoke("bytesPerLine", "bytesPerLine() const", typeof(int));
@@ -290,11 +290,11 @@
         public bool Load(string fileName) {
             return (bool) interceptor.Invoke("load$", "load(const QString&)", typeof(bool), typeof(string), fileName);
         }
-        public bool LoadFromData(char[] buf, int len, string format) {
-            return (bool) interceptor.Invoke("loadFromData$$$", "loadFromData(const uchar*, int, const char*)", typeof(bool), typeof(char[]), buf, typeof(int), len, typeof(string), format);
+        public bool LoadFromData(Pointer<byte> buf, int len, string format) {
+            return (bool) interceptor.Invoke("loadFromData$$$", "loadFromData(const uchar*, int, const char*)", typeof(bool), typeof(Pointer<byte>), buf, typeof(int), len, typeof(string), format);
         }
-        public bool LoadFromData(char[] buf, int len) {
-            return (bool) interceptor.Invoke("loadFromData$$", "loadFromData(const uchar*, int)", typeof(bool), typeof(char[]), buf, typeof(int), len);
+        public bool LoadFromData(Pointer<byte> buf, int len) {
+            return (bool) interceptor.Invoke("loadFromData$$", "loadFromData(const uchar*, int)", typeof(bool), typeof(Pointer<byte>), buf, typeof(int), len);
         }
         public bool LoadFromData(QByteArray data, string aformat) {
             return (bool) interceptor.Invoke("loadFromData#$", "loadFromData(const QByteArray&, const char*)", typeof(bool), typeof(QByteArray), data, typeof(string), aformat);
@@ -391,11 +391,11 @@
         public static QTransform TrueMatrix(QTransform arg1, int w, int h) {
             return (QTransform) staticInterceptor.Invoke("trueMatrix#$$", "trueMatrix(const QTransform&, int, int)", typeof(QTransform), typeof(QTransform), arg1, typeof(int), w, typeof(int), h);
         }
-        public static QImage FromData(char[] data, int size, string format) {
-            return (QImage) staticInterceptor.Invoke("fromData$$$", "fromData(const uchar*, int, const char*)", typeof(QImage), typeof(char[]), data, typeof(int), size, typeof(string), format);
+        public static QImage FromData(Pointer<byte> data, int size, string format) {
+            return (QImage) staticInterceptor.Invoke("fromData$$$", "fromData(const uchar*, int, const char*)", typeof(QImage), typeof(Pointer<byte>), data, typeof(int), size, typeof(string), format);
         }
-        public static QImage FromData(char[] data, int size) {
-            return (QImage) staticInterceptor.Invoke("fromData$$", "fromData(const uchar*, int)", typeof(QImage), typeof(char[]), data, typeof(int), size);
+        public static QImage FromData(Pointer<byte> data, int size) {
+            return (QImage) staticInterceptor.Invoke("fromData$$", "fromData(const uchar*, int)", typeof(QImage), typeof(Pointer<byte>), data, typeof(int), size);
         }
         public static QImage FromData(QByteArray data, string format) {
             return (QImage) staticInterceptor.Invoke("fromData#$", "fromData(const QByteArray&, const char*)", typeof(QImage), typeof(QByteArray), data, typeof(string), format);
--- trunk/KDE/kdebindings/csharp/qyoto/gui/QPixmap.cs #888146:888147
@@ -162,14 +162,14 @@
         public bool Load(string fileName) {
             return (bool) interceptor.Invoke("load$", "load(const QString&)", typeof(bool), typeof(string), fileName);
         }
-        public bool LoadFromData(char[] buf, uint len, string format, uint flags) {
-            return (bool) interceptor.Invoke("loadFromData$$$$", "loadFromData(const uchar*, uint, const char*, Qt::ImageConversionFlags)", typeof(bool), typeof(char[]), buf, typeof(uint), len, typeof(string), format, typeof(uint), flags);
+        public bool LoadFromData(Pointer<byte> buf, uint len, string format, uint flags) {
+            return (bool) interceptor.Invoke("loadFromData$$$$", "loadFromData(const uchar*, uint, const char*, Qt::ImageConversionFlags)", typeof(bool), typeof(Pointer<byte>), buf, typeof(uint), len, typeof(string), format, typeof(uint), flags);
         }
-        public bool LoadFromData(char[] buf, uint len, string format) {
-            return (bool) interceptor.Invoke("loadFromData$$$", "loadFromData(const uchar*, uint, const char*)", typeof(bool), typeof(char[]), buf, typeof(uint), len, typeof(string), format);
+        public bool LoadFromData(Pointer<byte> buf, uint len, string format) {
+            return (bool) interceptor.Invoke("loadFromData$$$", "loadFromData(const uchar*, uint, const char*)", typeof(bool), typeof(Pointer<byte>), buf, typeof(uint), len, typeof(string), format);
         }
-        public bool LoadFromData(char[] buf, uint len) {
-            return (bool) interceptor.Invoke("loadFromData$$", "loadFromData(const uchar*, uint)", typeof(bool), typeof(char[]), buf, typeof(uint), len);
+        public bool LoadFromData(Pointer<byte> buf, uint len) {
+            return (bool) interceptor.Invoke("loadFromData$$", "loadFromData(const uchar*, uint)", typeof(bool), typeof(Pointer<byte>), buf, typeof(uint), len);
         }
         public bool LoadFromData(QByteArray data, string format, uint flags) {
             return (bool) interceptor.Invoke("loadFromData#$$", "loadFromData(const QByteArray&, const char*, Qt::ImageConversionFlags)", typeof(bool), typeof(QByteArray), data, typeof(string), format, typeof(uint), flags);
--- trunk/KDE/kdebindings/csharp/qyoto/src/Qyoto.cs #888146:888147
@@ -87,13 +87,33 @@
 
 #endif
 
-	public unsafe class Pointer<T> where T : struct {
+	public unsafe class Pointer<T> : IDisposable
+		where T : struct
+	{
 		private IntPtr m_ptr;
+		private bool alloced = false;
 		
 		public Pointer(IntPtr ptr) {
 			m_ptr = ptr;
 		}
 		
+		public Pointer(int length) {
+			m_ptr = Marshal.AllocHGlobal(GetPrimitiveSize() * length);
+			alloced = true;
+		}
+		
+		public void Dispose() {
+			if (alloced) Marshal.FreeHGlobal(m_ptr);
+		}
+		
+		public Pointer(T[] array) {
+			m_ptr = Marshal.AllocHGlobal(GetPrimitiveSize() * array.Length);
+			alloced = true;
+			for(int i = 0; i < array.Length; i++) {
+				this[i] = array[i];
+			}
+		}
+		
 		public T this[int index] {
 			get {
 				return (T) GetPointerValue(m_ptr, typeof(T), index);
@@ -112,6 +132,33 @@
 			return m_ptr;
 		}
 		
+		private int GetPrimitiveSize() {
+			if (typeof(T) == typeof(bool)) {
+				return sizeof(bool);
+			} else if (typeof(T) == typeof(sbyte)) {
+				return sizeof(sbyte);
+			} else if (typeof(T) == typeof(byte)) {
+				return sizeof(byte);
+			} else if (typeof(T) == typeof(short)) {
+				return sizeof(short);
+			} else if (typeof(T) == typeof(ushort)) {
+				return sizeof(ushort);
+			} else if (typeof(T) == typeof(int)) {
+				return sizeof(int);
+			} else if (typeof(T) == typeof(uint)) {
+				return sizeof(uint);
+			} else if (typeof(T) == typeof(long)) {
+				return sizeof(long);
+			} else if (typeof(T) == typeof(ulong)) {
+				return sizeof(ulong);
+			} else if (typeof(T) == typeof(float)) {
+				return sizeof(float);
+			} else if (typeof(T) == typeof(double)) {
+				return sizeof(double);
+			}
+			return 0;
+		}
+		
 		private object GetPointerValue(IntPtr ptr, Type t, int i) {
 			if (t == typeof(bool)) {
 				return ((bool*) ptr)[i];
@@ -172,6 +219,10 @@
 		public static implicit operator Pointer<T>(IntPtr rhs) {
 			return new Pointer<T>(rhs);
 		}
+		
+		public static implicit operator Pointer<T>(T[] rhs) {
+			return new Pointer<T>(rhs);
+		}
 	}
 
 	[AttributeUsage(AttributeTargets.Assembly, AllowMultiple = false)]
--- trunk/KDE/kdebindings/csharp/qyoto/src/handlers.cpp #888146:888147
@@ -1092,6 +1092,31 @@
 	}
 }
 
+static void marshall_ucharP(Marshall *m) {
+	switch(m->action()) {
+	case Marshall::FromObject:
+	{
+		m->item().s_voidp = (*GenericPointerGetIntPtr)(m->var().s_class);
+		(*FreeGCHandle)(m->var().s_voidp);
+	}
+	break;
+
+	case Marshall::ToObject:
+	{
+		uchar *p = (uchar*) m->item().s_voidp;
+		m->var().s_class = (*CreateGenericPointer)("System.Byte", p);
+	    if (m->cleanup()) {
+			delete[] p;
+		}
+	}
+	break;
+
+	default:
+		m->unsupported();
+		break;
+	}
+}
+
 static void marshall_QString(Marshall *m) {
 	switch(m->action()) {
 	case Marshall::FromObject:
@@ -1923,8 +1948,10 @@
     { "sigend int&", marshall_intR },
     { "signed long*", marshall_longR },
     { "signed long&", marshall_longR },
+    { "uchar*", marshall_ucharP},
     { "uint*", marshall_uintR },
     { "uint&", marshall_uintR },
+    { "unsigned char*", marshall_ucharP},
     { "unsigned int*", marshall_uintR },
     { "unsigned int&", marshall_uintR },
     { "unsigned long*", marshall_ulongR },



More information about the Kde-bindings mailing list