mirror of
https://github.com/oxen-io/session-android.git
synced 2025-06-11 05:58:34 +00:00
Include face position and projection matrix into elements matrix.
This commit is contained in:
parent
b4f134adf7
commit
90f22a4b66
@ -1,8 +1,5 @@
|
|||||||
package org.thoughtcrime.securesms.imageeditor.renderers;
|
package org.thoughtcrime.securesms.imageeditor.renderers;
|
||||||
|
|
||||||
import android.graphics.Matrix;
|
|
||||||
import android.graphics.Point;
|
|
||||||
import android.graphics.RectF;
|
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
@ -10,41 +7,20 @@ import androidx.annotation.NonNull;
|
|||||||
import org.thoughtcrime.securesms.imageeditor.Bounds;
|
import org.thoughtcrime.securesms.imageeditor.Bounds;
|
||||||
import org.thoughtcrime.securesms.imageeditor.Renderer;
|
import org.thoughtcrime.securesms.imageeditor.Renderer;
|
||||||
import org.thoughtcrime.securesms.imageeditor.RendererContext;
|
import org.thoughtcrime.securesms.imageeditor.RendererContext;
|
||||||
import org.thoughtcrime.securesms.imageeditor.model.ParcelUtils;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A rectangle that will be rendered on the blur mask layer. Intended for blurring faces.
|
* A rectangle that will be rendered on the blur mask layer. Intended for blurring faces.
|
||||||
*/
|
*/
|
||||||
public class FaceBlurRenderer implements Renderer {
|
public final class FaceBlurRenderer implements Renderer {
|
||||||
|
|
||||||
private static final int CORNER_RADIUS = 0;
|
|
||||||
|
|
||||||
private final RectF faceRect;
|
|
||||||
private final Matrix imageProjectionMatrix;
|
|
||||||
|
|
||||||
private FaceBlurRenderer(@NonNull RectF faceRect, @NonNull Matrix imageProjectionMatrix) {
|
|
||||||
this.faceRect = faceRect;
|
|
||||||
this.imageProjectionMatrix = imageProjectionMatrix;
|
|
||||||
}
|
|
||||||
|
|
||||||
public FaceBlurRenderer(@NonNull RectF faceRect, @NonNull Point imageDimensions) {
|
|
||||||
this.faceRect = faceRect;
|
|
||||||
this.imageProjectionMatrix = new Matrix();
|
|
||||||
|
|
||||||
this.imageProjectionMatrix.setRectToRect(new RectF(0, 0, imageDimensions.x, imageDimensions.y), Bounds.FULL_BOUNDS, Matrix.ScaleToFit.FILL);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render(@NonNull RendererContext rendererContext) {
|
public void render(@NonNull RendererContext rendererContext) {
|
||||||
rendererContext.canvas.save();
|
rendererContext.canvas.drawRect(Bounds.FULL_BOUNDS, rendererContext.getMaskPaint());
|
||||||
rendererContext.canvas.concat(imageProjectionMatrix);
|
|
||||||
rendererContext.canvas.drawRoundRect(faceRect, CORNER_RADIUS, CORNER_RADIUS, rendererContext.getMaskPaint());
|
|
||||||
rendererContext.canvas.restore();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean hitTest(float x, float y) {
|
public boolean hitTest(float x, float y) {
|
||||||
return false;
|
return Bounds.FULL_BOUNDS.contains(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -54,17 +30,12 @@ public class FaceBlurRenderer implements Renderer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
public void writeToParcel(Parcel dest, int flags) {
|
||||||
ParcelUtils.writeMatrix(dest, imageProjectionMatrix);
|
|
||||||
ParcelUtils.writeRect(dest, faceRect);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final Creator<FaceBlurRenderer> CREATOR = new Creator<FaceBlurRenderer>() {
|
public static final Creator<FaceBlurRenderer> CREATOR = new Creator<FaceBlurRenderer>() {
|
||||||
@Override
|
@Override
|
||||||
public FaceBlurRenderer createFromParcel(Parcel in) {
|
public FaceBlurRenderer createFromParcel(Parcel in) {
|
||||||
Matrix imageProjection = ParcelUtils.readMatrix(in);
|
return new FaceBlurRenderer();
|
||||||
RectF faceRect = ParcelUtils.readRectF (in);
|
|
||||||
|
|
||||||
return new FaceBlurRenderer(faceRect, imageProjection);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -21,6 +21,7 @@ import androidx.fragment.app.Fragment;
|
|||||||
|
|
||||||
import org.thoughtcrime.securesms.R;
|
import org.thoughtcrime.securesms.R;
|
||||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||||
|
import org.thoughtcrime.securesms.imageeditor.Bounds;
|
||||||
import org.thoughtcrime.securesms.imageeditor.ColorableRenderer;
|
import org.thoughtcrime.securesms.imageeditor.ColorableRenderer;
|
||||||
import org.thoughtcrime.securesms.imageeditor.ImageEditorView;
|
import org.thoughtcrime.securesms.imageeditor.ImageEditorView;
|
||||||
import org.thoughtcrime.securesms.imageeditor.Renderer;
|
import org.thoughtcrime.securesms.imageeditor.Renderer;
|
||||||
@ -478,7 +479,6 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
|
|||||||
|
|
||||||
private void renderFaceBlurs(@NonNull FaceDetectionResult result) {
|
private void renderFaceBlurs(@NonNull FaceDetectionResult result) {
|
||||||
List<RectF> faces = result.rects;
|
List<RectF> faces = result.rects;
|
||||||
Point size = result.imageSize;
|
|
||||||
|
|
||||||
if (faces.isEmpty()) {
|
if (faces.isEmpty()) {
|
||||||
cachedFaceDetection = null;
|
cachedFaceDetection = null;
|
||||||
@ -487,10 +487,22 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
|
|||||||
|
|
||||||
imageEditorView.getModel().pushUndoPoint();
|
imageEditorView.getModel().pushUndoPoint();
|
||||||
|
|
||||||
|
Matrix faceMatrix = new Matrix();
|
||||||
|
|
||||||
for (RectF face : faces) {
|
for (RectF face : faces) {
|
||||||
FaceBlurRenderer faceBlurRenderer = new FaceBlurRenderer(face, size);
|
FaceBlurRenderer faceBlurRenderer = new FaceBlurRenderer();
|
||||||
EditorElement element = new EditorElement(faceBlurRenderer, EditorModel.Z_MASK);
|
EditorElement element = new EditorElement(faceBlurRenderer, EditorModel.Z_MASK);
|
||||||
element.getLocalMatrix().set(result.position);
|
Matrix localMatrix = element.getLocalMatrix();
|
||||||
|
|
||||||
|
faceMatrix.setRectToRect(Bounds.FULL_BOUNDS, face, Matrix.ScaleToFit.FILL);
|
||||||
|
|
||||||
|
localMatrix.set(result.position);
|
||||||
|
localMatrix.preConcat(faceMatrix);
|
||||||
|
|
||||||
|
element.getFlags().setEditable(false)
|
||||||
|
.setSelectable(false)
|
||||||
|
.persist();
|
||||||
|
|
||||||
imageEditorView.getModel().addElementWithoutPushUndo(element);
|
imageEditorView.getModel().addElementWithoutPushUndo(element);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -555,13 +567,15 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
|
|||||||
|
|
||||||
private static class FaceDetectionResult {
|
private static class FaceDetectionResult {
|
||||||
private final List<RectF> rects;
|
private final List<RectF> rects;
|
||||||
private final Point imageSize;
|
|
||||||
private final Matrix position;
|
private final Matrix position;
|
||||||
|
|
||||||
private FaceDetectionResult(@NonNull List<RectF> rects, @NonNull Point imageSize, @NonNull Matrix position) {
|
private FaceDetectionResult(@NonNull List<RectF> rects, @NonNull Point imageSize, @NonNull Matrix position) {
|
||||||
this.rects = rects;
|
this.rects = rects;
|
||||||
this.imageSize = imageSize;
|
this.position = new Matrix(position);
|
||||||
this.position = new Matrix(position);
|
|
||||||
|
Matrix imageProjectionMatrix = new Matrix();
|
||||||
|
imageProjectionMatrix.setRectToRect(new RectF(0, 0, imageSize.x, imageSize.y), Bounds.FULL_BOUNDS, Matrix.ScaleToFit.FILL);
|
||||||
|
this.position.preConcat(imageProjectionMatrix);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user