| Index: src/core/SkPath.cpp
|
| diff --git a/src/core/SkPath.cpp b/src/core/SkPath.cpp
|
| index 8da15804deb69b8defca2c8fb0dbf6f5a64be835..97e34386dc1ce3aeeb8b09919cbeecc3096b35fa 100644
|
| --- a/src/core/SkPath.cpp
|
| +++ b/src/core/SkPath.cpp
|
| @@ -36,7 +36,7 @@ static bool is_degenerate(const SkPath& path) {
|
| class SkAutoDisableDirectionCheck {
|
| public:
|
| SkAutoDisableDirectionCheck(SkPath* path) : fPath(path) {
|
| - fSaved = static_cast<SkPathPriv::FirstDirection>(fPath->fFirstDirection);
|
| + fSaved = static_cast<SkPathPriv::FirstDirection>(fPath->fFirstDirection.load());
|
| }
|
|
|
| ~SkAutoDisableDirectionCheck() {
|
| @@ -166,7 +166,8 @@ void SkPath::copyFields(const SkPath& that) {
|
| fLastMoveToIndex = that.fLastMoveToIndex;
|
| fFillType = that.fFillType;
|
| fConvexity = that.fConvexity;
|
| - fFirstDirection = that.fFirstDirection;
|
| + // Simulate fFirstDirection = that.fFirstDirection;
|
| + fFirstDirection.store(that.fFirstDirection.load());
|
| fIsVolatile = that.fIsVolatile;
|
| }
|
|
|
| @@ -183,7 +184,10 @@ void SkPath::swap(SkPath& that) {
|
| SkTSwap<int>(fLastMoveToIndex, that.fLastMoveToIndex);
|
| SkTSwap<uint8_t>(fFillType, that.fFillType);
|
| SkTSwap<uint8_t>(fConvexity, that.fConvexity);
|
| - SkTSwap<uint8_t>(fFirstDirection, that.fFirstDirection);
|
| + // Simulate SkTSwap<uint8_t>(fFirstDirection, that.fFirstDirection);
|
| + uint8_t temp = fFirstDirection;
|
| + fFirstDirection.store(that.fFirstDirection.load());
|
| + that.fFirstDirection.store(temp);
|
| SkTSwap<SkBool8>(fIsVolatile, that.fIsVolatile);
|
| }
|
| }
|
| @@ -1495,9 +1499,10 @@ void SkPath::transform(const SkMatrix& matrix, SkPath* dst) const {
|
| SkScalarMul(matrix.get(SkMatrix::kMScaleX), matrix.get(SkMatrix::kMScaleY)) -
|
| SkScalarMul(matrix.get(SkMatrix::kMSkewX), matrix.get(SkMatrix::kMSkewY));
|
| if (det2x2 < 0) {
|
| - dst->fFirstDirection = SkPathPriv::OppositeFirstDirection((SkPathPriv::FirstDirection)fFirstDirection);
|
| + dst->fFirstDirection = SkPathPriv::OppositeFirstDirection(
|
| + (SkPathPriv::FirstDirection)fFirstDirection.load());
|
| } else if (det2x2 > 0) {
|
| - dst->fFirstDirection = fFirstDirection;
|
| + dst->fFirstDirection = fFirstDirection.load();
|
| } else {
|
| dst->fConvexity = kUnknown_Convexity;
|
| dst->fFirstDirection = SkPathPriv::kUnknown_FirstDirection;
|
| @@ -2475,8 +2480,8 @@ static void crossToDir(SkScalar cross, SkPathPriv::FirstDirection* dir) {
|
| * its cross product.
|
| */
|
| bool SkPathPriv::CheapComputeFirstDirection(const SkPath& path, FirstDirection* dir) {
|
| - if (kUnknown_FirstDirection != path.fFirstDirection) {
|
| - *dir = static_cast<FirstDirection>(path.fFirstDirection);
|
| + if (kUnknown_FirstDirection != path.fFirstDirection.load()) {
|
| + *dir = static_cast<FirstDirection>(path.fFirstDirection.load());
|
| return true;
|
| }
|
|
|
| @@ -2484,7 +2489,7 @@ bool SkPathPriv::CheapComputeFirstDirection(const SkPath& path, FirstDirection*
|
| // is unknown, so we don't call isConvex()
|
| if (SkPath::kConvex_Convexity == path.getConvexityOrUnknown()) {
|
| SkASSERT(kUnknown_FirstDirection == path.fFirstDirection);
|
| - *dir = static_cast<FirstDirection>(path.fFirstDirection);
|
| + *dir = static_cast<FirstDirection>(path.fFirstDirection.load());
|
| return false;
|
| }
|
|
|
|
|