X-Git-Url: http://gitweb.michael.orlitzky.com/?a=blobdiff_plain;f=src%2FMRI.hs;h=5cca1aed9ffcd2ab9250cd5883326fd45a59f087;hb=1ea61681483c8402faf572c8c853ba086b622ffe;hp=094991c2dac537b38e18bd992b7dfe90737ea726;hpb=3544d15ebbd0176c9aac2fd0e0e94468abc56879;p=spline3.git diff --git a/src/MRI.hs b/src/MRI.hs index 094991c..5cca1ae 100644 --- a/src/MRI.hs +++ b/src/MRI.hs @@ -66,7 +66,8 @@ type ColorData sh = Array U sh RGB read_word16s :: FilePath -> IO RawData3D read_word16s path = do arr <- R.readArrayFromStorableFile path mri_shape - now $ R.copyS arr + c <- R.copyP arr + now $ c @@ -87,7 +88,7 @@ flip16 xx = {-# INLINE swap_bytes #-} -swap_bytes :: (Shape sh, Repr r Word16) => Array r sh Word16 +swap_bytes :: (Shape sh, Source r Word16) => Array r sh Word16 -> Array D sh Word16 swap_bytes = R.map flip16 @@ -104,13 +105,13 @@ round_array = R.map round -flip_y :: Repr r Word16 => Array r DIM3 Word16 -> Array D DIM3 Word16 +flip_y :: Source r Word16 => Array r DIM3 Word16 -> Array D DIM3 Word16 flip_y arr = R.unsafeTraverse arr id (\get (Z :. z :. y :. x) -> get (Z :. z :. (mri_height - 1) - y :. x)) -flip_x :: Repr r Word16 => Array r DIM3 Word16 -> Array D DIM3 Word16 +flip_x :: Source r Word16 => Array r DIM3 Word16 -> Array D DIM3 Word16 flip_x arr = R.unsafeTraverse arr id (\get (Z :. z :. y :. x) -> @@ -123,9 +124,13 @@ write_word16s = R.writeArrayToStorableFile -values_to_colors :: (Shape sh) => (Values sh) -> (ColorData sh) +-- +-- Instead of IO, we could get away with a generic monad 'm' +-- here. However, /we/ only call this function from within IO. +-- +values_to_colors :: (Shape sh) => (Values sh) -> IO (ColorData sh) values_to_colors arr = - R.computeS $ R.map (truncate_rgb . ramp_it) arr + R.computeUnboxedP $ R.map (truncate_rgb . ramp_it) arr where ramp_it :: Double -> (Double, Double, Double) ramp_it x = @@ -143,14 +148,15 @@ values_to_colors arr = b' = truncate (b * 255) -z_slice :: (R.Unbox a, Repr r a) => Int -> Array r DIM3 a -> Array D DIM2 a +z_slice :: (R.Unbox a, Source r a) => Int -> Array r DIM3 a -> Array D DIM2 a z_slice n arr = slice arr (Any :. n :. All :. All) write_values_slice_to_bitmap :: Values2D -> FilePath -> IO () -write_values_slice_to_bitmap v3d path = +write_values_slice_to_bitmap v3d path = do + values <- R.computeUnboxedP $ R.map fromIntegral arr_bracketed + colors <- values_to_colors $ values R.writeImageToBMP path colors where arr_bracketed = bracket_array v3d - colors = values_to_colors $ R.computeS $ R.map fromIntegral arr_bracketed