diff --git a/app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/FaceBlurRenderer.java b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/FaceBlurRenderer.java index 38ace8648d..db5a39a222 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/FaceBlurRenderer.java +++ b/app/src/main/java/org/thoughtcrime/securesms/imageeditor/renderers/FaceBlurRenderer.java @@ -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 CREATOR = new Creator() { @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 diff --git a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java index dab4b5572c..259955a1d1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java @@ -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 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 rects; - private final Point imageSize; private final Matrix position; private FaceDetectionResult(@NonNull List 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); } } }