113 lines
2.7 KiB
Factor
113 lines
2.7 KiB
Factor
|
|
USING: accessors alien.c-types combinators grouping kernel
|
|
locals math math.geometry.rect math.vectors opengl.gl sequences
|
|
ui.gadgets ui.render ;
|
|
|
|
IN: frame-buffer
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
TUPLE: <frame-buffer> < gadget pixels last-dim ;
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
GENERIC: update-frame-buffer ( <frame-buffer> -- )
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
: init-frame-buffer-pixels ( frame-buffer -- )
|
|
dup
|
|
rect-dim product "uint[4]" <c-array>
|
|
>>pixels
|
|
drop ;
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
: frame-buffer ( -- <frame-buffer> ) <frame-buffer> new-gadget ;
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
:: draw-pixels ( FRAME-BUFFER -- )
|
|
|
|
FRAME-BUFFER rect-dim first2
|
|
GL_RGBA
|
|
GL_UNSIGNED_INT
|
|
FRAME-BUFFER pixels>>
|
|
glDrawPixels ;
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
:: read-pixels ( FRAME-BUFFER -- )
|
|
|
|
0
|
|
0
|
|
FRAME-BUFFER rect-dim first2
|
|
GL_RGBA
|
|
GL_UNSIGNED_INT
|
|
FRAME-BUFFER pixels>>
|
|
glReadPixels ;
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
:: copy-row ( OLD NEW -- )
|
|
|
|
[let | LEN [ OLD NEW min-length ] |
|
|
|
|
OLD LEN head-slice 0 NEW copy ] ;
|
|
|
|
: copy-pixels ( old-pixels old-width new-pixels new-width -- )
|
|
[ 16 * <sliced-groups> ] 2bi@
|
|
[ copy-row ] 2each ;
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
: update-last-dim ( frame-buffer -- ) dup rect-dim >>last-dim drop ;
|
|
|
|
M:: <frame-buffer> layout* ( FRAME-BUFFER -- )
|
|
|
|
{
|
|
{
|
|
[ FRAME-BUFFER last-dim>> f = ]
|
|
[
|
|
FRAME-BUFFER init-frame-buffer-pixels
|
|
|
|
FRAME-BUFFER update-last-dim
|
|
]
|
|
}
|
|
{
|
|
[ FRAME-BUFFER [ rect-dim ] [ last-dim>> ] bi = not ]
|
|
[
|
|
[let | OLD-PIXELS [ FRAME-BUFFER pixels>> ]
|
|
OLD-WIDTH [ FRAME-BUFFER last-dim>> first ] |
|
|
|
|
FRAME-BUFFER init-frame-buffer-pixels
|
|
|
|
FRAME-BUFFER update-last-dim
|
|
|
|
[let | NEW-PIXELS [ FRAME-BUFFER pixels>> ]
|
|
NEW-WIDTH [ FRAME-BUFFER last-dim>> first ] |
|
|
|
|
OLD-PIXELS OLD-WIDTH NEW-PIXELS NEW-WIDTH copy-pixels ] ]
|
|
]
|
|
}
|
|
{ [ t ] [ ] }
|
|
}
|
|
cond ;
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|
|
M:: <frame-buffer> draw-gadget* ( FRAME-BUFFER -- )
|
|
|
|
FRAME-BUFFER rect-dim { 0 1 } v* first2 glRasterPos2i
|
|
|
|
FRAME-BUFFER draw-pixels
|
|
|
|
FRAME-BUFFER update-frame-buffer
|
|
|
|
glFlush
|
|
|
|
FRAME-BUFFER read-pixels ;
|
|
|
|
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
|