Revert orientation tracking on the camera image
Roll back the rendering-pipeline changes from v1.1.6 (and the subsequent attempts in 1.1.7/1.1.8/1.1.9): no more SurfaceTexture transform-matrix-driven re-orientation, no more rebinding on rotation, no more inverse-rotation correction. The camera passthrough goes back to fixed portrait-oriented texcoords and the crop-to-fill math treats the camera buffer as portrait unconditionally. The activity stays `fullSensor`, so the Compose UI and the GL blur passes continue to follow the device orientation — only the camera image itself is left untouched, which matches the "normal camera doesn't flip the picture when rotating the phone" behaviour requested. Bump to 1.1.10. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
6d7be66341
commit
4f8661f648
7 changed files with 55 additions and 171 deletions
|
|
@ -2,10 +2,8 @@ package no.naiv.tiltshift.camera
|
|||
|
||||
import android.content.Context
|
||||
import android.graphics.SurfaceTexture
|
||||
import android.hardware.display.DisplayManager
|
||||
import android.util.Log
|
||||
import android.util.Size
|
||||
import android.view.Display
|
||||
import android.view.Surface
|
||||
import androidx.camera.core.Camera
|
||||
import androidx.camera.core.CameraSelector
|
||||
|
|
@ -72,14 +70,6 @@ class CameraManager(private val context: Context) {
|
|||
/** Weak reference to avoid preventing Activity GC across config changes. */
|
||||
private var lifecycleOwnerRef: WeakReference<LifecycleOwner>? = null
|
||||
|
||||
/**
|
||||
* Target rotation passed to CameraX use cases. Drives the SurfaceTexture
|
||||
* transform matrix and the rotation metadata on captured images.
|
||||
* Initialized to the display rotation when the camera binds; updated by
|
||||
* [setTargetRotation] when the device orientation changes.
|
||||
*/
|
||||
private var targetRotation: Int = Surface.ROTATION_0
|
||||
|
||||
/**
|
||||
* Starts the camera with the given lifecycle owner.
|
||||
* The surfaceTextureProvider should return the SurfaceTexture from the GL renderer.
|
||||
|
|
@ -90,13 +80,6 @@ class CameraManager(private val context: Context) {
|
|||
) {
|
||||
this.surfaceTextureProvider = surfaceTextureProvider
|
||||
this.lifecycleOwnerRef = WeakReference(lifecycleOwner)
|
||||
// Capture initial display rotation so the very first frame is oriented correctly,
|
||||
// before the OrientationEventListener has had a chance to fire.
|
||||
// Note: Context.getDisplay() throws on Application contexts; DisplayManager works
|
||||
// for any context type and returns the default display.
|
||||
targetRotation = (context.getSystemService(Context.DISPLAY_SERVICE) as? DisplayManager)
|
||||
?.getDisplay(Display.DEFAULT_DISPLAY)?.rotation
|
||||
?: Surface.ROTATION_0
|
||||
|
||||
val cameraProviderFuture = ProcessCameraProvider.getInstance(context)
|
||||
cameraProviderFuture.addListener({
|
||||
|
|
@ -127,13 +110,11 @@ class CameraManager(private val context: Context) {
|
|||
|
||||
preview = Preview.Builder()
|
||||
.setResolutionSelector(resolutionSelector)
|
||||
.setTargetRotation(targetRotation)
|
||||
.build()
|
||||
|
||||
// Image capture use case
|
||||
val captureBuilder = ImageCapture.Builder()
|
||||
.setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
|
||||
.setTargetRotation(targetRotation)
|
||||
|
||||
imageCapture = captureBuilder.build()
|
||||
|
||||
|
|
@ -192,23 +173,6 @@ class CameraManager(private val context: Context) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the target rotation for Preview and ImageCapture use cases.
|
||||
*
|
||||
* Rebinds the use cases so CameraX issues a fresh SurfaceRequest with a
|
||||
* resolution matching the new rotation and a corresponding texture transform
|
||||
* matrix. Calling `preview.targetRotation = rotation` alone is insufficient
|
||||
* for a custom SurfaceProvider — the new rotation only takes effect on
|
||||
* subsequently bound streams, leaving the live SurfaceTexture matrix and
|
||||
* buffer size stale (which made the preview appear locked to the original
|
||||
* portrait orientation when the device was rotated to landscape).
|
||||
*/
|
||||
fun setTargetRotation(rotation: Int) {
|
||||
if (targetRotation == rotation) return
|
||||
targetRotation = rotation
|
||||
lifecycleOwnerRef?.get()?.let { bindCameraUseCases(it) }
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the zoom ratio. Updates UI state immediately so that rapid pinch-to-zoom
|
||||
* gestures accumulate correctly (each frame uses the latest ratio as its base).
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue