From 5fe8fbf99a62a45305622d28a421df412034ff0a Mon Sep 17 00:00:00 2001 From: Yair Morgenstern Date: Sun, 14 May 2023 23:33:58 +0300 Subject: [PATCH] Mod preview images: Dispose of Pixmap, cache images for later use Based on CR by @SomeTroglodyte --- .../pickerscreens/ModManagementScreen.kt | 40 ++++++++++++++----- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/core/src/com/unciv/ui/screens/pickerscreens/ModManagementScreen.kt b/core/src/com/unciv/ui/screens/pickerscreens/ModManagementScreen.kt index a58ae15433..a4a9d65c4f 100644 --- a/core/src/com/unciv/ui/screens/pickerscreens/ModManagementScreen.kt +++ b/core/src/com/unciv/ui/screens/pickerscreens/ModManagementScreen.kt @@ -364,6 +364,9 @@ class ModManagementScreen( modOptions.modSize ) } + + val repoUrlToPreviewImage = HashMap() + private fun addModInfoToActionTable( repoUrl: String, default_branch: String, @@ -376,19 +379,38 @@ class ModManagementScreen( // Display metadata val imageHolder = Table() - Concurrency.run { - val imagePixmap = Github.tryGetPreviewImage(repoUrl, default_branch) ?: return@run - Concurrency.runOnGLThread { - val largestImageSize = max(imagePixmap.width, imagePixmap.height) - val cell = imageHolder.add(Image(Texture(imagePixmap))) - val maxAllowedImageSize = 200f - if (largestImageSize > maxAllowedImageSize) { - val resizeRatio = maxAllowedImageSize / largestImageSize - cell.size(imagePixmap.width * resizeRatio, imagePixmap.height * resizeRatio) + fun setTextureAsPreview(texture: Texture){ + val maxAllowedImageSize = 200f + val cell = imageHolder.add(Image(texture)) + val largestImageSize = max(texture.width, texture.height) + if (largestImageSize > maxAllowedImageSize) { + val resizeRatio = maxAllowedImageSize / largestImageSize + cell.size(texture.width * resizeRatio, texture.height * resizeRatio) + } + } + + if (!repoUrlToPreviewImage.containsKey(repoUrl)) { + Concurrency.run { + val imagePixmap = Github.tryGetPreviewImage(repoUrl, default_branch) + + if (imagePixmap == null) { + repoUrlToPreviewImage[repoUrl] = null + return@run + } + Concurrency.runOnGLThread { + val texture = Texture(imagePixmap) + imagePixmap.dispose() + repoUrlToPreviewImage[repoUrl] = texture + setTextureAsPreview(texture) } } } + else { + val texture = repoUrlToPreviewImage[repoUrl] + if (texture!=null) setTextureAsPreview(texture) + } + modActionTable.add(imageHolder).row()