1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 #include "Simplify.h" 8 9 namespace UnitTest { 10 11 #include "EdgeWalker.cpp" 12 13 } // end of UnitTest namespace 14 15 #include "Intersection_Tests.h" 16 17 SkPoint leftRight[][4] = { 18 // equal length 19 {{10, 10}, {10, 50}, {20, 10}, {20, 50}}, 20 {{10, 10}, {10, 50}, {10, 10}, {20, 50}}, 21 {{10, 10}, {10, 50}, {20, 10}, {10, 50}}, 22 // left top higher 23 {{10, 0}, {10, 50}, {20, 10}, {20, 50}}, 24 {{10, 0}, {10, 50}, {10, 10}, {20, 50}}, 25 {{10, 0}, {10, 50}, {20, 10}, {10, 50}}, 26 {{10, 0}, {10, 50}, {20, 10}, {10 + 0.000001f, 40}}, 27 // left top lower 28 {{10, 20}, {10, 50}, {20, 10}, {20, 50}}, 29 {{10, 20}, {10, 50}, {10, 10}, {20, 50}}, 30 {{10, 20}, {10, 50}, {20, 10}, {10, 50}}, 31 {{10, 20}, {10, 50}, {20, 10}, {10 + 0.000001f, 40}}, 32 {{10, 20}, {10, 50}, { 0, 0}, {50, 50}}, 33 // left bottom higher 34 {{10, 10}, {10, 40}, {20, 10}, {20, 50}}, 35 {{10, 10}, {10, 40}, {10, 10}, {20, 50}}, 36 {{10, 10}, {10, 40}, {20, 10}, {10, 50}}, 37 {{10, 10}, {10, 40}, {20, 10}, { 0 + 0.000001f, 70}}, 38 // left bottom lower 39 {{10, 10}, {10, 60}, {20, 10}, {20, 50}}, 40 {{10, 10}, {10, 60}, {10, 10}, {20, 50}}, 41 {{10, 10}, {10, 60}, {20, 10}, {10 + 0.000001f, 50}}, 42 {{10, 10}, {10, 60}, {20, 10}, {10 + 0.000001f, 40}}, 43 {{10, 10}, {10, 60}, { 0, 0}, {20 + 0.000001f, 20}}, 44 }; 45 46 size_t leftRightCount = sizeof(leftRight) / sizeof(leftRight[0]); 47 48 // older code that worked mostly 49 static bool operator_less_than(const UnitTest::ActiveEdge& lh, 50 const UnitTest::ActiveEdge& rh) { 51 if ((rh.fAbove.fY - lh.fAbove.fY > lh.fBelow.fY - rh.fAbove.fY 52 && lh.fBelow.fY < rh.fBelow.fY) 53 || (lh.fAbove.fY - rh.fAbove.fY < rh.fBelow.fY - lh.fAbove.fY 54 && rh.fBelow.fY < lh.fBelow.fY)) { 55 const SkPoint& check = rh.fBelow.fY <= lh.fBelow.fY 56 && lh.fBelow != rh.fBelow ? rh.fBelow : 57 rh.fAbove; 58 return (check.fY - lh.fAbove.fY) * (lh.fBelow.fX - lh.fAbove.fX) 59 < (lh.fBelow.fY - lh.fAbove.fY) * (check.fX - lh.fAbove.fX); 60 } 61 const SkPoint& check = lh.fBelow.fY <= rh.fBelow.fY 62 && lh.fBelow != rh.fBelow ? lh.fBelow : lh.fAbove; 63 return (rh.fBelow.fY - rh.fAbove.fY) * (check.fX - rh.fAbove.fX) 64 < (check.fY - rh.fAbove.fY) * (rh.fBelow.fX - rh.fAbove.fX); 65 } 66 67 68 void ActiveEdge_Test() { 69 UnitTest::InEdge leftIn, rightIn; 70 UnitTest::ActiveEdge left, right; 71 left.fWorkEdge.fEdge = &leftIn; 72 right.fWorkEdge.fEdge = &rightIn; 73 for (size_t x = 0; x < leftRightCount; ++x) { 74 left.fAbove = leftRight[x][0]; 75 left.fTangent = left.fBelow = leftRight[x][1]; 76 right.fAbove = leftRight[x][2]; 77 right.fTangent = right.fBelow = leftRight[x][3]; 78 SkASSERT(left < right); 79 SkASSERT(operator_less_than(left, right)); 80 SkASSERT(!(right < left)); 81 SkASSERT(!operator_less_than(right, left)); 82 } 83 } 84