Include face position and projection matrix into elements matrix.
This commit is contained in:
parent
b4f134adf7
commit
90f22a4b66
2 changed files with 26 additions and 41 deletions
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue