diff options
| author | Joshua Rahm <joshua.rahm@colorado.edu> | 2014-03-18 23:52:40 -0600 |
|---|---|---|
| committer | Joshua Rahm <joshua.rahm@colorado.edu> | 2014-03-18 23:52:40 -0600 |
| commit | 62fa8f93990f6aedaae8242fdde6bba44e434f5f (patch) | |
| tree | d4d33f3bde43ee70b5247d9f91a3a1fc2c98552b /Graphics/Glyph/Textures.hs | |
| download | earths-ring-62fa8f93990f6aedaae8242fdde6bba44e434f5f.tar.gz earths-ring-62fa8f93990f6aedaae8242fdde6bba44e434f5f.tar.bz2 earths-ring-62fa8f93990f6aedaae8242fdde6bba44e434f5f.zip | |
initial commit
Diffstat (limited to 'Graphics/Glyph/Textures.hs')
| -rw-r--r-- | Graphics/Glyph/Textures.hs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/Graphics/Glyph/Textures.hs b/Graphics/Glyph/Textures.hs new file mode 100644 index 0000000..7e86d2a --- /dev/null +++ b/Graphics/Glyph/Textures.hs @@ -0,0 +1,39 @@ +module Graphics.Glyph.Textures where + +import Data.Array.Storable +import Data.Word + +import Graphics.Rendering.OpenGL.Raw.Core31 +import Graphics.Rendering.OpenGL +import Control.Monad + +data Pixels = + PixelsRGB (Int,Int) (StorableArray Int Word8) | + PixelsRGBA (Int,Int) (StorableArray Int Word8) + +pixelsArray :: Pixels -> StorableArray Int Word8 +pixelsArray (PixelsRGB _ a) = a +pixelsArray (PixelsRGBA _ a) = a +-- construct a new 2d array of pixels +makePixelsRGB :: (Int, Int) -> IO Pixels +makePixelsRGB a@(w,h) = liftM (PixelsRGB a) (newArray_ (0,w*h-1)) + +-- convert a list of rgb values to an array +newPixelsFromListRGB :: (Int, Int) -> [(Word8,Word8,Word8)] -> IO Pixels +newPixelsFromListRGB a@(w,h) lst = liftM (PixelsRGB a) $ (newListArray (0,w*h*3) . + concatMap (\(x,y,z)->[x,y,z])) lst + +newPixelsFromListRGBA :: (Int, Int) -> [(Word8,Word8,Word8,Word8)] -> IO Pixels +newPixelsFromListRGBA a@(w,h) lst = liftM (PixelsRGBA a) $ newListArray (0,w*h*4) + (concatMap (\(x,y,z,q)->[x,y,z,q]) lst) + +attachPixelsToTexture :: Pixels -> TextureObject -> IO () +attachPixelsToTexture pixels tex = + withStorableArray (pixelsArray pixels) $ \ptr -> do + textureBinding Texture2D $= Just tex + case pixels of + PixelsRGB (w,h) _ -> glTexImage2D gl_TEXTURE_2D 0 3 (f w) (f h) 0 gl_RGB gl_UNSIGNED_BYTE ptr + PixelsRGBA (w,h) _ -> glTexImage2D gl_TEXTURE_2D 0 4 (f w) (f h) 0 gl_RGBA gl_UNSIGNED_BYTE ptr + where f = fromIntegral + + |