1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// Copyright (c) 2023 Xu Shaohua <shaohua@biofan.org>. All rights reserved.
// Use of this source is governed by Lesser General Public License that can be found
// in the LICENSE file.

use crate::core::path::Path;
use crate::core::rect::Rect;

// TODO(Shaohua): move everything below into the PathBuilder
/// The logical operations that can be performed when combining two paths.
#[derive(Debug, Clone, Copy, Eq, PartialEq, Ord, PartialOrd)]
pub enum PathOp {
    /// Subtract the op path from the first path
    Difference,

    /// Intersect the two paths
    Intersect,

    /// Union (inclusive-or) the two paths
    Union,

    /// exclusive-or the two paths
    Xor,

    /// Subtract the first path from the op path
    ReverseDifference,
}

/// Set this path to the result of applying the Op to this path and the
/// specified path: this = (this op operand).
///
/// The resulting path will be constructed from non-overlapping contours.
/// The curve order is reduced where possible so that cubics may be turned
/// into quadratics, and quadratics maybe turned into lines.
///
/// # Parameters
/// Returns true if operation was able to produce a result;
/// otherwise, result is unmodified.
///
/// # Parameters
/// - `one` - The first operand (for difference, the minuend)
/// - `two` - The second operand (for difference, the subtrahend)
/// - `op` - The operator to apply.
/// - `result` - The product of the operands. The result may be one of the inputs.
///
/// Returns true if the operation succeeded.
pub fn op(_one: &Path, _two: &Path, _op: PathOp, _result: &mut Path) -> bool {
    unimplemented!()
}

/// Set this path to a set of non-overlapping contours that describe the
/// same area as the original path.
///
/// The curve order is reduced where possible so that cubics may
/// be turned into quadratics, and quadratics maybe turned into lines.
///
/// Returns true if operation was able to produce a result;
/// otherwise, result is unmodified.
///
/// # Parameters
/// - `path` - The path to simplify.
/// - `result` The simplified path. The result may be the input.
///
/// Returns true if simplification succeeded.
pub fn simplify(_path: &Path, _result: &mut Path) -> bool {
    unimplemented!()
}

/// Set the resulting rectangle to the tight bounds of the path.
///
/// # Parameters
/// - `path` - The path measured.
/// - `result` - The tight bounds of the path.
///
/// Returns true if the bounds could be computed.
pub fn tight_bounds(_path: &Path, _result: &mut Rect) -> bool {
    unimplemented!()
}

/// Set the result with fill type winding to area equivalent to path.
///
/// Returns true if successful. Does not detect if path contains contours which
/// contain self-crossings or cross other contours; in these cases, may return
/// true even though result does not fill same area as path.
///
/// Returns true if operation was able to produce a result;
/// otherwise, result is unmodified. The result may be the input.
///
/// # Parameters
/// - `path` - The path typically with fill type set to even odd.
/// - `result` - The equivalent path with fill type set to winding.
///
/// Returns true if winding path was set.
pub fn as_winding(_path: &Path, _result: &mut Path) -> bool {
    unimplemented!()
}

/// Perform a series of path operations, optimized for unioning many paths together.
pub struct OpBuilder {
    // TODO(Shaohua): Replace Path with PathRef.
    path_refs: Vec<Path>,
    ops: Vec<PathOp>,
}

impl OpBuilder {
    /// Add one or more paths and their operand.
    ///
    /// The builder is empty before the first path is added, so the result
    /// of a single add is (`empty_path` OP path).
    ///
    /// # Parameters
    /// - `path` - The second operand.
    /// - `operator` - The operator to apply to the existing and supplied paths.
    pub fn add(&mut self, path: &Path, operator: PathOp) {
        self.path_refs.push(path.clone());
        self.ops.push(operator);
        unimplemented!()
    }

    /// Computes the sum of all paths and operands, and resets the builder to its
    /// initial state.
    ///
    /// # Parameters
    /// - `result` - The product of the operands.
    ///
    /// Returns true if the operation succeeded.
    pub fn resolve(&mut self, _result: &mut Path) -> bool {
        unimplemented!()
    }

    fn fix_winding(_path: &mut Path) -> bool {
        unimplemented!()
    }

    fn reverse_path(_path: &mut Path) {
        unimplemented!()
    }

    fn reset(&mut self) {
        self.path_refs.clear();
        self.ops.clear();
        unimplemented!()
    }
}