2 USING: kernel alien.c-types combinators sequences splitting grouping
3 opengl.gl ui.gadgets ui.render
4 math math.vectors accessors math.geometry.rect ;
6 IN: ui.gadgets.frame-buffer
8 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
10 TUPLE: frame-buffer < gadget action pdim last-dim graft ungraft pixels ;
12 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
14 : init-frame-buffer-pixels ( frame-buffer -- frame-buffer )
16 rect-dim product "uint[4]" <c-array>
19 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
21 : new-frame-buffer ( class -- gadget )
28 : <frame-buffer> ( -- frame-buffer ) frame-buffer new-frame-buffer ;
30 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
32 : draw-pixels ( fb -- fb )
35 rect-dim first2 GL_RGBA GL_UNSIGNED_INT r> pixels>> glDrawPixels
38 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
40 : read-pixels ( fb -- fb )
44 0 0 r> rect-dim first2 GL_RGBA GL_UNSIGNED_INT r> pixels>> glReadPixels
47 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
49 M: frame-buffer pref-dim* pdim>> ;
50 M: frame-buffer graft* graft>> call ;
51 M: frame-buffer ungraft* ungraft>> call ;
53 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
55 : copy-row ( old new -- )
56 2dup min-length swap >r head-slice 0 r> copy ;
58 ! : copy-pixels ( old-pixels old-width new-pixels new-width -- )
60 ! [ copy-row ] 2each ;
62 ! : copy-pixels ( old-pixels old-width new-pixels new-width -- )
64 ! [ copy-row ] 2each ;
66 : copy-pixels ( old-pixels old-width new-pixels new-width -- )
67 [ 16 * <sliced-groups> ] 2bi@
70 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
72 M: frame-buffer layout* ( fb -- )
75 [ dup last-dim>> f = ]
77 init-frame-buffer-pixels
84 [ dup [ rect-dim ] [ last-dim>> ] bi = not ]
86 dup [ pixels>> ] [ last-dim>> first ] bi
88 rot init-frame-buffer-pixels
89 dup rect-dim >>last-dim
91 [ pixels>> ] [ rect-dim first ] bi
100 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
102 M: frame-buffer draw-gadget* ( fb -- )
104 dup rect-dim { 0 1 } v* first2 glRasterPos2i