blob: 60c866cd82d57e97c004d36c47a8b0e1955fe9ec [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package io.flutter.plugins.camera;
import android.hardware.camera2.params.MeteringRectangle;
import android.util.Size;
public final class CameraRegions {
private MeteringRectangle aeMeteringRectangle;
private MeteringRectangle afMeteringRectangle;
private Size maxBoundaries;
public CameraRegions(Size maxBoundaries) {
assert (maxBoundaries == null || maxBoundaries.getWidth() > 0);
assert (maxBoundaries == null || maxBoundaries.getHeight() > 0);
this.maxBoundaries = maxBoundaries;
}
public MeteringRectangle getAEMeteringRectangle() {
return aeMeteringRectangle;
}
public MeteringRectangle getAFMeteringRectangle() {
return afMeteringRectangle;
}
public Size getMaxBoundaries() {
return this.maxBoundaries;
}
public void resetAutoExposureMeteringRectangle() {
this.aeMeteringRectangle = null;
}
public void setAutoExposureMeteringRectangleFromPoint(double x, double y) {
this.aeMeteringRectangle = getMeteringRectangleForPoint(maxBoundaries, x, y);
}
public void resetAutoFocusMeteringRectangle() {
this.afMeteringRectangle = null;
}
public void setAutoFocusMeteringRectangleFromPoint(double x, double y) {
this.afMeteringRectangle = getMeteringRectangleForPoint(maxBoundaries, x, y);
}
public MeteringRectangle getMeteringRectangleForPoint(Size maxBoundaries, double x, double y) {
assert (x >= 0 && x <= 1);
assert (y >= 0 && y <= 1);
if (maxBoundaries == null)
throw new IllegalStateException(
"Functionality for managing metering rectangles is unavailable as this CameraRegions instance was initialized with null boundaries.");
// Interpolate the target coordinate
int targetX = (int) Math.round(x * ((double) (maxBoundaries.getWidth() - 1)));
int targetY = (int) Math.round(y * ((double) (maxBoundaries.getHeight() - 1)));
// Determine the dimensions of the metering triangle (10th of the viewport)
int targetWidth = (int) Math.round(((double) maxBoundaries.getWidth()) / 10d);
int targetHeight = (int) Math.round(((double) maxBoundaries.getHeight()) / 10d);
// Adjust target coordinate to represent top-left corner of metering rectangle
targetX -= targetWidth / 2;
targetY -= targetHeight / 2;
// Adjust target coordinate as to not fall out of bounds
if (targetX < 0) targetX = 0;
if (targetY < 0) targetY = 0;
int maxTargetX = maxBoundaries.getWidth() - 1 - targetWidth;
int maxTargetY = maxBoundaries.getHeight() - 1 - targetHeight;
if (targetX > maxTargetX) targetX = maxTargetX;
if (targetY > maxTargetY) targetY = maxTargetY;
// Build the metering rectangle
return new MeteringRectangle(targetX, targetY, targetWidth, targetHeight, 1);
}
}