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