@@ -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