Add base types for path ops
Paths contain lines, quads, and cubics, which are
collectively curves.
To work with path intersections, intermediary curves
are constructed. For now, those intermediates use
doubles to guarantee sufficient precision.
The DVector, DPoint, DLine, DQuad, and DCubic
structs encapsulate these intermediate curves.
The DRect and DTriangle structs are created to
describe intersectable areas of interest.
The Bounds struct inherits from SkRect to create
a SkScalar-based rectangle that intersects shared
edges.
This also includes common math equalities and
debugging that the remainder of path ops builds on,
as well as a temporary top-level interface in
include/pathops/SkPathOps.h.
Review URL: https://codereview.chromium.org/12827020
git-svn-id: http://skia.googlecode.com/svn/trunk@8551 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-04-08 11:47:37 +00:00
|
|
|
/*
|
|
|
|
* 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
|
|
|
|
|
2019-04-23 17:05:21 +00:00
|
|
|
#include "include/core/SkPreConfig.h"
|
|
|
|
#include "include/private/SkTArray.h"
|
|
|
|
#include "include/private/SkTDArray.h"
|
2013-07-09 19:43:35 +00:00
|
|
|
|
Add base types for path ops
Paths contain lines, quads, and cubics, which are
collectively curves.
To work with path intersections, intermediary curves
are constructed. For now, those intermediates use
doubles to guarantee sufficient precision.
The DVector, DPoint, DLine, DQuad, and DCubic
structs encapsulate these intermediate curves.
The DRect and DTriangle structs are created to
describe intersectable areas of interest.
The Bounds struct inherits from SkRect to create
a SkScalar-based rectangle that intersects shared
edges.
This also includes common math equalities and
debugging that the remainder of path ops builds on,
as well as a temporary top-level interface in
include/pathops/SkPathOps.h.
Review URL: https://codereview.chromium.org/12827020
git-svn-id: http://skia.googlecode.com/svn/trunk@8551 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-04-08 11:47:37 +00:00
|
|
|
class SkPath;
|
2014-06-24 14:55:11 +00:00
|
|
|
struct SkRect;
|
Add base types for path ops
Paths contain lines, quads, and cubics, which are
collectively curves.
To work with path intersections, intermediary curves
are constructed. For now, those intermediates use
doubles to guarantee sufficient precision.
The DVector, DPoint, DLine, DQuad, and DCubic
structs encapsulate these intermediate curves.
The DRect and DTriangle structs are created to
describe intersectable areas of interest.
The Bounds struct inherits from SkRect to create
a SkScalar-based rectangle that intersects shared
edges.
This also includes common math equalities and
debugging that the remainder of path ops builds on,
as well as a temporary top-level interface in
include/pathops/SkPathOps.h.
Review URL: https://codereview.chromium.org/12827020
git-svn-id: http://skia.googlecode.com/svn/trunk@8551 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-04-08 11:47:37 +00:00
|
|
|
|
2015-03-26 16:05:12 +00:00
|
|
|
|
2013-04-22 14:37:05 +00:00
|
|
|
// FIXME: move everything below into the SkPath class
|
|
|
|
/**
|
|
|
|
* The logical operations that can be performed when combining two paths.
|
|
|
|
*/
|
Add base types for path ops
Paths contain lines, quads, and cubics, which are
collectively curves.
To work with path intersections, intermediary curves
are constructed. For now, those intermediates use
doubles to guarantee sufficient precision.
The DVector, DPoint, DLine, DQuad, and DCubic
structs encapsulate these intermediate curves.
The DRect and DTriangle structs are created to
describe intersectable areas of interest.
The Bounds struct inherits from SkRect to create
a SkScalar-based rectangle that intersects shared
edges.
This also includes common math equalities and
debugging that the remainder of path ops builds on,
as well as a temporary top-level interface in
include/pathops/SkPathOps.h.
Review URL: https://codereview.chromium.org/12827020
git-svn-id: http://skia.googlecode.com/svn/trunk@8551 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-04-08 11:47:37 +00:00
|
|
|
enum SkPathOp {
|
2015-03-26 14:52:43 +00:00
|
|
|
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
|
Add base types for path ops
Paths contain lines, quads, and cubics, which are
collectively curves.
To work with path intersections, intermediary curves
are constructed. For now, those intermediates use
doubles to guarantee sufficient precision.
The DVector, DPoint, DLine, DQuad, and DCubic
structs encapsulate these intermediate curves.
The DRect and DTriangle structs are created to
describe intersectable areas of interest.
The Bounds struct inherits from SkRect to create
a SkScalar-based rectangle that intersects shared
edges.
This also includes common math equalities and
debugging that the remainder of path ops builds on,
as well as a temporary top-level interface in
include/pathops/SkPathOps.h.
Review URL: https://codereview.chromium.org/12827020
git-svn-id: http://skia.googlecode.com/svn/trunk@8551 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-04-08 11:47:37 +00:00
|
|
|
};
|
|
|
|
|
2013-04-26 19:51:16 +00:00
|
|
|
/** 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.
|
2013-04-27 07:02:53 +00:00
|
|
|
The curve order is reduced where possible so that cubics may be turned
|
2013-04-26 19:51:16 +00:00
|
|
|
into quadratics, and quadratics maybe turned into lines.
|
|
|
|
|
2013-04-27 07:02:53 +00:00
|
|
|
Returns true if operation was able to produce a result;
|
2013-04-26 19:51:16 +00:00
|
|
|
otherwise, result is unmodified.
|
|
|
|
|
|
|
|
@param one The first operand (for difference, the minuend)
|
|
|
|
@param two The second operand (for difference, the subtrahend)
|
2015-03-26 14:52:43 +00:00
|
|
|
@param op The operator to apply.
|
2013-04-26 19:51:16 +00:00
|
|
|
@param result The product of the operands. The result may be one of the
|
|
|
|
inputs.
|
2015-03-26 14:52:43 +00:00
|
|
|
@return True if the operation succeeded.
|
Add base types for path ops
Paths contain lines, quads, and cubics, which are
collectively curves.
To work with path intersections, intermediary curves
are constructed. For now, those intermediates use
doubles to guarantee sufficient precision.
The DVector, DPoint, DLine, DQuad, and DCubic
structs encapsulate these intermediate curves.
The DRect and DTriangle structs are created to
describe intersectable areas of interest.
The Bounds struct inherits from SkRect to create
a SkScalar-based rectangle that intersects shared
edges.
This also includes common math equalities and
debugging that the remainder of path ops builds on,
as well as a temporary top-level interface in
include/pathops/SkPathOps.h.
Review URL: https://codereview.chromium.org/12827020
git-svn-id: http://skia.googlecode.com/svn/trunk@8551 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-04-08 11:47:37 +00:00
|
|
|
*/
|
2013-07-09 19:43:35 +00:00
|
|
|
bool SK_API Op(const SkPath& one, const SkPath& two, SkPathOp op, SkPath* result);
|
Add base types for path ops
Paths contain lines, quads, and cubics, which are
collectively curves.
To work with path intersections, intermediary curves
are constructed. For now, those intermediates use
doubles to guarantee sufficient precision.
The DVector, DPoint, DLine, DQuad, and DCubic
structs encapsulate these intermediate curves.
The DRect and DTriangle structs are created to
describe intersectable areas of interest.
The Bounds struct inherits from SkRect to create
a SkScalar-based rectangle that intersects shared
edges.
This also includes common math equalities and
debugging that the remainder of path ops builds on,
as well as a temporary top-level interface in
include/pathops/SkPathOps.h.
Review URL: https://codereview.chromium.org/12827020
git-svn-id: http://skia.googlecode.com/svn/trunk@8551 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-04-08 11:47:37 +00:00
|
|
|
|
2013-04-26 19:51:16 +00:00
|
|
|
/** Set this path to a set of non-overlapping contours that describe the
|
2013-04-27 07:02:53 +00:00
|
|
|
same area as the original path.
|
2013-04-26 19:51:16 +00:00
|
|
|
The curve order is reduced where possible so that cubics may
|
|
|
|
be turned into quadratics, and quadratics maybe turned into lines.
|
|
|
|
|
2013-04-27 07:02:53 +00:00
|
|
|
Returns true if operation was able to produce a result;
|
2013-04-26 19:51:16 +00:00
|
|
|
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.
|
Add base types for path ops
Paths contain lines, quads, and cubics, which are
collectively curves.
To work with path intersections, intermediary curves
are constructed. For now, those intermediates use
doubles to guarantee sufficient precision.
The DVector, DPoint, DLine, DQuad, and DCubic
structs encapsulate these intermediate curves.
The DRect and DTriangle structs are created to
describe intersectable areas of interest.
The Bounds struct inherits from SkRect to create
a SkScalar-based rectangle that intersects shared
edges.
This also includes common math equalities and
debugging that the remainder of path ops builds on,
as well as a temporary top-level interface in
include/pathops/SkPathOps.h.
Review URL: https://codereview.chromium.org/12827020
git-svn-id: http://skia.googlecode.com/svn/trunk@8551 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-04-08 11:47:37 +00:00
|
|
|
*/
|
2013-07-09 19:43:35 +00:00
|
|
|
bool SK_API Simplify(const SkPath& path, SkPath* result);
|
Add base types for path ops
Paths contain lines, quads, and cubics, which are
collectively curves.
To work with path intersections, intermediary curves
are constructed. For now, those intermediates use
doubles to guarantee sufficient precision.
The DVector, DPoint, DLine, DQuad, and DCubic
structs encapsulate these intermediate curves.
The DRect and DTriangle structs are created to
describe intersectable areas of interest.
The Bounds struct inherits from SkRect to create
a SkScalar-based rectangle that intersects shared
edges.
This also includes common math equalities and
debugging that the remainder of path ops builds on,
as well as a temporary top-level interface in
include/pathops/SkPathOps.h.
Review URL: https://codereview.chromium.org/12827020
git-svn-id: http://skia.googlecode.com/svn/trunk@8551 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-04-08 11:47:37 +00:00
|
|
|
|
2014-06-24 14:55:11 +00:00
|
|
|
/** 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);
|
|
|
|
|
2018-08-16 15:53:54 +00:00
|
|
|
/** 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);
|
|
|
|
|
2015-03-26 14:52:43 +00:00
|
|
|
/** 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.
|
2017-10-09 19:45:33 +00:00
|
|
|
*/
|
2015-03-26 14:52:43 +00:00
|
|
|
void add(const SkPath& path, SkPathOp _operator);
|
|
|
|
|
|
|
|
/** Computes the sum of all paths and operands, and resets the builder to its
|
|
|
|
initial state.
|
2017-10-09 19:45:33 +00:00
|
|
|
|
2015-03-26 14:52:43 +00:00
|
|
|
@param result The product of the operands.
|
|
|
|
@return True if the operation succeeded.
|
|
|
|
*/
|
|
|
|
bool resolve(SkPath* result);
|
|
|
|
|
|
|
|
private:
|
|
|
|
SkTArray<SkPath> fPathRefs;
|
|
|
|
SkTDArray<SkPathOp> fOps;
|
|
|
|
|
2016-11-07 13:09:28 +00:00
|
|
|
static bool FixWinding(SkPath* path);
|
|
|
|
static void ReversePath(SkPath* path);
|
2015-03-26 14:52:43 +00:00
|
|
|
void reset();
|
|
|
|
};
|
|
|
|
|
Add base types for path ops
Paths contain lines, quads, and cubics, which are
collectively curves.
To work with path intersections, intermediary curves
are constructed. For now, those intermediates use
doubles to guarantee sufficient precision.
The DVector, DPoint, DLine, DQuad, and DCubic
structs encapsulate these intermediate curves.
The DRect and DTriangle structs are created to
describe intersectable areas of interest.
The Bounds struct inherits from SkRect to create
a SkScalar-based rectangle that intersects shared
edges.
This also includes common math equalities and
debugging that the remainder of path ops builds on,
as well as a temporary top-level interface in
include/pathops/SkPathOps.h.
Review URL: https://codereview.chromium.org/12827020
git-svn-id: http://skia.googlecode.com/svn/trunk@8551 2bbb7eff-a529-9590-31e7-b0007b416f81
2013-04-08 11:47:37 +00:00
|
|
|
#endif
|