Data commit
This commit is contained in:
parent
7387c8f97b
commit
cb5bb5e222
199093 changed files with 3378972 additions and 0 deletions
68
Task/Image-noise/Haskell/image-noise.hs
Normal file
68
Task/Image-noise/Haskell/image-noise.hs
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
import qualified Graphics.Rendering.OpenGL as GL
|
||||
import qualified Graphics.UI.GLFW as GLFW
|
||||
import qualified Foreign as F
|
||||
import qualified System.Random as R
|
||||
|
||||
height = 240
|
||||
width = 320
|
||||
numbytes = height * width
|
||||
imagesize = GL.Size (fromIntegral width) (fromIntegral height)
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
isInit <- GLFW.init
|
||||
if isInit
|
||||
then do
|
||||
m <- GLFW.createWindow width height "" Nothing Nothing
|
||||
case m of
|
||||
Just win -> do
|
||||
GLFW.makeContextCurrent m
|
||||
GLFW.swapInterval 1
|
||||
GLFW.setKeyCallback win $ Just keyCallback
|
||||
glLoop win
|
||||
GLFW.destroyWindow win
|
||||
Nothing -> return ()
|
||||
GLFW.terminate
|
||||
else return ()
|
||||
|
||||
glLoop :: GLFW.Window -> IO ()
|
||||
glLoop win = do
|
||||
foreignPixels <- F.mallocForeignPtrArray numbytes
|
||||
F.withForeignPtr foreignPixels
|
||||
(\pixels -> do
|
||||
let pixelData = GL.PixelData GL.Luminance GL.UnsignedByte pixels
|
||||
loop pixelData pixels 0)
|
||||
where
|
||||
loop pixelData pixels frames = do
|
||||
close <- GLFW.windowShouldClose win
|
||||
if close
|
||||
then return ()
|
||||
else do
|
||||
randomizePixels pixels
|
||||
GL.drawPixels imagesize pixelData
|
||||
GLFW.swapBuffers win
|
||||
GLFW.pollEvents
|
||||
time <- GLFW.getTime
|
||||
let fps =
|
||||
case time of
|
||||
Just t -> show $ (fromIntegral frames) / t
|
||||
Nothing -> "???"
|
||||
GLFW.setWindowTitle win $ "FPS: " ++ fps
|
||||
loop pixelData pixels $ frames + 1
|
||||
|
||||
randomizePixels :: F.Ptr GL.GLubyte -> IO ()
|
||||
randomizePixels ptr = iter 0 numbytes
|
||||
where
|
||||
iter index range
|
||||
| index == range = return ()
|
||||
| otherwise = do
|
||||
v <- R.randomRIO (0, 1)
|
||||
F.pokeElemOff ptr index $ v * 255
|
||||
iter (index + 1) range
|
||||
|
||||
keyCallback :: GLFW.Window -> GLFW.Key -> Int -> GLFW.KeyState ->
|
||||
GLFW.ModifierKeys -> IO ()
|
||||
keyCallback win key _ action _ =
|
||||
case key of
|
||||
GLFW.Key'Q -> GLFW.setWindowShouldClose win True
|
||||
_ -> return ()
|
||||
Loading…
Add table
Add a link
Reference in a new issue