| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #ifndef GrStrokeInfo_DEFINED | 8 #ifndef GrStrokeInfo_DEFINED |
| 9 #define GrStrokeInfo_DEFINED | 9 #define GrStrokeInfo_DEFINED |
| 10 | 10 |
| 11 #include "SkStrokeRec.h" | 11 #include "SkStrokeRec.h" |
| 12 #include "SkPathEffect.h" | 12 #include "SkPathEffect.h" |
| 13 | 13 |
| 14 class GrUniqueKey; |
| 15 |
| 14 /* | 16 /* |
| 15 * GrStrokeInfo encapsulates all the pertinent infomation regarding the stroke.
The SkStrokeRec | 17 * GrStrokeInfo encapsulates all the pertinent infomation regarding the stroke.
The SkStrokeRec |
| 16 * which holds information on fill style, width, miter, cap, and join. It also h
olds information | 18 * which holds information on fill style, width, miter, cap, and join. It also h
olds information |
| 17 * about the dash like intervals, count, and phase. | 19 * about the dash like intervals, count, and phase. |
| 18 */ | 20 */ |
| 19 class GrStrokeInfo : public SkStrokeRec { | 21 class GrStrokeInfo : public SkStrokeRec { |
| 20 public: | 22 public: |
| 21 GrStrokeInfo(SkStrokeRec::InitStyle style) | 23 GrStrokeInfo(SkStrokeRec::InitStyle style) |
| 22 : INHERITED(style) | 24 : INHERITED(style) |
| 23 , fDashType(SkPathEffect::kNone_DashType) { | 25 , fDashType(SkPathEffect::kNone_DashType) { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 53 fDashPhase = other.fDashPhase; | 55 fDashPhase = other.fDashPhase; |
| 54 fIntervals.reset(other.getDashCount()); | 56 fIntervals.reset(other.getDashCount()); |
| 55 memcpy(fIntervals.get(), other.fIntervals.get(), fIntervals.count()
* sizeof(SkScalar)); | 57 memcpy(fIntervals.get(), other.fIntervals.get(), fIntervals.count()
* sizeof(SkScalar)); |
| 56 } else { | 58 } else { |
| 57 this->removeDash(); | 59 this->removeDash(); |
| 58 } | 60 } |
| 59 this->INHERITED::operator=(other); | 61 this->INHERITED::operator=(other); |
| 60 return *this; | 62 return *this; |
| 61 } | 63 } |
| 62 | 64 |
| 65 bool hasEqualEffect(const GrStrokeInfo& other) const { |
| 66 if (this->isDashed() != other.isDashed()) { |
| 67 return false; |
| 68 } |
| 69 if (this->isDashed()) { |
| 70 if (fDashPhase != other.fDashPhase || |
| 71 fIntervals.count() != other.fIntervals.count() || |
| 72 memcmp(fIntervals.get(), other.fIntervals.get(), |
| 73 fIntervals.count() * sizeof(SkScalar)) != 0) { |
| 74 return false; |
| 75 } |
| 76 } |
| 77 return this->INHERITED::hasEqualEffect(other); |
| 78 } |
| 79 |
| 63 /* | 80 /* |
| 64 * This functions takes in a patheffect and updates the dashing information
if the path effect | 81 * This functions takes in a patheffect and updates the dashing information
if the path effect |
| 65 * is a Dash type. Returns true if the path effect is a dashed effect and we
are stroking, | 82 * is a Dash type. Returns true if the path effect is a dashed effect and we
are stroking, |
| 66 * otherwise it returns false. | 83 * otherwise it returns false. |
| 67 */ | 84 */ |
| 68 bool setDashInfo(const SkPathEffect* pe) { | 85 bool setDashInfo(const SkPathEffect* pe) { |
| 69 if (pe && !this->isFillStyle()) { | 86 if (pe && !this->isFillStyle()) { |
| 70 SkPathEffect::DashInfo dashInfo; | 87 SkPathEffect::DashInfo dashInfo; |
| 71 fDashType = pe->asADash(&dashInfo); | 88 fDashType = pe->asADash(&dashInfo); |
| 72 if (SkPathEffect::kDash_DashType == fDashType) { | 89 if (SkPathEffect::kDash_DashType == fDashType) { |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 } | 137 } |
| 121 | 138 |
| 122 /** Applies the dash to a path, if the stroke info has dashing. | 139 /** Applies the dash to a path, if the stroke info has dashing. |
| 123 * @return true if the dashing was applied (dst and dstStrokeInfo will be mo
dified). | 140 * @return true if the dashing was applied (dst and dstStrokeInfo will be mo
dified). |
| 124 * false if the stroke info did not have dashing. The dst and dstStr
okeInfo | 141 * false if the stroke info did not have dashing. The dst and dstStr
okeInfo |
| 125 * will be unmodified. The stroking in the SkStrokeRec might s
till | 142 * will be unmodified. The stroking in the SkStrokeRec might s
till |
| 126 * be applicable. | 143 * be applicable. |
| 127 */ | 144 */ |
| 128 bool applyDashToPath(SkPath* dst, GrStrokeInfo* dstStrokeInfo, const SkPath&
src) const; | 145 bool applyDashToPath(SkPath* dst, GrStrokeInfo* dstStrokeInfo, const SkPath&
src) const; |
| 129 | 146 |
| 147 /** |
| 148 * Computes the length of the data that will be written by asUniqueKeyFragme
nt() function. |
| 149 */ |
| 150 int computeUniqueKeyFragmentData32Cnt() const { |
| 151 const int kSkScalarData32Cnt = sizeof(SkScalar) / sizeof(uint32_t); |
| 152 // SkStrokeRec data: 32 bits for style+join+cap and 2 scalars for miter
and width. |
| 153 int strokeKeyData32Cnt = 1 + 2 * kSkScalarData32Cnt; |
| 154 |
| 155 if (this->isDashed()) { |
| 156 // One scalar for dash phase and one for each dash value. |
| 157 strokeKeyData32Cnt += (1 + this->getDashCount()) * kSkScalarData32Cn
t; |
| 158 } |
| 159 return strokeKeyData32Cnt; |
| 160 } |
| 161 |
| 162 /** |
| 163 * Writes the object contents as uint32_t data, to be used with GrUniqueKey. |
| 164 * Note: the data written does not encode the length, so care must be taken
to ensure |
| 165 * that the full unique key data is encoded properly. For example, GrStrokeI
nfo |
| 166 * fragment can be placed last in the sequence, at fixed index. |
| 167 */ |
| 168 void asUniqueKeyFragment(uint32_t*) const; |
| 169 |
| 130 private: | 170 private: |
| 131 // Prevent accidental usage, not implemented for GrStrokeInfos. | 171 // Prevent accidental usage, should use GrStrokeInfo::hasEqualEffect. |
| 132 bool hasEqualEffect(const SkStrokeRec& other) const; | 172 bool hasEqualEffect(const SkStrokeRec& other) const; |
| 133 | 173 |
| 134 void init(const SkPaint& paint) { | 174 void init(const SkPaint& paint) { |
| 135 const SkPathEffect* pe = paint.getPathEffect(); | 175 const SkPathEffect* pe = paint.getPathEffect(); |
| 136 this->setDashInfo(pe); | 176 this->setDashInfo(pe); |
| 137 } | 177 } |
| 138 | 178 |
| 139 SkPathEffect::DashType fDashType; | 179 SkPathEffect::DashType fDashType; |
| 140 SkScalar fDashPhase; | 180 SkScalar fDashPhase; |
| 141 SkAutoSTArray<2, SkScalar> fIntervals; | 181 SkAutoSTArray<2, SkScalar> fIntervals; |
| 142 typedef SkStrokeRec INHERITED; | 182 typedef SkStrokeRec INHERITED; |
| 143 }; | 183 }; |
| 144 | 184 |
| 145 #endif | 185 #endif |
| OLD | NEW |