| Index: src/gpu/GrStrokeInfo.h
|
| diff --git a/src/gpu/GrStrokeInfo.h b/src/gpu/GrStrokeInfo.h
|
| index f008dc6a5d27183cb7da349a0cc22daddd21b9ba..e1349a7eece9d941afdc8dfdd801154d759ccc62 100644
|
| --- a/src/gpu/GrStrokeInfo.h
|
| +++ b/src/gpu/GrStrokeInfo.h
|
| @@ -12,10 +12,9 @@
|
| #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.
|
| + * GrStrokeInfo encapsulates all the pertinent infomation regarding the stroke. The SkStrokeRec
|
| + * which holds information on fill style, width, miter, cap, and join. It also holds information
|
| + * about the dash like intervals, count, and phase.
|
| */
|
| class GrStrokeInfo {
|
| public:
|
| @@ -23,11 +22,11 @@ public:
|
| fStroke(style), fDashType(SkPathEffect::kNone_DashType) {}
|
|
|
| GrStrokeInfo(const GrStrokeInfo& src, bool includeDash = true) : fStroke(src.fStroke) {
|
| - if (includeDash) {
|
| - fDashInfo = src.fDashInfo;
|
| + if (includeDash && src.isDashed()) {
|
| fDashType = src.fDashType;
|
| - fIntervals.reset(src.dashCount());
|
| - memcpy(fIntervals.get(), src.fIntervals.get(), src.dashCount() * sizeof(SkScalar));
|
| + fDashPhase = src.fDashPhase;
|
| + fIntervals.reset(src.getDashCount());
|
| + memcpy(fIntervals.get(), src.fIntervals.get(), fIntervals.count() * sizeof(SkScalar));
|
| } else {
|
| fDashType = SkPathEffect::kNone_DashType;
|
| }
|
| @@ -44,11 +43,15 @@ public:
|
| }
|
|
|
| GrStrokeInfo& operator=(const GrStrokeInfo& other) {
|
| + if (other.isDashed()) {
|
| + fDashType = other.fDashType;
|
| + fDashPhase = other.fDashPhase;
|
| + fIntervals.reset(other.getDashCount());
|
| + memcpy(fIntervals.get(), other.fIntervals.get(), fIntervals.count() * sizeof(SkScalar));
|
| + } else {
|
| + this->removeDash();
|
| + }
|
| fStroke = other.fStroke;
|
| - fDashInfo = other.fDashInfo;
|
| - fDashType = other.fDashType;
|
| - fIntervals.reset(other.dashCount());
|
| - memcpy(fIntervals.get(), other.fIntervals.get(), other.dashCount() * sizeof(SkScalar));
|
| return *this;
|
| }
|
|
|
| @@ -59,18 +62,19 @@ public:
|
| 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.
|
| + * This functions takes in a patheffect and updates the 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 returns false.
|
| */
|
| bool setDashInfo(const SkPathEffect* pe) {
|
| if (pe && !fStroke.isFillStyle()) {
|
| - fDashInfo.fIntervals = NULL;
|
| - fDashType = pe->asADash(&fDashInfo);
|
| + SkPathEffect::DashInfo dashInfo;
|
| + fDashType = pe->asADash(&dashInfo);
|
| if (SkPathEffect::kDash_DashType == fDashType) {
|
| - fIntervals.reset(fDashInfo.fCount);
|
| - fDashInfo.fIntervals = fIntervals.get();
|
| - pe->asADash(&fDashInfo);
|
| + fIntervals.reset(dashInfo.fCount);
|
| + dashInfo.fIntervals = fIntervals.get();
|
| + pe->asADash(&dashInfo);
|
| + fDashPhase = dashInfo.fPhase;
|
| return true;
|
| }
|
| }
|
| @@ -83,13 +87,12 @@ public:
|
| bool setDashInfo(const SkPathEffect::DashInfo& info) {
|
| if (!fStroke.isFillStyle()) {
|
| SkASSERT(!fStroke.isFillStyle());
|
| - fDashInfo.fCount = info.fCount;
|
| - fDashInfo.fPhase = info.fPhase;
|
| + fDashType = SkPathEffect::kDash_DashType;
|
| + fDashPhase = info.fPhase;
|
| fIntervals.reset(info.fCount);
|
| - for (int i = 0; i < info.fCount; i++) {
|
| + for (int i = 0; i < fIntervals.count(); i++) {
|
| fIntervals[i] = info.fIntervals[i];
|
| }
|
| - fDashInfo.fIntervals = fIntervals.get();
|
| return true;
|
| }
|
| return false;
|
| @@ -101,18 +104,27 @@ public:
|
|
|
| bool isFillStyle() const { return fStroke.isFillStyle(); }
|
|
|
| - int32_t dashCount() const {
|
| - return fDashInfo.fCount;
|
| + int32_t getDashCount() const {
|
| + SkASSERT(this->isDashed());
|
| + return fIntervals.count();
|
| + }
|
| +
|
| + SkScalar getDashPhase() const {
|
| + SkASSERT(this->isDashed());
|
| + return fDashPhase;
|
| + }
|
| +
|
| + const SkScalar* getDashIntervals() const {
|
| + SkASSERT(this->isDashed());
|
| + return fIntervals.get();
|
| }
|
|
|
| void removeDash() {
|
| fDashType = SkPathEffect::kNone_DashType;
|
| }
|
| -
|
| - const SkPathEffect::DashInfo& getDashInfo() const { return fDashInfo; }
|
|
|
| /** Applies the dash to a path, if the stroke info has dashing.
|
| - * @return true if the dash ingwas applied (dst and dstStrokeInfo will be modified).
|
| + * @return true if the dashing was applied (dst and dstStrokeInfo will be modified).
|
| * false if the stroke info did not have dashing. The dst and dstStrokeInfo
|
| * will be unmodified. The stroking in the SkStrokeRec might still
|
| * be applicable.
|
| @@ -128,7 +140,7 @@ private:
|
|
|
| SkStrokeRec fStroke;
|
| SkPathEffect::DashType fDashType;
|
| - SkPathEffect::DashInfo fDashInfo;
|
| + SkScalar fDashPhase;
|
| SkAutoSTArray<2, SkScalar> fIntervals;
|
| };
|
|
|
|
|