1 //******************************************************************************
2 // Copyright (c) 2005-2013 by Jan Van hijfte
3 //
4 // See the included file COPYING.TXT for details about the copyright.
5 //
6 // This program is distributed in the hope that it will be useful,
7 // but WITHOUT ANY WARRANTY; without even the implied warranty of
8 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9 //******************************************************************************
10
11
12
13 #ifndef PASCALBIND_H
14 #define PASCALBIND_H
15
16 #include <QtCore>
17 #include <QtGui>
18 #include <qapplication.h>
19
20 #include <qstring.h>
21 #include <qrect.h>
22 #include <qpoint.h>
23 #include <qsize.h>
24 #include <qlist.h>
25 #include <qvector.h>
26
27 #include "chandles.h"
28
29
30 #if defined(__WIN32__)
31 #define C_EXPORT extern "C" __declspec( dllexport )
32 #else
33 #define C_EXPORT extern "C"
34 #endif
35
36 #ifdef __WIN32__
37 #include <windows.h>
38 #endif
39
40 typedef bool (*EventFilter)(void *message, long *result);
41 typedef bool (*EventFilter2)(void *message);
42
43 #if defined(_LP64) || defined(__amd64__)
44 typedef long long int PTRINT;
45 typedef unsigned long long int PTRUINT;
46 #else
47 typedef int PTRINT;
48 typedef unsigned int PTRUINT;
49 #endif
50
51
52 typedef uint WFlags;
53 typedef int QCOORDH;
54
55 typedef struct {
56 void *func;
57 void *data;
58 } QHook;
59 typedef QHook QHookH;
60 typedef QHook QOverrideHook;
61 typedef QOverrideHook QOverrideHookH;
62
63 typedef struct {
64 int x_or_y;
65 int y_or_x;
66 } TQtPoint;
67 typedef TQtPoint *PQtPoint;
68
69 typedef struct {
70 qreal x;
71 qreal y;
72 } TQtPointF;
73 typedef TQtPointF *PQtPointF;
74
75 typedef struct {
76 int cx;
77 int cy;
78 } TSize;
79 typedef TSize *PSize;
80
81 typedef struct {
82 unsigned short data;
83 } TQSizePolicy;
84 typedef TQSizePolicy *PQSizePolicy;
85
86 typedef struct {
87 uint spec;
88 ushort alpha;
89 ushort red;
90 ushort green;
91 ushort blue;
92 ushort pad;
93 } TQColor;
94 typedef TQColor *PQColor;
95
96
97 typedef struct {
98 int start;
99 int length;
100 } TTextRange;
101 typedef TTextRange *PTextRange;
102
103 #if defined DARWIN
104 typedef struct CGImage *CGImageRef;
105 #endif
106
107
108 //======================
109 // WideString
110 //======================
111
112 typedef void *PWideString;
113 typedef void *PAnsiString;
114 typedef char *PAnsiChar;
115 typedef unsigned short *PWideChar;
116
117 typedef void (*CopyUnicodeToPWideString)(const QChar *unicode, PWideString ps, int len);
118 typedef PWideChar (*UnicodeOfPWideString)(PWideString ps);
119 typedef int (*LengthOfPWideString)(PWideString ps);
120 typedef void (*InitializePWideString)(PWideString &ps);
121 typedef void (*FinalizePWideString)(PWideString &ps);
122
123 extern CopyUnicodeToPWideString copyUnicodeToPWideString;
124 extern UnicodeOfPWideString unicodeOfPWideString;
125 extern LengthOfPWideString lengthOfPWideString;
126 extern InitializePWideString initPWideString;
127 extern FinalizePWideString finalPWideString;
128
copyQStringToPWideString(const QString & qs,PWideString ps)129 inline void copyQStringToPWideString(const QString &qs, PWideString ps)
130 {
131 if (qs!=0 && ps) copyUnicodeToPWideString(qs.unicode(), ps, qs.length());
132 }
133
134
copyPWideStringToQString(PWideString ps,QString & qs)135 inline void copyPWideStringToQString(PWideString ps, QString &qs)
136 {
137 qs.setUtf16((ushort *)unicodeOfPWideString(ps),
138 lengthOfPWideString(ps));
139 }
140
initializePWideString(PAnsiString & pws)141 inline void initializePWideString(PAnsiString &pws)
142 {
143 initPWideString(pws);
144 }
145
finalizePWideString(PWideString & pws)146 inline void finalizePWideString(PWideString &pws)
147 {
148 finalPWideString(pws);
149 }
150
151 C_EXPORT void initPWideStrings(CopyUnicodeToPWideString cutps,
152 UnicodeOfPWideString uops, LengthOfPWideString lops,
153 InitializePWideString ip, FinalizePWideString fp);
154
155
156
157 //=======================================================
158 // QRect
159 // Pascal : left,top,right,bottom
160 // Qt : left,top,right,bottom aka x1,y1,x2,y2
161 // Qt MAC: top,left,bottom,right aka y1,x1,y2,x2
162 //=======================================================
163
164 typedef void *PRect;
165
copyQRectToPRect(const QRect & qr,PRect pr)166 inline void copyQRectToPRect(const QRect &qr, PRect pr)
167 {
168 #if defined OLDDARWIN
169 ((QRect *)pr)->setLeft(qr.top());
170 ((QRect *)pr)->setTop(qr.left());
171 ((QRect *)pr)->setRight(qr.bottom()+1);
172 ((QRect *)pr)->setBottom(qr.right()+1);
173 #else
174 ((QRect *)pr)->setLeft(qr.left());
175 ((QRect *)pr)->setTop(qr.top());
176 ((QRect *)pr)->setRight(qr.right()+1);
177 ((QRect *)pr)->setBottom(qr.bottom()+1);
178 #endif
179 }
180
copyPRectToQRect(PRect pr,QRect & qr)181 inline void copyPRectToQRect(PRect pr, QRect &qr)
182 {
183 #if defined OLDDARWIN
184 qr.setLeft(((QRect *)pr)->top());
185 qr.setTop(((QRect *)pr)->left());
186 qr.setRight(((QRect *)pr)->bottom()-1);
187 qr.setBottom(((QRect *)pr)->right()-1);
188 #else
189 qr.setLeft(((QRect *)pr)->left());
190 qr.setTop(((QRect *)pr)->top());
191 qr.setRight(((QRect *)pr)->right()-1);
192 qr.setBottom(((QRect *)pr)->bottom()-1);
193 #endif
194 }
195
196 //=========================
197 // QList<T> vs PtrIntArray
198 //=========================
199
200 typedef void *PPtrIntArray;
201 typedef void *(*GetPtrIntArrayAddr)(PPtrIntArray parr);
202 typedef int (*GetPtrIntArrayLength)(PPtrIntArray parr);
203 typedef void (*SetPtrIntArrayLength)(PPtrIntArray parr, int len);
204
205 extern GetPtrIntArrayAddr getPtrIntArrayAddr;
206 extern GetPtrIntArrayLength getPtrIntArrayLength;
207 extern SetPtrIntArrayLength setPtrIntArrayLength;
208
209
210 template <typename T>
copyQListTemplateToPtrIntArray(QList<T> & qlist,PPtrIntArray parr)211 Q_OUTOFLINE_TEMPLATE void copyQListTemplateToPtrIntArray(QList<T> &qlist, PPtrIntArray parr)
212 {
213 int len = qlist.count();
214 setPtrIntArrayLength(parr, len);
215 if (len>0) {
216 PTRINT *array = (PTRINT *)getPtrIntArrayAddr(parr);
217 for (int i = 0; i < len; i++)
218 array[i] = (PTRINT)qlist[i];
219 }
220 }
221
222
223
224 template <typename T>
copyPtrIntArrayToQListTemplate(PPtrIntArray parr,QList<T> & qlist)225 Q_OUTOFLINE_TEMPLATE void copyPtrIntArrayToQListTemplate(PPtrIntArray parr,QList<T> &qlist)
226 {
227 int len = getPtrIntArrayLength(parr);
228 qlist.clear();
229 if (len>0) {
230 PTRINT *array = (PTRINT *)getPtrIntArrayAddr(parr);
231 for (int i = 0; i < len; i++)
232 qlist.append((T)array[i]);
233 }
234 }
235
236
237 //===============================================================================
238 // Only valid for T not castable to PtrInt
239 // will allocate new T to get *T which is castable to PtrInt
240 //===============================================================================
241
242 template <typename T>
copyQListTemplateToPtrIntArrayWithNew(QList<T> & qlist,PPtrIntArray parr)243 Q_OUTOFLINE_TEMPLATE void copyQListTemplateToPtrIntArrayWithNew(QList<T> &qlist, PPtrIntArray parr)
244 {
245 int len = qlist.count();
246 setPtrIntArrayLength(parr, len);
247 if (len>0) {
248 PTRINT *array = (PTRINT *)getPtrIntArrayAddr(parr);
249 for (int i = 0; i < len; i++)
250 array[i] = (PTRINT)(new T(qlist[i]));
251 }
252 }
253
254
255
256 C_EXPORT void initializePPtrIntArray(GetPtrIntArrayAddr gaa, GetPtrIntArrayLength gal, SetPtrIntArrayLength sal);
257
258
259
260 //===============================
261 // QVector<qreal> vs TQRealArray
262 //===============================
263
264 typedef qreal *PQRealArray;
265 typedef qreal *(*GetQRealArrayAddr)(PQRealArray parr);
266 typedef int (*GetQRealArrayLength)(PQRealArray parr);
267 typedef void (*SetQRealArrayLength)(PQRealArray parr, int len);
268
269 extern GetQRealArrayAddr getQRealArrayAddr;
270 extern GetQRealArrayLength getQRealArrayLength;
271 extern SetQRealArrayLength setQRealArrayLength;
272
273
copyQVectorQRealToQRealArray(QVector<qreal> & qvector,PQRealArray parr)274 inline void copyQVectorQRealToQRealArray(QVector<qreal> &qvector, PQRealArray parr)
275 {
276 int len = qvector.size();
277 setQRealArrayLength(parr, len);
278 if (len>0) {
279 qreal *array = getQRealArrayAddr(parr);
280 for (int i = 0; i < len; i++)
281 array[i] = qvector.at(i);
282 }
283 }
284
285
copyQRealArrayToQVectorQReal(PQRealArray parr,QVector<qreal> & qvector)286 inline void copyQRealArrayToQVectorQReal(PQRealArray parr,QVector<qreal> &qvector)
287 {
288 int len = getQRealArrayLength(parr);
289 qvector.resize(len);
290 if (len>0) {
291 qreal *array = getQRealArrayAddr(parr);
292 for (int i = 0; i < len; i++)
293 qvector[i] = array[i];
294 }
295 }
296
297 C_EXPORT void initializeQRealArray(GetQRealArrayAddr gaa, GetQRealArrayLength gal, SetQRealArrayLength sal);
298
299 #endif
300