Store predrawn icon in weak reference
This commit is contained in:
parent
3f9db4751f
commit
e646844623
@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user