diff --git a/Graphics/PDF.hs b/Graphics/PDF.hs
--- a/Graphics/PDF.hs
+++ b/Graphics/PDF.hs
@@ -2,7 +2,7 @@
 {-# LANGUAGE BangPatterns #-}
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
@@ -293,10 +293,8 @@
 pdfByteString :: PDFDocumentInfo
               -> PDFRect -- ^ Default size for a page
               -> PDF a  -- ^ PDF action 
-              -> IO (B.ByteString) 
-pdfByteString infos rect m = do 
-    let content = createObjectByteStrings (defaultPdfSettings {defaultRect = rect, docInfo = infos} ) m
-    return content
+              -> B.ByteString
+pdfByteString infos rect m = createObjectByteStrings (defaultPdfSettings {defaultRect = rect, docInfo = infos} ) m
 
 -- | Generates a PDF document
 runPdf :: String -- ^ Name of the PDF document
@@ -305,7 +303,7 @@
        -> PDF a  -- ^ PDF action 
        -> IO ()
 runPdf filename infos rect m = do
-  bytestring <- pdfByteString infos rect m 
+  let bytestring = pdfByteString infos rect m 
   B.writeFile filename bytestring
 
 
diff --git a/Graphics/PDF/Action.hs b/Graphics/PDF/Action.hs
--- a/Graphics/PDF/Action.hs
+++ b/Graphics/PDF/Action.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Annotation.hs b/Graphics/PDF/Annotation.hs
--- a/Graphics/PDF/Annotation.hs
+++ b/Graphics/PDF/Annotation.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Colors.hs b/Graphics/PDF/Colors.hs
--- a/Graphics/PDF/Colors.hs
+++ b/Graphics/PDF/Colors.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Coordinates.hs b/Graphics/PDF/Coordinates.hs
--- a/Graphics/PDF/Coordinates.hs
+++ b/Graphics/PDF/Coordinates.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Data/Trie.hs b/Graphics/PDF/Data/Trie.hs
--- a/Graphics/PDF/Data/Trie.hs
+++ b/Graphics/PDF/Data/Trie.hs
@@ -1,7 +1,7 @@
 {-# LANGUAGE CPP #-}
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Document.hs b/Graphics/PDF/Document.hs
--- a/Graphics/PDF/Document.hs
+++ b/Graphics/PDF/Document.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Draw.hs b/Graphics/PDF/Draw.hs
--- a/Graphics/PDF/Draw.hs
+++ b/Graphics/PDF/Draw.hs
@@ -7,7 +7,7 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Hyphenate.hs b/Graphics/PDF/Hyphenate.hs
--- a/Graphics/PDF/Hyphenate.hs
+++ b/Graphics/PDF/Hyphenate.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Hyphenate/English.hs b/Graphics/PDF/Hyphenate/English.hs
--- a/Graphics/PDF/Hyphenate/English.hs
+++ b/Graphics/PDF/Hyphenate/English.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Hyphenate/LowLevel.hs b/Graphics/PDF/Hyphenate/LowLevel.hs
--- a/Graphics/PDF/Hyphenate/LowLevel.hs
+++ b/Graphics/PDF/Hyphenate/LowLevel.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Image.hs b/Graphics/PDF/Image.hs
--- a/Graphics/PDF/Image.hs
+++ b/Graphics/PDF/Image.hs
@@ -5,7 +5,7 @@
 {-# LANGUAGE ScopedTypeVariables #-}
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
@@ -21,12 +21,14 @@
      PDFJpeg
    , JpegFile
    , RawImage
+   , PDFFilter(..)
    -- ** Functions
    , createPDFJpeg
    , readJpegFile
    , jpegBounds
-   , createPDFRawImage
    , readJpegDataURL
+   , createPDFRawImageFromARGB
+   , createPDFRawImageFromByteString
  ) where
      
 import Graphics.PDF.LowLevel.Types
@@ -58,7 +60,20 @@
 #if __GLASGOW_HASKELL__ < 710
 import Control.Applicative
 #endif
+import Control.Error.Util (note)
 
+-- | A Jpeg file   
+data JpegFile = JpegFile !Int !Int !Int !Int !Builder
+
+data PDFFilter = ASCIIHexDecode
+               | ASCII85Decode
+               | LZWDecode
+               | FlateDecode
+               | RunLengthDecode
+               | CCITTFaxDecode
+               | DCTDecode 
+               | NoFilter
+
 m_sof0 :: Int
 m_sof0 = 0xc0 
 m_sof1 :: Int 
@@ -245,7 +260,7 @@
                io $ hSeek h RelativeSeek (fromIntegral (l-2))
                parseJpegContent h
 
-analyzeJpeg :: Handle -> FA (Int,PDFFloat,PDFFloat,Int)
+analyzeJpeg :: Handle -> FA (Int,Int,Int,Int)
 analyzeJpeg h = do
     -- Get Length
     io $ hSeek h SeekFromEnd 0
@@ -269,7 +284,7 @@
     --io $ print color_space
     --io $ hClose h
     unless (color_space `elem` [1,3,4]) $ EXC.throwError "Color space not supported"
-    return (bits_per_component,(fromIntegral height),(fromIntegral width),color_space)
+    return (bits_per_component,height,width,color_space)
     
 --test = analyzePng "Test/logo.png"
     
@@ -292,7 +307,7 @@
          Left s -> return $ Left s) `E.catch` (\(err :: IOException) -> return $ Left (show err)) 
 
 -- | Get the JPEG bounds
-jpegBounds :: JpegFile -> (PDFFloat,PDFFloat)
+jpegBounds :: JpegFile -> (Int,Int)
 jpegBounds (JpegFile _ w h _ _) = (w,h)
 
 -- | Use an abstract description of a Jpeg to return a PDFReference that can be used to manipulate the Jpeg in the context
@@ -301,7 +316,7 @@
               -> PDF (PDFReference PDFJpeg)
 createPDFJpeg (JpegFile bits_per_component width height color_space img) = do
         PDFReference s <- createContent a' Nothing  
-        recordBound s width height
+        recordBound s (fromIntegral width) (fromIntegral height)
         return (PDFReference s) 
     where
        color c = case c of
@@ -315,8 +330,8 @@
                  do modifyStrict $ \s -> s  {otherRsrcs = PDFDictionary. M.fromList $ 
                                                    [ (PDFName "Type",AnyPdfObject . PDFName $ "XObject")
                                                    , (PDFName "Subtype",AnyPdfObject . PDFName $ "Image")
-                                                   , (PDFName "Width",AnyPdfObject . PDFInteger $ round width)
-                                                   , (PDFName "Height",AnyPdfObject . PDFInteger $ round height)
+                                                   , (PDFName "Width",AnyPdfObject . PDFInteger $ width)
+                                                   , (PDFName "Height",AnyPdfObject . PDFInteger $ height)
                                                    , (PDFName "BitsPerComponent",AnyPdfObject . PDFInteger $ bits_per_component)
                                                    , (PDFName "Interpolate", AnyPdfObject True)
                                                    , (PDFName "Filter",AnyPdfObject . PDFName $ "DCTDecode")
@@ -324,15 +339,49 @@
                                              }
                     tell img        
         
-createPDFRawImage :: Double -- ^ Width
-                  -> Double -- ^ Height
-                  -> Bool -- ^ Interpolation
-                  -> U.Vector Word32 -- ^ RGBA pixels (A component not used y the PDF document)
-                  -> PDF (PDFReference RawImage)  
-createPDFRawImage width height interpolate stream =  do
+createPDFRawImageFromByteString :: Int -- ^ Width
+                                -> Int -- ^ Height
+                                -> Bool -- ^ Interpolation
+                                -> PDFFilter -- ^ Decompression filter to be sued by the PDF reader to render the picture
+                                -> B.ByteString -- ^ RGB pixels
+                                -> PDF (PDFReference RawImage)  
+createPDFRawImageFromByteString width height interpolate pdfFilter stream =  do
         PDFReference s <- createContent a' Nothing  
-        recordBound s width height
+        recordBound s (fromIntegral width) (fromIntegral height)
         return (PDFReference s) 
+    where     
+        getFilter = case pdfFilter of 
+                    NoFilter -> []
+                    ASCIIHexDecode -> [(PDFName "Filter",AnyPdfObject . PDFName $ "ASCIIHexDecode")]
+                    ASCII85Decode -> [(PDFName "Filter",AnyPdfObject . PDFName $ "ASCII85Decode")]
+                    LZWDecode -> [(PDFName "Filter",AnyPdfObject . PDFName $ "LZWDecode")]
+                    FlateDecode -> [(PDFName "Filter",AnyPdfObject . PDFName $ "FlateDecode")]
+                    RunLengthDecode -> [(PDFName "Filter",AnyPdfObject . PDFName $ "RunLengthDecode")]
+                    CCITTFaxDecode -> [(PDFName "Filter",AnyPdfObject . PDFName $ "CCITTFaxDecode")]
+                    DCTDecode -> [(PDFName "Filter",AnyPdfObject . PDFName $ "DCTDecode")]
+
+        a' =  do 
+                modifyStrict $ \s -> s  {otherRsrcs = PDFDictionary. M.fromList $ 
+                                                   [ (PDFName "Type",AnyPdfObject . PDFName $ "XObject")
+                                                   , (PDFName "Subtype",AnyPdfObject . PDFName $ "Image")
+                                                   , (PDFName "Width",AnyPdfObject . PDFInteger $ width)
+                                                   , (PDFName "Height",AnyPdfObject . PDFInteger $ height)
+                                                   , (PDFName "BitsPerComponent",AnyPdfObject . PDFInteger $ 8)
+                                                   , (PDFName "ColorSpace",AnyPdfObject $ PDFName "DeviceRGB")
+                                                   , (PDFName "Interpolate", AnyPdfObject interpolate)
+                                                   ] ++ getFilter
+                                             }
+                tell . fromLazyByteString $ stream
+
+createPDFRawImageFromARGB :: Int -- ^ Width
+                          -> Int -- ^ Height
+                          -> Bool -- ^ Interpolation
+                          -> U.Vector Word32 -- ^ ARGB pixels (A component not used y the PDF document)
+                          -> PDF (PDFReference RawImage)  
+createPDFRawImageFromARGB width height interpolate stream =  do
+        PDFReference s <- createContent a' Nothing  
+        recordBound s (fromIntegral width) (fromIntegral height)
+        return (PDFReference s) 
     where
         addPixel (a:t) =  
            let xa = fromIntegral $ (a `shiftR` 16) .&. 0x0FF
@@ -346,8 +395,8 @@
                 modifyStrict $ \s -> s  {otherRsrcs = PDFDictionary. M.fromList $ 
                                                    [ (PDFName "Type",AnyPdfObject . PDFName $ "XObject")
                                                    , (PDFName "Subtype",AnyPdfObject . PDFName $ "Image")
-                                                   , (PDFName "Width",AnyPdfObject . PDFInteger $ round width)
-                                                   , (PDFName "Height",AnyPdfObject . PDFInteger $ round height)
+                                                   , (PDFName "Width",AnyPdfObject . PDFInteger $  width)
+                                                   , (PDFName "Height",AnyPdfObject . PDFInteger $  height)
                                                    , (PDFName "BitsPerComponent",AnyPdfObject . PDFInteger $ 8)
                                                    , (PDFName "ColorSpace",AnyPdfObject $ PDFName "DeviceRGB")
                                                    , (PDFName "Interpolate", AnyPdfObject interpolate)
@@ -356,8 +405,6 @@
                 tell . fromLazyByteString . B.pack . addPixel . U.toList $ stream  
 
 -- Read Jpeg from ByteString
--- These two functions bother me.  They could throw an exception if the incoming data is invalid...
-
 sIndex :: C8.ByteString -> Int -> Maybe Char
 sIndex bs idx = 
   if (idx < 0) || (idx > C8.length bs)
@@ -365,82 +412,66 @@
   else Just $ bs `C8.index` idx
 
 sReadWord8 :: C8.ByteString -> Int -> Maybe Int
-sReadWord8 bs idx = 
-  case mlo of
-    Nothing -> Nothing
-    Just lo -> Just (fromEnum . ord $ lo)
-  where mlo = bs `sIndex` idx
+sReadWord8 bs idx = (fromEnum . ord) <$> (bs `sIndex` idx)
 
 sReadWord16 :: C8.ByteString -> Int -> Maybe Int
-sReadWord16 bs idx = 
-  case (sequence [mhi,mlo]) of
-    Nothing -> Nothing
-    Just [hi,lo] -> Just $ ((fromEnum hi) `shiftL` 8) .|. (fromEnum . ord $ lo)
-    Just _ -> Nothing
-  where mhi = bs `sIndex` idx
-        mlo = bs `sIndex` (idx + 1)
+sReadWord16 bs idx = do
+  hi <- sReadWord8 bs idx
+  lo <- sReadWord8 bs (idx + 1)
+  return $ (hi `shiftL` 8) .|. lo
 
 parseJpegDetailData :: C8.ByteString -> Int -> Maybe (Int,Int,Int,Int)
-parseJpegDetailData bs offset = 
-  let m_bits_per_component = sReadWord8 bs (offset + 4)
-      m_height = sReadWord16 bs (offset + 5)
-      m_width = sReadWord16 bs (offset + 7)
-      m_color_space = sReadWord8 bs (offset + 9)
-  in case (sequence [m_bits_per_component, m_height, m_width, m_color_space]) of
-    Nothing -> Nothing
-    Just [bits_per_component, height, width, color_space] -> Just (bits_per_component, height, width, color_space)
-    Just _ -> Nothing
+parseJpegDetailData bs offset = do
+  bpc <- sReadWord8  bs (offset + 4)
+  hgt <- sReadWord16 bs (offset + 5)
+  wdt <- sReadWord16 bs (offset + 7)
+  cls <- sReadWord8  bs (offset + 9)
+  return (bpc, hgt, wdt, cls)
 
+(?|) :: Maybe b -> a -> Either a b
+(?|) = flip note
+
 parseJpegContentData :: C8.ByteString -> Int -> Either String (Int,Int,Int,Int)
-parseJpegContentData bs offset = 
-  let msof = sReadWord8 bs (offset + 1)
-      ml = sReadWord16 bs (offset + 2)
-  in case (sequence [msof, ml]) of
-    Nothing -> Left "Corrupt JPEG data URL"
-    Just [sof, l] -> case sof of
-                       a | a `elem` [m_sof5,m_sof6,m_sof7,m_sof9,m_sof10,m_sof11,m_sof13,m_sof14,m_sof15] -> Left "Unuspported compression mode"
-                         | a `elem` [m_sof0,m_sof1,m_sof3] -> case (parseJpegDetailData bs offset) of
-                                                                Nothing -> Left "Corrupt JPEG data URL"
-                                                                Just d -> Right d
-                         | a `elem` [m_soi,m_eoi,m_tem,m_rst0,m_rst1,m_rst2,m_rst3,m_rst4,m_rst5,m_rst6,m_rst7] -> parseJpegContentData bs (offset + 2)
-                         | otherwise -> parseJpegContentData bs (offset + l + 2)
-    Just _ -> Left "Corrupt JPEG data URL"
+parseJpegContentData bs offset = do
+  r <- sReadWord8 bs offset ?| "Corrupt JPEG data URL - no marker found"
+  guard (r == 0x0FF) ?| "Corrupt JPEG data URL - no marker found"
+  sof <- (sReadWord8 bs (offset + 1)) ?| "Corrupt JPEG data URL - no start of file offset found"
+  case sof of
+    a | a `elem` [m_sof5,m_sof6,m_sof7,m_sof9,m_sof10,m_sof11,m_sof13,m_sof14,m_sof15] -> Left "Unsupported compression mode"
+      | a `elem` [m_sof0,m_sof1,m_sof3] -> (parseJpegDetailData bs offset) ?| "Corrupt JPEG data URL - insufficient data in URL"
+      | a `elem` [m_soi,m_eoi,m_tem,m_rst0,m_rst1,m_rst2,m_rst3,m_rst4,m_rst5,m_rst6,m_rst7] -> parseJpegContentData bs (offset + 2)
+      | otherwise -> do 
+          l <- (sReadWord16 bs (offset + 2)) ?| "Corrupt JPEG data URL - insufficient data in URL"
+          parseJpegContentData bs (offset + l + 2)
 
-analyzeJpegData :: C8.ByteString -> Either String (Int,PDFFloat,PDFFloat,Int)
-analyzeJpegData bs =
-  let mheader = sReadWord16 bs 0
-  in case mheader of
-    Nothing -> Left "Not a JPEG data URL"
-    Just header -> if (header /= 0x0FFD8) 
-                   then Left "Not a JPEG data URL"
-                   else let jpegData = parseJpegContentData bs 0
-                        in case jpegData of
-                          Right (bits_per_component,height,width,color_space) -> if (color_space `elem` [1,3,4])
-                                                                                 then Right (bits_per_component,(fromIntegral height),(fromIntegral width),color_space)
-                                                                                 else Left "Color space not supported"
-                          Left err -> Left err
+checkColorSpace :: (Int,Int,Int,Int) -> Either String (Int,Int,Int,Int)
+checkColorSpace hdrData@(_,_,_,color_space) = do
+  guard (color_space `elem` [1,3,4]) ?| ("Color space [" ++ show color_space ++ "] not supported")
+  return hdrData
 
+analyzeJpegData :: C8.ByteString -> Either String (Int,Int,Int,Int)
+analyzeJpegData bs = do
+  header <- sReadWord16 bs 0 ?| "Not a JPEG data URL - no marker found"
+  guard (header == 0x0FFD8) ?| "Not a JPEG data URL - invalid JPEG marker" 
+  hdrData <- parseJpegContentData bs 0
+  checkColorSpace hdrData
+
 readJpegData :: String -> Either String JpegFile
-readJpegData dataString = 
-  case (decode $ C8.pack dataString) of
-    Left err -> Left err
-    Right bs -> 
-      let jpegData = analyzeJpegData bs
-      in case jpegData of
-           Left err -> Left err
-           Right (bits_per_component,height,width,color_space) -> Right $ JpegFile bits_per_component width height color_space (fromByteString bs) 
+readJpegData dataString = do
+  bs <- decode $ C8.pack dataString
+  (bits_per_component,height,width,color_space) <- analyzeJpegData bs
+  return $ JpegFile bits_per_component width height color_space (fromByteString bs) 
 
 -- | Reads a data URL string, and returns a JpegFile.
 -- The incoming string must be a correctly formatted data URL for a JPEG.
 -- You can convert jpeg files to data URLs at the following web site:
 -- http://dataurl.net/#dataurlmaker
 readJpegDataURL :: String -> Either String JpegFile
-readJpegDataURL dataurl = if (take 23 dataurl /= "data:image/jpeg;base64,")
-                          then Left "Data URL does not start with a valid JPEG header"
-                          else readJpegData $ drop 23 dataurl   
+readJpegDataURL dataurl = do
+  guard (take 23 dataurl == "data:image/jpeg;base64,") ?| "Data URL does not start with a valid JPEG header"
+  readJpegData $ drop 23 dataurl   
 
--- | A Jpeg file   
-data JpegFile = JpegFile !Int !PDFFloat !PDFFloat !Int !Builder
+
      
 -- | A Jpeg PDF object
 data PDFJpeg
diff --git a/Graphics/PDF/LowLevel/Serializer.hs b/Graphics/PDF/LowLevel/Serializer.hs
--- a/Graphics/PDF/LowLevel/Serializer.hs
+++ b/Graphics/PDF/LowLevel/Serializer.hs
@@ -5,7 +5,7 @@
 {-# LANGUAGE FlexibleInstances #-}
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/LowLevel/Types.hs b/Graphics/PDF/LowLevel/Types.hs
--- a/Graphics/PDF/LowLevel/Types.hs
+++ b/Graphics/PDF/LowLevel/Types.hs
@@ -6,7 +6,7 @@
 {-# LANGUAGE GeneralizedNewtypeDeriving #-}
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Navigation.hs b/Graphics/PDF/Navigation.hs
--- a/Graphics/PDF/Navigation.hs
+++ b/Graphics/PDF/Navigation.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Pages.hs b/Graphics/PDF/Pages.hs
--- a/Graphics/PDF/Pages.hs
+++ b/Graphics/PDF/Pages.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Pattern.hs b/Graphics/PDF/Pattern.hs
--- a/Graphics/PDF/Pattern.hs
+++ b/Graphics/PDF/Pattern.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Resources.hs b/Graphics/PDF/Resources.hs
--- a/Graphics/PDF/Resources.hs
+++ b/Graphics/PDF/Resources.hs
@@ -2,7 +2,7 @@
 {-# LANGUAGE FlexibleInstances #-}
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Shading.hs b/Graphics/PDF/Shading.hs
--- a/Graphics/PDF/Shading.hs
+++ b/Graphics/PDF/Shading.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Shapes.hs b/Graphics/PDF/Shapes.hs
--- a/Graphics/PDF/Shapes.hs
+++ b/Graphics/PDF/Shapes.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Text.hs b/Graphics/PDF/Text.hs
--- a/Graphics/PDF/Text.hs
+++ b/Graphics/PDF/Text.hs
@@ -4,7 +4,7 @@
 {-# LANGUAGE DeriveFunctor #-}
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Typesetting.hs b/Graphics/PDF/Typesetting.hs
--- a/Graphics/PDF/Typesetting.hs
+++ b/Graphics/PDF/Typesetting.hs
@@ -6,7 +6,7 @@
 {-# LANGUAGE DeriveFunctor #-}
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Typesetting/Box.hs b/Graphics/PDF/Typesetting/Box.hs
--- a/Graphics/PDF/Typesetting/Box.hs
+++ b/Graphics/PDF/Typesetting/Box.hs
@@ -3,7 +3,7 @@
 {-# LANGUAGE FlexibleInstances #-}
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Typesetting/Breaking.hs b/Graphics/PDF/Typesetting/Breaking.hs
--- a/Graphics/PDF/Typesetting/Breaking.hs
+++ b/Graphics/PDF/Typesetting/Breaking.hs
@@ -3,7 +3,7 @@
 {-# LANGUAGE FlexibleInstances #-}
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Typesetting/Horizontal.hs b/Graphics/PDF/Typesetting/Horizontal.hs
--- a/Graphics/PDF/Typesetting/Horizontal.hs
+++ b/Graphics/PDF/Typesetting/Horizontal.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Typesetting/Layout.hs b/Graphics/PDF/Typesetting/Layout.hs
--- a/Graphics/PDF/Typesetting/Layout.hs
+++ b/Graphics/PDF/Typesetting/Layout.hs
@@ -2,7 +2,7 @@
 {-# LANGUAGE FunctionalDependencies #-}
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Typesetting/StandardStyle.hs b/Graphics/PDF/Typesetting/StandardStyle.hs
--- a/Graphics/PDF/Typesetting/StandardStyle.hs
+++ b/Graphics/PDF/Typesetting/StandardStyle.hs
@@ -1,7 +1,7 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/Graphics/PDF/Typesetting/Vertical.hs b/Graphics/PDF/Typesetting/Vertical.hs
--- a/Graphics/PDF/Typesetting/Vertical.hs
+++ b/Graphics/PDF/Typesetting/Vertical.hs
@@ -1,6 +1,6 @@
 ---------------------------------------------------------
 -- |
--- Copyright   : (c) 2006-2012, alpheccar.org
+-- Copyright   : (c) 2006-2016, alpheccar.org
 -- License     : BSD-style
 --
 -- Maintainer  : misc@NOSPAMalpheccar.org
diff --git a/HPDF.cabal b/HPDF.cabal
--- a/HPDF.cabal
+++ b/HPDF.cabal
@@ -1,9 +1,9 @@
 Name: HPDF
-Version: 1.4.8
-cabal-version: >=1.6
+Version: 1.4.9
+cabal-version: >=1.10
 License: BSD3
 License-file:LICENSE
-Copyright: Copyright (c) 2007-2015, alpheccar.org
+Copyright: Copyright (c) 2007-2016, alpheccar.org
 category: Graphics
 synopsis: Generation of PDF documents
 maintainer: misc@NOSPAMalpheccar.org
@@ -28,6 +28,15 @@
 source-repository head
   type:     git
   location: https://github.com/alpheccar/HPDF.git
+
+Test-Suite HPDF-Tests
+  Type:              exitcode-stdio-1.0
+  Main-is:           HPDF-tests.hs
+  hs-source-dirs:    Test
+  Build-depends:     base >= 4, 
+                     HTF >= 0.10,
+                     HPDF
+  Default-language:  Haskell2010
   
 library
   build-depends: 
@@ -40,8 +49,10 @@
       binary >= 0.4, 
       mtl,
       vector >=0.10,
+      errors,
       base64-bytestring >= 0.1
-  
+  Default-language:  Haskell2010
+
   ghc-options: -Wall -fno-warn-tabs -funbox-strict-fields  -O2
 
   C-Sources:  
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-* Copyright (c) 2006-2013, alpheccar.org
+* Copyright (c) 2006-2016, alpheccar.org
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
diff --git a/NEWS.txt b/NEWS.txt
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -1,14 +1,1 @@
-WHAT'S NEW IN HPDF 1.4
-======================
-Lot's of contributions from Leon Smith ! Thank you. Here is a summary:
-
-A - Changes by Leon
-===================
-1 - Huge speed improvement of the draw monad ;
-2 - New implementation of shapes (Rectangle, curveto, arcto, point datatype) ;
-3 - Cleaning of the API (coordinates, shapes) ;
-
-B - Changes by alpheccar
-=========================
-1 - Lots of bug corrections for typesetting ;
-2 - An API to draw text boxes 
+Added travis and stack.
diff --git a/TODO.txt b/TODO.txt
--- a/TODO.txt
+++ b/TODO.txt
@@ -1,14 +1,1 @@
-BUGS TO CORRECT
-===============
-
-* Line formatting sometimes broken when there is a break on an hyphen in all modes except the fully justified one ;
-* Break on - will generate two hyphens (end of line and start of next line) ;
-* Wrong metric for ( and ) ;
-
-FEATURES TO ADD
-===============
-* Constraint programming ;
-* Combinator interface to specify the layout of complex documents ;
-* Support for other fonts an encoding ;
-* Support for PNG ;
-* Support for inclusion of other PDF files ;
+The MAIN missing feature is the support for unicode and the bidirectionnal layout algorithm that will then be required.
diff --git a/Test/HPDF-tests.hs b/Test/HPDF-tests.hs
new file mode 100644
--- /dev/null
+++ b/Test/HPDF-tests.hs
@@ -0,0 +1,27 @@
+{-# OPTIONS_GHC -F -pgmF htfpp #-}
+{-# LANGUAGE OverloadedStrings #-}
+module Main where
+
+import Test.Framework
+import Data.Either (isRight)
+
+import Graphics.PDF.Image(JpegFile, readJpegDataURL, jpegBounds)
+
+main = htfMain htf_thisModulesTests
+
+raw_jpeg :: String
+raw_jpeg = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4RDcRXhpZgAATU0AKgAAAAgABAE7AAIAAAAGAAAISodpAAQAAAABAAAIUJydAAEAAAAMAAAQyOocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNjb3R0AAAFkAMAAgAAABQAABCekAQAAgAAABQAABCykpEAAgAAAAMwNwAAkpIAAgAAAAMwNwAA6hwABwAACAwAAAiSAAAAABzqAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMjAxNDoxMjowNiAwOTo0Mzo1MQAyMDE0OjEyOjA2IDA5OjQzOjUxAAAAUwBjAG8AdAB0AAAA/+ELGGh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+PHhtcDpDcmVhdGVEYXRlPjIwMTQtMTItMDZUMDk6NDM6NTEuMDcyPC94bXA6Q3JlYXRlRGF0ZT48L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJkZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOmxpPlNjb3R0PC9yZGY6bGk+PC9yZGY6U2VxPg0KCQkJPC9kYzpjcmVhdG9yPjwvcmRmOkRlc2NyaXB0aW9uPjwvcmRmOlJERj48L3g6eG1wbWV0YT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0ndyc/Pv/bAEMABwUFBgUEBwYFBggHBwgKEQsKCQkKFQ8QDBEYFRoZGBUYFxseJyEbHSUdFxgiLiIlKCkrLCsaIC8zLyoyJyorKv/bAEMBBwgICgkKFAsLFCocGBwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKv/AABEIABMAEwMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAAAAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEUMoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUGBwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS8BVictEKFiQ04SXxFxgZGiYnKCkqNTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqCg4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2dri4+Tl5ufo6ery8/T19vf4+fr/2gAMAwEAAhEDEQA/APoH+3tJOvf2INRtjqnlecbMSDzAn97b1xXB/Er4rN4ev4fC3g62Gr+Lb0hIbZBuW2z/ABSe+OcenJwOvi3xBk8W+G/2l9SufCVrO+qaioWzxCX8xXhVSy54O0g89AV56V7d8J/hVD4FspNT1iX+0PE2oAveXrtvKZOSik84z1PVj+ApRXPFSe3X/L/Njk+WTS36f5v9Ed7pS3q6PZrqzRvfiBBctEPlMm0biPbOaKtUVTd3clKysIVBYMQMjocdKWiikMKKKKAP/9k="
+raw_jpeg_bounds :: (Double, Double)
+raw_jpeg_bounds = (19, 19)
+
+jpg :: JpegFile
+jpg = jpegFile
+    where Right jpegFile = readJpegDataURL raw_jpeg
+
+test_decodeTick :: IO()
+test_decodeTick = case (readJpegDataURL raw_jpeg) of
+                    Right _ -> assertBool True 
+                    Left msg -> assertEqual "Error:" msg
+
+test_bounds :: IO()
+test_bounds =  assertEqual raw_jpeg_bounds (jpegBounds jpg)
diff --git a/Test/test.hs b/Test/test.hs
--- a/Test/test.hs
+++ b/Test/test.hs
@@ -144,7 +144,7 @@
                    | i < 2*nb*(3*nb) = 0x0000FF00
                    | otherwise = 0x000000FF
         pixels = U.generate (9*nb*nb) getPixel
-    jpg <- createPDFRawImage (fromIntegral $ 3*nb) (fromIntegral $ 3*nb) True pixels
+    jpg <- createPDFRawImageFromARGB (fromIntegral $ 3*nb) (fromIntegral $ 3*nb) True pixels
     drawWithPage page $ do
       withNewContext $ do
           setFillAlpha 0.4
diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,4 +1,4 @@
 HPDF 1.4.8 (released 2015-09-04)
-	* Building on GHC 7.10 and GHC 7.8.4 
+    * Building on GHC 7.10 and GHC 7.8.4 
     * Parsing of JPEG data URLs by Scott Sedgwick
     
