[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