Store predrawn icon in weak reference

This commit is contained in:
MM20 2023-05-16 14:42:36 +02:00
parent 3f9db4751f
commit e646844623
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389

View File

@ -14,6 +14,7 @@ import kotlinx.coroutines.sync.Semaphore
import kotlinx.coroutines.sync.withPermit import kotlinx.coroutines.sync.withPermit
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import palettes.TonalPalette import palettes.TonalPalette
import java.lang.ref.WeakReference
sealed interface LauncherIcon sealed interface LauncherIcon
@ -29,19 +30,19 @@ data class StaticLauncherIcon(
val foregroundLayer: LauncherIconLayer, val foregroundLayer: LauncherIconLayer,
val backgroundLayer: LauncherIconLayer, val backgroundLayer: LauncherIconLayer,
) : LauncherIcon { ) : LauncherIcon {
private var cachedBitmap: Bitmap? = null private var cachedBitmap: WeakReference<Bitmap>? = null
private var cachedRenderSettings: LauncherIconRenderSettings? = null private var cachedRenderSettings: LauncherIconRenderSettings? = null
private var renderSemaphore = Semaphore(1) private var renderSemaphore = Semaphore(1)
fun getCachedBitmap(settings: LauncherIconRenderSettings): Bitmap? { fun getCachedBitmap(settings: LauncherIconRenderSettings): Bitmap? {
return if (cachedRenderSettings == settings) cachedBitmap else null return if (cachedRenderSettings == settings) cachedBitmap?.get() else null
} }
/** /**
* Render this icon to a bitmap. * Render this icon to a bitmap.
*/ */
suspend fun render(settings: LauncherIconRenderSettings): Bitmap { suspend fun render(settings: LauncherIconRenderSettings): Bitmap {
val cachedBmp = cachedBitmap val cachedBmp = cachedBitmap?.get()
if (cachedRenderSettings == settings && cachedBmp != null) return cachedBmp if (cachedRenderSettings == settings && cachedBmp != null) return cachedBmp
val bmp = withContext(Dispatchers.Default) { val bmp = withContext(Dispatchers.Default) {
renderSemaphore.withPermit { renderSemaphore.withPermit {
@ -56,7 +57,7 @@ data class StaticLauncherIcon(
}) })
renderLayer(canvas, backgroundLayer, settings.bgThemeColor, settings.bgTone) renderLayer(canvas, backgroundLayer, settings.bgThemeColor, settings.bgTone)
renderLayer(canvas, foregroundLayer, settings.fgThemeColor, settings.fgTone) renderLayer(canvas, foregroundLayer, settings.fgThemeColor, settings.fgTone)
cachedBitmap = bmp cachedBitmap = WeakReference(bmp)
cachedRenderSettings = settings cachedRenderSettings = settings
bmp bmp
} }