1 | 1 patch for repository /home/cdsmith/gloss-head-tmp: |
---|
2 | |
---|
3 | Sun Aug 7 21:45:09 MDT 2011 Chris Smith <cdsmith@gmail.com> |
---|
4 | * Add BMP file loader |
---|
5 | |
---|
6 | New patches: |
---|
7 | |
---|
8 | [Add BMP file loader |
---|
9 | Chris Smith <cdsmith@gmail.com>**20110808034509 |
---|
10 | Ignore-this: dbe9f2941ebccf3844cd0b768c35c5df |
---|
11 | ] hunk ./library/Graphics/Gloss/Data/Picture.hs 15 |
---|
12 | , pictures |
---|
13 | |
---|
14 | -- * Miscellaneous |
---|
15 | + , loadBMPFile |
---|
16 | , lineLoop |
---|
17 | , circleSolid |
---|
18 | |
---|
19 | hunk ./library/Graphics/Gloss/Data/Picture.hs 26 |
---|
20 | import Graphics.Gloss.Data.Color |
---|
21 | import Graphics.Gloss.Data.Point |
---|
22 | import Graphics.Gloss.Data.Vector |
---|
23 | +import Control.Monad |
---|
24 | import Data.Monoid |
---|
25 | hunk ./library/Graphics/Gloss/Data/Picture.hs 28 |
---|
26 | -import Data.ByteString |
---|
27 | + |
---|
28 | +import Data.ByteString (ByteString) |
---|
29 | +import qualified Data.ByteString as B |
---|
30 | |
---|
31 | |
---|
32 | -- | A path through the x-y plane. |
---|
33 | hunk ./library/Graphics/Gloss/Data/Picture.hs 127 |
---|
34 | pictures = Pictures |
---|
35 | |
---|
36 | |
---|
37 | +-- BMP file loader ------------------------------------------------------------ |
---|
38 | +-- | An IO action that loads a BMP format file from the given path, and |
---|
39 | +-- produces a picture. |
---|
40 | +loadBMPFile :: FilePath -> IO Picture |
---|
41 | +loadBMPFile fname = do |
---|
42 | + bs <- B.readFile fname |
---|
43 | + when (not (isBmp bs)) $ error (fname ++ ": not a bmp file" ) |
---|
44 | + when (bpp bs < 32) $ error (fname ++ ": must be saved in 32-bit RGBA format" ) |
---|
45 | + when (comp bs /= 0) $ error (fname ++ ": must be saved in uncompressed format") |
---|
46 | + return (Bitmap (width bs) (height bs) (dat bs)) |
---|
47 | + where range s n bs = B.unpack (B.take n (B.drop s bs)) |
---|
48 | + littleEndian ds = sum [ fromIntegral b * 256^k | (b,k) <- zip ds [(0 :: Int) ..] ] |
---|
49 | + isBmp bs = littleEndian (range 0 2 bs) == (19778 :: Int) |
---|
50 | + pxOff bs = littleEndian (range 10 4 bs) :: Int |
---|
51 | + width bs = littleEndian (range 18 4 bs) :: Int |
---|
52 | + height bs = littleEndian (range 22 4 bs) :: Int |
---|
53 | + bpp bs = littleEndian (range 28 2 bs) :: Int |
---|
54 | + comp bs = littleEndian (range 30 4 bs) :: Int |
---|
55 | + dat bs = swapRB (B.take (4 * width bs * height bs) |
---|
56 | + (B.drop (pxOff bs) bs)) |
---|
57 | + swapRB bs |
---|
58 | + | B.null bs = B.empty |
---|
59 | + | otherwise = let [b,g,r,a] = B.unpack (B.take 4 bs) |
---|
60 | + in B.pack [r,g,b,a] `B.append` swapRB (B.drop 4 bs) |
---|
61 | + |
---|
62 | + |
---|
63 | -- Shapes ---------------------------------------------------------------------------------------- |
---|
64 | -- | A closed loop along this path. |
---|
65 | lineLoop :: Path -> Picture |
---|
66 | |
---|
67 | Context: |
---|
68 | |
---|
69 | [fix typo in docs |
---|
70 | Chris Smith <cdsmith@gmail.com>**20110805043827 |
---|
71 | Ignore-this: 5eaa3e5393395f8d976fb104aec34715 |
---|
72 | ] |
---|
73 | [add circleSolid to export list |
---|
74 | Chris Smith <cdsmith@gmail.com>**20110808024148 |
---|
75 | Ignore-this: 62b8f994bd9f7a85fee0eb0524e84cb8 |
---|
76 | ] |
---|
77 | [Add circleSolid |
---|
78 | Chris Smith <cdsmith@gmail.com>**20110805044049 |
---|
79 | Ignore-this: 1d64f38f77e704a85eabdf21afcac0cb |
---|
80 | ] |
---|
81 | [TAG Release 1.3.3.1 |
---|
82 | Ben Lippmeier <benl@ouroborus.net>**20110803064127 |
---|
83 | Ignore-this: 66231bcec657fe6c21bb62dfe0dad8bf |
---|
84 | ] |
---|
85 | Patch bundle hash: |
---|
86 | 5871429b1e30cb8988b490c99dc8e6e945d2d8d1 |
---|