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 +1/−1
- changelog +7/−0
- src/Graphics/Rasterific.hs +1/−1
- src/Graphics/Rasterific/CubicBezier.hs +7/−0
- src/Graphics/Rasterific/Line.hs +6/−0
- src/Graphics/Rasterific/Operators.hs +5/−0
- src/Graphics/Rasterific/QuadraticBezier.hs +6/−0
- src/Graphics/Rasterific/StrokeInternal.hs +9/−0
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