Index: src/gpu/GrStrokeInfo.h |
diff --git a/src/gpu/GrStrokeInfo.h b/src/gpu/GrStrokeInfo.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b96ed3909630ff6e8f5c74d3c861f9859c5285b6 |
--- /dev/null |
+++ b/src/gpu/GrStrokeInfo.h |
@@ -0,0 +1,88 @@ |
+/* |
+ * Copyright 2014 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef GrStrokeInfo_DEFINED |
+#define GrStrokeInfo_DEFINED |
+ |
+#include "SkStrokeRec.h" |
+#include "SkPathEffect.h" |
+ |
+/* |
+ * GrStrokeInfo encapsulates the data objects that hold all the pertinent infomation |
+ * regarding the stroke. The two objects are SkStrokeRec which holds information on fill style, |
+ * width, miter, cap, and join. The second object is DashInfo. This holds information about the |
+ * dash like intervals, count, and phase. |
+ */ |
+class GrStrokeInfo { |
+public: |
+ GrStrokeInfo(SkStrokeRec::InitStyle style) : |
+ fStroke(style), fDashType(SkPathEffect::kNone_DashType) {} |
+ |
+ GrStrokeInfo(const GrStrokeInfo& src, bool includeDash = true) : fStroke(src.fStroke) { |
+ if (includeDash) { |
+ fDashInfo = src.fDashInfo; |
+ fDashType = src.fDashType; |
+ fIntervals.reset(src.dashCount()); |
+ memcpy(fIntervals.get(), src.fIntervals.get(), src.dashCount() * sizeof(SkScalar)); |
+ } else { |
+ fDashType = SkPathEffect::kNone_DashType; |
+ } |
+ } |
+ |
+ explicit GrStrokeInfo(const SkPaint& paint) : |
+ fStroke(paint), fDashType(SkPathEffect::kNone_DashType) { |
+ const SkPathEffect* pe = paint.getPathEffect(); |
+ this->setDashInfo(pe); |
+ } |
+ |
+ const SkStrokeRec& getStrokeRec() const { return fStroke; } |
+ |
+ SkStrokeRec* getStrokeRecPtr() { return &fStroke; } |
+ |
+ void setFillStyle() { fStroke.setFillStyle(); } |
+ |
+ /* |
+ * This functions takes in a patheffect and fills in fDashInfo with the various dashing |
+ * information if the path effect is a Dash type. Returns true if the path effect is a |
+ * dashed effect and we are stroking, otherwise it retruns false. |
+ */ |
+ bool setDashInfo(const SkPathEffect* pe) { |
+ if (NULL != pe && !fStroke.isFillStyle()) { |
+ fDashInfo.fIntervals = NULL; |
+ fDashType = pe->asADash(&fDashInfo); |
+ if (SkPathEffect::kDash_DashType == fDashType) { |
+ fIntervals.reset(fDashInfo.fCount); |
+ fDashInfo.fIntervals = fIntervals.get(); |
+ pe->asADash(&fDashInfo); |
+ return true; |
+ } |
+ } |
+ return false; |
+ } |
+ |
+ bool isDashed() const { |
+ return (!fStroke.isFillStyle() && SkPathEffect::kDash_DashType == fDashType); |
+ } |
+ |
+ int32_t dashCount() const { |
+ return fDashInfo.fCount; |
+ } |
+ |
+ void removeDash() { |
+ fDashType = SkPathEffect::kNone_DashType; |
+ } |
+ |
+ const SkPathEffect::DashInfo& getDashInfo() const { return fDashInfo; } |
+ |
+private: |
+ SkStrokeRec fStroke; |
+ SkPathEffect::DashType fDashType; |
+ SkPathEffect::DashInfo fDashInfo; |
+ SkAutoSTArray<2, SkScalar> fIntervals; |
+}; |
+ |
+#endif |