packages feed

Rasterific 0.7.4.1 → 0.7.4.2

raw patch · 4 files changed

+22/−13 lines, 4 filesdep ~JuicyPixelsPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: JuicyPixels

API changes (from Hackage documentation)

+ Graphics.Rasterific.Linear: infixl 6 ^-^
- Graphics.Rasterific: cacheDrawing :: forall px. (RenderablePixel px) => Int -> Int -> Dpi -> Drawing px () -> Drawing px ()
+ Graphics.Rasterific: cacheDrawing :: forall px. RenderablePixel px => Int -> Int -> Dpi -> Drawing px () -> Drawing px ()
- Graphics.Rasterific: drawOrdersOfDrawing :: forall px. (RenderablePixel px) => Int -> Int -> Dpi -> px -> Drawing px () -> [DrawOrder px]
+ Graphics.Rasterific: drawOrdersOfDrawing :: forall px. RenderablePixel px => Int -> Int -> Dpi -> px -> Drawing px () -> [DrawOrder px]
- Graphics.Rasterific: dumpDrawing :: (Show px, Show (PixelBaseComponent px), PixelBaseComponent (PixelBaseComponent px) ~ (PixelBaseComponent px)) => Drawing px () -> String
+ Graphics.Rasterific: dumpDrawing :: (Show px, Show (PixelBaseComponent px), PixelBaseComponent (PixelBaseComponent px) ~ PixelBaseComponent px) => Drawing px () -> String
- Graphics.Rasterific: listToPrims :: (Geometry a, (Foldable f)) => f a -> [Primitive]
+ Graphics.Rasterific: listToPrims :: (Geometry a, Foldable f) => f a -> [Primitive]
- Graphics.Rasterific: renderDrawing :: forall px. (RenderablePixel px) => Int -> Int -> px -> Drawing px () -> Image px
+ Graphics.Rasterific: renderDrawing :: forall px. RenderablePixel px => Int -> Int -> px -> Drawing px () -> Image px
- Graphics.Rasterific: renderDrawingAtDpi :: forall px. (RenderablePixel px) => Int -> Int -> Dpi -> px -> Drawing px () -> Image px
+ Graphics.Rasterific: renderDrawingAtDpi :: forall px. RenderablePixel px => Int -> Int -> Dpi -> px -> Drawing px () -> Image px
- Graphics.Rasterific: stroke :: (Geometry geom) => Float -> Join -> (Cap, Cap) -> geom -> Drawing px ()
+ Graphics.Rasterific: stroke :: Geometry geom => Float -> Join -> (Cap, Cap) -> geom -> Drawing px ()
- Graphics.Rasterific.Immediate: DrawOrder :: ![[Primitive]] -> !(Texture px) -> !FillMethod -> !(Maybe (Texture (PixelBaseComponent px))) -> !(forall s. DrawContext (ST s) px ()) -> DrawOrder px
+ Graphics.Rasterific.Immediate: DrawOrder :: ![[Primitive]] -> !Texture px -> !FillMethod -> !Maybe (Texture (PixelBaseComponent px)) -> !forall s. DrawContext (ST s) px () -> DrawOrder px
- Graphics.Rasterific.Immediate: [_orderDirect] :: DrawOrder px -> !(forall s. DrawContext (ST s) px ())
+ Graphics.Rasterific.Immediate: [_orderDirect] :: DrawOrder px -> !forall s. DrawContext (ST s) px ()
- Graphics.Rasterific.Immediate: [_orderMask] :: DrawOrder px -> !(Maybe (Texture (PixelBaseComponent px)))
+ Graphics.Rasterific.Immediate: [_orderMask] :: DrawOrder px -> !Maybe (Texture (PixelBaseComponent px))
- Graphics.Rasterific.Immediate: [_orderTexture] :: DrawOrder px -> !(Texture px)
+ Graphics.Rasterific.Immediate: [_orderTexture] :: DrawOrder px -> !Texture px
- Graphics.Rasterific.Immediate: meshToImage :: forall px. (RenderablePixel px) => Maybe Transformation -> Int -> Int -> PatchInterpolation -> MeshPatch px -> Image px
+ Graphics.Rasterific.Immediate: meshToImage :: forall px. RenderablePixel px => Maybe Transformation -> Int -> Int -> PatchInterpolation -> MeshPatch px -> Image px
- Graphics.Rasterific.MeshPatch: MeshPatch :: !Int -> !Int -> !(Vector Point) -> !(Vector InterBezier) -> !(Vector InterBezier) -> !(Vector px) -> !(Maybe (Vector Derivatives)) -> MeshPatch px
+ Graphics.Rasterific.MeshPatch: MeshPatch :: !Int -> !Int -> !Vector Point -> !Vector InterBezier -> !Vector InterBezier -> !Vector px -> !Maybe (Vector Derivatives) -> MeshPatch px
- Graphics.Rasterific.MeshPatch: [_meshColors] :: MeshPatch px -> !(Vector px)
+ Graphics.Rasterific.MeshPatch: [_meshColors] :: MeshPatch px -> !Vector px
- Graphics.Rasterific.MeshPatch: [_meshHorizontalSecondary] :: MeshPatch px -> !(Vector InterBezier)
+ Graphics.Rasterific.MeshPatch: [_meshHorizontalSecondary] :: MeshPatch px -> !Vector InterBezier
- Graphics.Rasterific.MeshPatch: [_meshPrimaryVertices] :: MeshPatch px -> !(Vector Point)
+ Graphics.Rasterific.MeshPatch: [_meshPrimaryVertices] :: MeshPatch px -> !Vector Point
- Graphics.Rasterific.MeshPatch: [_meshTensorDerivatives] :: MeshPatch px -> !(Maybe (Vector Derivatives))
+ Graphics.Rasterific.MeshPatch: [_meshTensorDerivatives] :: MeshPatch px -> !Maybe (Vector Derivatives)
- Graphics.Rasterific.MeshPatch: [_meshVerticalSecondary] :: MeshPatch px -> !(Vector InterBezier)
+ Graphics.Rasterific.MeshPatch: [_meshVerticalSecondary] :: MeshPatch px -> !Vector InterBezier
- Graphics.Rasterific.MeshPatch: calculateMeshColorDerivative :: forall px. (InterpolablePixel px) => MeshPatch px -> MeshPatch (Derivative px)
+ Graphics.Rasterific.MeshPatch: calculateMeshColorDerivative :: forall px. InterpolablePixel px => MeshPatch px -> MeshPatch (Derivative px)
- Graphics.Rasterific.MeshPatch: coonPatchAtWithDerivative :: (InterpolablePixel px) => MeshPatch (Derivative px) -> Int -> Int -> CoonPatch (CubicCoefficient px)
+ Graphics.Rasterific.MeshPatch: coonPatchAtWithDerivative :: InterpolablePixel px => MeshPatch (Derivative px) -> Int -> Int -> CoonPatch (CubicCoefficient px)
- Graphics.Rasterific.MeshPatch: cubicCoonPatchesOf :: (InterpolablePixel px) => MeshPatch (Derivative px) -> [CoonPatch (CubicCoefficient px)]
+ Graphics.Rasterific.MeshPatch: cubicCoonPatchesOf :: InterpolablePixel px => MeshPatch (Derivative px) -> [CoonPatch (CubicCoefficient px)]
- Graphics.Rasterific.MeshPatch: cubicTensorPatchesOf :: (InterpolablePixel px) => MeshPatch (Derivative px) -> [TensorPatch (CubicCoefficient px)]
+ Graphics.Rasterific.MeshPatch: cubicTensorPatchesOf :: InterpolablePixel px => MeshPatch (Derivative px) -> [TensorPatch (CubicCoefficient px)]
- Graphics.Rasterific.MeshPatch: tensorPatchAtWithDerivative :: (InterpolablePixel px) => MeshPatch (Derivative px) -> Int -> Int -> TensorPatch (CubicCoefficient px)
+ Graphics.Rasterific.MeshPatch: tensorPatchAtWithDerivative :: InterpolablePixel px => MeshPatch (Derivative px) -> Int -> Int -> TensorPatch (CubicCoefficient px)
- Graphics.Rasterific.PathWalker: currentPosition :: (Monad m) => PathWalkerT m (Maybe Point)
+ Graphics.Rasterific.PathWalker: currentPosition :: Monad m => PathWalkerT m (Maybe Point)
- Graphics.Rasterific.PathWalker: currentTangeant :: (Monad m) => PathWalkerT m (Maybe Vector)
+ Graphics.Rasterific.PathWalker: currentTangeant :: Monad m => PathWalkerT m (Maybe Vector)
- Graphics.Rasterific.PathWalker: runPathWalking :: (Monad m) => Path -> PathWalkerT m a -> m a
+ Graphics.Rasterific.PathWalker: runPathWalking :: Monad m => Path -> PathWalkerT m a -> m a

Files

Rasterific.cabal view
@@ -1,7 +1,7 @@ -- Initial Rasterific.cabal generated by cabal init.  For further 
 -- documentation, see http://haskell.org/cabal/users-guide/
 name:                Rasterific
-version:             0.7.4.1
+version:             0.7.4.2
 synopsis:            A pure haskell drawing engine.
 -- A longer description of the package.
 description:
@@ -38,7 +38,7 @@ Source-Repository this
     Type:      git
     Location:  git://github.com/Twinside/Rasterific.git
-    Tag:       v0.7.4.1
+    Tag:       v0.7.4.2
 
 flag embed_linear
   description: Embed a reduced version of Linear avoiding a (huge) dep
changelog view
@@ -1,6 +1,14 @@ Change log
 ==========
 
+v0.7.4.2 December 2018
+----------------------
+
+ * Refactoring: minor enhancement in the PathWalker
+   (newtype instead of single constructor data) (thanks to yairchu)
+ * Fix: PDF rendering didn't produce valid pdf in some cases,
+        the XRef table wasn't sorted by ID (thanks to robx)
+
 v0.7.4.1 October 2018
 ---------------------
 
src/Graphics/Rasterific/MicroPdf.hs view
@@ -17,6 +17,7 @@ import Control.Monad.Reader( Reader, local, asks, runReader )
 
 import Numeric( showFFloat )
+import Data.List( sortOn )
 import Data.Monoid( (<>) )
 import qualified Data.Foldable as F
 import Data.Word( Word32 )
@@ -945,7 +946,7 @@ buildXRefTable lst = tp "xref\n0 " <> intDec (glength lst) <> tp "\n"
                    <> foldMap build lst where
   build 0 = "0000000000 65535 f \n"
-  build ix = toPdf . B.pack $ printf "%010d 00000 n \n" ix
+  build off = toPdf . B.pack $ printf "%010d 00000 n \n" off
 
 buildTrailer :: Foldable f => f a -> PdfId -> Builder
 buildTrailer objs startId = tp "trailer\n" <> toPdf
@@ -1000,12 +1001,13 @@     <> reverse (_generatedPdfObjects endContext)
 
   (indexes, objs) = unzip $ prepareObjects objects
-  lastIndex = last indexes
-  xrefIndex = lastIndex + B.length (last objs)
+  (_, lastOffset) = last indexes
+  xrefOffset = lastOffset + B.length (last objs)
 
-  xrefPosition = "startxref\n" <> intDec xrefIndex <> tp "\n"
+  xrefPosition = "startxref\n" <> intDec xrefOffset <> tp "\n"
 
-  xref = buildXRefTable indexes
+  offsets = map snd $ sortOn fst indexes
+  xref = buildXRefTable offsets
 
 renderDrawingToPdf :: (forall px . PdfColorable px => Drawing px () -> [DrawOrder px])
                    -> Int -> Int -> Dpi -> Drawing PixelRGBA8 ()
@@ -1165,7 +1167,6 @@       , _pdfConfToOrder = toOrders
       }
 
-prepareObjects :: [PdfObject] -> [(Int, B.ByteString)]
-prepareObjects = scanl go (0, pdfSignature) where
-  go (ix, prev) obj = (ix + B.length prev, buildToStrict $ toPdf obj)
-
+prepareObjects :: [PdfObject] -> [((PdfId, Int), B.ByteString)]
+prepareObjects = scanl go ((0, 0), pdfSignature) where
+  go ((_, off), prev) obj = ((_pdfId obj, off + B.length prev), buildToStrict $ toPdf obj)
src/Graphics/Rasterific/PathWalker.hs view
@@ -41,8 +41,8 @@ -- | State of the path walker, just a bunch of primitives
 -- with continuity guarantee. The continuity is guaranteed
 -- by the Path used to derive this primitives.
-data WalkerState = WalkerState
-    { _walkerPrims :: ![Primitive]
+newtype WalkerState = WalkerState
+    { _walkerPrims :: [Primitive]
     }
 
 -- | Create a path walker from a given path