summaryrefslogtreecommitdiffstats
path: root/libs/hwui/SpotShadow.cpp
diff options
context:
space:
mode:
authorztenghui <ztenghui@google.com>2014-11-12 23:49:08 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-11-12 23:49:08 +0000
commit5679d937ff033ff1fa86245d646b6e5dbf23d635 (patch)
tree89e086cf86fc4ed2e0b7fe672c7e2807400cd6fe /libs/hwui/SpotShadow.cpp
parentc3e29108fcd87b8229cddacec98e63fe5f79efdf (diff)
parentab6515f6214a09e23deee4b432b41d1849ae403f (diff)
downloadframeworks_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.cpp20
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++) {