peertube-live-streaming/encoder/src/main/java/com/pedro/encoder/input/gl/AndroidViewSprite.java

158 lines
3.7 KiB
Java

package com.pedro.encoder.input.gl;
import android.graphics.PointF;
import android.view.View;
import com.pedro.encoder.utils.gl.TranslateTo;
/**
* Created by pedro on 3/2/22.
*/
public class AndroidViewSprite {
private PointF scale;
private PointF position;
private PointF rotationAxis;
private int rotation;
private View view;
public AndroidViewSprite() {
reset();
}
public void setView(View view) {
this.view = view;
rotationAxis = new PointF(view.getMeasuredWidth() / 2f, view.getMeasuredHeight() / 2f);
}
/**
* @param deltaX Position x in percent
* @param deltaY Position x in percent
*/
public void translate(float deltaX, float deltaY) {
position.x = deltaX;
position.y = deltaY;
}
/**
* @param translation Predefined position
*/
public void translate(TranslateTo translation) {
switch (translation) {
case CENTER:
this.position.x = 50f - scale.x / 2f;
this.position.y = 50f - scale.x / 2f;
break;
case BOTTOM:
this.position.x = 50f - scale.x / 2f;
this.position.y = 100f - scale.y;
break;
case TOP:
this.position.x = 50f - scale.x / 2f;
this.position.y = 0f;
break;
case LEFT:
this.position.x = 0f;
this.position.y = 50f - scale.y / 2f;
break;
case RIGHT:
this.position.x = 100f - scale.x;
this.position.y = 50f - scale.y / 2f;
break;
case TOP_LEFT:
this.position.x = 0f;
this.position.y = 0f;
break;
case TOP_RIGHT:
this.position.x = 100f - scale.x;
this.position.y = 0f;
break;
case BOTTOM_LEFT:
this.position.x = 0f;
this.position.y = 100f - scale.y;
break;
case BOTTOM_RIGHT:
this.position.x = 100f - scale.x;
this.position.y = 100f - scale.y;
break;
default:
break;
}
}
/**
* @param deltaX Scale x in percent
* @param deltaY Scale y in percent
*/
public void scale(float deltaX, float deltaY) {
//keep old position
position.x /= deltaX / scale.x;
position.y /= deltaY / scale.y;
//set new scale.
scale = new PointF(deltaX, deltaY);
}
/**
* @return Scale in percent
*/
public PointF getScale() {
return scale;
}
/**
* @return Position in percent
*/
public PointF getTranslation() {
return position;
}
public int getRotation() {
return rotation;
}
public PointF getRotationAxis() {
return rotationAxis;
}
public void setRotation(int rotation) {
if (rotation < 0) {
this.rotation = 0;
} else if (rotation > 360) {
this.rotation = 360;
} else {
this.rotation = rotation;
}
}
public void reset() {
scale = new PointF(0f, 0f);
position = new PointF(0f, 0f);
}
/**
* Traduce position in percent to work with canvas.
*/
public PointF getCanvasPosition(float previewX, float previewY) {
return new PointF(previewX * position.x / 100f, previewY * position.y / 100f);
}
/**
* Traduce scale in percent to work with canvas.
*/
public PointF getCanvasScale(float previewX, float previewY) {
float scaleFactorX = 100f * (float) view.getWidth() / previewX;
float scaleFactorY = 100f * (float) view.getHeight() / previewY;
return new PointF(scale.x / scaleFactorX, scale.y / scaleFactorY);
}
/**
* Calculate default scale if none is indicated after load the filter.
*/
public void calculateDefaultScale(float previewX, float previewY) {
if (scale.x == 0f && scale.y == 0f) {
scale.x = 100f * (float) view.getWidth() / previewX;
scale.y = 100f * (float) view.getHeight() / previewY;
}
}
}