-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathgl2.ijs
More file actions
457 lines (412 loc) · 13.2 KB
/
gl2.ijs
File metadata and controls
457 lines (412 loc) · 13.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
NB. gl2 init
coclass 'jgl2'
WDCB_jqtide_=: (WDCB_jqtide_"_)^:(0=4!:0<'WDCB_jqtide_') (IFIOS*.IFQT)+.(UNAME-:'Wasm')
3 : 0''
if. 0~: 4!:0 <'PROFONT_z_' do. PROFONT=: (('Linux';'FreeBSD';'OpenBSD';'Darwin';'Android';'Win') i. <UNAME){:: 'Sans 10' ; 'Sans 10' ; 'Sans 10' ; '"Lucida Grande" 10' ; (IFQT{::'Sans 10';'"Droid Sans" 10') ; 'Tahoma 10' ; 'Tahoma 10' else. PROFONT=: PROFONT_z_ end.
if. 0~: 4!:0 <'FIXFONT_z_' do. FIXFONT=: (('Linux';'FreeBSD';'OpenBSD';'Darwin';'Android';'Win') i. <UNAME){:: 'mono 10' ; 'mono 10' ; 'mono 10' ; 'Monaco 10' ; (IFQT{::'monospace 10';'"Droid Sans Mono" 10') ; '"Lucida Console" 10' ; '"Lucida Console" 10' else. FIXFONT=: FIXFONT_z_ end.
)
NB. gl2 constant
PS_NULL=: 0
PS_SOLID=: 1
PS_DASH=: 2
PS_DOT=: 3
PS_DASHDOT=: 4
PS_DASHDOTDOT=: 5
IDC_ARROW=: 0
IDC_UPARROW=: 1
IDC_CROSS=: 2
IDC_WAIT=: 3
IDC_IBEAM=: 4
IDC_SIZEVER=: 5
IDC_SIZEHOR=: 6
IDC_SIZEBDIAG=: 7
IDC_SIZEFDIAG=: 8
IDC_SIZEALL=: 9
IDC_BLANK=: 10
IDC_SPLITV=: 11
IDC_SPLITH=: 12
IDC_POINTINGHAND=: 13
IDC_FORBIDDEN=: 14
IDC_OPENHAND=: 17
IDC_CLOSEDHAND=: 18
IDC_WHATSTHIS=: 15
IDC_BUSY=: 16
IDC_DRAGMOVE=: 20
IDC_DRAGCOPY=: 19
IDC_DRAGLINK=: 21
IDC_UNSET=: _1
NB. numeric constants used in glcmds
glarc_n=: 2001
glbrush_n=: 2004
glbrushnull_n=: 2005
glcapture_n=: 2062
glcaret_n=: 2065
glclear_n=: 2007
glclip_n=: 2078
glclipreset_n=: 2079
glcmds_n=: 2999
glcursor_n=: 2069
glellipse_n=: 2008
glemfopen_n=: 2084
glemfclose_n=: 2085
glemfplay_n=: 2086
glfile_n=: 2066
glfill_n=: 2093
glfont_n=: 2012
glfontextent_n=: 2094
gllines_n=: 2015
glnodblbuf_n=: 2070
glpaint_n=: 2020
glpaintx_n=: 2021
glpen_n=: 2022
glpie_n=: 2023
glpixel_n=: 2024
glpixelsx_n=: 2075
glpixels_n=: 2076
glprint_n=: 2089
glprintmore_n=: 2091
glpolygon_n=: 2029
glqextent_n=: 2057
glqextentw_n=: 2083
glqpixels_n=: 2077
glqpixelm_n=: 2080
glqprintpaper_n=: 2092
glqprintwh_n=: 2088
glqtextmetrics_n=: 2058
glqtype_n=: 2095
glqwh_n=: 2059
glqhandles_n=: 2060
glrect_n=: 2031
glrgb_n=: 2032
glroundr_n=: 2033
glsel_n=: 2035
gltext_n=: 2038
gltextcolor_n=: 2040
gltextxy_n=: 2056
glwindoworg_n=: 2045
glbkmode_n=: 2003
glnoerasebkgnd_n=: 2071
glsetlocale_n=: 2072
glfont2_n=: 2312
glfontangle_n=: 2096
glrgba_n=: 2097
glsel2_n=: 2098
NB. image utility
glgetimg_n=: 3000
glreadimg_n=: 3001
glputimg_n=: 3002
glwriteimg_n=: 3003
NB. keyboard events
kbBS=: Qt_Key_Backspace_jqtide_
kbTAB=: Qt_Key_Tab_jqtide_
kbLF=: Qt_Key_Enter_jqtide_
kbENTER=: Qt_Key_Enter_jqtide_
kbRETURN=: Qt_Key_Return_jqtide_
kbPUP=: Qt_Key_PageUp_jqtide_
kbPDOWN=: Qt_Key_PageDown_jqtide_
kbEND=: Qt_Key_End_jqtide_
kbHOME=: Qt_Key_Home_jqtide_
kbLEFT=: Qt_Key_Left_jqtide_
kbUP=: Qt_Key_Up_jqtide_
kbRIGHT=: Qt_Key_Right_jqtide_
kbDOWN=: Qt_Key_Down_jqtide_
kbESC=: Qt_Key_Escape_jqtide_
kbINS=: Qt_Key_Insert_jqtide_
kbDEL=: Qt_Key_Delete_jqtide_
kbMETA=: Qt_Key_Meta_jqtide_
kbALT=: Qt_Key_Alt_jqtide_
kbSHIFT=: Qt_Key_Shift_jqtide_
kbCTRL=: Qt_Key_Control_jqtide_
NB. qt gl2
chkgl2=: 13!:8@3:^:(0&<)@>@{.
NB. =========================================================
glarc=: chkgl2 @: (('"',libjqt,'" glarc >',(IFWIN#'+'),' i *i') cd <) "1
glbrush=: chkgl2 @: (('"',libjqt,'" glbrush >',(IFWIN#'+'),' i')&cd bind '') "1
glbrushnull=: chkgl2 @: (('"',libjqt,'" glbrushnull >',(IFWIN#'+'),' i')&cd bind '') "1
glcapture=: chkgl2 @: (('"',libjqt,'" glcapture >',(IFWIN#'+'),' i i')&cd) "1
glcaret=: chkgl2 @: (('"',libjqt,'" glcaret >',(IFWIN#'+'),' i *i') cd <) "1
glclear=: (('"',libjqt,'" glclear >',(IFWIN#'+'),' i')&cd bind '') "1
glclip=: chkgl2 @: (('"',libjqt,'" glclip >',(IFWIN#'+'),' i *i') cd <) "1
glclipreset=: chkgl2 @: (('"',libjqt,'" glclipreset >',(IFWIN#'+'),' i')&cd bind '') "1
glcmds=: chkgl2 @: (('"',libjqt,'" glcmds >',(IFWIN#'+'),' i *i i') cd (;#)) "1
glcursor=: chkgl2 @: (('"',libjqt,'" glcursor >',(IFWIN#'+'),' i i')&cd) "1
glellipse=: chkgl2 @: (('"',libjqt,'" glellipse >',(IFWIN#'+'),' i *i') cd <@:<.) "1
glfill=: chkgl2 @: (('"',libjqt,'" glfill >',(IFWIN#'+'),' i *i') cd <@:<.) "1
glfont=: chkgl2 @: (('"',libjqt,'" glfont >',(IFWIN#'+'),' i *c') cd <@,) "1
glfont2=: chkgl2 @: (('"',libjqt,'" glfont2 >',(IFWIN#'+'),' i *i i') cd (;#)@:<.) "1
glfontangle=: chkgl2 @: (('"',libjqt,'" glfontangle >',(IFWIN#'+'),' i i')&cd) "1
glfontextent=: chkgl2 @: (('"',libjqt,'" glfontextent >',(IFWIN#'+'),' i *c') cd <@,) "1
gllines=: chkgl2 @: (('"',libjqt,'" gllines >',(IFWIN#'+'),' i *i i') cd (;#)) "1
glnodblbuf=: chkgl2 @: (('"',libjqt,'" glnodblbuf >',(IFWIN#'+'),' i i') cd {.@(,&0)) "1
glpen=: chkgl2 @: (('"',libjqt,'" glpen >',(IFWIN#'+'),' i *i') cd <@:(2 {. (,&1))) "1
glpie=: chkgl2 @: (('"',libjqt,'" glpie >',(IFWIN#'+'),' i *i') cd <) "1
glpixel=: chkgl2 @: (('"',libjqt,'" glpixel >',(IFWIN#'+'),' i *i') cd <) "1
glpixels=: chkgl2 @: (('"',libjqt,'" glpixels >',(IFWIN#'+'),' i *i i') cd (;#)@:<.) "1
glpixelsx=: chkgl2 @: (('"',libjqt,'" glpixelsx >',(IFWIN#'+'),' i *i') cd <@:<.) "1
glpolygon=: chkgl2 @: (('"',libjqt,'" glpolygon >',(IFWIN#'+'),' i *i i') cd (;#)@:<.) "1
glrect=: chkgl2 @: (('"',libjqt,'" glrect >',(IFWIN#'+'),' i *i') cd <) "1
glrgb=: chkgl2 @: (('"',libjqt,'" glrgb >',(IFWIN#'+'),' i *i') cd <@:<.) "1
glrgba=: chkgl2 @: (('"',libjqt,'" glrgba >',(IFWIN#'+'),' i *i') cd <@:<.) "1
glsel1=: chkgl2 @: (('"',libjqt,'" glsel >',(IFWIN#'+'),' i x')&cd) "1
glsel2=: chkgl2 @: (('"',libjqt,'" glsel2 >',(IFWIN#'+'),' i *c') cd <@,) "1
gltext=: chkgl2 @: (('"',libjqt,'" gltext >',(IFWIN#'+'),' i *c') cd <@,) "1
gltextcolor=: chkgl2 @: (('"',libjqt,'" gltextcolor >',(IFWIN#'+'),' i')&cd bind '') "1
gltextxy=: chkgl2 @: (('"',libjqt,'" gltextxy >',(IFWIN#'+'),' i *i') cd <@:<.) "1
glwaitgl=: chkgl2 @: (('"',libjqt,'" glwaitgl >',(IFWIN#'+'),' i')&cd bind '') "1
glwaitnative=: chkgl2 @: (('"',libjqt,'" glwaitnative >',(IFWIN#'+'),' i')&cd bind '') "1
glwindoworg=: chkgl2 @: (('"',libjqt,'" glwindoworg >',(IFWIN#'+'),' i *i') cd <@:<.) "1
glsetlocale=: chkgl2 @: (('"',libjqt,'" glsetlocale >',(IFWIN#'+'),' i *c') cd <@,@>) "1
NB. =========================================================
NB. immediate paint
glpaint=: 3 : 0 "1
('"',libjqt,'" glpaint >',(IFWIN#'+'),' i')&cd ''
0
)
NB. =========================================================
NB. paint
glpaintx=: 3 : 0 "1
('"',libjqt,'" glpaintx >',(IFWIN#'+'),' i')&cd ''
0
)
NB. =========================================================
glqhandles=: 3 : 0"1
hs=. 3#2-2
chkgl2 cdrc=. ('"',libjqt,'" glqhandles ',(IFWIN#'+'),' i *x') cd <hs
1{::cdrc
)
NB. =========================================================
glqtype=: 3 : 0"1
type=. 1#2-2
chkgl2 cdrc=. ('"',libjqt,'" glqtype ',(IFWIN#'+'),' i *i') cd <type
1{::cdrc
)
NB. =========================================================
glqwh=: 3 : 0"1
wh=. 2#2-2
chkgl2 cdrc=. ('"',libjqt,'" glqwh ',(IFWIN#'+'),' i *i') cd <wh
1{::cdrc
)
NB. =========================================================
NB. return matrix of pixels
NB. wh is limited to pixmap size
NB. -1 in w or h means read to end
glqpixelm=: 3 : 0"1
n=. */ 2{.2}.y
pix=. n#2-2
shape=. 2#2-2
chkgl2 cdrc=. ('"',libjqt,'" glqpixelm ',(IFWIN#'+'),' i *i *i *i') cd y;shape;pix
(2&{:: $ 3&{::) cdrc
)
NB. =========================================================
NB. result is in opengl form
NB. pixels top to bottom, RGB24
NB. TODO
glqpixels=: 3 : 0"1
n=. */ 2{.2}.y
pix=. n#2-2
chkgl2 cdrc=. ('"',libjqt,'" glqpixels ',(IFWIN#'+'),' i *i *i') cd y;pix
2{::cdrc
)
NB. =========================================================
NB. TODO
glqextent=: 3 : 0"1
wh=. 2#2-2
chkgl2 cdrc=. ('"',libjqt,'" glqextent ',(IFWIN#'+'),' i *c *i') cd (,y);wh
2{::cdrc
)
NB. =========================================================
NB. TODO
glqextentw=: 3 : 0"1
y=. y,(LF~:{:y)#LF [ y=. ,y
w=. (+/LF=y)#2-2
chkgl2 cdrc=. ('"',libjqt,'" glqextentw ',(IFWIN#'+'),' i *c *i') cd y;w
2{::cdrc
)
NB. =========================================================
NB. font information: Height, Ascent, Descent, InternalLeading, ExternalLeading, AverageCharWidth, MaxCharWidth
NB. TODO
glqtextmetrics=: 3 : 0"1
tm=. 7#2-2
chkgl2 cdrc=. ('"',libjqt,'" glqtextmetrics ',(IFWIN#'+'),' i *i') cd <tm
1{::cdrc
)
NB. =========================================================
glsetbrush=: glbrush @ glrgb
glsetpen=: glpen @ ((1 1 [ glrgb) :((2 {. (,&1)) glrgb))
NB. =========================================================
NB. printer
NB. not implemented
glprint=: [:
glprintmore=: [:
glqprintpaper=: [:
glqprintwh=: [:
NB. not implemented
glemfclose=: [:
glemfopen=: [:
glemfplay=: [:
glfile=: [:
glroundr=: [:
NB. =========================================================
glsel=: glsel2@:(":^:(2~:3!:0))
NB. =========================================================
3 : 0''
if. WDCB_jqtide_ do.
chkgl2=: ]
glarc=: 11 !: glarc_n
glbrush=: 11 !: glbrush_n
glbrushnull=: 11 !: glbrushnull_n
glcapture=: 11 !: glcapture_n
glcaret=: 11 !: glcaret_n
glclear=: 11 !: glclear_n
glclip=: 11 !: glclip_n
glclipreset=: 11 !: glclipreset_n
glcmds=: 11 !: glcmds_n
glcursor=: 11 !: glcursor_n
glellipse=: 11 !: glellipse_n
glfill=: 11 !: glfill_n
glfont=: 11 !: glfont_n
glfont2=: 11 !: glfont2_n
glfontangle=: 11 !: glfontangle_n
glfontextent=: 11 !: glfontextent_n
gllines=: 11 !: gllines_n
glnodblbuf=: 11 !: glnodblbuf_n
glpen=: 11 !: glpen_n
glpie=: 11 !: glpie_n
glpixel=: 11 !: glpixel_n
glpixels=: 11 !: glpixels_n
glpixelsx=: 11 !: glpixelsx_n
glpolygon=: 11 !: glpolygon_n
glrect=: 11 !: glrect_n
glrgb=: 11 !: glrgb_n
glrgba=: 11 !: glrgba_n
gltext=: 11 !: gltext_n
gltextcolor=: 11 !: gltextcolor_n
gltextxy=: 11 !: gltextxy_n
NB. glwaitgl=: 11 !: glwaitgl_n
NB. glwaitnative=: 11 !: glwaitnative_n
glwindoworg=: 11 !: glwindoworg_n
glsetlocale=: 11 !: glsetlocale_n
glpaint=: 11 !: glpaint_n
glpaintx=: 11 !: glpaintx_n
glqhandles=: 11 !: glqhandles_n
glqtype=: 11 !: glqtype_n
glqwh=: 11 !: glqwh_n
glqpixelm=: 11 !: glqpixelm_n
glqpixels=: 11 !: glqpixels_n
glqextent=: 11 !: glqextent_n
glqextentw=: 11 !: glqextentw_n
glqtextmetrics=: 11 !: glqtextmetrics_n
glsel=: (11 !: glsel_n)`(11 !: glsel2_n)@.(2=3!:0)
NB. image utility
glgetimg=: 11 !: glgetimg_n
glreadimg=: 11 !: glreadimg_n
glputimg=: 11 !: glputimg_n
glwriteimg=: 11 !: glwriteimg_n
end.
EMPTY
)
NB. util
NB. =========================================================
RGBA=: 3 : 'r (23 b.) 8 (33 b.) g (23 b.) 8 (33 b.) b (23 b.) 8 (33 b.) a [ ''r g b a''=. <.y'
BGRA=: 3 : 'b (23 b.) 8 (33 b.) g (23 b.) 8 (33 b.) r (23 b.) 8 (33 b.) a [ ''r g b a''=. <.y'
NB. =========================================================
NB. pafc v Polar angle from cartesian coords
pafc=: 2p1&|@{:@:(*.@(j./))
rfd=: *&(1p1%180)
dfr=: *&(180%1p1)
NB. calcAngle gives polar angle in radians with zero at 3-o'clock
NB. from rectangular coordiates with origin (0,0) at the top, left
NB. (xctr,yctr) calcAngle xpt,ypt
calcAngle=: ([: pafc _1 1 * -)"1
NB. =========================================================
NB. convert radians to 64ths-of-a-degree
degree64=: 0.5 <.@:+ 64 * dfr
NB. =========================================================
NB. opengl (and normal folk?) are ARGB with A 0
NB. glpixels and glqpixels need to make these adjustments
3 : 0''
if. IF64 do.
ALPHA=: 0{_3 ic 0 0 0 255 255 255 255 255{a.
else.
ALPHA=: 0{_2 ic 0 0 0 255{a.
end.
''
)
NOTALPHA=: 0{_2 ic 255 255 255 0{a.
ALPHARGB=: IF64{::_1;16bffffffff
NB. =========================================================
NB. arc drawing - glellipse, glarc, glpie
NB. draw arc on the ellipse defined by rectangle
NB. arc starts at xa,ya and ends at xz,yz (counterclockwise)
NB. points need not lie on the ellipse
NB. they define a line from the center that intersects ellipse
NB. gdk arc has same xywh but args are start and end angles
NB. counterclockwise in 64th degrees
NB. =========================================================
parseFontname=: 3 : 0
font=. ' ',y
b=. (font=' ') > ~:/\font='"'
a: -.~ b <@(-.&'"');._1 font
)
NB.*FontStyle n Regular Bold Italic Underline Strikeout
NB. 0 1 2 4 8
FontStyle=: ;:'regular bold italic underline strikeout'
parseFontSpec=: 3 : 0
'ns styleangle'=. 2 split parseFontname y
'face size'=. ns
size=. 12". size
style=. FontStyle i. tolower each styleangle
style=. <.+/2^<:(style ((> 0) *. <) #FontStyle) # style
if. 1 e. an=. ('angle'-:5&{.)&> styleangle do.
degree=. 10%~ 0". 5}.>(an i. 1){styleangle
else.
degree=. 0
end.
face;size;style;degree
)
NB. delete leading white spaces
dlws=: 3 : 0
y }.~ +/ *./\ (y e. ' ')+.(y e. LF)+.(y e. TAB)
)
NB. count leading white spaces
clws=: 3 : 0
+/ *./\ (y e. ' ')+.(y e. LF)+.(y e. TAB)
)
NB. get first argument and remove enclosing dquotes or DEL
NB. update global noun wdglptr on exit
wdglshiftarg=: 3 : 0
if. (#wdglstr) = wdglptr=: wdglptr + clws wdglptr}. wdglstr do. '' return. end.
y=. wdglptr}.wdglstr
b=. y e. ' '
a=. y e. '*'
q=. 2| +/\ y e. '"'
d=. 2| +/\ y e. DEL
b=. b *. -.q+.d
a=. a *. -.q+.d
if. 1={.a do. NB. *argument
z=. }.y
wdglptr=: #wdglstr
elseif. (1={.d)+.(1={.q) do. NB. enclosed between DEL or "
p2=. 1+ (}.y) i. {.y
z=. }.p2{.y
wdglptr=: wdglptr+ p2+1
elseif. 1 e. b do. NB. space delimited
p2=. {.I.b
z=. p2{.y
wdglptr=: wdglptr+ 1+p2
elseif. do.
z=. y
wdglptr=: #wdglstr
end.
<z
)
NB. get all arguments by repeating calling wdglshiftarg
wdglshiftargs=: 3 : 0
wdglptr=: 0 [ wdglstr=: y
z=. 0$<''
while. wdglptr < #wdglstr do. z=. z, wdglshiftarg'' end.
z
)
tors=: 3 : 0
(2{.y),(2{.y)+2}.y
)