packages feed

Rasterific 0.7.5 → 0.7.5.1

raw patch · 8 files changed

+42/−2 lines, 8 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

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.5
+version:             0.7.5.1
 synopsis:            A pure haskell drawing engine.
 -- A longer description of the package.
 description:
changelog view
@@ -1,6 +1,13 @@ Change log
 ==========
 
+v0.7.5.1 January 2020
+---------------------
+
+ * Reworked sanitization in the filling case, only culling geometry
+   with generate coordinate, really small geometry can still contribute
+   meaningfully to filling
+
 v0.7.5 November 2019
 --------------------
 
src/Graphics/Rasterific.hs view
@@ -685,7 +685,7 @@ 
     go ctxt (Free (Fill method prims next)) rest = order : after where
       after = go ctxt next rest
-      order = orderOf ctxt method [geometryOf ctxt prims >>= listOfContainer . sanitize]
+      order = orderOf ctxt method [geometryOf ctxt prims >>= listOfContainer . sanitizeFilling]
 
     go ctxt (Free (Stroke w j cap prims next)) rest = order : after where
       after = go ctxt next rest
src/Graphics/Rasterific/CubicBezier.hs view
@@ -10,6 +10,7 @@     , clipCubicBezier
     , decomposeCubicBeziers
     , sanitizeCubicBezier
+    , sanitizeCubicBezierFilling
     , offsetCubicBezier
     , flattenCubicBezier
     , cubicBezierLengthApproximation
@@ -359,6 +360,12 @@   | otherwise = mempty
     where ac = a `midPoint` c
           bd = a `midPoint` d
+
+sanitizeCubicBezierFilling :: CubicBezier -> Container Primitive
+sanitizeCubicBezierFilling bezier@(CubicBezier a b c d)
+  | isDegenerate a || isDegenerate b ||
+    isDegenerate c || isDegenerate d = mempty
+  | otherwise = pure $ CubicBezierPrim bezier
 
 cubicFromQuadraticBezier :: Bezier -> CubicBezier
 cubicFromQuadraticBezier (Bezier p0 p1 p2) = CubicBezier p0 pa pb p2 where
src/Graphics/Rasterific/Line.hs view
@@ -5,6 +5,7 @@     , decomposeLine
     , clipLine
     , sanitizeLine
+    , sanitizeLineFilling
     , lineBreakAt
     , flattenLine
     , lineLength
@@ -44,6 +45,11 @@ sanitizeLine :: Line -> Container Primitive
 sanitizeLine l@(Line p1 p2)
   | p1 `isNearby` p2 = mempty
+  | otherwise = pure $ LinePrim l
+
+sanitizeLineFilling :: Line -> Container Primitive
+sanitizeLineFilling l@(Line p1 p2)
+  | isDegenerate p1 || isDegenerate p2 = mempty
   | otherwise = pure $ LinePrim l
 
 lineBreakAt :: Line -> Float -> (Line, Line)
src/Graphics/Rasterific/Operators.hs view
@@ -25,6 +25,7 @@     , ifZero
     , isNearby
     , isDistingableFrom
+    , isDegenerate
     ) where
 
 import Control.Applicative( liftA2, liftA3 )
@@ -156,6 +157,10 @@     isNaN squareDist || isInfinite squareDist -- degenerate case protection
   where vec = p1 ^-^ p2
         squareDist = vec `dot` vec
+
+isDegenerate :: Point -> Bool
+isDegenerate (V2 x y) =
+  isNaN x || isNaN y || isInfinite x || isInfinite y
 
 -- | simply `not (a `isNearby` b)`
 isDistingableFrom :: Point -> Point -> Bool
src/Graphics/Rasterific/QuadraticBezier.hs view
@@ -10,6 +10,7 @@     , decomposeBeziers
     , clipBezier
     , sanitizeBezier
+    , sanitizeBezierFilling
     , offsetBezier
     , flattenBezier
     , bezierBreakAt
@@ -201,6 +202,11 @@         v = b `normal` c
         ac = a `midPoint` c
         abbc = (a `midPoint` b) `midPoint` (b `midPoint` c)
+
+sanitizeBezierFilling :: Bezier -> Container Primitive
+sanitizeBezierFilling bezier@(Bezier a b c)
+  | isDegenerate a || isDegenerate b || isDegenerate c = mempty
+  | otherwise = pure $ BezierPrim bezier
 
 bezierBreakAt :: Bezier -> Float -> (Bezier, Bezier)
 bezierBreakAt (Bezier a b c) t = (Bezier a ab abbc, Bezier abbc bc c)
src/Graphics/Rasterific/StrokeInternal.hs view
@@ -7,6 +7,7 @@     , approximatePathLength
     , isPrimitivePoint
     , sanitize
+    , sanitizeFilling
     )  where
 
 import Data.Monoid( (<>) )
@@ -192,6 +193,14 @@ sanitize (LinePrim l) = sanitizeLine l
 sanitize (BezierPrim b) = sanitizeBezier b
 sanitize (CubicBezierPrim c) = sanitizeCubicBezier c
+
+-- | Sanitizing that don't cull really small elements, only
+-- Degenerate case, to allow them to participate to the correct
+-- coverage, even if really small.
+sanitizeFilling :: Primitive -> Container Primitive
+sanitizeFilling (LinePrim l) = sanitizeLineFilling l
+sanitizeFilling (BezierPrim b) = sanitizeBezierFilling b
+sanitizeFilling (CubicBezierPrim c) = sanitizeCubicBezierFilling c
 
 strokize :: Geometry geom
          => StrokeWidth -> Join -> (Cap, Cap) -> geom