hoodle-render 0.3.1 → 0.3.2
raw patch · 4 files changed
+124/−53 lines, 4 filesdep ~hoodle-typesdep ~strictPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: hoodle-types, strict
API changes (from Hackage documentation)
Files
- hoodle-render.cabal +3/−3
- src/Graphics/Hoodle/Render.hs +106/−31
- src/Graphics/Hoodle/Render/Background.hs +14/−19
- src/Graphics/Hoodle/Render/Type/Hoodle.hs +1/−0
hoodle-render.cabal view
@@ -1,5 +1,5 @@ Name: hoodle-render-Version: 0.3.1+Version: 0.3.2 Synopsis: Hoodle file renderer Description: Rendering library using cairo for hoodle file format License: BSD3@@ -26,11 +26,11 @@ containers >= 0.4, cairo == 0.12.*, svgcairo == 0.12.*,- strict == 0.3.*, + strict >= 0.3, bytestring >= 0.9, base64-bytestring >= 0.1, lens >= 2.5, - hoodle-types >= 0.2,+ hoodle-types >= 0.2.1, gd >= 3000.7, unix >= 2.5, uuid >= 1.2,
src/Graphics/Hoodle/Render.hs view
@@ -60,7 +60,7 @@ import Data.Hoodle.Simple import Data.Hoodle.BBox import Data.Hoodle.Predefined -import Data.Hoodle.Zipper +import Data.Hoodle.Zipper hiding (moveTo) import qualified Graphics.UI.Gtk.Poppler.Page as PopplerPage import qualified Graphics.Rendering.Cairo.SVG as RSVG -- from this package@@ -125,13 +125,13 @@ (ix',iy') = RSVG.svgGetSize rsvg ix = fromIntegral ix' iy = fromIntegral iy'- clipBBox (Just (getBBox svgbbx))+ -- clipBBox (Just (getBBox svgbbx)) save translate x y scale ((x2-x1)/ix) ((y2-y1)/iy) RSVG.svgRender rsvg restore- resetClip + -- resetClip return () -- | render svg @@ -177,6 +177,21 @@ -- R-structure ---- +drawFallBackBkg :: Dimension -> Render () +drawFallBackBkg (Dim w h) = do + setSourceRGBA 1 1 1 1 + rectangle 0 0 w h + fill + setSourceRGBA 0 0 0 1 + setLineWidth 5+ moveTo 0 0+ lineTo w h + stroke + moveTo w 0 + lineTo 0 h+ stroke+ + -- | renderRBkg :: (RBackground,Dimension) -> Render (RBackground,Dimension) renderRBkg (r,dim) = @@ -185,10 +200,10 @@ drawBkgAndRecord (renderBkg (rbkg2Bkg r,dim)) -- renderBkg (rbkg2Bkg r,dim) >> return (r,dim) (RBkgPDF _ _ _ p _) -> - maybe (return (r,dim)) + maybe (drawFallBackBkg dim >> return (r,dim)) (\pg -> drawBkgAndRecord (bkgPdfRender pg)) p (RBkgEmbedPDF _ p _) -> - maybe (return (r,dim)) + maybe (drawFallBackBkg dim >> return (r,dim)) (\pg -> drawBkgAndRecord (bkgPdfRender pg)) p where drawBkgAndRecord rdr = do @@ -218,6 +233,7 @@ ix <- liftM fromIntegral (imageSurfaceGetWidth sfc) iy <- liftM fromIntegral (imageSurfaceGetHeight sfc) save + -- setAntialias AntialiasNone translate x y scale ((x2-x1)/ix) ((y2-y1)/iy) setSourceSurface sfc 0 0 @@ -233,13 +249,14 @@ (ix',iy') = RSVG.svgGetSize rsvg ix = fromIntegral ix' iy = fromIntegral iy'- clipBBox (Just (getBBox svgbbx))+ -- clipBBox (Just (getBBox svgbbx)) save + -- setAntialias AntialiasNone translate x y scale ((x2-x1)/ix) ((y2-y1)/iy) RSVG.svgRender rsvg restore- resetClip + -- resetClip return () return itm renderRItem itm@(RItemLink lnkbbx mrsvg) = do @@ -251,13 +268,14 @@ (ix',iy') = RSVG.svgGetSize rsvg ix = fromIntegral ix' iy = fromIntegral iy'- clipBBox (Just (getBBox lnkbbx))+ -- clipBBox (Just (getBBox lnkbbx)) save + -- setAntialias AntialiasNone translate x y scale ((x2-x1)/ix) ((y2-y1)/iy) RSVG.svgRender rsvg restore- resetClip + -- resetClip return () return itm @@ -267,49 +285,96 @@ -- InBBox -- ------------ +{-+renderRItem_InBBox :: Maybe BBox -> RItem -> Render RItem +renderRItem_InBBox _ itm@(RItemStroke strk) = renderStrk (bbxed_content strk) >> return itm+renderRItem_InBBox mbbox itm@(RItemImage img msfc) = do + case msfc of+ Nothing -> renderImg (bbxed_content img)+ Just sfc -> do + 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)+ save + clipBBox (fmap (flip inflate 1) mbbox) + translate x y + scale ((x2-x1)/ix) ((y2-y1)/iy)+ setSourceSurface sfc 0 0 + paint + resetClip + restore+ return itm +renderRItem_InBBox mbbox itm@(RItemSVG svgbbx mrsvg) = do + case mrsvg of+ Nothing -> renderSVG (bbxed_content svgbbx)+ Just rsvg -> do + let (x,y) = (svg_pos . bbxed_content) svgbbx+ BBox (x1,y1) (x2,y2) = getBBox svgbbx+ (ix',iy') = RSVG.svgGetSize rsvg+ ix = fromIntegral ix' + iy = fromIntegral iy'+ clipBBox (fmap (flip inflate 0.5) mbbox)+ save + translate x y + scale ((x2-x1)/ix) ((y2-y1)/iy)+ RSVG.svgRender rsvg + resetClip + restore+ return () + return itm +renderRItem_InBBox mbbox 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'+ save + clipBBox (fmap (flip inflate 0.5) mbbox)+ translate x y + scale ((x2-x1)/ix) ((y2-y1)/iy)+ RSVG.svgRender rsvg + resetClip + restore+ return () + return itm +-}++ -- | background drawing in bbox renderRBkg_InBBox :: Maybe BBox -> (RBackground,Dimension) -> Render (RBackground,Dimension) renderRBkg_InBBox mbbox (b,dim) = do - clipBBox mbbox+ clipBBox (fmap (flip inflate 1) mbbox)+ -- clipBBox mbbox renderRBkg_Buf (b,dim) resetClip return (b,dim) -{- case b of - RBkgSmpl _ _ _ -> do - clipBBox mbbox- renderRBkg_Buf (b,dim)- resetClip- RBkgPDF _ _ _ _ _ -> do - clipBBox mbbox- renderRBkg_Buf (b,dim)- resetClip- 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 (fmap (flip inflate 1) mbbox) + clipBBox (fmap (flip inflate 2) mbbox) -- temporary+ -- clipBBox mbbox let hittestbbox = case mbbox of Nothing -> NotHitted [] :- Hitted (view gitems layer) :- Empty Just bbox -> (hltHittedByBBox bbox . view gitems) layer (mapM_ renderRItem . concatMap unHitted . getB) hittestbbox- resetClip- -- return layer + resetClip -- simply twice rendering if whole redraw happening case view gbuffer layer of LyBuf (Just sfc) -> do liftIO $ renderWith sfc $ do - -- renderRLayer_InBBox mbbox lyr - clipBBox (fmap (flip inflate 1) mbbox )+ clipBBox (fmap (flip inflate 2) mbbox ) -- temporary+ -- clipBBox mbbox + -- setAntialias AntialiasNone setSourceRGBA 0 0 0 0 setOperator OperatorSource paint@@ -318,6 +383,7 @@ resetClip return layer _ -> return layer + @@ -335,21 +401,29 @@ case msfc of Nothing -> renderRBkg (b,dim) >> return () Just sfc -> do + save+ -- setAntialias AntialiasNone setSourceSurface sfc 0 0 paint + restore RBkgPDF _ _ _n _ msfc -> do case msfc of Nothing -> renderRBkg (b,dim) >> return () Just sfc -> do + save+ -- setAntialias AntialiasNone setSourceSurface sfc 0 0 paint + restore RBkgEmbedPDF _ _ msfc -> do case msfc of Nothing -> renderRBkg (b,dim) >> return () Just sfc -> do + save+ -- setAntialias AntialiasNone setSourceSurface sfc 0 0 paint -+ restore return (b,dim) -- | @@ -410,12 +484,13 @@ cnstrctRHoodle hdl = do let hid = view hoodleID hdl ttl = view title hdl + revs = view revisions hdl pgs = view pages hdl 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) + return $ GHoodle hid ttl revs embeddedsrc (fromList npgs) -- |
src/Graphics/Hoodle/Render/Background.hs view
@@ -38,15 +38,6 @@ -- import Prelude hiding (mapM_) -{--isPopplerEnabled :: Bool -#ifdef POPPLER-isPopplerEnabled = True -#else-isPopplerEnabled = False-#endif--} - -- | popplerGetDocFromFile :: ByteString -> IO (Maybe Poppler.Document) popplerGetDocFromFile fp = @@ -76,21 +67,24 @@ removeFile tmpfile return mdoc - -- | popplerGetPageFromDoc :: Poppler.Document -> Int -- ^ page number -> IO (Maybe Poppler.Page, Maybe Surface) popplerGetPageFromDoc doc pn = do - pg <- Poppler.documentGetPage doc (pn-1) - (w,h) <- PopplerPage.pageGetSize pg- sfc <- createImageSurface FormatARGB32 (floor w) (floor h)- renderWith sfc $ do - setSourceRGBA 1 1 1 1- rectangle 0 0 w h - fill- PopplerPage.pageRender pg- return (Just pg, Just sfc)+ n <- Poppler.documentGetNPages doc + if pn > n + then return (Nothing, Nothing)+ else do + pg <- Poppler.documentGetPage doc (pn-1) + (w,h) <- PopplerPage.pageGetSize pg+ sfc <- createImageSurface FormatARGB32 (floor w) (floor h)+ renderWith sfc $ do + setSourceRGBA 1 1 1 1+ rectangle 0 0 w h + fill+ PopplerPage.pageRender pg+ return (Just pg, Just sfc) -- | draw ruling all drawRuling :: Double -> Double -> ByteString -> Render () @@ -233,6 +227,7 @@ Just doc -> do liftIO $ popplerGetPageFromDoc doc pn Nothing -> error "error2 in cnstrctRBkg_StateT" + maybe (liftIO $ putStrLn ( "pn = " ++ show pn )) (const (return ())) mpage return (RBkgPDF (Just oldd) oldf pn mpage msfc) Nothing -> error "error3 in cnstrctRBkg_StateT" BackgroundEmbedPdf _ pn -> do
src/Graphics/Hoodle/Render/Type/Hoodle.hs view
@@ -75,6 +75,7 @@ rHoodle2Hoodle :: RHoodle -> Hoodle rHoodle2Hoodle = Hoodle <$> view ghoodleID <*> view gtitle + <*> view grevisions <*> view gembeddedpdf <*> IM.elems . fmap rPage2Page . view gpages