Image noise: Difference between revisions

Content added Content deleted
(→‎{{header|Factor}}: Sync from https://github.com/factor/factor/tree/master/extra/rosetta-code/image-noise)
Line 962: Line 962:


=={{header|Factor}}==
=={{header|Factor}}==
{{improve|Factor|Attempted to cleanup code, please review :)}}


~50 FPS
~150 FPS


<lang factor>USING: accessors calendar images images.viewer kernel math
<lang factor>USING: accessors calendar images images.viewer kernel math
math.parser models models.arrow random sequences threads timers
math.parser models models.arrow random sequences threads timers
ui.gadgets ui.gadgets.labels ui.gadgets.packs ;
ui ui.gadgets ui.gadgets.labels ui.gadgets.packs ;
IN: bw-noise
IN: rosetta-code.image-noise


CONSTANT: pixels { B{ 0 0 0 } B{ 255 255 255 } }
: bits>pixels ( bits -- bits' pixels )
[ -1 shift ] [ 1 bitand ] bi 255 * ; inline

: ?generate-more-bits ( a bits -- a bits' )
over 32 mod zero? [ drop random-32 ] when ; inline


: <random-images-bytes> ( dim -- bytes )
: <random-images-bytes> ( dim -- bytes )
product [ pixels random ] { } replicate-as concat ;
[ 0 0 ] dip product [
?generate-more-bits
[ 1 + ] [ bits>pixels ] bi*
] B{ } replicate-as 2nip ;

: <random-bw-image> ( -- image )
: <random-bw-image> ( -- image )
<image>
<image>
{ 320 240 } [ >>dim ] [ <random-images-bytes> >>bitmap ] bi
{ 320 240 } [ >>dim ] [ <random-images-bytes> >>bitmap ] bi
RGB >>component-order
L >>component-order
ubyte-components >>component-type ;
ubyte-components >>component-type ;


TUPLE: bw-noise-gadget < image-control timers cnt old-cnt fps-model ;
TUPLE: bw-noise-gadget < image-control timers cnt old-cnt fps-model ;


: animate-image ( control -- )
: animate-image ( control -- )
[ 1 + ] change-cnt
[ 1 + ] change-cnt
model>> <random-bw-image> swap set-model ;
model>> <random-bw-image> swap set-model ;


: update-cnt ( gadget -- )
: update-cnt ( gadget -- )
[ cnt>> ] [ old-cnt<< ] bi ;
[ cnt>> ] [ old-cnt<< ] bi ;

: fps ( gadget -- fps )
: fps ( gadget -- fps )
[ cnt>> ] [ old-cnt>> ] bi - ;
[ cnt>> ] [ old-cnt>> ] bi - ;

: fps-monitor ( gadget -- )
: fps-monitor ( gadget -- )
[ fps ] [ update-cnt ] [ fps-model>> set-model ] tri ;
[ fps ] [ update-cnt ] [ fps-model>> set-model ] tri ;

: start-animation ( gadget -- )
: start-animation ( gadget -- )
[ [ animate-image ] curry 1 nanoseconds every ] [ timers>> push ] bi ;
[ [ animate-image ] curry 1 nanoseconds every ] [ timers>> push ] bi ;

: start-fps ( gadget -- )
: start-fps ( gadget -- )
[ [ fps-monitor ] curry 1 seconds every ] [ timers>> push ] bi ;
[ [ fps-monitor ] curry 1 seconds every ] [ timers>> push ] bi ;

: setup-timers ( gadget -- )
: setup-timers ( gadget -- )
[ start-animation ] [ start-fps ] bi ;
[ start-animation ] [ start-fps ] bi ;

: stop-animation ( gadget -- )
: stop-animation ( gadget -- )
timers>> [ [ stop-timer ] each ] [ 0 swap set-length ] bi ;
timers>> [ [ stop-timer ] each ] [ delete-all ] bi ;


M: bw-noise-gadget graft* [ call-next-method ] [ setup-timers ] bi ;
M: bw-noise-gadget graft* [ call-next-method ] [ setup-timers ] bi ;

M: bw-noise-gadget ungraft* [ stop-animation ] [ call-next-method ] bi ;
M: bw-noise-gadget ungraft* [ stop-animation ] [ call-next-method ] bi ;


: <bw-noise-gadget> ( -- gadget )
: <bw-noise-gadget> ( -- gadget )
<random-bw-image> <model> bw-noise-gadget new-image-gadget*
<random-bw-image> <model> bw-noise-gadget new-image-gadget*
0 >>cnt 0 >>old-cnt 0 <model> >>fps-model V{ } clone >>timers ;
0 >>cnt 0 >>old-cnt 0 <model> >>fps-model V{ } clone >>timers ;

: fps-gadget ( model -- gadget )
: fps-gadget ( model -- gadget )
[ number>string ] <arrow> <label-control>
[ number>string ] <arrow> <label-control>
"FPS: " <label>
"FPS: " <label>
<shelf> swap add-gadget swap add-gadget ;
<shelf> swap add-gadget swap add-gadget ;

: with-fps ( gadget -- gadget' )
: with-fps ( gadget -- gadget' )
[ fps-model>> fps-gadget ]
[ fps-model>> fps-gadget ]
[ <pile> swap add-gadget swap add-gadget ] bi ;
[ <pile> swap add-gadget swap add-gadget ] bi ;


MAIN-WINDOW: open-noise-window
: open-noise-window ( -- ) [ <bw-noise-gadget> with-fps "Black and White noise" open-window ] with-ui ;</lang>
{ { title "Black and White noise" } }
<bw-noise-gadget> with-fps >>gadgets ;</lang>


=={{header|Go}}==
=={{header|Go}}==