From bb2397c523dc3e1e54fcd2ebf7ae20907e3f37ad Mon Sep 17 00:00:00 2001 From: Raph Levien Date: Thu, 12 Feb 2015 16:16:49 -0800 Subject: Fix EditText RenderNode invalidation bugs EditText uses a TextDisplayList data structure to hold RenderNode objects for optimized incremental drawing. This data structure uses an isDirty flag to indicate when it has been invalidated and needs to be re-rendered. This flag was not being computed correctly, leading to excessive re-rendering. This patch clears isDirty after rendering text into the RenderNode, so that it can be reused until it is invalidated, and also explicitly sets it when it is recycled. Bug: 19371378 Change-Id: I70239cc30e43bb8631dfffc2ea2705e8d4c452f4 --- core/java/android/widget/Editor.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/java/android/widget/Editor.java b/core/java/android/widget/Editor.java index d5166f327f32..4752594e06dd 100644 --- a/core/java/android/widget/Editor.java +++ b/core/java/android/widget/Editor.java @@ -1352,6 +1352,9 @@ public class Editor { searchStartIndex); // Note how dynamic layout's internal block indices get updated from Editor blockIndices[i] = blockIndex; + if (mTextDisplayLists[blockIndex] != null) { + mTextDisplayLists[blockIndex].isDirty = true; + } searchStartIndex = blockIndex + 1; } @@ -1388,6 +1391,7 @@ public class Editor { // brings this range of text back to the top left corner of the viewport hardwareCanvas.translate(-left, -top); layout.drawText(hardwareCanvas, blockBeginLine, blockEndLine); + mTextDisplayLists[blockIndex].isDirty = false; // No need to untranslate, previous context is popped after // drawDisplayList } finally { -- cgit v1.2.3-59-g8ed1b