1 /* 2 * Copyright 2014 Google Inc. 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 GrStrokeInfo_DEFINED 9 #define GrStrokeInfo_DEFINED 10 11 #include "SkStrokeRec.h" 12 #include "SkPathEffect.h" 13 14 /* 15 * GrStrokeInfo encapsulates the data objects that hold all the pertinent infomation 16 * regarding the stroke. The two objects are SkStrokeRec which holds information on fill style, 17 * width, miter, cap, and join. The second object is DashInfo. This holds information about the 18 * dash like intervals, count, and phase. 19 */ 20 class GrStrokeInfo { 21 public: 22 GrStrokeInfo(SkStrokeRec::InitStyle style) : 23 fStroke(style), fDashType(SkPathEffect::kNone_DashType) {} 24 25 GrStrokeInfo(const GrStrokeInfo& src, bool includeDash = true) : fStroke(src.fStroke) { 26 if (includeDash) { 27 fDashInfo = src.fDashInfo; 28 fDashType = src.fDashType; 29 fIntervals.reset(src.dashCount()); 30 memcpy(fIntervals.get(), src.fIntervals.get(), src.dashCount() * sizeof(SkScalar)); 31 } else { 32 fDashType = SkPathEffect::kNone_DashType; 33 } 34 } 35 36 GrStrokeInfo(const SkPaint& paint, SkPaint::Style styleOverride) : 37 fStroke(paint, styleOverride), fDashType(SkPathEffect::kNone_DashType) { 38 this->init(paint); 39 } 40 41 42 explicit GrStrokeInfo(const SkPaint& paint) : 43 fStroke(paint), fDashType(SkPathEffect::kNone_DashType) { 44 this->init(paint); 45 } 46 47 const SkStrokeRec& getStrokeRec() const { return fStroke; } 48 49 SkStrokeRec* getStrokeRecPtr() { return &fStroke; } 50 51 void setFillStyle() { fStroke.setFillStyle(); } 52 53 /* 54 * This functions takes in a patheffect and fills in fDashInfo with the various dashing 55 * information if the path effect is a Dash type. Returns true if the path effect is a 56 * dashed effect and we are stroking, otherwise it retruns false. 57 */ 58 bool setDashInfo(const SkPathEffect* pe) { 59 if (pe && !fStroke.isFillStyle()) { 60 fDashInfo.fIntervals = NULL; 61 fDashType = pe->asADash(&fDashInfo); 62 if (SkPathEffect::kDash_DashType == fDashType) { 63 fIntervals.reset(fDashInfo.fCount); 64 fDashInfo.fIntervals = fIntervals.get(); 65 pe->asADash(&fDashInfo); 66 return true; 67 } 68 } 69 return false; 70 } 71 72 bool isDashed() const { 73 return (!fStroke.isFillStyle() && SkPathEffect::kDash_DashType == fDashType); 74 } 75 76 int32_t dashCount() const { 77 return fDashInfo.fCount; 78 } 79 80 void removeDash() { 81 fDashType = SkPathEffect::kNone_DashType; 82 } 83 84 const SkPathEffect::DashInfo& getDashInfo() const { return fDashInfo; } 85 86 private: 87 88 void init(const SkPaint& paint) { 89 const SkPathEffect* pe = paint.getPathEffect(); 90 this->setDashInfo(pe); 91 } 92 93 SkStrokeRec fStroke; 94 SkPathEffect::DashType fDashType; 95 SkPathEffect::DashInfo fDashInfo; 96 SkAutoSTArray<2, SkScalar> fIntervals; 97 }; 98 99 #endif 100