am 5679d937: am ab6515f6: am 4e50ee4f: Merge "Shadow: Fix the crash in spot shadow" into lmp-mr1-dev

* commit '5679d937ff033ff1fa86245d646b6e5dbf23d635':
  Shadow: Fix the crash in spot shadow
diff --git a/libs/hwui/SpotShadow.cpp b/libs/hwui/SpotShadow.cpp
index 001e22f..b3cfde2 100644
--- a/libs/hwui/SpotShadow.cpp
+++ b/libs/hwui/SpotShadow.cpp
@@ -678,11 +678,13 @@
     return resultIndex;
 }
 
+// Allow some epsilon here since the later ray intersection did allow for some small
+// floating point error, when the intersection point is slightly outside the segment.
 inline bool sameDirections(bool isPositiveCross, float a, float b) {
     if (isPositiveCross) {
-        return a >= 0 && b >= 0;
+        return a >= -EPSILON && b >= -EPSILON;
     } else {
-        return a <= 0 && b <= 0;
+        return a <= EPSILON && b <= EPSILON;
     }
 }
 
@@ -722,22 +724,23 @@
         // For current penumbra vertex, starting from previousClosestUmbraIndex,
         // then check the next one until the distance increase.
         // The last one before the increase is the umbra vertex we need to pair with.
-        int currentUmbraIndex = previousClosestUmbraIndex;
-        float currentLengthSquared = (currentPenumbraVertex - umbra[currentUmbraIndex]).lengthSquared();
-        int currentClosestUmbraIndex = -1;
+        float currentLengthSquared =
+                (currentPenumbraVertex - umbra[previousClosestUmbraIndex]).lengthSquared();
+        int currentClosestUmbraIndex = previousClosestUmbraIndex;
         int indexDelta = 0;
         for (int j = 1; j < umbraLength; j++) {
             int newUmbraIndex = (previousClosestUmbraIndex + j) % umbraLength;
             float newLengthSquared = (currentPenumbraVertex - umbra[newUmbraIndex]).lengthSquared();
             if (newLengthSquared > currentLengthSquared) {
-                currentClosestUmbraIndex = (previousClosestUmbraIndex + j - 1) % umbraLength;
+                // currentClosestUmbraIndex is the umbra vertex's index which has
+                // currently found smallest distance, so we can simply break here.
                 break;
             } else {
                 currentLengthSquared = newLengthSquared;
                 indexDelta++;
+                currentClosestUmbraIndex = newUmbraIndex;
             }
         }
-        LOG_ALWAYS_FATAL_IF(currentClosestUmbraIndex == -1, "Can't find a closet umbra vertext at all");
 
         if (indexDelta > 1) {
             // For those umbra don't have  penumbra, generate new penumbra vertices by interpolation.
@@ -815,6 +818,9 @@
         const Vector2& centroid, Vector2* polyToCentroid) {
     for (int j = 0; j < polyLength; j++) {
         polyToCentroid[j] = poly2d[j] - centroid;
+        // Normalize these vectors such that we can use epsilon comparison after
+        // computing their cross products with another normalized vector.
+        polyToCentroid[j].normalize();
     }
     float refCrossProduct = 0;
     for (int j = 0; j < polyLength; j++) {