aboutsummaryrefslogtreecommitdiffstats
path: root/src/Main.hs
blob: 3b3d263a8bfa4816ac73623f8f4bab55bdaf9995 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
module Main where

import           Data.Bifunctor       (Bifunctor, bimap)
import qualified Data.ByteString      as B
import qualified Data.ByteString.Lazy as BL
import qualified Data.Text            as T
import           Data.Word            (Word8)
import           PFM

newtype Vec = Vec { unVec :: (Int, Int, Int) }

clamp :: PFMColour -> PPMColour
clamp (PFMColour ri gi bi) =
  PPMColour (f ri) (f gi) (f bi)
  where
    v s = s * 255.0
    f s = if v s > 255.0 then 255 else fromInteger (round (v s))
clamp _ = undefined

clampImage :: PFMImage -> PPMImage
clampImage (PFMImage w h c) =
  PPMImage w h . reverse $ fmap clamp <$> c

bmap :: (Bifunctor f) => (a -> b) -> f a a -> f b b
bmap f = bimap f f

toCircle :: Int -> [[(Int, Int)]] -> [[PFMColour]]
toCircle v m =
  fmap toCol <$> m
  where
    toCol val = if dist val <= v ^ (2 :: Int)
      then PFMColour 1.0 0.5 0.5
      else PFMColour 0.5 0.5 1.0
    dist = add . bmap ((^(2 :: Int)) . (v-))
    add (an, bn) = an + bn

circleImage :: Int -> PFMImage
circleImage s = PFMImage s s $ toCircle ((s - 1) `div` 2)
  [ [ (y, x) | x <- [0..s-1] ] | y <- [0..s-1] ]

main :: IO ()
main = do
  -- s <- B.readFile "/home/yannherklotz/Imperial/AdvancedGraphics/coursework1/CO417-Assignment1/UrbanProbe/urbanEM_latlong.pfm"
  s <- B.readFile "/home/yannherklotz/Downloads/memorial.pfm"
  -- BL.writeFile "random.ppm" . encodePPM . clampImage . parse $ s
  BL.writeFile "circle.ppm" . encodePPM . clampImage $ circleImage 511