diff options
author | Doris Liu <tianliu@google.com> | 2013-10-28 14:44:24 -0700 |
---|---|---|
committer | Doris Liu <tianliu@google.com> | 2013-10-28 15:31:29 -0700 |
commit | 36ebcb11b15fb00d3a641499c0f8a16745a2fbb0 (patch) | |
tree | db8c6bfd18f48907c05212b41262c42343a62a06 /src/com/android/camera/FocusOverlayManager.java | |
parent | 5737b93254f451859c7924792c46354d385da946 (diff) | |
download | android_packages_apps_Snap-36ebcb11b15fb00d3a641499c0f8a16745a2fbb0.tar.gz android_packages_apps_Snap-36ebcb11b15fb00d3a641499c0f8a16745a2fbb0.tar.bz2 android_packages_apps_Snap-36ebcb11b15fb00d3a641499c0f8a16745a2fbb0.zip |
Fix the mapping between preview UI and camera sensor
Bug: 11409659
Change-Id: I46ae3d7797590d59befbdc394d5304f14a212a80
Diffstat (limited to 'src/com/android/camera/FocusOverlayManager.java')
-rw-r--r-- | src/com/android/camera/FocusOverlayManager.java | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/src/com/android/camera/FocusOverlayManager.java b/src/com/android/camera/FocusOverlayManager.java index c223aea6b..edc2db7b7 100644 --- a/src/com/android/camera/FocusOverlayManager.java +++ b/src/com/android/camera/FocusOverlayManager.java @@ -76,8 +76,6 @@ public class FocusOverlayManager { private boolean mAeAwbLock; private Matrix mMatrix; - private int mPreviewWidth; // The width of the preview frame layout. - private int mPreviewHeight; // The height of the preview frame layout. private boolean mMirror; // true if the camera is front-facing. private int mDisplayOrientation; private List<Object> mFocusArea; // focus area in driver format @@ -93,6 +91,7 @@ public class FocusOverlayManager { private boolean mFocusDefault; private FocusUI mUI; + private final Rect mPreviewRect = new Rect(0, 0, 0, 0); public interface FocusUI { public boolean hasFaces(); @@ -159,13 +158,25 @@ public class FocusOverlayManager { } public void setPreviewSize(int previewWidth, int previewHeight) { - if (mPreviewWidth != previewWidth || mPreviewHeight != previewHeight) { - mPreviewWidth = previewWidth; - mPreviewHeight = previewHeight; + if (mPreviewRect.width() != previewWidth || mPreviewRect.height() != previewHeight) { + setPreviewRect(new Rect(0, 0, previewWidth, previewHeight)); + } + } + + /** This setter should be the only way to mutate mPreviewRect. */ + public void setPreviewRect(Rect previewRect) { + if (!mPreviewRect.equals(previewRect)) { + mPreviewRect.set(previewRect); setMatrix(); } } + /** Returns a copy of mPreviewRect so that outside class cannot modify preview + * rect except deliberately doing so through the setter. */ + public Rect getPreviewRect() { + return new Rect(mPreviewRect); + } + public void setMirror(boolean mirror) { mMirror = mirror; setMatrix(); @@ -177,10 +188,9 @@ public class FocusOverlayManager { } private void setMatrix() { - if (mPreviewWidth != 0 && mPreviewHeight != 0) { + if (mPreviewRect.width() != 0 && mPreviewRect.height() != 0) { Matrix matrix = new Matrix(); - CameraUtil.prepareMatrix(matrix, mMirror, mDisplayOrientation, - mPreviewWidth, mPreviewHeight); + CameraUtil.prepareMatrix(matrix, mMirror, mDisplayOrientation, getPreviewRect()); // In face detection, the matrix converts the driver coordinates to UI // coordinates. In tap focus, the inverted matrix converts the UI // coordinates to driver coordinates. @@ -352,7 +362,7 @@ public class FocusOverlayManager { mState == STATE_SUCCESS || mState == STATE_FAIL)) { cancelAutoFocus(); } - if (mPreviewWidth == 0 || mPreviewHeight == 0) return; + if (mPreviewRect.width() == 0 || mPreviewRect.height() == 0) return; mFocusDefault = false; // Initialize mFocusArea. if (mFocusAreaSupported) { @@ -507,7 +517,7 @@ public class FocusOverlayManager { mUI.clearFocus(); // Initialize mFocusArea. if (mFocusAreaSupported) { - initializeFocusAreas(mPreviewWidth / 2, mPreviewHeight / 2); + initializeFocusAreas(mPreviewRect.centerX(), mPreviewRect.centerY()); } // Reset metering area when no specific region is selected. if (mMeteringAreaSupported) { @@ -518,8 +528,10 @@ public class FocusOverlayManager { private void calculateTapArea(int x, int y, float areaMultiple, Rect rect) { int areaSize = (int) (getAreaSize() * areaMultiple); - int left = CameraUtil.clamp(x - areaSize / 2, 0, mPreviewWidth - areaSize); - int top = CameraUtil.clamp(y - areaSize / 2, 0, mPreviewHeight - areaSize); + int left = CameraUtil.clamp(x - areaSize / 2, mPreviewRect.left, + mPreviewRect.right - areaSize); + int top = CameraUtil.clamp(y - areaSize / 2, mPreviewRect.top, + mPreviewRect.bottom - areaSize); RectF rectF = new RectF(left, top, left + areaSize, top + areaSize); mMatrix.mapRect(rectF); @@ -529,7 +541,7 @@ public class FocusOverlayManager { private int getAreaSize() { // Recommended focus area size from the manufacture is 1/8 of the image // width (i.e. longer edge of the image) - return Math.max(mPreviewWidth, mPreviewHeight) / 8; + return Math.max(mPreviewRect.width(), mPreviewRect.height()) / 8; } /* package */ int getFocusState() { |