aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-10 13:51:32 +0000
committerGravatar robertphillips@google.com <robertphillips@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2014-02-10 13:51:32 +0000
commitf66cf72c6810766234d06bb96696b594a99dcd02 (patch)
treef2b69e7436603f6e8219a6390de9028b7ca3310a /src/core
parent2693eb95233f16ed58b7b37c6b497fb8991b0396 (diff)
Move fLastMoveToIndex from SkPath to SkPathRef
Diffstat (limited to 'src/core')
-rw-r--r--src/core/SkPath.cpp48
-rw-r--r--src/core/SkPathRef.cpp39
2 files changed, 43 insertions, 44 deletions
diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp
index 04c807b644..d3f493d46f 100644
--- a/src/core/SkPath.cpp
+++ b/src/core/SkPath.cpp
@@ -122,9 +122,6 @@ private:
////////////////////////////////////////////////////////////////////////////
-// flag to require a moveTo if we begin with something else, like lineTo etc.
-#define INITIAL_LASTMOVETOINDEX_VALUE ~0
-
SkPath::SkPath()
: fPathRef(SkPathRef::CreateEmpty())
#ifdef SK_BUILD_FOR_ANDROID
@@ -136,7 +133,6 @@ SkPath::SkPath()
void SkPath::resetFields() {
//fPathRef is assumed to have been emptied by the caller.
- fLastMoveToIndex = INITIAL_LASTMOVETOINDEX_VALUE;
fFillType = kWinding_FillType;
fConvexity = kUnknown_Convexity;
fDirection = kUnknown_Direction;
@@ -174,7 +170,6 @@ SkPath& SkPath::operator=(const SkPath& that) {
void SkPath::copyFields(const SkPath& that) {
//fPathRef is assumed to have been set by the caller.
- fLastMoveToIndex = that.fLastMoveToIndex;
fFillType = that.fFillType;
fConvexity = that.fConvexity;
fDirection = that.fDirection;
@@ -192,7 +187,6 @@ void SkPath::swap(SkPath& that) {
if (this != &that) {
fPathRef.swap(&that.fPathRef);
- SkTSwap<int>(fLastMoveToIndex, that.fLastMoveToIndex);
SkTSwap<uint8_t>(fFillType, that.fFillType);
SkTSwap<uint8_t>(fConvexity, that.fConvexity);
SkTSwap<uint8_t>(fDirection, that.fDirection);
@@ -667,9 +661,6 @@ void SkPath::moveTo(SkScalar x, SkScalar y) {
SkPathRef::Editor ed(&fPathRef);
- // remember our index
- fLastMoveToIndex = fPathRef->countPoints();
-
ed.growForVerb(kMove_Verb)->set(x, y);
}
@@ -679,26 +670,11 @@ void SkPath::rMoveTo(SkScalar x, SkScalar y) {
this->moveTo(pt.fX + x, pt.fY + y);
}
-void SkPath::injectMoveToIfNeeded() {
- if (fLastMoveToIndex < 0) {
- SkScalar x, y;
- if (fPathRef->countVerbs() == 0) {
- x = y = 0;
- } else {
- const SkPoint& pt = fPathRef->atPoint(~fLastMoveToIndex);
- x = pt.fX;
- y = pt.fY;
- }
- this->moveTo(x, y);
- }
-}
-
void SkPath::lineTo(SkScalar x, SkScalar y) {
SkDEBUGCODE(this->validate();)
- this->injectMoveToIfNeeded();
-
SkPathRef::Editor ed(&fPathRef);
+ ed.injectMoveToIfNeeded();
ed.growForVerb(kLine_Verb)->set(x, y);
DIRTY_AFTER_EDIT;
@@ -714,9 +690,8 @@ void SkPath::rLineTo(SkScalar x, SkScalar y) {
void SkPath::quadTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2) {
SkDEBUGCODE(this->validate();)
- this->injectMoveToIfNeeded();
-
SkPathRef::Editor ed(&fPathRef);
+ ed.injectMoveToIfNeeded();
SkPoint* pts = ed.growForVerb(kQuad_Verb);
pts[0].set(x1, y1);
pts[1].set(x2, y2);
@@ -744,9 +719,8 @@ void SkPath::conicTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2,
} else {
SkDEBUGCODE(this->validate();)
- this->injectMoveToIfNeeded();
-
SkPathRef::Editor ed(&fPathRef);
+ ed.injectMoveToIfNeeded();
SkPoint* pts = ed.growForVerb(kConic_Verb, w);
pts[0].set(x1, y1);
pts[1].set(x2, y2);
@@ -767,9 +741,8 @@ void SkPath::cubicTo(SkScalar x1, SkScalar y1, SkScalar x2, SkScalar y2,
SkScalar x3, SkScalar y3) {
SkDEBUGCODE(this->validate();)
- this->injectMoveToIfNeeded();
-
SkPathRef::Editor ed(&fPathRef);
+ ed.injectMoveToIfNeeded();
SkPoint* pts = ed.growForVerb(kCubic_Verb);
pts[0].set(x1, y1);
pts[1].set(x2, y2);
@@ -810,15 +783,6 @@ void SkPath::close() {
break;
}
}
-
- // signal that we need a moveTo to follow us (unless we're done)
-#if 0
- if (fLastMoveToIndex >= 0) {
- fLastMoveToIndex = ~fLastMoveToIndex;
- }
-#else
- fLastMoveToIndex ^= ~fLastMoveToIndex >> (8 * sizeof(fLastMoveToIndex) - 1);
-#endif
}
///////////////////////////////////////////////////////////////////////////////
@@ -860,8 +824,6 @@ void SkPath::addPoly(const SkPoint pts[], int count, bool close) {
return;
}
- fLastMoveToIndex = fPathRef->countPoints();
-
// +close makes room for the extra kClose_Verb
SkPathRef::Editor ed(&fPathRef, count+close, count);
@@ -1358,8 +1320,6 @@ void SkPath::addArc(const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle
SkDEBUGCODE(this->validate();)
SkASSERT(count & 1);
- fLastMoveToIndex = fPathRef->countPoints();
-
SkPathRef::Editor ed(&fPathRef, 1+(count-1)/2, count);
ed.growForVerb(kMove_Verb)->set(pts[0].fX, pts[0].fY);
diff --git a/src/core/SkPathRef.cpp b/src/core/SkPathRef.cpp
index 161eb80419..1272cf2594 100644
--- a/src/core/SkPathRef.cpp
+++ b/src/core/SkPathRef.cpp
@@ -154,6 +154,7 @@ SkPathRef* SkPathRef::CreateFromBuffer(SkRBuffer* buffer) {
void SkPathRef::Rewind(SkAutoTUnref<SkPathRef>* pathRef) {
if ((*pathRef)->unique()) {
SkDEBUGCODE((*pathRef)->validate();)
+ (*pathRef)->fLastMoveToIndex = kINITIAL_LASTMOVETOINDEX_VALUE;
(*pathRef)->fBoundsIsDirty = true; // this also invalidates fIsFinite
(*pathRef)->fVerbCnt = 0;
(*pathRef)->fPointCnt = 0;
@@ -276,6 +277,20 @@ void SkPathRef::copy(const SkPathRef& ref,
SkDEBUGCODE(this->validate();)
}
+void SkPathRef::injectMoveToIfNeeded() {
+ if (fLastMoveToIndex < 0) {
+ SkScalar x, y;
+ if (this->countVerbs() == 0) {
+ x = y = 0;
+ } else {
+ const SkPoint& pt = this->atPoint(~fLastMoveToIndex);
+ x = pt.fX;
+ y = pt.fY;
+ }
+ this->growForVerb(SkPath::kMove_Verb, 0)->set(x, y);
+ }
+}
+
SkPoint* SkPathRef::growForRepeatedVerb(int /*SkPath::Verb*/ verb,
int numVbs,
SkScalar** weights) {
@@ -284,11 +299,16 @@ SkPoint* SkPathRef::growForRepeatedVerb(int /*SkPath::Verb*/ verb,
// future this will appear to have been a fluke...
static const unsigned int kMIN_COUNT_FOR_MEMSET_TO_BE_FAST = 16;
+ if (numVbs <= 0) {
+ return NULL;
+ }
+
SkDEBUGCODE(this->validate();)
int pCnt;
bool dirtyAfterEdit = true;
switch (verb) {
case SkPath::kMove_Verb:
+ fLastMoveToIndex = fPointCnt + numVbs - 1;
pCnt = numVbs;
dirtyAfterEdit = false;
break;
@@ -310,6 +330,8 @@ SkPoint* SkPathRef::growForRepeatedVerb(int /*SkPath::Verb*/ verb,
break;
case SkPath::kClose_Verb:
SkDEBUGFAIL("growForRepeatedVerb called for kClose_Verb");
+ // signal that we need a moveTo to follow us (unless we're done)
+ fLastMoveToIndex ^= ~fLastMoveToIndex >> (8 * sizeof(fLastMoveToIndex) - 1);
pCnt = 0;
dirtyAfterEdit = false;
break;
@@ -361,6 +383,8 @@ SkPoint* SkPathRef::growForVerb(int /* SkPath::Verb*/ verb, SkScalar weight) {
bool dirtyAfterEdit = true;
switch (verb) {
case SkPath::kMove_Verb:
+ // remember our index
+ fLastMoveToIndex = fPointCnt;
pCnt = 1;
dirtyAfterEdit = false;
break;
@@ -381,6 +405,8 @@ SkPoint* SkPathRef::growForVerb(int /* SkPath::Verb*/ verb, SkScalar weight) {
pCnt = 3;
break;
case SkPath::kClose_Verb:
+ // signal that we need a moveTo to follow us (unless we're done)
+ fLastMoveToIndex ^= ~fLastMoveToIndex >> (8 * sizeof(fLastMoveToIndex) - 1);
pCnt = 0;
dirtyAfterEdit = false;
break;
@@ -460,23 +486,34 @@ void SkPathRef::validate() const {
#ifdef SK_DEBUG_PATH
uint32_t mask = 0;
+ int lastMoveToIndex = kINITIAL_LASTMOVETOINDEX_VALUE;
+ int pointCnt = 0;
for (int i = 0; i < fVerbCnt; ++i) {
switch (fVerbs[~i]) {
case SkPath::kMove_Verb:
+ lastMoveToIndex = pointCnt;
+ ++pointCnt;
break;
case SkPath::kLine_Verb:
mask |= SkPath::kLine_SegmentMask;
+ ++pointCnt;
break;
case SkPath::kQuad_Verb:
mask |= SkPath::kQuad_SegmentMask;
+ pointCnt += 2;
break;
case SkPath::kConic_Verb:
mask |= SkPath::kConic_SegmentMask;
+ pointCnt += 2;
break;
case SkPath::kCubic_Verb:
mask |= SkPath::kCubic_SegmentMask;
+ pointCnt += 3;
break;
case SkPath::kClose_Verb:
+ if (lastMoveToIndex >= 0) {
+ lastMoveToIndex = ~lastMoveToIndex;
+ }
break;
case SkPath::kDone_Verb:
SkDEBUGFAIL("Done verb shouldn't be recorded.");
@@ -487,6 +524,8 @@ void SkPathRef::validate() const {
}
}
SkASSERT(mask == fSegmentMask);
+ SkASSERT(lastMoveToIndex == fLastMoveToIndex);
+ SkASSERT(pointCnt == fPointCnt);
#endif // SK_DEBUG_PATH
}
#endif