diff options
Diffstat (limited to 'compiler/src/FileProcessors.hs')
-rw-r--r-- | compiler/src/FileProcessors.hs | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/compiler/src/FileProcessors.hs b/compiler/src/FileProcessors.hs index 6e1738e..78e7351 100644 --- a/compiler/src/FileProcessors.hs +++ b/compiler/src/FileProcessors.hs | |||
@@ -100,17 +100,35 @@ type FileDescriber a = | |||
100 | 100 | ||
101 | getImageResolution :: FilePath -> IO Resolution | 101 | getImageResolution :: FilePath -> IO Resolution |
102 | getImageResolution fsPath = | 102 | getImageResolution fsPath = |
103 | readProcess "magick" ["identify", "-format", "%w %h", firstFrame] [] | 103 | readProcess "magick" |
104 | >>= parseResolution . break (== ' ') | 104 | [ "identify" |
105 | , "-ping" | ||
106 | , "-format", "%[orientation] %w %h" | ||
107 | , firstFrame | ||
108 | ] [] | ||
109 | >>= parseOutput . words | ||
110 | |||
105 | where | 111 | where |
106 | firstFrame :: FilePath | 112 | firstFrame :: FilePath |
107 | firstFrame = fsPath ++ "[0]" | 113 | firstFrame = fsPath ++ "[0]" |
108 | 114 | ||
115 | -- Flip the dimensions when necessary according to the metadata. | ||
116 | -- ImageMagick's `-auto-orient` flag does the same, but isn't compatible | ||
117 | -- with `-ping` and causes the whole image file to be loaded. | ||
118 | parseOutput :: [String] -> IO Resolution | ||
119 | parseOutput ["RightTop", w, h] = parseResolution (h, w) | ||
120 | parseOutput ["LeftBottom", w, h] = parseResolution (h, w) | ||
121 | parseOutput [_, w, h] = parseResolution (w, h) | ||
122 | parseOutput _ = throwIO failedRead | ||
123 | |||
109 | parseResolution :: (String, String) -> IO Resolution | 124 | parseResolution :: (String, String) -> IO Resolution |
110 | parseResolution (widthString, heightString) = | 125 | parseResolution (widthString, heightString) = |
111 | case (readMaybe widthString, readMaybe heightString) of | 126 | case (readMaybe widthString, readMaybe heightString) of |
112 | (Just w, Just h) -> return $ Resolution w h | 127 | (Just w, Just h) -> return $ Resolution w h |
113 | _ -> throwIO $ ProcessingException fsPath "Unable to read image resolution." | 128 | _ -> throwIO failedRead |
129 | |||
130 | failedRead :: ProcessingException | ||
131 | failedRead = ProcessingException fsPath "Unable to read image resolution." | ||
114 | 132 | ||
115 | resourceAt :: FileDescriber Resource | 133 | resourceAt :: FileDescriber Resource |
116 | resourceAt resPath fsPath = Resource resPath <$> getModificationTime fsPath | 134 | resourceAt resPath fsPath = Resource resPath <$> getModificationTime fsPath |