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 ;
 | ||
|  | 
 | ||
|  | ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! | ||
|  | 
 |