From bfaaf20fd9c891657b2680b6bea347c01c4bb5df Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Fri, 15 Apr 2022 10:52:34 -0300 Subject: [PATCH] Fix image editor outlining on Android 12+. --- .../core/renderers/MultiLineTextRenderer.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/image-editor/lib/src/main/java/org/signal/imageeditor/core/renderers/MultiLineTextRenderer.java b/image-editor/lib/src/main/java/org/signal/imageeditor/core/renderers/MultiLineTextRenderer.java index d3566b4f4..1b88904ae 100644 --- a/image-editor/lib/src/main/java/org/signal/imageeditor/core/renderers/MultiLineTextRenderer.java +++ b/image-editor/lib/src/main/java/org/signal/imageeditor/core/renderers/MultiLineTextRenderer.java @@ -4,8 +4,10 @@ import android.animation.ValueAnimator; import android.graphics.Color; import android.graphics.Matrix; import android.graphics.Paint; +import android.graphics.Path; import android.graphics.Rect; import android.graphics.RectF; +import android.os.Build; import android.os.Parcel; import android.view.animation.Interpolator; @@ -181,6 +183,7 @@ public final class MultiLineTextRenderer extends InvalidateableRenderer implemen private final RectF textBounds = new RectF(); private final RectF hitBounds = new RectF(); private final RectF modeBounds = new RectF(); + private final Path outlinerPath = new Path(); private String text; private int selStart; @@ -359,7 +362,15 @@ public final class MultiLineTextRenderer extends InvalidateableRenderer implemen if (mode == Mode.OUTLINE) { int modeAlpha = modePaint.getAlpha(); modePaint.setAlpha(rendererContext.getAlpha(alpha)); - rendererContext.canvas.drawText(text, 0, 0, modePaint); + + if (Build.VERSION.SDK_INT >= 31) { + outlinerPath.reset(); + modePaint.getTextPath(text, 0, text.length(), 0, 0, outlinerPath); + outlinerPath.op(outlinerPath, Path.Op.INTERSECT); + rendererContext.canvas.drawPath(outlinerPath, modePaint); + } else { + rendererContext.canvas.drawText(text, 0, 0, modePaint); + } modePaint.setAlpha(modeAlpha); }