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