| Index: src/effects/SkDashPathEffect.cpp
|
| diff --git a/src/effects/SkDashPathEffect.cpp b/src/effects/SkDashPathEffect.cpp
|
| index 15276b684c779329fd9b8d4aee352bf0b344b5de..6f132e0be573a568dcda60a45ee11f31d8daecb4 100644
|
| --- a/src/effects/SkDashPathEffect.cpp
|
| +++ b/src/effects/SkDashPathEffect.cpp
|
| @@ -34,19 +34,10 @@ static SkScalar FindFirstInterval(const SkScalar intervals[], SkScalar phase,
|
| return intervals[0];
|
| }
|
|
|
| -SkDashPathEffect::SkDashPathEffect(const SkScalar intervals[], int count,
|
| - SkScalar phase) {
|
| - SkASSERT(intervals);
|
| - SkASSERT(count > 1 && SkAlign2(count) == count);
|
| -
|
| - fIntervals = (SkScalar*)sk_malloc_throw(sizeof(SkScalar) * count);
|
| - fCount = count;
|
| -
|
| +void SkDashPathEffect::setInternalMembers(SkScalar phase) {
|
| SkScalar len = 0;
|
| - for (int i = 0; i < count; i++) {
|
| - SkASSERT(intervals[i] >= 0);
|
| - fIntervals[i] = intervals[i];
|
| - len += intervals[i];
|
| + for (int i = 0; i < fCount; i++) {
|
| + len += fIntervals[i];
|
| }
|
| fIntervalLength = len;
|
|
|
| @@ -74,8 +65,10 @@ SkDashPathEffect::SkDashPathEffect(const SkScalar intervals[], int count,
|
| }
|
| SkASSERT(phase >= 0 && phase < len);
|
|
|
| - fInitialDashLength = FindFirstInterval(intervals, phase,
|
| - &fInitialDashIndex, count);
|
| + fPhase = phase;
|
| +
|
| + fInitialDashLength = FindFirstInterval(fIntervals, fPhase,
|
| + &fInitialDashIndex, fCount);
|
|
|
| SkASSERT(fInitialDashLength >= 0);
|
| SkASSERT(fInitialDashIndex >= 0 && fInitialDashIndex < fCount);
|
| @@ -84,6 +77,21 @@ SkDashPathEffect::SkDashPathEffect(const SkScalar intervals[], int count,
|
| }
|
| }
|
|
|
| +SkDashPathEffect::SkDashPathEffect(const SkScalar intervals[], int count,
|
| + SkScalar phase) {
|
| + SkASSERT(intervals);
|
| + SkASSERT(count > 1 && SkAlign2(count) == count);
|
| +
|
| + fIntervals = (SkScalar*)sk_malloc_throw(sizeof(SkScalar) * count);
|
| + fCount = count;
|
| + for (int i = 0; i < count; i++) {
|
| + SkASSERT(intervals[i] >= 0);
|
| + fIntervals[i] = intervals[i];
|
| + }
|
| +
|
| + this->setInternalMembers(phase);
|
| +}
|
| +
|
| SkDashPathEffect::~SkDashPathEffect() {
|
| sk_free(fIntervals);
|
| }
|
| @@ -510,17 +518,24 @@ bool SkDashPathEffect::asPoints(PointData* results,
|
| return true;
|
| }
|
|
|
| +SkPathEffect::DashType SkDashPathEffect::asADash(DashInfo* info) const {
|
| + if (info) {
|
| + if (info->fCount >= fCount && NULL != info->fIntervals) {
|
| + memcpy(info->fIntervals, fIntervals, fCount * sizeof(SkScalar));
|
| + }
|
| + info->fCount = fCount;
|
| + info->fPhase = fPhase;
|
| + }
|
| + return kDash_DashType;
|
| +}
|
| +
|
| SkFlattenable::Factory SkDashPathEffect::getFactory() const {
|
| return CreateProc;
|
| }
|
|
|
| void SkDashPathEffect::flatten(SkWriteBuffer& buffer) const {
|
| this->INHERITED::flatten(buffer);
|
| - buffer.writeInt(fInitialDashIndex);
|
| - buffer.writeScalar(fInitialDashLength);
|
| - buffer.writeScalar(fIntervalLength);
|
| - // Dummy write to stay compatible with old skps. Write will be removed in follow up patch.
|
| - buffer.writeBool(false);
|
| + buffer.writeScalar(fPhase);
|
| buffer.writeScalarArray(fIntervals, fCount);
|
| }
|
|
|
| @@ -529,10 +544,15 @@ SkFlattenable* SkDashPathEffect::CreateProc(SkReadBuffer& buffer) {
|
| }
|
|
|
| SkDashPathEffect::SkDashPathEffect(SkReadBuffer& buffer) : INHERITED(buffer) {
|
| - fInitialDashIndex = buffer.readInt();
|
| - fInitialDashLength = buffer.readScalar();
|
| - fIntervalLength = buffer.readScalar();
|
| - buffer.readBool(); // dummy read to stay compatible with old skps
|
| + bool useOldPic = buffer.pictureVersion() < 25 && 0 != buffer.pictureVersion();
|
| + if (useOldPic) {
|
| + fInitialDashIndex = buffer.readInt();
|
| + fInitialDashLength = buffer.readScalar();
|
| + fIntervalLength = buffer.readScalar();
|
| + buffer.readBool(); // Dummy for old ScalarToFit field
|
| + } else {
|
| + fPhase = buffer.readScalar();
|
| + }
|
|
|
| fCount = buffer.getArrayCount();
|
| size_t allocSize = sizeof(SkScalar) * fCount;
|
| @@ -542,4 +562,14 @@ SkDashPathEffect::SkDashPathEffect(SkReadBuffer& buffer) : INHERITED(buffer) {
|
| } else {
|
| fIntervals = NULL;
|
| }
|
| +
|
| + if (useOldPic) {
|
| + fPhase = 0;
|
| + for (int i = 0; i < fInitialDashIndex; ++i) {
|
| + fPhase += fIntervals[i];
|
| + }
|
| + fPhase += fInitialDashLength;
|
| + } else {
|
| + this->setInternalMembers(fPhase);
|
| + }
|
| }
|
|
|