• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2006 The Android Open Source Project
3  *
4  * Use of this source code is governed by a BSD-style license that can be
5  * found in the LICENSE file.
6  */
7 
8 #ifndef SkPathMeasure_DEFINED
9 #define SkPathMeasure_DEFINED
10 
11 #include "include/core/SkContourMeasure.h"
12 #include "include/core/SkPath.h"
13 #include "include/private/SkTDArray.h"
14 
15 class SK_API SkPathMeasure {
16 public:
17     SkPathMeasure();
18     /** Initialize the pathmeasure with the specified path. The parts of the path that are needed
19      *  are copied, so the client is free to modify/delete the path after this call.
20      *
21      *  resScale controls the precision of the measure. values > 1 increase the
22      *  precision (and possible slow down the computation).
23      */
24     SkPathMeasure(const SkPath& path, bool forceClosed, SkScalar resScale = 1);
25     ~SkPathMeasure();
26 
27     /** Reset the pathmeasure with the specified path. The parts of the path that are needed
28      *  are copied, so the client is free to modify/delete the path after this call..
29      */
30     void setPath(const SkPath*, bool forceClosed);
31 
32     /** Return the total length of the current contour, or 0 if no path
33         is associated (e.g. resetPath(null))
34     */
35     SkScalar getLength();
36 
37     /** Pins distance to 0 <= distance <= getLength(), and then computes
38         the corresponding position and tangent.
39         Returns false if there is no path, or a zero-length path was specified, in which case
40         position and tangent are unchanged.
41     */
42     bool SK_WARN_UNUSED_RESULT getPosTan(SkScalar distance, SkPoint* position,
43                                          SkVector* tangent);
44 
45     enum MatrixFlags {
46         kGetPosition_MatrixFlag     = 0x01,
47         kGetTangent_MatrixFlag      = 0x02,
48         kGetPosAndTan_MatrixFlag    = kGetPosition_MatrixFlag | kGetTangent_MatrixFlag
49     };
50 
51     /** Pins distance to 0 <= distance <= getLength(), and then computes
52         the corresponding matrix (by calling getPosTan).
53         Returns false if there is no path, or a zero-length path was specified, in which case
54         matrix is unchanged.
55     */
56     bool SK_WARN_UNUSED_RESULT getMatrix(SkScalar distance, SkMatrix* matrix,
57                                   MatrixFlags flags = kGetPosAndTan_MatrixFlag);
58 
59     /** Given a start and stop distance, return in dst the intervening segment(s).
60         If the segment is zero-length, return false, else return true.
61         startD and stopD are pinned to legal values (0..getLength()). If startD > stopD
62         then return false (and leave dst untouched).
63         Begin the segment with a moveTo if startWithMoveTo is true
64     */
65     bool getSegment(SkScalar startD, SkScalar stopD, SkPath* dst, bool startWithMoveTo);
66 
67     /** Return true if the current contour is closed()
68     */
69     bool isClosed();
70 
71     /** Move to the next contour in the path. Return true if one exists, or false if
72         we're done with the path.
73     */
74     bool nextContour();
75 
76 #ifdef SK_DEBUG
77     void    dump();
78 #endif
79 
80 private:
81     SkContourMeasureIter    fIter;
82     sk_sp<SkContourMeasure> fContour;
83 
84     SkPathMeasure(const SkPathMeasure&) = delete;
85     SkPathMeasure& operator=(const SkPathMeasure&) = delete;
86 };
87 
88 #endif
89