Skip to content

Commit 5907564

Browse files
Gilles DebunneAndroid (Google) Code Review
authored andcommitted
Merge "Handle non DynamicLayout in Editable draw method."
2 parents ee9da04 + 0711047 commit 5907564

File tree

1 file changed

+55
-54
lines changed

1 file changed

+55
-54
lines changed

core/java/android/widget/TextView.java

Lines changed: 55 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -11707,66 +11707,67 @@ private void drawHardwareAccelerated(Canvas canvas, Layout layout, Path highligh
1170711707
layout.drawBackground(canvas, highlight, mHighlightPaint, cursorOffsetVertical,
1170811708
firstLine, lastLine);
1170911709

11710-
if (mTextDisplayLists == null) {
11711-
mTextDisplayLists = new DisplayList[ArrayUtils.idealObjectArraySize(0)];
11712-
}
11713-
if (! (layout instanceof DynamicLayout)) {
11714-
Log.e(LOG_TAG, "Editable TextView is not using a DynamicLayout");
11715-
return;
11716-
}
11717-
11718-
DynamicLayout dynamicLayout = (DynamicLayout) layout;
11719-
int[] blockEnds = dynamicLayout.getBlockEnds();
11720-
int[] blockIndices = dynamicLayout.getBlockIndices();
11721-
final int numberOfBlocks = dynamicLayout.getNumberOfBlocks();
11722-
11723-
canvas.translate(mScrollX, mScrollY);
11724-
int endOfPreviousBlock = -1;
11725-
int searchStartIndex = 0;
11726-
for (int i = 0; i < numberOfBlocks; i++) {
11727-
int blockEnd = blockEnds[i];
11728-
int blockIndex = blockIndices[i];
11710+
if (layout instanceof DynamicLayout) {
11711+
if (mTextDisplayLists == null) {
11712+
mTextDisplayLists = new DisplayList[ArrayUtils.idealObjectArraySize(0)];
11713+
}
11714+
11715+
DynamicLayout dynamicLayout = (DynamicLayout) layout;
11716+
int[] blockEnds = dynamicLayout.getBlockEnds();
11717+
int[] blockIndices = dynamicLayout.getBlockIndices();
11718+
final int numberOfBlocks = dynamicLayout.getNumberOfBlocks();
11719+
11720+
canvas.translate(mScrollX, mScrollY);
11721+
int endOfPreviousBlock = -1;
11722+
int searchStartIndex = 0;
11723+
for (int i = 0; i < numberOfBlocks; i++) {
11724+
int blockEnd = blockEnds[i];
11725+
int blockIndex = blockIndices[i];
11726+
11727+
final boolean blockIsInvalid = blockIndex == DynamicLayout.INVALID_BLOCK_INDEX;
11728+
if (blockIsInvalid) {
11729+
blockIndex = getAvailableDisplayListIndex(blockIndices, numberOfBlocks,
11730+
searchStartIndex);
11731+
// Dynamic layout internal block indices structure is updated from Editor
11732+
blockIndices[i] = blockIndex;
11733+
searchStartIndex = blockIndex + 1;
11734+
}
1172911735

11730-
final boolean blockIsInvalid = blockIndex == DynamicLayout.INVALID_BLOCK_INDEX;
11731-
if (blockIsInvalid) {
11732-
blockIndex = getAvailableDisplayListIndex(blockIndices, numberOfBlocks,
11733-
searchStartIndex);
11734-
// Dynamic layout internal block indices structure is updated from Editor
11735-
blockIndices[i] = blockIndex;
11736-
searchStartIndex = blockIndex + 1;
11737-
}
11736+
DisplayList blockDisplayList = mTextDisplayLists[blockIndex];
11737+
if (blockDisplayList == null) {
11738+
blockDisplayList = mTextDisplayLists[blockIndex] =
11739+
getHardwareRenderer().createDisplayList("Text " + blockIndex);
11740+
} else {
11741+
if (blockIsInvalid) blockDisplayList.invalidate();
11742+
}
1173811743

11739-
DisplayList blockDisplayList = mTextDisplayLists[blockIndex];
11740-
if (blockDisplayList == null) {
11741-
blockDisplayList = mTextDisplayLists[blockIndex] =
11742-
getHardwareRenderer().createDisplayList("Text " + blockIndex);
11743-
} else {
11744-
if (blockIsInvalid) blockDisplayList.invalidate();
11745-
}
11746-
11747-
if (!blockDisplayList.isValid()) {
11748-
final HardwareCanvas hardwareCanvas = blockDisplayList.start();
11749-
try {
11750-
hardwareCanvas.setViewport(width, height);
11751-
// The dirty rect should always be null for a display list
11752-
hardwareCanvas.onPreDraw(null);
11753-
hardwareCanvas.translate(-mScrollX, -mScrollY);
11754-
layout.drawText(hardwareCanvas, endOfPreviousBlock + 1, blockEnd);
11755-
hardwareCanvas.translate(mScrollX, mScrollY);
11756-
} finally {
11757-
hardwareCanvas.onPostDraw();
11758-
blockDisplayList.end();
11759-
if (USE_DISPLAY_LIST_PROPERTIES) {
11760-
blockDisplayList.setLeftTopRightBottom(0, 0, width, height);
11744+
if (!blockDisplayList.isValid()) {
11745+
final HardwareCanvas hardwareCanvas = blockDisplayList.start();
11746+
try {
11747+
hardwareCanvas.setViewport(width, height);
11748+
// The dirty rect should always be null for a display list
11749+
hardwareCanvas.onPreDraw(null);
11750+
hardwareCanvas.translate(-mScrollX, -mScrollY);
11751+
layout.drawText(hardwareCanvas, endOfPreviousBlock + 1, blockEnd);
11752+
hardwareCanvas.translate(mScrollX, mScrollY);
11753+
} finally {
11754+
hardwareCanvas.onPostDraw();
11755+
blockDisplayList.end();
11756+
if (USE_DISPLAY_LIST_PROPERTIES) {
11757+
blockDisplayList.setLeftTopRightBottom(0, 0, width, height);
11758+
}
1176111759
}
1176211760
}
11763-
}
1176411761

11765-
((HardwareCanvas) canvas).drawDisplayList(blockDisplayList, width, height, null,
11766-
DisplayList.FLAG_CLIP_CHILDREN);
11767-
endOfPreviousBlock = blockEnd;
11762+
((HardwareCanvas) canvas).drawDisplayList(blockDisplayList, width, height, null,
11763+
DisplayList.FLAG_CLIP_CHILDREN);
11764+
endOfPreviousBlock = blockEnd;
11765+
}
11766+
canvas.translate(-mScrollX, -mScrollY);
11767+
} else {
11768+
// Fallback on the layout method (a BoringLayout is used when the text is empty)
11769+
layout.drawText(canvas, firstLine, lastLine);
1176811770
}
11769-
canvas.translate(-mScrollX, -mScrollY);
1177011771
}
1177111772

1177211773
private int getAvailableDisplayListIndex(int[] blockIndices, int numberOfBlocks,

0 commit comments

Comments
 (0)