Add support for more standard scaling options in GlSurfaceViewRenderer.
PiperOrigin-RevId: 524062033
This commit is contained in:
parent
c63b30dff5
commit
ad169b9123
|
@ -56,6 +56,16 @@ public class GlSurfaceViewRenderer implements GLSurfaceView.Renderer {
|
||||||
void onBitmapCaptured(Bitmap result);
|
void onBitmapCaptured(Bitmap result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Scale to use when the frame and view have different aspect ratios.
|
||||||
|
*/
|
||||||
|
public enum Scale {
|
||||||
|
FILL,
|
||||||
|
FIT,
|
||||||
|
FIT_TO_WIDTH,
|
||||||
|
FIT_TO_HEIGHT
|
||||||
|
};
|
||||||
|
|
||||||
private static final String TAG = "DemoRenderer";
|
private static final String TAG = "DemoRenderer";
|
||||||
private static final int ATTRIB_POSITION = 1;
|
private static final int ATTRIB_POSITION = 1;
|
||||||
private static final int ATTRIB_TEXTURE_COORDINATE = 2;
|
private static final int ATTRIB_TEXTURE_COORDINATE = 2;
|
||||||
|
@ -68,7 +78,6 @@ public class GlSurfaceViewRenderer implements GLSurfaceView.Renderer {
|
||||||
private int frameUniform;
|
private int frameUniform;
|
||||||
private int textureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES;
|
private int textureTarget = GLES11Ext.GL_TEXTURE_EXTERNAL_OES;
|
||||||
private int textureTransformUniform;
|
private int textureTransformUniform;
|
||||||
private boolean shouldFitToWidth = false;
|
|
||||||
// Controls the alignment between frame size and surface size, 0.5f default is centered.
|
// Controls the alignment between frame size and surface size, 0.5f default is centered.
|
||||||
private float alignmentHorizontal = 0.5f;
|
private float alignmentHorizontal = 0.5f;
|
||||||
private float alignmentVertical = 0.5f;
|
private float alignmentVertical = 0.5f;
|
||||||
|
@ -79,6 +88,7 @@ public class GlSurfaceViewRenderer implements GLSurfaceView.Renderer {
|
||||||
private BitmapCaptureListener bitmapCaptureListener;
|
private BitmapCaptureListener bitmapCaptureListener;
|
||||||
// Specifies whether a black CLAMP_TO_BORDER effect should be used.
|
// Specifies whether a black CLAMP_TO_BORDER effect should be used.
|
||||||
private boolean shouldClampToBorder = false;
|
private boolean shouldClampToBorder = false;
|
||||||
|
private Scale scale = Scale.FILL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the {@link BitmapCaptureListener}.
|
* Sets the {@link BitmapCaptureListener}.
|
||||||
|
@ -225,15 +235,21 @@ public class GlSurfaceViewRenderer implements GLSurfaceView.Renderer {
|
||||||
// TODO: compute scale from surfaceTexture size.
|
// TODO: compute scale from surfaceTexture size.
|
||||||
float scaleWidth = frameWidth > 0 ? (float) surfaceWidth / (float) frameWidth : 1.0f;
|
float scaleWidth = frameWidth > 0 ? (float) surfaceWidth / (float) frameWidth : 1.0f;
|
||||||
float scaleHeight = frameHeight > 0 ? (float) surfaceHeight / (float) frameHeight : 1.0f;
|
float scaleHeight = frameHeight > 0 ? (float) surfaceHeight / (float) frameHeight : 1.0f;
|
||||||
// By default whichever of the two scales is greater corresponds to the dimension where the
|
|
||||||
// image is proportionally smaller than the view. Dividing both scales by that number results
|
// By default, FILL setting is used. That is, whichever of the two scales is greater corresponds
|
||||||
// in that dimension having scale 1.0, and thus touching the edges of the view, while the
|
// to the dimension where the image is proportionally smaller than the view. Dividing both
|
||||||
// other is cropped proportionally. If shouldFitToWidth is set as true, use the min scale
|
// scales by that number results in that dimension having scale 1.0, and thus touching the edges
|
||||||
// if frame width is greater than frame height.
|
// of the view, while the other is cropped proportionally.
|
||||||
float scale = max(scaleWidth, scaleHeight);
|
float scale = max(scaleWidth, scaleHeight);
|
||||||
if (shouldFitToWidth && (frameWidth > frameHeight)) {
|
|
||||||
|
// If any of the FIT settings are used, the min scale is divided so the frame doesn't exceed
|
||||||
|
// the view in that direction (or both for FIT).
|
||||||
|
if (this.scale == Scale.FIT
|
||||||
|
|| (this.scale == Scale.FIT_TO_WIDTH && (frameWidth > frameHeight))
|
||||||
|
|| (this.scale == Scale.FIT_TO_HEIGHT && (frameHeight > frameWidth))) {
|
||||||
scale = min(scaleWidth, scaleHeight);
|
scale = min(scaleWidth, scaleHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
scaleWidth /= scale;
|
scaleWidth /= scale;
|
||||||
scaleHeight /= scale;
|
scaleHeight /= scale;
|
||||||
|
|
||||||
|
@ -303,11 +319,6 @@ public class GlSurfaceViewRenderer implements GLSurfaceView.Renderer {
|
||||||
frameHeight = height;
|
frameHeight = height;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Supports fit to width when the frame width is greater than the frame height. */
|
|
||||||
public void setShouldFitToWidth(boolean shouldFitToWidth) {
|
|
||||||
this.shouldFitToWidth = shouldFitToWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When the aspect ratios between the camera frame and the surface size are mismatched, this
|
* When the aspect ratios between the camera frame and the surface size are mismatched, this
|
||||||
* controls how the image is aligned. 0.0 means aligning the left/bottom edges; 1.0 means aligning
|
* controls how the image is aligned. 0.0 means aligning the left/bottom edges; 1.0 means aligning
|
||||||
|
@ -330,6 +341,11 @@ public class GlSurfaceViewRenderer implements GLSurfaceView.Renderer {
|
||||||
this.shouldClampToBorder = shouldClampToBorder;
|
this.shouldClampToBorder = shouldClampToBorder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** {@link Scale} option to use when frame and view have different aspect ratios. */
|
||||||
|
public void setScale(Scale scale) {
|
||||||
|
this.scale = scale;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean isExternalTexture() {
|
private boolean isExternalTexture() {
|
||||||
return textureTarget == GLES11Ext.GL_TEXTURE_EXTERNAL_OES;
|
return textureTarget == GLES11Ext.GL_TEXTURE_EXTERNAL_OES;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user