Apparent fix for issue 383 / Moment + Android 2.1 issue
authorsrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Fri, 16 Apr 2010 10:56:15 +0000 (10:56 +0000)
committersrowen <srowen@59b500cc-1b3d-0410-9834-0bbf25fbcc57>
Fri, 16 Apr 2010 10:56:15 +0000 (10:56 +0000)
git-svn-id: http://zxing.googlecode.com/svn/trunk@1309 59b500cc-1b3d-0410-9834-0bbf25fbcc57

android/src/com/google/zxing/client/android/camera/CameraConfigurationManager.java
android/src/com/google/zxing/client/android/camera/CameraManager.java

index e70b1a3..e04c352 100644 (file)
@@ -52,8 +52,12 @@ final class CameraConfigurationManager {
     previewFormat = parameters.getPreviewFormat();
     previewFormatString = parameters.get("preview-format");
     Log.v(TAG, "Default preview format: " + previewFormat + '/' + previewFormatString);
-    screenResolution = getScreenResolution();
-    cameraResolution = getCameraResolution(parameters);
+    WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+    Display display = manager.getDefaultDisplay();
+    screenResolution = new Point(display.getWidth(), display.getHeight());
+    Log.v(TAG, "Screen resolution: " + screenResolution);
+    cameraResolution = getCameraResolution(parameters, screenResolution);
+    Log.v(TAG, "Camera resolution: " + screenResolution);
   }
 
   /**
@@ -64,7 +68,7 @@ final class CameraConfigurationManager {
    */
   void setDesiredCameraParameters(Camera camera) {
     Camera.Parameters parameters = camera.getParameters();
-    Log.v(TAG, "Setting preview size: " + cameraResolution.x + ", " + cameraResolution.y);
+    Log.v(TAG, "Setting preview size: " + cameraResolution);
     parameters.setPreviewSize(cameraResolution.x, cameraResolution.y);
     setFlash(parameters);
     setZoom(parameters);
@@ -76,6 +80,10 @@ final class CameraConfigurationManager {
     return cameraResolution;
   }
 
+  Point getScreenResolution() {
+    return screenResolution;
+  }
+
   int getPreviewFormat() {
     return previewFormat;
   }
@@ -84,13 +92,7 @@ final class CameraConfigurationManager {
     return previewFormatString;
   }
 
-  private Point getScreenResolution() {
-    WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
-    Display display = manager.getDefaultDisplay();
-    return new Point(display.getWidth(), display.getHeight());
-  }
-
-  private Point getCameraResolution(Camera.Parameters parameters) {
+  private static Point getCameraResolution(Camera.Parameters parameters, Point screenResolution) {
 
     String previewSizeValueString = parameters.get("preview-size-values");
     // saw this on Xperia
@@ -101,7 +103,7 @@ final class CameraConfigurationManager {
     Point cameraResolution = null;
 
     if (previewSizeValueString != null) {
-      Log.v(TAG, "preview-size parameter: " + previewSizeValueString);
+      Log.v(TAG, "preview-size-values parameter: " + previewSizeValueString);
       cameraResolution = findBestPreviewSizeValue(previewSizeValueString, screenResolution);
     }
 
@@ -157,7 +159,7 @@ final class CameraConfigurationManager {
     return null;
   }
 
-  private static int findBestMotZoomValue(String stringValues, int tenDesiredZoom) {
+  private static int findBestMotZoomValue(CharSequence stringValues, int tenDesiredZoom) {
     int tenBestValue = 0;
     for (String stringValue : COMMA_PATTERN.split(stringValues)) {
       stringValue = stringValue.trim();
index 5f67471..fc56693 100755 (executable)
@@ -16,8 +16,6 @@
 
 package com.google.zxing.client.android.camera;
 
-import com.google.zxing.ResultPoint;
-
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.graphics.PixelFormat;
@@ -56,6 +54,7 @@ public final class CameraManager {
   private final CameraConfigurationManager configManager;
   private Camera camera;
   private Rect framingRect;
+  private Rect framingRectInPreview;
   private boolean initialized;
   private boolean previewing;
   private final boolean useOneShotPreviewCallback;
@@ -205,31 +204,49 @@ public final class CameraManager {
    * @return The rectangle to draw on screen in window coordinates.
    */
   public Rect getFramingRect() {
-    Point cameraResolution = configManager.getCameraResolution();
+    Point screenResolution = configManager.getScreenResolution();
     if (framingRect == null) {
       if (camera == null) {
         return null;
       }
-      int width = cameraResolution.x * 3 / 4;
+      int width = screenResolution.x * 3 / 4;
       if (width < MIN_FRAME_WIDTH) {
         width = MIN_FRAME_WIDTH;
       } else if (width > MAX_FRAME_WIDTH) {
         width = MAX_FRAME_WIDTH;
       }
-      int height = cameraResolution.y * 3 / 4;
+      int height = screenResolution.y * 3 / 4;
       if (height < MIN_FRAME_HEIGHT) {
         height = MIN_FRAME_HEIGHT;
       } else if (height > MAX_FRAME_HEIGHT) {
         height = MAX_FRAME_HEIGHT;
       }
-      int leftOffset = (cameraResolution.x - width) / 2;
-      int topOffset = (cameraResolution.y - height) / 2;
+      int leftOffset = (screenResolution.x - width) / 2;
+      int topOffset = (screenResolution.y - height) / 2;
       framingRect = new Rect(leftOffset, topOffset, leftOffset + width, topOffset + height);
       Log.v(TAG, "Calculated framing rect: " + framingRect);
     }
     return framingRect;
   }
 
+  /**
+   * Like {@link #getFramingRect} but coordinates are in terms of the preview frame,
+   * not UI / screen.
+   */
+  public Rect getFramingRectInPreview() {
+    if (framingRectInPreview == null) {
+      Rect rect = new Rect(getFramingRect());
+      Point cameraResolution = configManager.getCameraResolution();
+      Point screenResolution = configManager.getScreenResolution();
+      rect.left = rect.left * cameraResolution.x / screenResolution.x;
+      rect.right = rect.right * cameraResolution.x / screenResolution.x;
+      rect.top = rect.top * cameraResolution.y / screenResolution.y;
+      rect.bottom = rect.bottom * cameraResolution.y / screenResolution.y;
+      framingRectInPreview = rect;
+    }
+    return framingRectInPreview;
+  }
+
   /**
    * Converts the result points from still resolution coordinates to screen coordinates.
    *
@@ -237,8 +254,9 @@ public final class CameraManager {
    * @return An array of Points scaled to the size of the framing rect and offset appropriately
    *         so they can be drawn in screen coordinates.
    */
+  /*
   public Point[] convertResultPoints(ResultPoint[] points) {
-    Rect frame = getFramingRect();
+    Rect frame = getFramingRectInPreview();
     int count = points.length;
     Point[] output = new Point[count];
     for (int x = 0; x < count; x++) {
@@ -248,6 +266,7 @@ public final class CameraManager {
     }
     return output;
   }
+   */
 
   /**
    * A factory method to build the appropriate LuminanceSource object based on the format
@@ -259,7 +278,7 @@ public final class CameraManager {
    * @return A PlanarYUVLuminanceSource instance.
    */
   public PlanarYUVLuminanceSource buildLuminanceSource(byte[] data, int width, int height) {
-    Rect rect = getFramingRect();
+    Rect rect = getFramingRectInPreview();
     int previewFormat = configManager.getPreviewFormat();
     String previewFormatString = configManager.getPreviewFormatString();
     switch (previewFormat) {