diff --git a/OpenRA.Mods.Common/Widgets/ImageWidget.cs b/OpenRA.Mods.Common/Widgets/ImageWidget.cs index 28b71ab4edd9..afa9a4eb5792 100644 --- a/OpenRA.Mods.Common/Widgets/ImageWidget.cs +++ b/OpenRA.Mods.Common/Widgets/ImageWidget.cs @@ -31,6 +31,8 @@ public class ImageWidget : Widget readonly Lazy tooltipContainer; public Func GetTooltipText; + CachedTransform<(string, string), Sprite> getImageCache; + public ImageWidget() { GetImageName = () => ImageName; @@ -38,6 +40,8 @@ public ImageWidget() GetTooltipText = () => TooltipText; tooltipContainer = Exts.Lazy(() => Ui.Root.Get(TooltipContainer)); + + CreateImageCache(); } protected ImageWidget(ImageWidget other) @@ -54,19 +58,28 @@ protected ImageWidget(ImageWidget other) GetTooltipText = other.GetTooltipText; tooltipContainer = Exts.Lazy(() => Ui.Root.Get(TooltipContainer)); + + CreateImageCache(); + } + + void CreateImageCache() + { + getImageCache = new CachedTransform<(string, string), Sprite>( + ((string collection, string image) args) => + { + var sprite = ChromeProvider.GetImage(args.collection, args.image); + if (sprite == null) + throw new ArgumentException($"Sprite {args.collection}/{args.image} was not found."); + + return sprite; + }); } public override Widget Clone() { return new ImageWidget(this); } public override void Draw() { - var name = GetImageName(); - var collection = GetImageCollection(); - - var sprite = ChromeProvider.GetImage(collection, name); - if (sprite == null) - throw new ArgumentException($"Sprite {collection}/{name} was not found."); - + var sprite = getImageCache.Update((GetImageCollection(), GetImageName())); WidgetUtils.DrawSprite(sprite, RenderOrigin); }