blob: 59e43cc3819333271aaa554481a938c4d880bf6b [file] [log] [blame]
/*
* Copyright (C) 2019 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package androidx.camera.core;
import android.util.Log;
import android.view.Surface;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.ImageOutputConfig.RotationValue;
/**
* Contains utility methods related to camera orientation.
*
* @hide
*/
@RestrictTo(Scope.LIBRARY_GROUP)
public final class CameraOrientationUtil {
private static final String TAG = "CameraOrientationUtil";
private static final boolean DEBUG = false;
// Do not allow instantiation
private CameraOrientationUtil() {
}
/**
* Calculates the delta between a source rotation and destination rotation.
*
* <p>A typical use of this method would be calculating the angular difference between the
* display orientation (destRotationDegrees) and camera sensor orientation
* (sourceRotationDegrees).
*
* @param destRotationDegrees The destination rotation relative to the device's natural
* rotation.
* @param sourceRotationDegrees The source rotation relative to the device's natural rotation.
* @param isOppositeFacing Whether the source and destination planes are facing opposite
* directions.
*/
public static int getRelativeImageRotation(
int destRotationDegrees, int sourceRotationDegrees, boolean isOppositeFacing) {
int result;
if (isOppositeFacing) {
result = (sourceRotationDegrees - destRotationDegrees + 360) % 360;
} else {
result = (sourceRotationDegrees + destRotationDegrees) % 360;
}
if (DEBUG) {
Log.d(
TAG,
String.format(
"getRelativeImageRotation: destRotationDegrees=%s, "
+ "sourceRotationDegrees=%s, isOppositeFacing=%s, "
+ "result=%s",
destRotationDegrees, sourceRotationDegrees, isOppositeFacing, result));
}
return result;
}
/**
* Converts rotation values enumerated in {@link Surface} to their equivalent in degrees.
*
* <p>Valid values for the relative rotation are {@link Surface#ROTATION_0}, {@link
* Surface#ROTATION_90}, {@link Surface#ROTATION_180}, {@link Surface#ROTATION_270}.
*
* @param rotationEnum One of the enumerated rotation values from {@link Surface}.
* @return The equivalent rotation value in degrees.
* @throws IllegalArgumentException If the provided rotation enum is not one of those defined in
* {@link Surface}.
*/
public static int surfaceRotationToDegrees(@RotationValue int rotationEnum) {
int rotationDegrees;
switch (rotationEnum) {
case Surface.ROTATION_0:
rotationDegrees = 0;
break;
case Surface.ROTATION_90:
rotationDegrees = 90;
break;
case Surface.ROTATION_180:
rotationDegrees = 180;
break;
case Surface.ROTATION_270:
rotationDegrees = 270;
break;
default:
throw new IllegalArgumentException("Unsupported surface rotation: " + rotationEnum);
}
return rotationDegrees;
}
}