From f394713466f8d3c04583df1fe713f7de6769d0ed Mon Sep 17 00:00:00 2001 From: Can Undeger Date: Tue, 3 Feb 2026 12:35:32 -0500 Subject: [PATCH 1/9] Add logs to see what's going on with the stroke span --- .../react/views/text/ReactTextView.java | 24 ++++++++++++++++++- .../text/internal/span/StrokeStyleSpan.kt | 13 ++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java index f8f68a42ea0fc5..1e249296dadeda 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/ReactTextView.java @@ -371,7 +371,29 @@ protected void onDraw(Canvas canvas) { CharSequence text = getText(); StrokeStyleSpan strokeSpan = text instanceof Spanned ? StrokeStyleSpan.getStrokeSpan((Spanned) text) : null; - if (strokeSpan == null || !strokeSpan.draw(getPaint(), () -> super.onDraw(canvas))) { + + // Debug logging + Layout layout = getLayout(); + if (strokeSpan != null && layout != null) { + android.util.Log.d("ReactTextView", "===== ReactTextView.onDraw ====="); + android.util.Log.d("ReactTextView", "Layout lineCount: " + layout.getLineCount()); + android.util.Log.d("ReactTextView", "View size: " + getWidth() + "x" + getHeight()); + android.util.Log.d("ReactTextView", "Canvas clip bounds: " + canvas.getClipBounds()); + android.util.Log.d("ReactTextView", "Overflow mode: " + mOverflow); + for (int i = 0; i < layout.getLineCount(); i++) { + android.util.Log.d("ReactTextView", "Line " + i + " - top: " + layout.getLineTop(i) + + ", bottom: " + layout.getLineBottom(i) + + ", baseline: " + layout.getLineBaseline(i)); + } + android.util.Log.d("ReactTextView", "Text: " + text); + android.util.Log.d("ReactTextView", "About to call strokeSpan.draw()"); + } + + if (strokeSpan == null || !strokeSpan.draw(getPaint(), () -> { + android.util.Log.d("ReactTextView", ">>> Calling super.onDraw() - canvas clip: " + canvas.getClipBounds()); + super.onDraw(canvas); + android.util.Log.d("ReactTextView", "<<< super.onDraw() complete"); + })) { super.onDraw(canvas); } diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt index ac07de3b2c4da7..fdcc5dd4ae542a 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt @@ -13,6 +13,7 @@ import android.graphics.PorterDuffColorFilter import android.text.Spanned import android.text.TextPaint import android.text.style.CharacterStyle +import android.util.Log public class StrokeStyleSpan( public val width: Float, @@ -32,6 +33,9 @@ public class StrokeStyleSpan( return false } + Log.d("StrokeStyleSpan", "===== STROKE DRAW START =====") + Log.d("StrokeStyleSpan", "Stroke width: $width, color: ${Integer.toHexString(color)}") + val originalStyle = paint.style val originalStrokeWidth = paint.strokeWidth val originalStrokeJoin = paint.strokeJoin @@ -39,20 +43,26 @@ public class StrokeStyleSpan( val originalColor = paint.color val originalColorFilter = paint.colorFilter + Log.d("StrokeStyleSpan", "Original paint - style: $originalStyle, strokeWidth: $originalStrokeWidth, color: ${Integer.toHexString(originalColor)}") + // Stroke pass paint.style = Paint.Style.STROKE paint.strokeWidth = width paint.strokeJoin = Paint.Join.ROUND paint.strokeCap = Paint.Cap.ROUND paint.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN) + Log.d("StrokeStyleSpan", ">>> STROKE PASS - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, colorFilter: ${paint.colorFilter}") drawCallback.run() + Log.d("StrokeStyleSpan", "<<< STROKE PASS COMPLETE") // Fill pass paint.style = Paint.Style.FILL paint.strokeWidth = 0f paint.color = originalColor paint.colorFilter = originalColorFilter + Log.d("StrokeStyleSpan", ">>> FILL PASS - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, color: ${Integer.toHexString(paint.color)}") drawCallback.run() + Log.d("StrokeStyleSpan", "<<< FILL PASS COMPLETE") // Restore paint.style = originalStyle @@ -62,6 +72,9 @@ public class StrokeStyleSpan( paint.color = originalColor paint.colorFilter = originalColorFilter + Log.d("StrokeStyleSpan", "Paint restored to original state") + Log.d("StrokeStyleSpan", "===== STROKE DRAW END =====") + return true } From feee9c42e064c93852ce50392df5f0e620e058eb Mon Sep 17 00:00:00 2001 From: Can Undeger Date: Tue, 3 Feb 2026 21:13:44 -0500 Subject: [PATCH 2/9] Use a different color filter mode --- .../react/views/text/internal/span/StrokeStyleSpan.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt index fdcc5dd4ae542a..46e3eadd3baad3 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt @@ -50,8 +50,8 @@ public class StrokeStyleSpan( paint.strokeWidth = width paint.strokeJoin = Paint.Join.ROUND paint.strokeCap = Paint.Cap.ROUND - paint.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC_IN) - Log.d("StrokeStyleSpan", ">>> STROKE PASS - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, colorFilter: ${paint.colorFilter}") + paint.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC) + Log.d("StrokeStyleSpan", ">>> STROKE PASS - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, colorFilter: ${paint.colorFilter}, mode: SRC") drawCallback.run() Log.d("StrokeStyleSpan", "<<< STROKE PASS COMPLETE") From 104318283bd733e146df3d12cc914bde824cafd5 Mon Sep 17 00:00:00 2001 From: Can Undeger Date: Tue, 3 Feb 2026 21:38:47 -0500 Subject: [PATCH 3/9] Another attempt --- .../text/internal/span/StrokeStyleSpan.kt | 27 ++++--------------- 1 file changed, 5 insertions(+), 22 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt index 46e3eadd3baad3..737f1a6a02b942 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt @@ -33,7 +33,7 @@ public class StrokeStyleSpan( return false } - Log.d("StrokeStyleSpan", "===== STROKE DRAW START =====") + Log.d("StrokeStyleSpan", "===== STROKE DRAW START (STROKE ONLY TEST) =====") Log.d("StrokeStyleSpan", "Stroke width: $width, color: ${Integer.toHexString(color)}") val originalStyle = paint.style @@ -45,35 +45,18 @@ public class StrokeStyleSpan( Log.d("StrokeStyleSpan", "Original paint - style: $originalStyle, strokeWidth: $originalStrokeWidth, color: ${Integer.toHexString(originalColor)}") - // Stroke pass + // Stroke pass ONLY - no fill pass paint.style = Paint.Style.STROKE paint.strokeWidth = width paint.strokeJoin = Paint.Join.ROUND paint.strokeCap = Paint.Cap.ROUND paint.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC) - Log.d("StrokeStyleSpan", ">>> STROKE PASS - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, colorFilter: ${paint.colorFilter}, mode: SRC") + Log.d("StrokeStyleSpan", ">>> STROKE PASS ONLY - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, colorFilter: ${paint.colorFilter}, mode: SRC") drawCallback.run() Log.d("StrokeStyleSpan", "<<< STROKE PASS COMPLETE") - // Fill pass - paint.style = Paint.Style.FILL - paint.strokeWidth = 0f - paint.color = originalColor - paint.colorFilter = originalColorFilter - Log.d("StrokeStyleSpan", ">>> FILL PASS - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, color: ${Integer.toHexString(paint.color)}") - drawCallback.run() - Log.d("StrokeStyleSpan", "<<< FILL PASS COMPLETE") - - // Restore - paint.style = originalStyle - paint.strokeWidth = originalStrokeWidth - paint.strokeJoin = originalStrokeJoin - paint.strokeCap = originalStrokeCap - paint.color = originalColor - paint.colorFilter = originalColorFilter - - Log.d("StrokeStyleSpan", "Paint restored to original state") - Log.d("StrokeStyleSpan", "===== STROKE DRAW END =====") + // DON'T restore paint, DON'T do fill pass - leave it as stroke + Log.d("StrokeStyleSpan", "===== STROKE DRAW END (NO FILL, NO RESTORE) =====") return true } From 8f9db2dc68f8764ce3d42ecca5307335441faa2a Mon Sep 17 00:00:00 2001 From: Can Undeger Date: Tue, 3 Feb 2026 22:08:45 -0500 Subject: [PATCH 4/9] Use color directly instead of color filter --- .../react/views/text/internal/span/StrokeStyleSpan.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt index 737f1a6a02b942..511031b0ebc1b2 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt @@ -50,8 +50,8 @@ public class StrokeStyleSpan( paint.strokeWidth = width paint.strokeJoin = Paint.Join.ROUND paint.strokeCap = Paint.Cap.ROUND - paint.colorFilter = PorterDuffColorFilter(color, PorterDuff.Mode.SRC) - Log.d("StrokeStyleSpan", ">>> STROKE PASS ONLY - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, colorFilter: ${paint.colorFilter}, mode: SRC") + paint.color = color // Set color directly instead of colorFilter + Log.d("StrokeStyleSpan", ">>> STROKE PASS ONLY - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, color: ${Integer.toHexString(paint.color)}") drawCallback.run() Log.d("StrokeStyleSpan", "<<< STROKE PASS COMPLETE") From 86dd13b4dd64759f30ac3b23b4c78e2864348cb9 Mon Sep 17 00:00:00 2001 From: Can Undeger Date: Wed, 4 Feb 2026 09:48:22 -0500 Subject: [PATCH 5/9] Use color directly instead of color filter --- .../text/internal/span/StrokeStyleSpan.kt | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt index 511031b0ebc1b2..51f1014d4a152b 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt @@ -33,7 +33,7 @@ public class StrokeStyleSpan( return false } - Log.d("StrokeStyleSpan", "===== STROKE DRAW START (STROKE ONLY TEST) =====") + Log.d("StrokeStyleSpan", "===== STROKE DRAW START =====") Log.d("StrokeStyleSpan", "Stroke width: $width, color: ${Integer.toHexString(color)}") val originalStyle = paint.style @@ -41,22 +41,36 @@ public class StrokeStyleSpan( val originalStrokeJoin = paint.strokeJoin val originalStrokeCap = paint.strokeCap val originalColor = paint.color - val originalColorFilter = paint.colorFilter Log.d("StrokeStyleSpan", "Original paint - style: $originalStyle, strokeWidth: $originalStrokeWidth, color: ${Integer.toHexString(originalColor)}") - // Stroke pass ONLY - no fill pass + // Stroke pass - use direct color instead of colorFilter paint.style = Paint.Style.STROKE paint.strokeWidth = width paint.strokeJoin = Paint.Join.ROUND paint.strokeCap = Paint.Cap.ROUND - paint.color = color // Set color directly instead of colorFilter - Log.d("StrokeStyleSpan", ">>> STROKE PASS ONLY - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, color: ${Integer.toHexString(paint.color)}") + paint.color = color + Log.d("StrokeStyleSpan", ">>> STROKE PASS - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, color: ${Integer.toHexString(paint.color)}") drawCallback.run() Log.d("StrokeStyleSpan", "<<< STROKE PASS COMPLETE") - // DON'T restore paint, DON'T do fill pass - leave it as stroke - Log.d("StrokeStyleSpan", "===== STROKE DRAW END (NO FILL, NO RESTORE) =====") + // Fill pass + paint.style = Paint.Style.FILL + paint.strokeWidth = 0f + paint.color = originalColor + Log.d("StrokeStyleSpan", ">>> FILL PASS - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, color: ${Integer.toHexString(paint.color)}") + drawCallback.run() + Log.d("StrokeStyleSpan", "<<< FILL PASS COMPLETE") + + // Restore + paint.style = originalStyle + paint.strokeWidth = originalStrokeWidth + paint.strokeJoin = originalStrokeJoin + paint.strokeCap = originalStrokeCap + paint.color = originalColor + + Log.d("StrokeStyleSpan", "Paint restored to original state") + Log.d("StrokeStyleSpan", "===== STROKE DRAW END =====") return true } From 381f1462376670f063605da8dcd5f4f5e91a4616 Mon Sep 17 00:00:00 2001 From: Can Undeger Date: Wed, 4 Feb 2026 10:54:18 -0500 Subject: [PATCH 6/9] Try stroke again --- .../views/text/internal/span/StrokeStyleSpan.kt | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt index 51f1014d4a152b..f307220dcbcddd 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt @@ -54,20 +54,17 @@ public class StrokeStyleSpan( drawCallback.run() Log.d("StrokeStyleSpan", "<<< STROKE PASS COMPLETE") - // Fill pass - paint.style = Paint.Style.FILL - paint.strokeWidth = 0f - paint.color = originalColor - Log.d("StrokeStyleSpan", ">>> FILL PASS - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, color: ${Integer.toHexString(paint.color)}") - drawCallback.run() - Log.d("StrokeStyleSpan", "<<< FILL PASS COMPLETE") - - // Restore + // Fill pass - restore paint state and let spans handle colors paint.style = originalStyle paint.strokeWidth = originalStrokeWidth paint.strokeJoin = originalStrokeJoin paint.strokeCap = originalStrokeCap paint.color = originalColor + Log.d("StrokeStyleSpan", ">>> FILL PASS - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, color: ${Integer.toHexString(paint.color)}") + drawCallback.run() + Log.d("StrokeStyleSpan", "<<< FILL PASS COMPLETE") + + // Paint already restored above Log.d("StrokeStyleSpan", "Paint restored to original state") Log.d("StrokeStyleSpan", "===== STROKE DRAW END =====") From 68d1ae3f53d65c5b5cf1c00b0781367ded02c6c4 Mon Sep 17 00:00:00 2001 From: Can Undeger Date: Wed, 4 Feb 2026 13:09:07 -0500 Subject: [PATCH 7/9] Change the stroke order --- .../text/internal/span/StrokeStyleSpan.kt | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt index f307220dcbcddd..726216487c6fef 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt @@ -44,26 +44,21 @@ public class StrokeStyleSpan( Log.d("StrokeStyleSpan", "Original paint - style: $originalStyle, strokeWidth: $originalStrokeWidth, color: ${Integer.toHexString(originalColor)}") - // Stroke pass - use direct color instead of colorFilter + // FILL PASS FIRST - draw with original paint state + Log.d("StrokeStyleSpan", ">>> FILL PASS (FIRST) - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, color: ${Integer.toHexString(paint.color)}") + drawCallback.run() + Log.d("StrokeStyleSpan", "<<< FILL PASS COMPLETE") + + // STROKE PASS SECOND - draw stroke on top of fill paint.style = Paint.Style.STROKE paint.strokeWidth = width paint.strokeJoin = Paint.Join.ROUND paint.strokeCap = Paint.Cap.ROUND paint.color = color - Log.d("StrokeStyleSpan", ">>> STROKE PASS - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, color: ${Integer.toHexString(paint.color)}") + Log.d("StrokeStyleSpan", ">>> STROKE PASS (SECOND) - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, color: ${Integer.toHexString(paint.color)}") drawCallback.run() Log.d("StrokeStyleSpan", "<<< STROKE PASS COMPLETE") - // Fill pass - restore paint state and let spans handle colors - paint.style = originalStyle - paint.strokeWidth = originalStrokeWidth - paint.strokeJoin = originalStrokeJoin - paint.strokeCap = originalStrokeCap - paint.color = originalColor - Log.d("StrokeStyleSpan", ">>> FILL PASS - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, color: ${Integer.toHexString(paint.color)}") - drawCallback.run() - Log.d("StrokeStyleSpan", "<<< FILL PASS COMPLETE") - // Paint already restored above Log.d("StrokeStyleSpan", "Paint restored to original state") From 5155dec1d95ba1b31fff2fbdc78773a8be799537 Mon Sep 17 00:00:00 2001 From: Can Undeger Date: Wed, 4 Feb 2026 15:37:04 -0500 Subject: [PATCH 8/9] Another attempt at fixing the stroke --- .../react/views/text/internal/span/StrokeStyleSpan.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt index 726216487c6fef..a18ad8862937ba 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt @@ -44,7 +44,10 @@ public class StrokeStyleSpan( Log.d("StrokeStyleSpan", "Original paint - style: $originalStyle, strokeWidth: $originalStrokeWidth, color: ${Integer.toHexString(originalColor)}") - // FILL PASS FIRST - draw with original paint state + // FILL PASS FIRST - explicitly set FILL style + paint.style = Paint.Style.FILL + paint.strokeWidth = 0f + // Keep original color so text color spans work Log.d("StrokeStyleSpan", ">>> FILL PASS (FIRST) - style: ${paint.style}, strokeWidth: ${paint.strokeWidth}, color: ${Integer.toHexString(paint.color)}") drawCallback.run() Log.d("StrokeStyleSpan", "<<< FILL PASS COMPLETE") From cfe2f583ea1a4af08e36686017ccb7ebb1586ca6 Mon Sep 17 00:00:00 2001 From: Can Undeger Date: Thu, 5 Feb 2026 17:25:15 -0500 Subject: [PATCH 9/9] Attempt to understand the stroke issue --- .../react/views/text/internal/span/StrokeStyleSpan.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt index a18ad8862937ba..9609b1a8912f04 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/text/internal/span/StrokeStyleSpan.kt @@ -62,7 +62,12 @@ public class StrokeStyleSpan( drawCallback.run() Log.d("StrokeStyleSpan", "<<< STROKE PASS COMPLETE") - // Paint already restored above + // Restore paint + paint.style = originalStyle + paint.strokeWidth = originalStrokeWidth + paint.strokeJoin = originalStrokeJoin + paint.strokeCap = originalStrokeCap + paint.color = originalColor Log.d("StrokeStyleSpan", "Paint restored to original state") Log.d("StrokeStyleSpan", "===== STROKE DRAW END =====")