module Graphics.PS.Paper where

-- http://www.cl.cam.ac.uk/~mgk25/iso-paper.html

-- | Paper size data type.
data Paper = Paper { width :: Int
                   , height :: Int } 
             deriving (Eq, Show)

-- | Swap width and height.
landscape :: Paper -> Paper
landscape (Paper w h) = Paper h w

-- | A div variant that rounds rather than truncates.
divRound :: Int -> Int -> Int
divRound x y = 
    let x' = (fromIntegral x)::Double
        y' = (fromIntegral y)::Double
    in round (x' / y')

-- | ISO size downscaling.
iso_down_scale :: Paper -> Paper
iso_down_scale (Paper w h) = Paper (h `divRound` 2) w

-- | ISO A sizes in millimeters.
a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 :: Paper
a0 = Paper 841 1189
a1 = iso_down_scale a0
a2 = iso_down_scale a1
a3 = iso_down_scale a2
a4 = iso_down_scale a3
a5 = iso_down_scale a4
a6 = iso_down_scale a5
a7 = iso_down_scale a6
a8 = iso_down_scale a7
a9 = iso_down_scale a8
a10 = iso_down_scale a9

-- | ISO B sizes in millimeters.
b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10 :: Paper
b0 = Paper 1000 1414
b1 = iso_down_scale b0
b2 = iso_down_scale b1
b3 = iso_down_scale b2
b4 = iso_down_scale b3
b5 = iso_down_scale b4
b6 = iso_down_scale b5
b7 = iso_down_scale b6
b8 = iso_down_scale b7
b9 = iso_down_scale b8
b10 = iso_down_scale b9

-- | ISO C sizes in millimeters.
c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10 :: Paper
c0 = Paper 917 1297
c1 = iso_down_scale c0
c2 = iso_down_scale c1
c3 = iso_down_scale c2
c4 = iso_down_scale c3
c5 = iso_down_scale c4
c6 = iso_down_scale c5
c7 = iso_down_scale c6
c8 = iso_down_scale c7
c9 = iso_down_scale c8
c10 = iso_down_scale c9

-- | US Letter size in millimeters.
usLetter :: Paper
usLetter = Paper 216 279