module Graphics.PS.Query where
import Data.CG.Minus.Types
import qualified Data.CG.Minus as CG
import qualified Data.CG.Minus.Bezier as CG
import Graphics.PS.Paper
import Graphics.PS.Path
startPt :: Path -> Maybe (Pt Double)
startPt path =
case path of
MoveTo p -> Just p
Join p _ -> startPt p
_ -> Nothing
startPt' :: Path -> Maybe (Pt Double)
startPt' path =
case path of
MoveTo p -> Just p
LineTo p -> Just p
CurveTo p _ _ -> Just p
Join p _ -> startPt' p
_ -> Nothing
mkValid :: Path -> Path
mkValid path =
case startPt' path of
Just p -> MoveTo p +++ path
Nothing -> path
endPt :: Path -> Maybe (Pt Double)
endPt path =
case path of
MoveTo p -> Just p
LineTo p -> Just p
CurveTo _ _ p -> Just p
Join _ p -> endPt p
_ -> Nothing
close :: Path -> Path
close path =
case startPt path of
Just p -> path +++ ClosePath p
Nothing -> path
approx :: Double -> Path -> Path
approx n path =
case path of
Join a (CurveTo p2 p3 p4) ->
let is = [0, (1.0/n) .. 1.0]
l = case endPt a of
Just p1 -> map (CG.bezier4 p1 p2 p3 p4) is
Nothing -> []
in a +++ line l
_ -> path
data Rect a = Rect {rect_ll :: Pt a
,rect_ur :: Pt a}
deriving (Eq,Show)
rect_sum :: Ord a => Rect a -> Rect a -> Rect a
rect_sum (Rect a b) (Rect c d) = Rect (CG.pt_min a c) (CG.pt_max b d)
path_rect :: Path -> Rect Double
path_rect path =
case path of
MoveTo p -> Rect p p
LineTo p -> Rect p p
CurveTo c0 c1 p0 -> Rect (foldl1 CG.pt_min [c0,c1,p0]) (foldl1 CG.pt_max [c0,c1,p0])
Join p q -> path_rect p `rect_sum` path_rect q
_ -> error "path_rect: illegal query"
rect_to_bbox :: RealFrac a => Rect a -> BBox
rect_to_bbox (Rect (Pt x0 y0) (Pt x1 y1)) = BBox (floor x0) (floor y0) (ceiling x1) (ceiling y1)
path_to_bbox :: Path -> BBox
path_to_bbox = rect_to_bbox . path_rect