00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef SkPathMeasure_DEFINED
00018 #define SkPathMeasure_DEFINED
00019
00020 #include "SkPath.h"
00021 #include "SkTDArray.h"
00022
00023 class SkPathMeasure : SkNoncopyable {
00024 public:
00025 SkPathMeasure();
00031 SkPathMeasure(const SkPath& path, bool forceClosed);
00032 ~SkPathMeasure();
00033
00039 void setPath(const SkPath*, bool forceClosed);
00040
00044 SkScalar getLength();
00045
00051 bool getPosTan(SkScalar distance, SkPoint* position, SkVector* tangent);
00052
00053 enum MatrixFlags {
00054 kGetPosition_MatrixFlag = 0x01,
00055 kGetTangent_MatrixFlag = 0x02,
00056 kGetPosAndTan_MatrixFlag = kGetPosition_MatrixFlag | kGetTangent_MatrixFlag
00057 };
00063 bool getMatrix(SkScalar distance, SkMatrix* matrix, MatrixFlags flags = kGetPosAndTan_MatrixFlag);
00070 bool getSegment(SkScalar startD, SkScalar stopD, SkPath* dst, bool startWithMoveTo);
00071
00074 bool isClosed();
00075
00079 bool nextContour();
00080
00081 #ifdef SK_DEBUG
00082 void dump();
00083 #endif
00084
00085 private:
00086 SkPath::Iter fIter;
00087 const SkPath* fPath;
00088 SkScalar fLength;
00089 int fFirstPtIndex;
00090 bool fIsClosed;
00091 bool fForceClosed;
00092
00093 struct Segment {
00094 SkScalar fDistance;
00095 unsigned fPtIndex : 15;
00096 unsigned fTValue : 15;
00097 unsigned fType : 2;
00098
00099 SkScalar getScalarT() const;
00100 };
00101 SkTDArray<Segment> fSegments;
00102
00103 static const Segment* NextSegment(const Segment*);
00104
00105 void buildSegments();
00106 SkScalar compute_quad_segs(const SkPoint pts[3], SkScalar distance,
00107 int mint, int maxt, int ptIndex);
00108 SkScalar compute_cubic_segs(const SkPoint pts[3], SkScalar distance,
00109 int mint, int maxt, int ptIndex);
00110 const Segment* distanceToSegment(SkScalar distance, SkScalar* t);
00111 };
00112
00113 #endif
00114