summaryrefslogtreecommitdiffstats
path: root/services/surfaceflinger/Layer.cpp
diff options
context:
space:
mode:
authorMichael Lentine <mlentine@google.com>2014-08-19 18:14:06 -0700
committerMichael Lentine <mlentine@google.com>2014-08-19 18:16:01 -0700
commit7b90258c7b1b6caf7fbbf62423723d0f4cdc79aa (patch)
treea74ebad83d96d546fca2a99be5d98345d690efb4 /services/surfaceflinger/Layer.cpp
parent1440963470cda68be762957e2efb7ecbe1570366 (diff)
downloadframeworks_native-7b90258c7b1b6caf7fbbf62423723d0f4cdc79aa.zip
frameworks_native-7b90258c7b1b6caf7fbbf62423723d0f4cdc79aa.tar.gz
frameworks_native-7b90258c7b1b6caf7fbbf62423723d0f4cdc79aa.tar.bz2
Fix inverse orientation when original is not applied first.
Change-Id: I6f1a11950c77c99800acbf08a672bc1b2310b0b5
Diffstat (limited to 'services/surfaceflinger/Layer.cpp')
-rw-r--r--services/surfaceflinger/Layer.cpp13
1 files changed, 11 insertions, 2 deletions
diff --git a/services/surfaceflinger/Layer.cpp b/services/surfaceflinger/Layer.cpp
index 2bbb223..a36ddd9 100644
--- a/services/surfaceflinger/Layer.cpp
+++ b/services/surfaceflinger/Layer.cpp
@@ -348,8 +348,17 @@ FloatRect Layer::computeCrop(const sp<const DisplayDevice>& hw) const {
int winWidth = s.active.w;
int winHeight = s.active.h;
if (invTransform & NATIVE_WINDOW_TRANSFORM_ROT_90) {
- invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
- NATIVE_WINDOW_TRANSFORM_FLIP_H;
+ // If the activeCrop has been rotate the ends are rotated but not
+ // the space itself so when transforming ends back we can't rely on
+ // a modification of the axes of rotation. To account for this we
+ // need to reorient the inverse rotation in terms of the current
+ // axes of rotation.
+ bool is_h_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_H) != 0;
+ bool is_v_flipped = (invTransform & NATIVE_WINDOW_TRANSFORM_FLIP_V) != 0;
+ if (is_h_flipped == is_v_flipped) {
+ invTransform ^= NATIVE_WINDOW_TRANSFORM_FLIP_V |
+ NATIVE_WINDOW_TRANSFORM_FLIP_H;
+ }
winWidth = s.active.h;
winHeight = s.active.w;
}