From: Eduardo Cavazos Date: Tue, 16 Dec 2008 00:36:52 +0000 (-0600) Subject: Add extra/frame-buffer X-Git-Tag: 0.94~2228^2~8 X-Git-Url: https://gitweb.factorcode.org/gitweb.cgi?p=factor.git;a=commitdiff_plain;h=1e9f7b65b5a3d8ce18276ded58d8a6a82a35c493 Add extra/frame-buffer --- diff --git a/extra/frame-buffer/frame-buffer.factor b/extra/frame-buffer/frame-buffer.factor new file mode 100644 index 0000000000..708c0d8bd4 --- /dev/null +++ b/extra/frame-buffer/frame-buffer.factor @@ -0,0 +1,112 @@ + +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: < gadget pixels last-dim ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +GENERIC: update-frame-buffer ( -- ) + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: init-frame-buffer-pixels ( frame-buffer -- ) + dup + rect-dim product "uint[4]" + >>pixels + drop ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: 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 * ] 2bi@ + [ copy-row ] 2each ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +: update-last-dim ( frame-buffer -- ) dup rect-dim >>last-dim drop ; + +M:: 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:: 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 ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +