packages feed

hoodle-render 0.2.1 → 0.3

raw patch · 14 files changed

+443/−307 lines, 14 filesdep +monad-loopsdep +unixdep +uuiddep −TypeComposedep ~hoodle-typesPVP ok

version bump matches the API change (PVP)

Dependencies added: monad-loops, unix, uuid

Dependencies removed: TypeCompose

Dependency ranges changed: hoodle-types

API changes (from Hackage documentation)

- Graphics.Hoodle.Render: renderBkg_InBBox :: Maybe BBox -> Dimension -> Background -> Render ()
- Graphics.Hoodle.Render.Debug: renderBkg_InBBox :: Maybe BBox -> Dimension -> Background -> Render ()
- Graphics.Hoodle.Render.Generic: instance RenderOptionable StrokeBBox
- Graphics.Hoodle.Render.Generic: instance Renderable StrokeBBox
- Graphics.Hoodle.Render.Type.Background: bkg2RBkg :: Background -> RBackground
- Graphics.Hoodle.Render.Type.Item: instance BBoxable RItem
+ Graphics.Hoodle.Render.Background: cnstrctRBkg_StateT :: Dimension -> Background -> StateT (Maybe Context) IO RBackground
+ Graphics.Hoodle.Render.Background: getByteStringIfEmbeddedPDF :: ByteString -> Maybe ByteString
+ Graphics.Hoodle.Render.Background: popplerGetDocFromDataURI :: ByteString -> IO (Maybe Document)
+ Graphics.Hoodle.Render.Background: popplerGetDocFromFile :: ByteString -> IO (Maybe Document)
+ Graphics.Hoodle.Render.Background: popplerGetPageFromDoc :: Document -> Int -> IO (Maybe Page, Maybe Surface)
+ Graphics.Hoodle.Render.Background: renderBkg :: (Background, Dimension) -> Render ()
+ Graphics.Hoodle.Render.Generic: instance RenderOptionable (BBoxed Stroke)
+ Graphics.Hoodle.Render.Generic: instance Renderable (BBoxed Stroke)
+ Graphics.Hoodle.Render.Highlight: renderBBoxHltd :: GetBBoxable a => a -> Render ()
+ Graphics.Hoodle.Render.Type.Background: RBkgEmbedPDF :: Int -> Maybe Page -> Maybe Surface -> RBackground
+ Graphics.Hoodle.Render.Type.Background: ctxt_embeddeddoc :: Context -> Maybe Document
+ Graphics.Hoodle.Render.Type.HitTest: instance Functor Hitted
+ Graphics.Hoodle.Render.Type.HitTest: instance Functor NotHitted
+ Graphics.Hoodle.Render.Type.Item: RItemLink :: (BBoxed Link) -> (Maybe SVG) -> RItem
+ Graphics.Hoodle.Render.Type.Item: instance GetBBoxable RItem
+ Graphics.Hoodle.Render.Type.Item: isLinkInRItem :: RItem -> Bool
+ Hoodle.Util.Process: checkPipe :: FilePath -> IO ()
+ Hoodle.Util.Process: existThenRemove :: FilePath -> IO ()
+ Hoodle.Util.Process: mkTmpFileName :: IO FilePath
+ Hoodle.Util.Process: pipeAction :: IO () -> (ByteString -> IO a) -> IO a
+ Hoodle.Util.Process: pipeActionWith :: IO () -> (FilePath -> IO a) -> IO a
- Graphics.Hoodle.Render.Debug: renderImgBBx_BBoxOnly :: ImageBBox -> Render ()
+ Graphics.Hoodle.Render.Debug: renderImgBBx_BBoxOnly :: BBoxed Image -> Render ()
- Graphics.Hoodle.Render.Debug: renderStrkBBx_BBoxOnly :: StrokeBBox -> Render ()
+ Graphics.Hoodle.Render.Debug: renderStrkBBx_BBoxOnly :: BBoxed Stroke -> Render ()
- Graphics.Hoodle.Render.Highlight: renderStrkHltd :: StrokeBBox -> Render ()
+ Graphics.Hoodle.Render.Highlight: renderStrkHltd :: BBoxed Stroke -> Render ()
- Graphics.Hoodle.Render.Type.Background: Context :: ByteString -> ByteString -> Maybe () -> Context
+ Graphics.Hoodle.Render.Type.Background: Context :: ByteString -> ByteString -> Maybe Document -> Maybe Document -> Context
- Graphics.Hoodle.Render.Type.Background: RBkgPDF :: Maybe ByteString -> Maybe ByteString -> Int -> Maybe () -> Maybe Surface -> RBackground
+ Graphics.Hoodle.Render.Type.Background: RBkgPDF :: Maybe ByteString -> ByteString -> Int -> Maybe Page -> Maybe Surface -> RBackground
- Graphics.Hoodle.Render.Type.Background: ctxt_doc :: Context -> Maybe ()
+ Graphics.Hoodle.Render.Type.Background: ctxt_doc :: Context -> Maybe Document
- Graphics.Hoodle.Render.Type.Background: rbkg_filename :: RBackground -> Maybe ByteString
+ Graphics.Hoodle.Render.Type.Background: rbkg_filename :: RBackground -> ByteString
- Graphics.Hoodle.Render.Type.Background: rbkg_popplerpage :: RBackground -> Maybe ()
+ Graphics.Hoodle.Render.Type.Background: rbkg_popplerpage :: RBackground -> Maybe Page
- Graphics.Hoodle.Render.Type.HitTest: type StrokeHitted = AlterList (NotHitted StrokeBBox) (Hitted StrokeBBox)
+ Graphics.Hoodle.Render.Type.HitTest: type StrokeHitted = AlterList (NotHitted (BBoxed Stroke)) (Hitted (BBoxed Stroke))
- Graphics.Hoodle.Render.Type.Item: RItemImage :: ImageBBox -> (Maybe Surface) -> RItem
+ Graphics.Hoodle.Render.Type.Item: RItemImage :: (BBoxed Image) -> (Maybe Surface) -> RItem
- Graphics.Hoodle.Render.Type.Item: RItemSVG :: SVGBBox -> (Maybe SVG) -> RItem
+ Graphics.Hoodle.Render.Type.Item: RItemSVG :: (BBoxed SVG) -> (Maybe SVG) -> RItem
- Graphics.Hoodle.Render.Type.Item: RItemStroke :: StrokeBBox -> RItem
+ Graphics.Hoodle.Render.Type.Item: RItemStroke :: (BBoxed Stroke) -> RItem
- Graphics.Hoodle.Render.Type.Item: findImgInRItem :: RItem -> Maybe ImageBBox
+ Graphics.Hoodle.Render.Type.Item: findImgInRItem :: RItem -> Maybe (BBoxed Image)
- Graphics.Hoodle.Render.Type.Item: findSVGInRItem :: RItem -> Maybe SVGBBox
+ Graphics.Hoodle.Render.Type.Item: findSVGInRItem :: RItem -> Maybe (BBoxed SVG)
- Graphics.Hoodle.Render.Type.Item: findStrkInRItem :: RItem -> Maybe StrokeBBox
+ Graphics.Hoodle.Render.Type.Item: findStrkInRItem :: RItem -> Maybe (BBoxed Stroke)
- Graphics.Hoodle.Render.Util.HitTest: elimHitted :: BBoxable a => AlterList (NotHitted a) (Hitted a) -> State (Maybe BBox) [a]
+ Graphics.Hoodle.Render.Util.HitTest: elimHitted :: GetBBoxable a => AlterList (NotHitted a) (Hitted a) -> State (Maybe BBox) [a]
- Graphics.Hoodle.Render.Util.HitTest: getTotalBBox :: BBoxable a => [a] -> Maybe BBox
+ Graphics.Hoodle.Render.Util.HitTest: getTotalBBox :: GetBBoxable a => [a] -> Maybe BBox
- Graphics.Hoodle.Render.Util.HitTest: hltEmbeddedByBBox :: BBoxable a => BBox -> [a] -> AlterList (NotHitted a) (Hitted a)
+ Graphics.Hoodle.Render.Util.HitTest: hltEmbeddedByBBox :: GetBBoxable a => BBox -> [a] -> AlterList (NotHitted a) (Hitted a)
- Graphics.Hoodle.Render.Util.HitTest: hltHittedByBBox :: BBoxable a => BBox -> [a] -> AlterList (NotHitted a) (Hitted a)
+ Graphics.Hoodle.Render.Util.HitTest: hltHittedByBBox :: GetBBoxable a => BBox -> [a] -> AlterList (NotHitted a) (Hitted a)
- Graphics.Hoodle.Render.Util.HitTest: hltHittedByLineRough :: BBoxable a => ((Double, Double), (Double, Double)) -> [a] -> AlterList (NotHitted a) (Hitted a)
+ Graphics.Hoodle.Render.Util.HitTest: hltHittedByLineRough :: GetBBoxable a => ((Double, Double), (Double, Double)) -> [a] -> AlterList (NotHitted a) (Hitted a)

Files

hoodle-render.cabal view
@@ -1,5 +1,5 @@ Name:		hoodle-render-Version:	0.2.1+Version:	0.3 Synopsis:       Hoodle file renderer Description: 	Rendering library using cairo for hoodle file format License: 	BSD3@@ -14,9 +14,9 @@   type: git   location: http://www.github.com/wavewave/hoodle-render -Flag Poppler-  Description: Enable poppler support-  Default:     False+-- Flag Poppler+--   Description: Enable poppler support+--   Default:     False  Library   hs-source-dirs: src@@ -34,14 +34,18 @@                  bytestring >= 0.9,                  base64-bytestring >= 0.1,                   lens >= 2.5, -                 hoodle-types >= 0.1.1,-                 TypeCompose == 0.9.*, -                 gd >= 3000.7 +                 hoodle-types >= 0.2,+                 gd >= 3000.7, +                 unix >= 2.5,+                 uuid >= 1.2, +                 monad-loops >= 0.3,  +                 -- hoodle-common >= 0.1,+                 poppler >= 0.12.2.2 -  if flag(poppler)-    Build-Depends: poppler >= 0.12.2.2-  else -    Build-Depends: +--   if flag(poppler)+--    Build-Depends: poppler >= 0.12.2.2+--  else +--     Build-Depends:     Exposed-Modules:                     Graphics.Hoodle.Render @@ -59,5 +63,7 @@                    Graphics.Hoodle.Render.Type.Select                    Graphics.Hoodle.Render.Util                    Graphics.Hoodle.Render.Util.HitTest-  if flag(poppler)-    cpp-options: -DPOPPLER+                   Hoodle.Util.Process++--  if flag(poppler)+--    cpp-options: -DPOPPLER
src/Graphics/Hoodle/Render.hs view
@@ -25,7 +25,7 @@ , renderItem  , renderPage -- * render in bbox using non R-structure -, renderBkg_InBBox+-- , renderBkg_InBBox -- * simple rendering using R-structure  , renderRBkg , renderRItem @@ -47,21 +47,21 @@ ) where  import           Control.Lens (view,set)+import           Control.Monad.Identity (runIdentity) import           Control.Monad.State hiding (mapM,mapM_) import qualified Data.ByteString.Char8 as C import           Data.Foldable import           Data.Traversable (mapM)-import qualified Data.Map as M-import           Data.Monoid+-- import qualified Data.Map as M+-- import           Data.Monoid import           Graphics.Rendering.Cairo -- from hoodle-platform -import Data.Hoodle.Generic-import Data.Hoodle.Simple-import Data.Hoodle.BBox-import Data.Hoodle.Predefined -#ifdef POPPLER+import           Data.Hoodle.Generic+import           Data.Hoodle.Simple+import           Data.Hoodle.BBox+import           Data.Hoodle.Predefined +import           Data.Hoodle.Zipper  import qualified Graphics.UI.Gtk.Poppler.Page as PopplerPage-#endif import qualified Graphics.Rendering.Cairo.SVG as RSVG -- from this package -- import Graphics.Hoodle.Render.Simple @@ -114,13 +114,13 @@       rectangle x y w h       stroke --- | render svg : not fully implemented +-- | render svg   renderSVG :: SVG -> Render ()  renderSVG svg@(SVG _ _ bstr _ _) = do       let str = C.unpack bstr      RSVG.withSvgFromString str $ \rsvg -> do -      let svgbbx = mkSVGBBox svg-      let (x,y) = (svg_pos . svgbbx_svg) svgbbx+      let svgbbx = runIdentity (makeBBoxed svg)+      let (x,y) = (svg_pos . bbxed_content) svgbbx           BBox (x1,y1) (x2,y2) = getBBox svgbbx           (ix',iy') = RSVG.svgGetSize rsvg           ix = fromIntegral ix' @@ -134,28 +134,34 @@       resetClip        return ()  +-- | render svg  +renderLink :: Link -> Render () +renderLink lnk = do  +    let bstr = link_render lnk +    let str = C.unpack bstr +    RSVG.withSvgFromString str $ \rsvg -> do +      let lnkbbx = runIdentity (makeBBoxed lnk)+      let (x,y) = (link_pos . bbxed_content) lnkbbx+          BBox (x1,y1) (x2,y2) = getBBox lnkbbx+          (ix',iy') = RSVG.svgGetSize rsvg+          ix = fromIntegral ix' +          iy = fromIntegral iy'+      clipBBox (Just (getBBox lnkbbx))+      save +      translate x y +      scale ((x2-x1)/ix) ((y2-y1)/iy)+      RSVG.svgRender rsvg +      restore+      resetClip +      return ()  + -- | render item  renderItem :: Item -> Render ()  renderItem (ItemStroke strk) = renderStrk strk renderItem (ItemImage img) = renderImg img renderItem (ItemSVG svg) = renderSVG svg---- | render background without any constraint -renderBkg :: (Background,Dimension) -> Render () -renderBkg (Background _typ col sty,Dim w h) = do -    let c = M.lookup col predefined_bkgcolor  -    case c of -      Just (r,g,b,_a) -> setSourceRGB r g b -      Nothing        -> setSourceRGB 1 1 1 -    rectangle 0 0 w h -    fill-    drawRuling w h sty-renderBkg (BackgroundPdf _ _ _ _,Dim w h) = do -    setSourceRGBA 1 1 1 1-    rectangle 0 0 w h -    fill-+renderItem (ItemLink lnk) = renderLink lnk  -- | renderPage :: Page -> Render ()@@ -166,73 +172,63 @@   mapM_ (mapM renderItem . view items) . view layers $ page   stroke ---- --- non-R but in bbox ----  ---- | render Background in BBox -renderBkg_InBBox :: Maybe BBox -> Dimension -> Background -> Render ()-renderBkg_InBBox mbbox dim@(Dim w h) (Background typ col sty) = do -    let mbbox2 = toMaybe $ fromMaybe mbbox `mappend` (Intersect (Middle (dimToBBox dim)))-    case mbbox2 of -      Nothing -> renderBkg (Background typ col sty,Dim w h)-      Just bbox@(BBox (x1,y1) (x2,y2)) -> do -        let c = M.lookup col predefined_bkgcolor  -        case c of -          Just (r,g,b,_a) -> setSourceRGB r g b -          Nothing        -> setSourceRGB 1 1 1 -        rectangle x1 y1 (x2-x1) (y2-y1)-        fill-        drawRuling_InBBox bbox w h sty-renderBkg_InBBox _ _  (BackgroundPdf _ _ _ _) = -    error "BackgroundPdf in renderBkg_InBBox"- ----- -- R-structure  ----  -- |  renderRBkg :: (RBackground,Dimension) -> Render (RBackground,Dimension)-renderRBkg (r@(RBkgSmpl _ _ _),dim) = renderBkg (rbkg2Bkg r,dim) >> return (r,dim)-renderRBkg (r@(RBkgPDF _ _ _ p _),dim) = do-  case p of -    Nothing -> return () -    Just pg -> do +renderRBkg (r,dim) = +    case r of +      (RBkgSmpl _ _ _) -> +        drawBkgAndRecord (renderBkg (rbkg2Bkg r,dim))+        -- renderBkg (rbkg2Bkg r,dim) >> return (r,dim)+      (RBkgPDF _ _ _ p _) -> +        maybe (return (r,dim)) +              (\pg -> drawBkgAndRecord (bkgPdfRender pg)) p+      (RBkgEmbedPDF _ p _) -> +        maybe (return (r,dim)) +              (\pg -> drawBkgAndRecord (bkgPdfRender pg)) p +  where +    drawBkgAndRecord rdr = do +      rdr +      case rbkg_cairosurface r of+        Nothing -> return ()+        Just sfc -> liftIO $ renderWith sfc rdr+      return (r,dim)+    bkgPdfRender pg = do        let Dim w h = dim        setSourceRGBA 1 1 1 1       rectangle 0 0 w h        fill-#ifdef POPPLER       PopplerPage.pageRender pg-#endif     -  return (r,dim)  ++ -- | renderRItem :: RItem -> Render RItem  -renderRItem itm@(RItemStroke strk) = renderStrk (strkbbx_strk strk) >> return itm+renderRItem itm@(RItemStroke strk) = renderStrk (bbxed_content strk) >> return itm renderRItem itm@(RItemImage img msfc) = do     case msfc of-    Nothing -> renderImg (imgbbx_img img)+    Nothing -> renderImg (bbxed_content img)     Just sfc -> do -      let (x,y) = (img_pos . imgbbx_img) img+      let (x,y) = (img_pos . bbxed_content) img           BBox (x1,y1) (x2,y2) = getBBox img       ix <- liftM fromIntegral (imageSurfaceGetWidth sfc)       iy <- liftM fromIntegral (imageSurfaceGetHeight sfc)-      -- clipBBox (Just (getBBox img))       save        translate x y        scale ((x2-x1)/ix) ((y2-y1)/iy)       setSourceSurface sfc 0 0        paint        restore-      -- resetClip    return itm  renderRItem itm@(RItemSVG svgbbx mrsvg) = do    case mrsvg of-    Nothing -> renderSVG (svgbbx_svg svgbbx)+    Nothing -> renderSVG (bbxed_content svgbbx)     Just rsvg -> do -      let (x,y) = (svg_pos . svgbbx_svg) svgbbx+      let (x,y) = (svg_pos . bbxed_content) svgbbx           BBox (x1,y1) (x2,y2) = getBBox svgbbx           (ix',iy') = RSVG.svgGetSize rsvg           ix = fromIntegral ix' @@ -244,12 +240,29 @@       RSVG.svgRender rsvg        restore       resetClip -       return () -   return itm +renderRItem itm@(RItemLink lnkbbx mrsvg) = do +  case mrsvg of+    Nothing -> renderLink (bbxed_content lnkbbx)+    Just rsvg -> do +      let (x,y) = (link_pos . bbxed_content) lnkbbx+          BBox (x1,y1) (x2,y2) = getBBox lnkbbx+          (ix',iy') = RSVG.svgGetSize rsvg+          ix = fromIntegral ix' +          iy = fromIntegral iy'+      clipBBox (Just (getBBox lnkbbx))+      save +      translate x y +      scale ((x2-x1)/ix) ((y2-y1)/iy)+      RSVG.svgRender rsvg +      restore+      resetClip +      return () +  return itm   + ------------ -- InBBox -- ------------@@ -259,7 +272,12 @@                   -> (RBackground,Dimension)                    -> Render (RBackground,Dimension) renderRBkg_InBBox mbbox (b,dim) = do -    case b of +    clipBBox mbbox+    renderRBkg_Buf (b,dim)+    resetClip+    return (b,dim)++{-    case b of        RBkgSmpl _ _ _ -> do          clipBBox mbbox         renderRBkg_Buf (b,dim)@@ -268,13 +286,16 @@         clipBBox mbbox         renderRBkg_Buf (b,dim)         resetClip-    return (b,dim)+      RBkgEmbedPDF _ _ _ -> do +        clipBBox mbbox+        renderRBkg_Buf (b,dim)+        resetClip -}   -- | render RLayer within BBox after hittest items renderRLayer_InBBox :: Maybe BBox -> RLayer -> Render RLayer renderRLayer_InBBox mbbox layer = do  -  clipBBox mbbox +  clipBBox (fmap (flip inflate 1) mbbox)    let hittestbbox = case mbbox of          Nothing -> NotHitted []                     :- Hitted (view gitems layer) @@ -288,7 +309,7 @@     LyBuf (Just sfc) -> do        liftIO $ renderWith sfc $ do          -- renderRLayer_InBBox mbbox lyr -        clipBBox mbbox +        clipBBox (fmap (flip inflate 1) mbbox )         setSourceRGBA 0 0 0 0          setOperator OperatorSource         paint@@ -322,6 +343,13 @@           Just sfc -> do              setSourceSurface sfc 0 0              paint +      RBkgEmbedPDF _ _ msfc -> do +        case msfc of +          Nothing -> renderRBkg (b,dim) >> return ()+          Just sfc -> do +            setSourceSurface sfc 0 0 +            paint +     return (b,dim)  -- | @@ -357,15 +385,6 @@         renderRLayer_InBBox Nothing lyr       return (set gbuffer (LyBuf (Just sfc)) lyr)        -       -      -- liftIO $ putStrLn "renderRLayer_InBBoxBuf"-         -- clipBBox mbbox    -        -- setSourceSurface sfc 0 0 -        -- paint -        -- resetClip--- -- |  updatePageBuf :: RPage -> IO RPage  updatePageBuf pg = do @@ -389,11 +408,15 @@ -- | cnstrctRHoodle :: Hoodle -> IO RHoodle cnstrctRHoodle hdl = do -  let ttl = view title hdl +  let hid = view hoodleID hdl +      ttl = view title hdl        pgs = view pages hdl-  npgs <- evalStateT (mapM cnstrctRPage_StateT pgs) Nothing -  return . set gtitle ttl . set gpages (fromList npgs) $ emptyGHoodle -    +      embeddedsrc = view embeddedPdf hdl +  mdoc <- maybe (return Nothing) (\src -> liftIO $ popplerGetDocFromDataURI src)+            embeddedsrc+  npgs <- evalStateT (mapM cnstrctRPage_StateT pgs) (Just (Context "" "" Nothing mdoc)) +  return $ GHoodle hid ttl embeddedsrc (fromList npgs)          +     -- | cnstrctRPage_StateT :: Page -> StateT (Maybe Context) IO RPage@@ -401,52 +424,16 @@   let bkg = view background pg       dim = view dimension pg        lyrs = view layers pg-  nlyrs <- liftIO $ (liftM fromList . mapM cnstrctRLayer) lyrs +  nlyrs_lst <- liftIO $ mapM cnstrctRLayer lyrs+  let nlyrs_nonemptylst = if null nlyrs_lst then (emptyRLayer,[]) else (head nlyrs_lst,tail nlyrs_lst) +      nlyrs = fromNonEmptyList nlyrs_nonemptylst    nbkg <- cnstrctRBkg_StateT dim bkg-  return . set glayers nlyrs $ emptyGPage dim nbkg +  return $ GPage dim nbkg nlyrs      -+-- | cnstrctRLayer :: Layer -> IO RLayer  cnstrctRLayer lyr = do    nitms <- (mapM cnstrctRItem . view items) lyr    return (set gitems nitms emptyRLayer)                   --- |-cnstrctRBkg_StateT :: Dimension -> Background -                   -> StateT (Maybe Context) IO RBackground-cnstrctRBkg_StateT dim@(Dim w h) bkg = do  -  let rbkg = bkg2RBkg bkg-  case rbkg of -    RBkgSmpl _c _s msfc -> do -      case msfc of -        Just _ -> return rbkg-        Nothing -> do -          sfc <- liftIO $ createImageSurface FormatARGB32 (floor w) (floor h)-          renderWith sfc $ renderBkg (bkg,dim) -          return rbkg { rbkg_cairosurface = Just sfc}-    RBkgPDF md mf pn _ _ -> do -#ifdef POPPLER-      mctxt <- get -      case mctxt of-        Nothing -> do -          case (md,mf) of -            (Just d, Just f) -> do -              mdoc <- liftIO $ popplerGetDocFromFile f-              put $ Just (Context d f mdoc)-              case mdoc of -                Just doc -> do  -                  (mpg,msfc) <- liftIO $ popplerGetPageFromDoc doc pn -                  return (rbkg {rbkg_popplerpage = mpg, rbkg_cairosurface = msfc})-                Nothing -> error "no pdf doc? in mkBkgPDF"-            _ -> return rbkg -        Just (Context _oldd _oldf olddoc) -> do -          (mpage,msfc) <- case olddoc of -            Just doc -> do -              liftIO $ popplerGetPageFromDoc doc pn-            Nothing -> return (Nothing,Nothing) -          return $ RBkgPDF md mf pn mpage msfc-#else-          return rbkg-#endif  -
src/Graphics/Hoodle/Render/Background.hs view
@@ -1,10 +1,6 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE OverloadedStrings #-} --- {-# LANGUAGE ExistentialQuantification, OverloadedStrings, ---              FlexibleInstances, FlexibleContexts,  ---              TypeFamilies, CPP #-}- ----------------------------------------------------------------------------- -- | -- Module      : Graphics.Hoodle.Render.PDFBackground @@ -24,34 +20,60 @@ import           Data.Foldable (mapM_) import           Graphics.Rendering.Cairo ---#ifdef POPPLER+import qualified Data.Map as M+import           Data.ByteString.Base64  import qualified Data.ByteString.Char8 as C import           Data.Monoid import qualified Graphics.UI.Gtk.Poppler.Document as Poppler import qualified Graphics.UI.Gtk.Poppler.Page as PopplerPage-#endif -- from hoodle-platform import           Data.Hoodle.BBox import           Data.Hoodle.Predefined +import           Data.Hoodle.Simple --+import           Graphics.Hoodle.Render.Type.Background+--  import Prelude hiding (mapM_)-  -  ++{-+isPopplerEnabled :: Bool   #ifdef POPPLER+isPopplerEnabled = True +#else+isPopplerEnabled = False+#endif+-} ++-- | popplerGetDocFromFile :: ByteString -> IO (Maybe Poppler.Document) popplerGetDocFromFile fp =    Poppler.documentNewFromFile      (C.unpack ("file://localhost" `mappend` fp)) Nothing -#endif -#ifdef POPPLER             +-- |+getByteStringIfEmbeddedPDF :: ByteString -> Maybe ByteString +getByteStringIfEmbeddedPDF bstr = do +    guard (C.length bstr > 30)+    let (header,dat) = C.splitAt 30 bstr +    guard (header == "data:application/x-pdf;base64,") +    either (const Nothing) return (decode dat)++-- | +popplerGetDocFromDataURI :: ByteString -> IO (Maybe Poppler.Document) +popplerGetDocFromDataURI dat = do +  let mdecoded = getByteStringIfEmbeddedPDF dat +  case mdecoded of +    Nothing -> return Nothing +    Just decoded -> do +      C.writeFile "/tmp/popplertest.pdf" decoded +      popplerGetDocFromFile "/tmp/popplertest.pdf"+++-- | popplerGetPageFromDoc :: Poppler.Document                        -> Int -- ^ page number                        -> IO (Maybe Poppler.Page, Maybe Surface) popplerGetPageFromDoc doc pn = do   -  -- n <- Poppler.documentGetNPages doc  -  -- putStrLn $ "pages : " ++ (show n)-  -- putStrLn $ "current page = " ++ show pn   pg <- Poppler.documentGetPage doc (pn-1)    (w,h) <- PopplerPage.pageGetSize pg   sfc <- createImageSurface FormatARGB32 (floor w) (floor h)@@ -61,7 +83,6 @@     fill     PopplerPage.pageRender pg   return (Just pg, Just sfc)-#endif  -- | draw ruling all  drawRuling :: Double -> Double -> ByteString -> Render () @@ -156,5 +177,64 @@     _ -> return ()       -      +-- | render background without any constraint +renderBkg :: (Background,Dimension) -> Render () +renderBkg (Background _typ col sty,Dim w h) = do +    let c = M.lookup col predefined_bkgcolor  +    case c of +      Just (r,g,b,_a) -> setSourceRGB r g b +      Nothing        -> setSourceRGB 1 1 1 +    rectangle 0 0 w h +    fill+    drawRuling w h sty+renderBkg (BackgroundPdf _ _ _ _,Dim w h) = do +    setSourceRGBA 1 1 1 1+    rectangle 0 0 w h +    fill+renderBkg (BackgroundEmbedPdf _ _,Dim w h) = do +    setSourceRGBA 1 1 1 1+    rectangle 0 0 w h +    fill++++-- | this has some bugs. need to fix +cnstrctRBkg_StateT :: Dimension -> Background +                   -> StateT (Maybe Context) IO RBackground+cnstrctRBkg_StateT dim@(Dim w h) bkg = do  +  case bkg of +    Background _t c s -> do +      sfc <- liftIO $ createImageSurface FormatARGB32 (floor w) (floor h)+      renderWith sfc $ renderBkg (bkg,dim) +      return (RBkgSmpl c s (Just sfc))+    BackgroundPdf _t md mf pn -> do +      case (md,mf) of +        (Just d, Just f) -> do +           mdoc <- liftIO $ popplerGetDocFromFile f+           put $ Just (Context d f mdoc Nothing)+           case mdoc of +             Just doc -> do  +               (mpg,msfc) <- liftIO $ popplerGetPageFromDoc doc pn +               return (RBkgPDF md f pn mpg msfc)+             Nothing -> error "error1 in cnstrctRBkg_StateT"+        _ -> do +          mctxt <- get+          case mctxt of  +            Just (Context oldd oldf olddoc _) -> do +              (mpage,msfc) <- case olddoc of +                Just doc -> do +                  liftIO $ popplerGetPageFromDoc doc pn+                Nothing -> error "error2 in cnstrctRBkg_StateT" +              return (RBkgPDF (Just oldd) oldf pn mpage msfc)+            Nothing -> error "error3 in cnstrctRBkg_StateT" +    BackgroundEmbedPdf _ pn -> do +      mctxt <- get+      case mctxt of  +        Just (Context _ _ _ mdoc) -> do +          (mpage,msfc) <- case mdoc of +            Just doc -> do +              liftIO $ popplerGetPageFromDoc doc pn+            Nothing -> error "error4 in cnstrctRBkg_StateT" +          return (RBkgEmbedPDF pn mpage msfc)+        Nothing -> error "error5 in cnstrctRBkg_StateT"  
src/Graphics/Hoodle/Render/Debug.hs view
@@ -21,7 +21,7 @@ -- * dummy rendering    renderRBkg_Dummy   -- * render in bbox using non R-structure -, renderBkg_InBBox+-- , renderBkg_InBBox -- * nopdf , renderRBkg_NoPDF -- * render only bbox (for debug purpose)@@ -45,9 +45,6 @@ import Data.Hoodle.Simple import Data.Hoodle.BBox import Data.Hoodle.Predefined --- #ifdef POPPLER--- import qualified Graphics.UI.Gtk.Poppler.Page as PopplerPage--- #endif -- from this package import Graphics.Hoodle.Render import Graphics.Hoodle.Render.Type @@ -72,34 +69,35 @@ renderRBkg_NoPDF :: (RBackground,Dimension) -> Render () renderRBkg_NoPDF r@(RBkgSmpl _ _ _,_) = renderRBkg r >> return () renderRBkg_NoPDF (RBkgPDF _ _ _ _ _,_) = return ()+renderRBkg_NoPDF (RBkgEmbedPDF _ _ _,_) = return ()  -------------- -- BBoxOnly -- --------------  -- | render only bounding box of a StrokeBBox      -renderStrkBBx_BBoxOnly :: StrokeBBox -> Render () +renderStrkBBx_BBoxOnly :: BBoxed Stroke -> Render ()  renderStrkBBx_BBoxOnly sbbox = do  -    let s = strkbbx_strk sbbox+    let s = bbxed_content sbbox     case M.lookup (stroke_color s) predefined_pencolor of        Just (r,g,b,a) -> setSourceRGBA r g b a       Nothing -> setSourceRGBA 0 0 0 1      setSourceRGBA 0 0 0 1     setLineWidth (stroke_width s) -    let BBox (x1,y1) (x2,y2) = strkbbx_bbx sbbox+    let BBox (x1,y1) (x2,y2) = getBBox sbbox     rectangle x1 y1 (x2-x1) (y2-y1)     stroke    -- |     -renderImgBBx_BBoxOnly :: ImageBBox -> Render () +renderImgBBx_BBoxOnly :: BBoxed Image -> Render ()  renderImgBBx_BBoxOnly ibbox = do      setSourceRGBA 0 0 0 1     setLineWidth 10-    let BBox (x1,y1) (x2,y2) = imgbbx_bbx ibbox+    let BBox (x1,y1) (x2,y2) = getBBox ibbox     rectangle x1 y1 (x2-x1) (y2-y1)     stroke -renderSVGBBx_BBoxOnly :: SVGBBox -> Render () +renderSVGBBx_BBoxOnly :: BBoxed SVG -> Render ()  renderSVGBBx_BBoxOnly svg = do      setSourceRGBA 0 0 0 1     setLineWidth 10@@ -107,6 +105,14 @@     rectangle x1 y1 (x2-x1) (y2-y1)     stroke +renderLnkBBx_BBoxOnly :: BBoxed Link -> Render () +renderLnkBBx_BBoxOnly lnk = do +    setSourceRGBA 0 0 0 1+    setLineWidth 10+    let BBox (x1,y1) (x2,y2) = getBBox lnk+    rectangle x1 y1 (x2-x1) (y2-y1)+    stroke+       -- | @@ -114,6 +120,7 @@ renderRItem_BBoxOnly (RItemStroke sbbox) = renderStrkBBx_BBoxOnly sbbox renderRItem_BBoxOnly (RItemImage ibbox _) = renderImgBBx_BBoxOnly ibbox renderRItem_BBoxOnly (RItemSVG svg _) = renderSVGBBx_BBoxOnly svg+renderRItem_BBoxOnly (RItemLink lnk _) = renderLnkBBx_BBoxOnly lnk   -- | 
src/Graphics/Hoodle/Render/Generic.hs view
@@ -48,8 +48,8 @@   cairoRender = passarg renderStrk   -- | -instance Renderable StrokeBBox where-  cairoRender = passarg (renderStrk . strkbbx_strk)+instance Renderable (BBoxed Stroke) where+  cairoRender = passarg (renderStrk . bbxed_content)    -- |  instance Renderable RLayer where@@ -74,8 +74,8 @@ data StrokeBBoxOption = DrawFull | DrawBoxOnly   -- | -instance RenderOptionable StrokeBBox where-  type RenderOption StrokeBBox = StrokeBBoxOption+instance RenderOptionable (BBoxed Stroke) where+  type RenderOption (BBoxed Stroke) = StrokeBBoxOption   cairoRenderOption DrawFull = cairoRender    cairoRenderOption DrawBoxOnly = passarg renderStrkBBx_BBoxOnly   
src/Graphics/Hoodle/Render/Highlight.hs view
@@ -30,9 +30,9 @@ import Prelude hiding (fst,snd,curry,uncurry,mapM_,concatMap)  -- | -renderStrkHltd :: StrokeBBox -> Render ()+renderStrkHltd :: BBoxed Stroke -> Render () renderStrkHltd sbbox = do -    let s = strkbbx_strk sbbox +    let s = bbxed_content sbbox      case M.lookup (stroke_color s) predefined_pencolor of        Just (r,g,b,a) -> setSourceRGBA r g b a       Nothing -> setSourceRGBA 0 0 0 1 @@ -55,20 +55,36 @@         drawVWStrokeCurve d              fill     + -- | render items highlighted  renderRItemHltd :: RItem -> Render () renderRItemHltd (RItemStroke strk) = renderStrkHltd strk-renderRItemHltd (RItemImage img _) = do -  setSourceRGBA 0 0 0 1+renderRItemHltd (RItemImage img _) = renderBBoxHltd img+{-  setSourceRGBA 0 0 0 1   setLineWidth 10 -  let BBox (x1,y1) (x2,y2) = imgbbx_bbx img+  let BBox (x1,y1) (x2,y2) = getBBox img   rectangle x1 y1 (x2-x1) (y2-y1)-  stroke-renderRItemHltd (RItemSVG svg _) = do -  setSourceRGBA 0 0 0 1+  stroke -}+renderRItemHltd (RItemSVG svg _) = renderBBoxHltd svg +{-  setSourceRGBA 0 0 0 1   setLineWidth 10    let BBox (x1,y1) (x2,y2) = getBBox svg   rectangle x1 y1 (x2-x1) (y2-y1)-  stroke+  stroke -}+renderRItemHltd (RItemLink lnk _) = renderBBoxHltd lnk+{-  setSourceRGBA 0 0 0 1+  setLineWidth 10 +  let BBox (x1,y1) (x2,y2) = getBBox lnk+  rectangle x1 y1 (x2-x1) (y2-y1)+  stroke -} ++-- |+renderBBoxHltd :: (GetBBoxable a) => a -> Render () +renderBBoxHltd x = do +  setSourceRGBA 0 0 0 1+  setLineWidth 10 +  let BBox (x1,y1) (x2,y2) = getBBox x+  rectangle x1 y1 (x2-x1) (y2-y1)+  stroke 
src/Graphics/Hoodle/Render/Item.hs view
@@ -19,8 +19,10 @@  import           Control.Applicative import           Control.Monad +import           Control.Monad.Identity  import qualified Data.ByteString as B import qualified Data.ByteString.Char8 as C8+-- import qualified Data.ByteString.Lazy as LB import           Data.ByteString.Base64  import           Graphics.GD.ByteString import           Graphics.Rendering.Cairo@@ -28,17 +30,18 @@ import           System.Directory import           System.FilePath  -- from hoodle-platform -import Data.Hoodle.BBox -import Data.Hoodle.Simple+import           Data.Hoodle.BBox +import           Data.Hoodle.Simple+import           Hoodle.Util.Process  -- from this package import Graphics.Hoodle.Render.Type.Item    -- | construct renderable item  cnstrctRItem :: Item -> IO RItem -cnstrctRItem (ItemStroke strk) = return (RItemStroke (mkStrokeBBox strk))+cnstrctRItem (ItemStroke strk) = return (RItemStroke (runIdentity (makeBBoxed strk))) cnstrctRItem (ItemImage img) = do -    let imgbbx = mkImageBBox img+    let imgbbx = runIdentity (makeBBoxed img)         src = img_src img         embed = getByteStringIfEmbeddedPNG src      case embed of         @@ -49,19 +52,34 @@         let filesrc = C8.unpack (img_src img)             filesrcext = takeExtension filesrc              imgaction -              | filesrcext == ".PNG" || filesrcext == ".png" = -                  Just <$> imageSurfaceCreateFromPNG filesrc-              | filesrcext == ".JPG" || filesrcext == ".jpg" = -                  Just <$> getJPGandCreateSurface filesrc +              | filesrcext == ".PNG" || filesrcext == ".png" = do +                  b <- doesFileExist filesrc +                  if b then Just <$> imageSurfaceCreateFromPNG filesrc+                       else return Nothing +              | filesrcext == ".JPG" || filesrcext == ".jpg" = do +                  b <- doesFileExist filesrc +                  if b then Just <$> getJPGandCreateSurface filesrc +                       else return Nothing                | otherwise = return Nothing          msfc <- imgaction         return (RItemImage imgbbx msfc) cnstrctRItem (ItemSVG svg@(SVG _ _ bstr _ _)) = do      let str = C8.unpack bstr -        svgbbx = mkSVGBBox svg+        svgbbx = runIdentity (makeBBoxed svg)     rsvg <- RSVG.svgNewFromString str     return (RItemSVG svgbbx (Just rsvg))+cnstrctRItem (ItemLink lnk@(Link _ _ _ _ _ bstr _ _)) = do +    let str = C8.unpack bstr +        lnkbbx = runIdentity (makeBBoxed lnk)+    rsvg <- RSVG.svgNewFromString str+    return (RItemLink lnkbbx (Just rsvg))+cnstrctRItem (ItemLink lnk@(LinkDocID _ _ _ _ _ bstr _ _)) = do +    let str = C8.unpack bstr +        lnkbbx = runIdentity (makeBBoxed lnk)+    rsvg <- RSVG.svgNewFromString str+    return (RItemLink lnkbbx (Just rsvg))     + -- | get embedded png image. If not, just give me nothing.  getByteStringIfEmbeddedPNG :: C8.ByteString -> Maybe C8.ByteString  getByteStringIfEmbeddedPNG bstr = do @@ -82,7 +100,10 @@ -- |  saveTempPNGToCreateSurface :: C8.ByteString -> IO Surface saveTempPNGToCreateSurface bstr = do +    pipeActionWith (B.writeFile "/dev/stdout" bstr) imageSurfaceCreateFromPNG ++{-     tdir <- getTemporaryDirectory      let tfile = tdir </> "temp.png"-    B.writeFile tfile bstr      imageSurfaceCreateFromPNG tfile +-}
src/Graphics/Hoodle/Render/Type/Background.hs view
@@ -17,9 +17,7 @@  import           Data.ByteString  import           Graphics.Rendering.Cairo-#ifdef POPPLER import qualified Graphics.UI.Gtk.Poppler.Document as Poppler-#endif -- from hoodle-platform import           Data.Hoodle.BBox import           Data.Hoodle.Simple @@ -32,11 +30,8 @@ -- |  data Context = Context { ctxt_domain :: ByteString                        , ctxt_filename :: ByteString -#ifdef POPPLER                        , ctxt_doc :: Maybe Poppler.Document-#else-                       , ctxt_doc :: Maybe ()-#endif +                       , ctxt_embeddeddoc :: Maybe Poppler.Document                        }  -- |@@ -47,15 +42,16 @@                    , rbkg_cairosurface :: Maybe Surface }                  | RBkgPDF                     { rbkg_domain :: Maybe ByteString-                   , rbkg_filename :: Maybe ByteString+                   , rbkg_filename :: ByteString                    , rbkg_pageno :: Int -#ifdef POPPLER                    , rbkg_popplerpage :: Maybe Poppler.Page -#else    -                   , rbkg_popplerpage :: Maybe ()-#endif                    , rbkg_cairosurface :: Maybe Surface } +                 | RBkgEmbedPDF+                   { rbkg_pageno :: Int+                   , rbkg_popplerpage :: Maybe Poppler.Page +                   , rbkg_cairosurface :: Maybe Surface }  + isRBkgSmpl :: RBackground -> Bool  isRBkgSmpl (RBkgSmpl _ _ _) = True  isRBkgSmpl _ = False @@ -68,9 +64,9 @@ -- | rbkg2Bkg :: RBackground -> Background  rbkg2Bkg (RBkgSmpl c s _) = Background "solid" c s -rbkg2Bkg (RBkgPDF d f n _ _ ) = BackgroundPdf "pdf" d f n +rbkg2Bkg (RBkgPDF d f n _ _ ) = BackgroundPdf "pdf" d (Just f) n +rbkg2Bkg (RBkgEmbedPDF n _ _) = BackgroundEmbedPdf "embedpdf" n --- |-bkg2RBkg :: Background -> RBackground-bkg2RBkg (Background _t c s) = RBkgSmpl c s Nothing-bkg2RBkg (BackgroundPdf _t md mf pn) = RBkgPDF md mf pn Nothing Nothing+++
src/Graphics/Hoodle/Render/Type/HitTest.hs view
@@ -1,3 +1,5 @@+{-# LANGUAGE DeriveFunctor #-}+ ----------------------------------------------------------------------------- -- | -- Module      : Graphics.Hoodle.Render.Type.HitTest @@ -14,7 +16,10 @@  module Graphics.Hoodle.Render.Type.HitTest where ++--  import Data.Hoodle.BBox+import Data.Hoodle.Simple --  import Graphics.Hoodle.Render.Type.Item  --@@ -28,14 +33,14 @@  -- |  newtype NotHitted a = NotHitted { unNotHitted :: [a] } -                    deriving (Show)+                    deriving (Show,Functor)  -- |  newtype Hitted a = Hitted { unHitted :: [a] } -                   deriving (Show)+                   deriving (Show,Functor)  -- | -type StrokeHitted = AlterList (NotHitted StrokeBBox) (Hitted StrokeBBox) +type StrokeHitted = AlterList (NotHitted (BBoxed Stroke)) (Hitted (BBoxed Stroke))  -- |  type RItemHitted = AlterList (NotHitted RItem) (Hitted RItem) 
src/Graphics/Hoodle/Render/Type/Hoodle.hs view
@@ -73,7 +73,9 @@  -- | project to simple Hoodle out of RHoodle  rHoodle2Hoodle :: RHoodle -> Hoodle -rHoodle2Hoodle = Hoodle <$> view gtitle +rHoodle2Hoodle = Hoodle <$> view ghoodleID+                        <*> view gtitle +                        <*> view gembeddedpdf                         <*> IM.elems . fmap rPage2Page . view gpages  
src/Graphics/Hoodle/Render/Type/Item.hs view
@@ -22,19 +22,22 @@ import Data.Hoodle.BBox  import Data.Hoodle.Simple -data RItem = RItemStroke StrokeBBox -           | RItemImage ImageBBox (Maybe Surface)-           | RItemSVG SVGBBox (Maybe RSVG.SVG)+data RItem = RItemStroke (BBoxed Stroke)+           | RItemImage (BBoxed Image) (Maybe Surface)+           | RItemSVG (BBoxed SVG) (Maybe RSVG.SVG)+           | RItemLink (BBoxed Link) (Maybe RSVG.SVG) -instance BBoxable RItem where+instance GetBBoxable RItem where   getBBox (RItemStroke strk) = getBBox strk   getBBox (RItemImage img _) = getBBox img    getBBox (RItemSVG svg _) = getBBox svg +  getBBox (RItemLink lnk _) = getBBox lnk  instance Show RItem where   show (RItemStroke strk) = "RItemStroke " ++ show strk   show (RItemImage img _) = "RItemImage " ++ show img    show (RItemSVG svg _) = "RItemSVG " ++ show svg+  show (RItemLink lnk _) = "RItemLink " ++ show lnk  -- |  isStrkInRItem :: RItem -> Bool @@ -51,30 +54,36 @@ isSVGInRItem (RItemSVG _ _) = True isSVGInRItem _ = False +-- | +isLinkInRItem :: RItem -> Bool +isLinkInRItem (RItemLink _ _) = True +isLinkInRItem _ = False + -- | -findStrkInRItem :: RItem -> Maybe StrokeBBox +findStrkInRItem :: RItem -> Maybe (BBoxed Stroke) findStrkInRItem (RItemStroke strk) = Just strk findStrkInRItem _ = Nothing   -- | -findImgInRItem :: RItem -> Maybe ImageBBox+findImgInRItem :: RItem -> Maybe (BBoxed Image) findImgInRItem (RItemImage img _ ) = Just img  findImgInRItem _ = Nothing    -- | -findSVGInRItem :: RItem -> Maybe SVGBBox+findSVGInRItem :: RItem -> Maybe (BBoxed SVG) findSVGInRItem (RItemSVG svg _) = Just svg  findSVGInRItem _ = Nothing   - -- | rItem2Item :: RItem -> Item -rItem2Item (RItemStroke strk) = (ItemStroke . strkbbx_strk) strk-rItem2Item (RItemImage img _) = (ItemImage . imgbbx_img) img-rItem2Item (RItemSVG svg _) = (ItemSVG. svgbbx_svg) svg+rItem2Item (RItemStroke strk) = (ItemStroke . bbxed_content) strk+rItem2Item (RItemImage img _) = (ItemImage . bbxed_content) img+rItem2Item (RItemSVG svg _) = (ItemSVG . bbxed_content) svg+rItem2Item (RItemLink lnk _) = (ItemLink . bbxed_content) lnk+  {- -- | 
src/Graphics/Hoodle/Render/Type/Select.hs view
@@ -15,7 +15,6 @@ module Graphics.Hoodle.Render.Type.Select where  -- from other packages-import Control.Compose import Control.Lens  import Data.IntMap hiding (map, fromList) -- from hoodle-platform @@ -84,28 +83,17 @@ hPage2RPage p =    let HLayersF s others = view glayers p        s' = hLayer2RLayer s-      normalizedothers = case others of   -        NoSelect [] -> error "something wrong in hPage2RPage" -        NoSelect (x:xs) -> Select (fromList (x:xs))-        Select (O (Nothing)) -> error "something wrong in hPage2RPage"-        Select (O (Just _)) -> others -      Select (O (Just sz)) = normalizedothers -  in GPage (view gdimension p) (view gbackground p) (Select . O . Just $ replace s' sz)+  in GPage (view gdimension p) (view gbackground p) (replace s' others)   -- |  mkHPage :: RPage -> HPage mkHPage p = -  let normalizedothers = case (view glayers p) of -        NoSelect [] -> error "something wrong in mkHPage" -        NoSelect (x:xs) -> Select (fromList (x:xs))-        Select (O (Nothing)) -> error "something wrong in mkHPage"-        others@(Select (O (Just _))) -> others -      Select (O (Just sz)) = normalizedothers +  let sz = view glayers p        curr  = current sz        currtemp = GLayer (view gbuffer curr) (TEitherAlterHitted . Left . view gitems $ curr)   in  GPage (view gdimension p) (view gbackground p) -            (HLayersF currtemp normalizedothers)+            (HLayersF currtemp sz)   
src/Graphics/Hoodle/Render/Util/HitTest.hs view
@@ -115,21 +115,21 @@   -- | -hltHittedByBBox :: (BBoxable a) => +hltHittedByBBox :: (GetBBoxable a) =>                     BBox  -- ^ test bounding box                 -> [a] -- ^ items to test                 -> AlterList (NotHitted a) (Hitted a) hltHittedByBBox b = hltFilteredBy (do2BBoxIntersect b . getBBox)   -- | -hltEmbeddedByBBox :: (BBoxable a) =>+hltEmbeddedByBBox :: (GetBBoxable a) =>                      BBox                    -> [a]                    -> AlterList (NotHitted a) (Hitted a) hltEmbeddedByBBox b = hltFilteredBy (isBBox2InBBox1 b . getBBox)  -- | only check if a line and bbox of item overlapped -hltHittedByLineRough :: (BBoxable a) => +hltHittedByLineRough :: (GetBBoxable a) =>                          ((Double,Double),(Double,Double)) -- ^ line                       -> [a] -- ^ items to test                      -> AlterList (NotHitted a) (Hitted a)@@ -144,7 +144,7 @@                            -> State Bool RItemHitted                               -- (AlterList (NotHitted RItem) (Hitted RItem)) hltItmsHittedByLine_StateT line = hltFilteredBy_StateT test  -  where test (RItemStroke strk) = (doesLineHitStrk line . strkbbx_strk) strk+  where test (RItemStroke strk) = (doesLineHitStrk line . bbxed_content) strk         test _ = False     -- |@@ -161,78 +161,8 @@   ------------------------------------------------- stroke filtering functions as AlterList ------------------------------------------------- -{-  --- | previously mkHitTestALState-hltStrksFilteredBy_StateT :: (StrokeBBox -> Bool)  -- ^ hit test condition-                          -> [StrokeBBox]          -- ^ strokes to test -                          -> State Bool (AlterList (NotHitted StrokeBBox) (Hitted StrokeBBox))-hltStrksFilteredBy_StateT test strs = do -    let (nhit,rest) = break test  strs-        (hit,rest') = break (not.test) rest -    modify (|| (not.null) hit) -    if null rest' -      then return (NotHitted nhit :- Hitted hit :- NotHitted [] :- Empty)-      else return (NotHitted nhit :- Hitted hit :- hltStrksFilteredBy test rest')---- | highlight strokes filtered by a condition. ---   previously mkHitTestAL-hltStrksFilteredBy :: (StrokeBBox -> Bool)  -- ^ hit test condition-                   -> [StrokeBBox]          -- ^ strokes to test -                   -> AlterList (NotHitted StrokeBBox) (Hitted StrokeBBox)-hltStrksFilteredBy test strs = evalState (hltStrksFilteredBy_StateT test strs) False--- -- | -hltStrksHittedByBBox :: BBox  -- ^ test bounding box-                     -> [StrokeBBox] -- ^ strokes to test-                     -> AlterList (NotHitted StrokeBBox) (Hitted StrokeBBox)-hltStrksHittedByBBox b = hltStrksFilteredBy (do2BBoxIntersect b . strkbbx_bbx) ---- | previously, mkHitTestInsideBBox-hltStrksEmbeddedByBBox :: BBox -                       -> [StrokeBBox] -                       -> AlterList (NotHitted StrokeBBox) (Hitted StrokeBBox)-hltStrksEmbeddedByBBox b = hltStrksFilteredBy (isBBox2InBBox1 b . strkbbx_bbx)---- | only check if a line and bbox of strokebbox overlapped ---   previously, mkHitTestBBox-hltStrksHittedByLineRough :: ((Double,Double),(Double,Double)) -- ^ line -                          -> [StrokeBBox]                      -- ^ strokes to test-                          -> AlterList (NotHitted StrokeBBox) (Hitted StrokeBBox)-hltStrksHittedByLineRough (p1,p2) = hltStrksFilteredBy boxhittest -  where boxhittest s = isPointInBBox (strkbbx_bbx s) p1-                       || isPointInBBox (strkbbx_bbx s) p2------ |-mkHitTestStroke :: ((Double,Double),(Double,Double))-                -> [StrokeBBox]-                -> State Bool (AlterList (NotHitted StrokeBBox) (Hitted StrokeBBox))-mkHitTestStroke line = hltStrksFilteredBy_StateT (doesLineHitStrk line . strkbbx_strk)-  ----- |-hitTestStrokes :: ((Double,Double),(Double,Double))-               -> AlterList (NotHitted StrokeBBox) (Hitted StrokeBBox)-               -> State Bool (AlterList (NotHitted StrokeBBox) StrokeHitted)-hitTestStrokes _ Empty = error "something is wrong, invariant broken"-hitTestStrokes _ (n:-Empty) = return (n:-Empty)-hitTestStrokes line (n:-h:-rest) = do -  h' <- mkHitTestStroke line (unHitted h)-  (n:-) . (h':-) <$> hitTestStrokes line rest---}----- | -elimHitted :: (BBoxable a) => +elimHitted :: (GetBBoxable a) =>                AlterList (NotHitted a) (Hitted a) -> State (Maybe BBox) [a] elimHitted Empty = error "something wrong in elimHitted" elimHitted (n:-Empty) = return (unNotHitted n)@@ -252,7 +182,7 @@   = Just (BBox (min x1 x3, min y1 y3) (max x2 x4,max y2 y4))        -- | -getTotalBBox :: (BBoxable a) => [a] -> Maybe BBox +getTotalBBox :: (GetBBoxable a) => [a] -> Maybe BBox  getTotalBBox = foldl f Nothing    where f acc = merge acc . Just . getBBox 
+ src/Hoodle/Util/Process.hs view
@@ -0,0 +1,89 @@+-----------------------------------------------------------------------------+-- |+-- Module      : Hoodle.Util.Process+-- Copyright   : (c) 2013 Ian-Woo Kim+--+-- License     : BSD3+-- Maintainer  : Ian-Woo Kim <ianwookim@gmail.com>+-- Stability   : experimental+-- Portability : GHC+--+-----------------------------------------------------------------------------++module Hoodle.Util.Process where++import Control.Concurrent+import Control.Monad+import Control.Monad.Loops +import qualified Data.ByteString.Lazy as B+-- import Data.Monoid+-- import Data.UUID+import Data.UUID.V4 +import System.Directory+import System.FilePath+import System.IO+-- import System.IO.MMap+import System.Posix.Files+-- import System.Posix.Files.ByteString +import System.Posix.IO+import System.Posix.Process ++-- | +checkPipe :: FilePath -> IO ()+checkPipe fp = untilM_ (threadDelay 10000) (fileExist fp) +++-- | +mkTmpFileName :: IO FilePath +mkTmpFileName = do+  tdir <- getTemporaryDirectory +  tuuid <- nextRandom+  return $ tdir </> show tuuid <.> "fifo"++-- | +existThenRemove :: FilePath -> IO () +existThenRemove fp = fileExist fp >>= \b -> when b (removeLink fp) ++-- |+pipeAction :: IO () -> (B.ByteString -> IO a) -> IO a +pipeAction sender receiver = pipeActionWith sender (receiver <=< B.readFile)+++{-  filename <- mkTmpFileName +  existThenRemove filename +  createNamedPipe filename (unionFileModes ownerReadMode ownerWriteMode)+  forkProcess $ do  +    fd <- openFd filename WriteOnly Nothing defaultFileFlags+    dupTo fd stdOutput +    closeFd fd+    sender +    hFlush stdout +  r <- receiver =<< B.readFile filename << checkPipe filename +  removeLink filename  +  return r +-}++-- |+pipeActionWith :: IO () -> (FilePath -> IO a) -> IO a +pipeActionWith sender receiverf = do +  filename <- mkTmpFileName +  existThenRemove filename +  createNamedPipe filename (unionFileModes ownerReadMode ownerWriteMode)+  forkProcess $ do  +    fd <- openFd filename WriteOnly Nothing defaultFileFlags+    dupTo fd stdOutput +    closeFd fd+    sender +    hFlush stdout +  r <- checkPipe filename >> receiverf filename  +  removeLink filename  +  return r ++{-+-- | +pipeActionSystem :: String -> (B.ByteString -> IO a) -> IO a +pipeActionSystem sendercmd receiver = do +  filename <- mkTmpFileName +  existThenRemove filename +  createNamedPipe filename (unionFileModes ownerReadMode ownerWriteMode)+-}