path ops -- fix skp bugs

This fixes a series of bugs discovered by running
the small set of Skia skp files through pathops
to flatten the clips.
Review URL: https://codereview.chromium.org/14798004

git-svn-id: http://skia.googlecode.com/svn/trunk@9042 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/pathops/SkOpContour.cpp b/src/pathops/SkOpContour.cpp
index 1aee405..6266c65 100644
--- a/src/pathops/SkOpContour.cpp
+++ b/src/pathops/SkOpContour.cpp
@@ -64,38 +64,36 @@
     #endif
         double startT = coincidence.fTs[0][0];
         double endT = coincidence.fTs[0][1];
-        bool cancelers;
-        if ((cancelers = startT > endT)) {
+        bool startSwapped, oStartSwapped, cancelers;
+        if ((cancelers = startSwapped = startT > endT)) {
             SkTSwap(startT, endT);
-            SkTSwap(coincidence.fPts[0], coincidence.fPts[1]);
         }
         SkASSERT(!approximately_negative(endT - startT));
         double oStartT = coincidence.fTs[1][0];
         double oEndT = coincidence.fTs[1][1];
-        if (oStartT > oEndT) {
-            SkTSwap<double>(oStartT, oEndT);
+        if ((oStartSwapped = oStartT > oEndT)) {
+            SkTSwap(oStartT, oEndT);
             cancelers ^= true;
         }
         SkASSERT(!approximately_negative(oEndT - oStartT));
-        bool opp = fOperand ^ otherContour->fOperand;
-        if (cancelers && !opp) {
+        if (cancelers) {
             // make sure startT and endT have t entries
             if (startT > 0 || oEndT < 1
                     || thisOne.isMissing(startT) || other.isMissing(oEndT)) {
-                thisOne.addTPair(startT, &other, oEndT, true, coincidence.fPts[0]);
+                thisOne.addTPair(startT, &other, oEndT, true, coincidence.fPts[startSwapped]);
             }
             if (oStartT > 0 || endT < 1
                     || thisOne.isMissing(endT) || other.isMissing(oStartT)) {
-                other.addTPair(oStartT, &thisOne, endT, true, coincidence.fPts[1]);
+                other.addTPair(oStartT, &thisOne, endT, true, coincidence.fPts[oStartSwapped]);
             }
         } else {
             if (startT > 0 || oStartT > 0
                     || thisOne.isMissing(startT) || other.isMissing(oStartT)) {
-                thisOne.addTPair(startT, &other, oStartT, true, coincidence.fPts[0]);
+                thisOne.addTPair(startT, &other, oStartT, true, coincidence.fPts[startSwapped]);
             }
             if (endT < 1 || oEndT < 1
                     || thisOne.isMissing(endT) || other.isMissing(oEndT)) {
-                other.addTPair(oEndT, &thisOne, endT, true, coincidence.fPts[1]);
+                other.addTPair(oEndT, &thisOne, endT, true, coincidence.fPts[!oStartSwapped]);
             }
         }
     #if DEBUG_CONCIDENT
@@ -135,8 +133,7 @@
             cancelers ^= true;
         }
         SkASSERT(!approximately_negative(oEndT - oStartT));
-        bool opp = fOperand ^ otherContour->fOperand;
-        if (cancelers && !opp) {
+        if (cancelers) {
             // make sure startT and endT have t entries
             if (!thisOne.done() && !other.done()) {
                 thisOne.addTCancel(startT, endT, &other, oStartT, oEndT);