OSDN Git Service

Fix SRI Pano orientation
authorJohn Reck <jreck@google.com>
Mon, 15 Oct 2012 23:11:04 +0000 (16:11 -0700)
committerJohn Reck <jreck@google.com>
Mon, 15 Oct 2012 23:30:12 +0000 (16:30 -0700)
 Bug: 7345511

Change-Id: I9a06f03b67ba820b86520588415ff3ab16f05829

src/com/android/gallery3d/ui/GLRoot.java
src/com/android/gallery3d/ui/PhotoView.java

index 1651b43..13b610b 100644 (file)
@@ -16,6 +16,7 @@
 
 package com.android.gallery3d.ui;
 
+import android.content.Context;
 import android.graphics.Matrix;
 
 import com.android.gallery3d.anim.CanvasAnimation;
@@ -45,4 +46,6 @@ public interface GLRoot {
     public void freeze();
     public void unfreeze();
     public void setLightsOutMode(boolean enabled);
+
+    public Context getContext();
 }
index 5978159..c6bf535 100644 (file)
@@ -17,6 +17,7 @@
 package com.android.gallery3d.ui;
 
 import android.content.Context;
+import android.content.res.Configuration;
 import android.graphics.Color;
 import android.graphics.Matrix;
 import android.graphics.Rect;
@@ -546,10 +547,20 @@ public class PhotoView extends GLView {
     }
 
     private int getPanoramaRotation() {
-        // Panorama only support rotations of 0 and 90, so if it is greater
-        // than that flip the output surface texture to compensate
-        if (mDisplayRotation > 180)
+        // This function is magic
+        // The issue here is that Pano makes bad assumptions about rotation and
+        // orientation. The first is it assumes only two rotations are possible,
+        // 0 and 90. Thus, if display rotation is >= 180, we invert the output.
+        // The second is that it assumes landscape is a 90 rotation from portrait,
+        // however on landscape devices this is not true. Thus, if we are in portrait
+        // on a landscape device, we need to invert the output
+        int orientation = getGLRoot().getContext().getResources().getConfiguration().orientation;
+        boolean invertPortrait = (orientation == Configuration.ORIENTATION_PORTRAIT
+                && (mDisplayRotation == 90 || mDisplayRotation == 270));
+        boolean invert = (mDisplayRotation >= 180);
+        if (invert != invertPortrait) {
             return (mCompensation + 180) % 360;
+        }
         return mCompensation;
     }