Include face position and projection matrix into elements matrix.

This commit is contained in:
Alan Evans 2020-06-04 19:48:20 -03:00
parent b4f134adf7
commit 90f22a4b66
2 changed files with 26 additions and 41 deletions

View file

@ -1,8 +1,5 @@
package org.thoughtcrime.securesms.imageeditor.renderers;
import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.RectF;
import android.os.Parcel;
import androidx.annotation.NonNull;
@ -10,41 +7,20 @@ import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.imageeditor.Bounds;
import org.thoughtcrime.securesms.imageeditor.Renderer;
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.
*/
public 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);
}
public final class FaceBlurRenderer implements Renderer {
@Override
public void render(@NonNull RendererContext rendererContext) {
rendererContext.canvas.save();
rendererContext.canvas.concat(imageProjectionMatrix);
rendererContext.canvas.drawRoundRect(faceRect, CORNER_RADIUS, CORNER_RADIUS, rendererContext.getMaskPaint());
rendererContext.canvas.restore();
rendererContext.canvas.drawRect(Bounds.FULL_BOUNDS, rendererContext.getMaskPaint());
}
@Override
public boolean hitTest(float x, float y) {
return false;
return Bounds.FULL_BOUNDS.contains(x, y);
}
@Override
@ -54,17 +30,12 @@ public class FaceBlurRenderer implements Renderer {
@Override
public void writeToParcel(Parcel dest, int flags) {
ParcelUtils.writeMatrix(dest, imageProjectionMatrix);
ParcelUtils.writeRect(dest, faceRect);
}
public static final Creator<FaceBlurRenderer> CREATOR = new Creator<FaceBlurRenderer>() {
@Override
public FaceBlurRenderer createFromParcel(Parcel in) {
Matrix imageProjection = ParcelUtils.readMatrix(in);
RectF faceRect = ParcelUtils.readRectF (in);
return new FaceBlurRenderer(faceRect, imageProjection);
return new FaceBlurRenderer();
}
@Override

View file

@ -21,6 +21,7 @@ import androidx.fragment.app.Fragment;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.imageeditor.Bounds;
import org.thoughtcrime.securesms.imageeditor.ColorableRenderer;
import org.thoughtcrime.securesms.imageeditor.ImageEditorView;
import org.thoughtcrime.securesms.imageeditor.Renderer;
@ -478,7 +479,6 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
private void renderFaceBlurs(@NonNull FaceDetectionResult result) {
List<RectF> faces = result.rects;
Point size = result.imageSize;
if (faces.isEmpty()) {
cachedFaceDetection = null;
@ -487,10 +487,22 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
imageEditorView.getModel().pushUndoPoint();
Matrix faceMatrix = new Matrix();
for (RectF face : faces) {
FaceBlurRenderer faceBlurRenderer = new FaceBlurRenderer(face, size);
EditorElement element = new EditorElement(faceBlurRenderer, EditorModel.Z_MASK);
element.getLocalMatrix().set(result.position);
FaceBlurRenderer faceBlurRenderer = new FaceBlurRenderer();
EditorElement element = new EditorElement(faceBlurRenderer, EditorModel.Z_MASK);
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);
}
@ -555,13 +567,15 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
private static class FaceDetectionResult {
private final List<RectF> rects;
private final Point imageSize;
private final Matrix position;
private FaceDetectionResult(@NonNull List<RectF> rects, @NonNull Point imageSize, @NonNull Matrix position) {
this.rects = rects;
this.imageSize = imageSize;
this.position = new Matrix(position);
this.rects = rects;
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);
}
}
}