diff options
author | ztenghui <ztenghui@google.com> | 2014-11-12 23:49:08 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2014-11-12 23:49:08 +0000 |
commit | 5679d937ff033ff1fa86245d646b6e5dbf23d635 (patch) | |
tree | 89e086cf86fc4ed2e0b7fe672c7e2807400cd6fe /libs/hwui/SpotShadow.cpp | |
parent | c3e29108fcd87b8229cddacec98e63fe5f79efdf (diff) | |
parent | ab6515f6214a09e23deee4b432b41d1849ae403f (diff) | |
download | frameworks_base-5679d937ff033ff1fa86245d646b6e5dbf23d635.zip frameworks_base-5679d937ff033ff1fa86245d646b6e5dbf23d635.tar.gz frameworks_base-5679d937ff033ff1fa86245d646b6e5dbf23d635.tar.bz2 |
am ab6515f6: am 4e50ee4f: Merge "Shadow: Fix the crash in spot shadow" into lmp-mr1-dev
* commit 'ab6515f6214a09e23deee4b432b41d1849ae403f':
Shadow: Fix the crash in spot shadow
Diffstat (limited to 'libs/hwui/SpotShadow.cpp')
-rw-r--r-- | libs/hwui/SpotShadow.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/libs/hwui/SpotShadow.cpp b/libs/hwui/SpotShadow.cpp index 200a9da..3046fd5 100644 --- a/libs/hwui/SpotShadow.cpp +++ b/libs/hwui/SpotShadow.cpp @@ -677,11 +677,13 @@ inline int getClosestUmbraIndex(const Vector2& pivot, const Vector2* polygon, in 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; } } @@ -721,22 +723,23 @@ inline void genNewPenumbraAndPairWithUmbra(const Vector2* penumbra, int penumbra // 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. @@ -814,6 +817,9 @@ inline bool genPolyToCentroid(const Vector2* poly2d, int polyLength, 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++) { |