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