From c3527389b6bdbbeb4bb16811d30e79612f323e1e Mon Sep 17 00:00:00 2001 From: Jason Simmons Date: Mon, 4 Mar 2019 11:04:51 -0800 Subject: [PATCH] Avoid the overhead of instantiating a generator in paintImage (#28736) This function is called frequently with non-repeating images during many animations --- .../lib/src/painting/decoration_image.dart | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/flutter/lib/src/painting/decoration_image.dart b/packages/flutter/lib/src/painting/decoration_image.dart index b3bdc09ffe..96a8b829ec 100644 --- a/packages/flutter/lib/src/painting/decoration_image.dart +++ b/packages/flutter/lib/src/painting/decoration_image.dart @@ -438,22 +438,25 @@ void paintImage({ final Rect sourceRect = alignment.inscribe( sourceSize, Offset.zero & inputSize, ); - for (Rect tileRect in _generateImageTileRects(rect, destinationRect, repeat)) - canvas.drawImageRect(image, sourceRect, tileRect, paint); + if (repeat == ImageRepeat.noRepeat) { + canvas.drawImageRect(image, sourceRect, destinationRect, paint); + } else { + for (Rect tileRect in _generateImageTileRects(rect, destinationRect, repeat)) + canvas.drawImageRect(image, sourceRect, tileRect, paint); + } } else { - for (Rect tileRect in _generateImageTileRects(rect, destinationRect, repeat)) - canvas.drawImageNine(image, centerSlice, tileRect, paint); + if (repeat == ImageRepeat.noRepeat) { + canvas.drawImageNine(image, centerSlice, destinationRect, paint); + } else { + for (Rect tileRect in _generateImageTileRects(rect, destinationRect, repeat)) + canvas.drawImageNine(image, centerSlice, tileRect, paint); + } } if (needSave) canvas.restore(); } Iterable _generateImageTileRects(Rect outputRect, Rect fundamentalRect, ImageRepeat repeat) sync* { - if (repeat == ImageRepeat.noRepeat) { - yield fundamentalRect; - return; - } - int startX = 0; int startY = 0; int stopX = 0;