///|
/// Fill rule for a cpdf-style path.
pub(all) enum PdfPathWindingRule {
  PdfPathEvenOdd
  PdfPathNonZero
} derive(Debug, Eq, ToJson)

///|
/// One straight or Bezier path segment.
pub(all) enum PdfPathSegment {
  PdfPathStraight(Point2, Point2)
  PdfPathBezier(Point2, Point2, Point2, Point2)
} derive(Debug, Eq, ToJson)

///|
/// Whether a subpath is a hole in the containing path.
pub(all) enum PdfPathHole {
  PdfPathHole
  PdfPathNotHole
} derive(Debug, Eq, ToJson)

///|
/// Whether a subpath is open or closed.
pub(all) enum PdfPathClosure {
  PdfPathClosed
  PdfPathOpen
} derive(Debug, Eq, ToJson)

///|
/// A cpdf-style subpath.
pub(all) struct PdfPathSubpath {
  hole : PdfPathHole
  closure : PdfPathClosure
  segments : Array[PdfPathSegment]
} derive(Debug, Eq, ToJson)

///|
/// A cpdf-style path.
pub(all) struct PdfPath {
  winding_rule : PdfPathWindingRule
  subpaths : Array[PdfPathSubpath]
} derive(Debug, Eq, ToJson)

///|
/// A cpdfcontent drawn path, pairing path geometry with paint flags.
pub(all) struct PdfDrawnPath {
  stroked : Bool
  filled : Bool
  path : PdfPath
} derive(Debug, Eq, ToJson)