| /* |
| * Copyright 2012 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| #ifndef SkPathOps_DEFINED |
| #define SkPathOps_DEFINED |
| |
| #include "include/core/SkPath.h" |
| #include "include/core/SkTypes.h" |
| #include "include/private/base/SkTArray.h" |
| #include "include/private/base/SkTDArray.h" |
| |
| struct SkRect; |
| |
| |
| // FIXME: move everything below into the SkPath class |
| /** |
| * The logical operations that can be performed when combining two paths. |
| */ |
| enum SkPathOp { |
| kDifference_SkPathOp, //!< subtract the op path from the first path |
| kIntersect_SkPathOp, //!< intersect the two paths |
| kUnion_SkPathOp, //!< union (inclusive-or) the two paths |
| kXOR_SkPathOp, //!< exclusive-or the two paths |
| kReverseDifference_SkPathOp, //!< subtract the first path from the op path |
| }; |
| |
| /** 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. |
| |
| Returns true if operation was able to produce a result; |
| otherwise, result is unmodified. |
| |
| @param one The first operand (for difference, the minuend) |
| @param two The second operand (for difference, the subtrahend) |
| @param op The operator to apply. |
| @param result The product of the operands. The result may be one of the |
| inputs. |
| @return True if the operation succeeded. |
| */ |
| bool SK_API Op(const SkPath& one, const SkPath& two, SkPathOp op, SkPath* result); |
| |
| /** 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. |
| |
| @param path The path to simplify. |
| @param result The simplified path. The result may be the input. |
| @return True if simplification succeeded. |
| */ |
| bool SK_API Simplify(const SkPath& path, SkPath* result); |
| |
| /** Set the resulting rectangle to the tight bounds of the path. |
| |
| @param path The path measured. |
| @param result The tight bounds of the path. |
| @return True if the bounds could be computed. |
| */ |
| bool SK_API TightBounds(const SkPath& path, SkRect* result); |
| |
| /** 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. |
| |
| @param path The path typically with fill type set to even odd. |
| @param result The equivalent path with fill type set to winding. |
| @return True if winding path was set. |
| */ |
| bool SK_API AsWinding(const SkPath& path, SkPath* result); |
| |
| /** Perform a series of path operations, optimized for unioning many paths together. |
| */ |
| class SK_API SkOpBuilder { |
| public: |
| /** 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 (emptyPath OP path). |
| |
| @param path The second operand. |
| @param _operator The operator to apply to the existing and supplied paths. |
| */ |
| void add(const SkPath& path, SkPathOp _operator); |
| |
| /** Computes the sum of all paths and operands, and resets the builder to its |
| initial state. |
| |
| @param result The product of the operands. |
| @return True if the operation succeeded. |
| */ |
| bool resolve(SkPath* result); |
| |
| private: |
| SkTArray<SkPath> fPathRefs; |
| SkTDArray<SkPathOp> fOps; |
| |
| static bool FixWinding(SkPath* path); |
| static void ReversePath(SkPath* path); |
| void reset(); |
| }; |
| |
| #endif |