repa-devil (empty) → 0.1
raw patch · 5 files changed
+425/−0 lines, 5 filesdep +Codec-Image-DevILdep +arraydep +basesetup-changed
Dependencies added: Codec-Image-DevIL, array, base, repa, transformers
Files
- Data/Array/Repa/IO/DevIL.hs +125/−0
- Image/DevIL/Base.hsc +205/−0
- LICENSE +30/−0
- Setup.hs +2/−0
- repa-devil.cabal +63/−0
+ Data/Array/Repa/IO/DevIL.hs view
@@ -0,0 +1,125 @@+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++-- |+-- Module : Data/Array/Repa/IO/DevIL.hs+-- Copyright : (c) Don Stewart 2011+--+-- License : BSD3+--+-- Maintainer: Don Stewart <dons00@gmail.com>+-- Stability : provisional+-- Portability: Repa interface to the DevIL image loading library.+--+-- Read and write images in many formats, representing them in Haskell+-- as a 3-dimensional /repa/ array. Image parsing and decoding is done+-- by the /Developers Image Library/, DevIL.+--+-- * Many formats are supported, including .png, .bmp, .jpg, .tif+--+-- * Image format parsing is determined by the filepath extension type.+--+-- Example: read a .png file into a 3D repa array, and write it out as a .jpg+--+-- > main = runIL $+-- > x <- readImage "/tmp/y.png" +-- > writeImage "/tmp/x.jpg" x+--+-- Note that as DevIL is stateful, we ensure the library is initialized+-- by running image manipulation functions in the /IL/ monad, a wrapper+-- over IO that ensures the library has been initialized. It is a type+-- error to call image functions outside of the /IL/ monad.+--++module Data.Array.Repa.IO.DevIL (++ -- * The IL monad+ runIL, IL,++ -- * Image IO + readImage, writeImage+ + ) where++-- transformers+import Control.Monad.IO.Class (MonadIO(..))++-- codec-image-devil+import qualified Codec.Image.DevIL as D++-- repa+import qualified Data.Array.Repa as R+import Data.Array.Repa++-- base / arrays+import Data.Array.Base+import Data.Word++------------------------------------------------------------------------++-- | The IL monad. Provides statically-guaranteed access to an initialized IL context.+newtype IL a = IL { unIL :: IO a }+ deriving (Monad, MonadIO)++-- | Running code in the /IL/ monad. This is a simple wrapper over /IO/+-- that guarantees the DevIL library has been initialized before you run+-- functions on it.+--+runIL :: IL a -> IO a+runIL (IL a) = do+ D.ilInit+ a++-- | Reads an image into an RGBA array. Indices are (row,column,color-channel).+--+-- Example:+--+-- > main = do+-- > x <- runIL $ readImage "/tmp/x.png"+-- > .. operations on x ..+--+--+-- /Note:/ The image input type is determined by the filename extension. +--+readImage :: FilePath -> IL (R.Array DIM3 Word8)+readImage f = do+ uarr <- liftIO (D.readImage f) :: IL (UArray (Int, Int, Int) Word8)+ return $! toRepa uarr++-- | Writes an RGBA array to a file. Indices are the row, column, and color-channel.+--+-- /Note:/ The image output type is determined by the filename extension. +--+writeImage :: FilePath -> R.Array DIM3 Word8 -> IL ()+writeImage f a = do+ liftIO $ D.writeImage f (fromRepa a)++------------------------------------------------------------------------++-- lazily stream an unboxed (3d) array to a repa array+toRepa :: UArray (Int,Int,Int) Word8 -> R.Array DIM3 Word8+toRepa uarr =+ let ((ni,nj,nk),(mi, mj, mk)) = bounds uarr+ (i,j,k) = (1 + mi - ni, 1 + mj - nj, 1 + mk - nk)+ es = elems uarr+ in R.fromList (R.Z :. i :. j :. k) es++-- lazily stream a repa array to an unboxed (3d) array+fromRepa :: R.Array DIM3 Word8 -> UArray (Int,Int,Int) Word8+fromRepa arr = + let es = R.toList arr+ (R.Z :. i :. j :. k) = extent arr+ in listArray ((0,0,0), (i-1, j-1, k-1)) es++{-++TODO: O(1) conversion:++toRepa uarr@(UArray l u n arr) = undefined++ -- data UArray i e = UArray !i !i !Int ByteArray#++ -- data Vector a = Vector {-# UNPACK #-} !Int+ {-# UNPACK #-} !Int+ {-# UNPACK #-} !ByteArray+-}+
+ Image/DevIL/Base.hsc view
@@ -0,0 +1,205 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE ForeignFunctionInterface #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}++--------------------------------------------------------------------+-- |+-- Module : Data/Array/Repa/IO/DevIL/Base.hsc+-- Copyright : (c) Don Stewart 2011, Luke Palmer 2010.+--+-- License : BSD3+--+-- Maintainer: Don Stewart <dons00@gmail.com>+-- Stability : provisional+--+-- Raw FFI bindings to DevIL.+--+module Image.DevIL.Base (++ -- * Types+ ILImage ,+ ILError ,++ ILUInt,+ ILSizei,+ ILBoolean,+ ILEnum,+ ILInt,+ ILUByte,++ ImageName(..),++ -- * Functions+ ilInit,++ -- * Values+ il_type_unknown, il_bmp , il_cut , il_doom , il_doom_flat ,+ il_ico , il_jpg , il_jfif , il_ilbm , il_pcd ,+ il_pcx , il_pic , il_png , il_pnm , il_sgi ,+ il_tga , il_tif , il_chead , il_raw , il_mdl ,+ il_wal , il_lif , il_mng , il_jng , il_gif ,+ il_dds , il_dcx , il_psd , il_exif , il_psp ,+ il_pix , il_pxr , il_xpm , il_hdr , il_icns ,+ il_jp2 , il_exr , il_wdp , il_vtf , il_wbmp ,+ il_sun , il_iff , il_tpl , il_fits , il_dicom ,+ il_iwi , il_blp , il_ftx , il_rot , il_texture ,+ il_dpx , il_utx , il_mp3 ++ , il_no_error , il_invalid_enum , il_out_of_memory + , il_format_not_supported , il_internal_error , il_invalid_value + , il_illegal_operation , il_illegal_file_value , il_invalid_file_header + , il_invalid_param , il_could_not_open_file , il_invalid_extension + , il_file_already_exists , il_out_format_same , il_stack_overflow + , il_stack_underflow , il_invalid_conversion , il_bad_dimensions + , il_file_read_error , il_file_write_error , il_lib_gif_error + , il_lib_jpeg_error , il_lib_png_error , il_lib_tiff_error + , il_lib_mng_error , il_lib_jp2_error , il_lib_exr_error + , il_unknown_error ++ ) where++import Foreign+import Foreign.Ptr+import Foreign.C.Types+import Foreign.C.String++#include "IL/il.h"++-- Documentation from: <http://openil.sourceforge.net/docs/DevIL%20Manual.pdf>+--+-- You must initialize DevIL, or it will most certainly crash. You need to+-- initialize each library (il, ilu, and ilut) separately. You do not need+-- to initialize libraries you are not using, but keep in mind that the+-- higher level libraries are dependent on the lower ones. ++-- Design: an /unforgeable/ token (ala the mersenne-random package):++------------------------------------------------------------------------+-- Bindings++-- Initialization ++-- | Initialize DevIL. Must be done prior to other calls.+ilInit :: IO ()+ilInit = c_ilInit++foreign import ccall "ilInit"+ c_ilInit :: IO ()++foreign import ccall "ilOriginFunc"+ c_ilOriginFunc :: ILenum -> IO ILboolean++foreign import ccall "ilEnable"+ c_ilEnableC :: ILenum -> IO ILboolean+++-- Names++type ILUInt = #type ILuint+type ILSizei = #type ILsizei+type ILBoolean = #type ILboolean+type ILEnum = #type ILenum+type ILInt = #type ILint+type ILUByte = #type ILubyte++-- | Image names are DevIL’s way of keeping track of images it is currently containing. +newtype ImageName = ImageName { fromImageName :: ILUInt }++------------------------------------------------------------------------+-- Enumeration types++-- | Image types+type ILImage = CInt++-- Image types+#{enum ILImage,+ , il_type_unknown = IL_TYPE_UNKNOWN + , il_bmp = IL_BMP + , il_cut = IL_CUT + , il_doom = IL_DOOM + , il_doom_flat = IL_DOOM_FLAT + , il_ico = IL_ICO + , il_jpg = IL_JPG + , il_jfif = IL_JFIF + , il_ilbm = IL_ILBM + , il_pcd = IL_PCD + , il_pcx = IL_PCX + , il_pic = IL_PIC + , il_png = IL_PNG + , il_pnm = IL_PNM + , il_sgi = IL_SGI + , il_tga = IL_TGA + , il_tif = IL_TIF + , il_chead = IL_CHEAD + , il_raw = IL_RAW + , il_mdl = IL_MDL + , il_wal = IL_WAL + , il_lif = IL_LIF + , il_mng = IL_MNG + , il_jng = IL_JNG + , il_gif = IL_GIF + , il_dds = IL_DDS + , il_dcx = IL_DCX + , il_psd = IL_PSD + , il_exif = IL_EXIF + , il_psp = IL_PSP + , il_pix = IL_PIX + , il_pxr = IL_PXR + , il_xpm = IL_XPM + , il_hdr = IL_HDR + , il_icns = IL_ICNS + , il_jp2 = IL_JP2 + , il_exr = IL_EXR + , il_wdp = IL_WDP + , il_vtf = IL_VTF + , il_wbmp = IL_WBMP + , il_sun = IL_SUN + , il_iff = IL_IFF + , il_tpl = IL_TPL + , il_fits = IL_FITS + , il_dicom = IL_DICOM + , il_iwi = IL_IWI + , il_blp = IL_BLP + , il_ftx = IL_FTX + , il_rot = IL_ROT + , il_texture = IL_TEXTURE + , il_dpx = IL_DPX + , il_utx = IL_UTX + , il_mp3 = IL_MP3 + , il_jasc_pal = IL_JASC_PAL+ }++-- | Error Types+type ILError = CInt++#{enum ILError,+ , il_no_error = IL_NO_ERROR + , il_invalid_enum = IL_INVALID_ENUM + , il_out_of_memory = IL_OUT_OF_MEMORY + , il_format_not_supported = IL_FORMAT_NOT_SUPPORTED + , il_internal_error = IL_INTERNAL_ERROR + , il_invalid_value = IL_INVALID_VALUE + , il_illegal_operation = IL_ILLEGAL_OPERATION + , il_illegal_file_value = IL_ILLEGAL_FILE_VALUE + , il_invalid_file_header = IL_INVALID_FILE_HEADER + , il_invalid_param = IL_INVALID_PARAM + , il_could_not_open_file = IL_COULD_NOT_OPEN_FILE + , il_invalid_extension = IL_INVALID_EXTENSION + , il_file_already_exists = IL_FILE_ALREADY_EXISTS + , il_out_format_same = IL_OUT_FORMAT_SAME + , il_stack_overflow = IL_STACK_OVERFLOW + , il_stack_underflow = IL_STACK_UNDERFLOW + , il_invalid_conversion = IL_INVALID_CONVERSION + , il_bad_dimensions = IL_BAD_DIMENSIONS + , il_file_read_error = IL_FILE_READ_ERROR + , il_file_write_error = IL_FILE_WRITE_ERROR + , il_lib_gif_error = IL_LIB_GIF_ERROR + , il_lib_jpeg_error = IL_LIB_JPEG_ERROR + , il_lib_png_error = IL_LIB_PNG_ERROR + , il_lib_tiff_error = IL_LIB_TIFF_ERROR + , il_lib_mng_error = IL_LIB_MNG_ERROR + , il_lib_jp2_error = IL_LIB_JP2_ERROR + , il_lib_exr_error = IL_LIB_EXR_ERROR + , il_unknown_error = IL_UNKNOWN_ERROR + }+
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c)2011, Don Stewart++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Don Stewart nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ repa-devil.cabal view
@@ -0,0 +1,63 @@+Name: repa-devil+Version: 0.1+Synopsis: Support for image reading and writing of Repa arrays++Description: The repa-image library adds support for reading and+ writing images in many formats based on the DevIL+ open source image library. Image data is represented in Haskell+ as typed, multi-dimensional repa arrays.+ .+ Developer\'s Image Library (DevIL) is a library to+ develop applications with very powerful image+ loading capabilities, yet with a relatively simple+ interface. DevIL can load, save, convert,+ manipulate, filter and display a wide variety of+ image formats, including:+ . + * BMP, ICO, JPG, PNG, PNM, TGA, TIF, GIF, EXIF and many more.+ .+ /References:/+ .+ * <http://hackage.haskell.org/package/repa>+ .+ * <http://openil.sourceforge.net/>+ .+ * <http://www.haskell.org/haskellwiki/Numeric_Haskell:_A_Repa_Tutorial>++Homepage: http://code.haskell.org/~dons/code/repa-devil+License: BSD3+License-file: LICENSE+Author: Don Stewart+Maintainer: dons00@gmail.com+Copyright: Don Stewart (c) 2011+Category: Data Structures+Build-type: Simple+Cabal-version: >=1.6++Library+ Exposed-modules: +-- Note: future versions will use their own binding+-- Image.DevIL.Base+ Data.Array.Repa.IO.DevIL+ + -- Packages needed in order to build this package.+ Build-depends: + base >= 3 && < 5,+ array >= 0.3 && < 0.4, + repa >= 2 && < 2.1,+ Codec-Image-DevIL >= 0.2 && < 0.3,+ transformers >= 0.2 && < 0.3+ + Build-tools:+ hsc2hs+ + Extensions:+ CPP,+ ForeignFunctionInterface++-- Extra-Libraries: IL++source-repository head+ type: darcs+ location: http://code.haskell.org/~dons/code/repa-devil+