Merge "Revert "Restrict maximum size of FontInterpolator font caches"" into tm-qpr-dev

This commit is contained in:
Liana Kazanova
2023-04-21 23:46:00 +00:00
committed by Android (Google) Code Review
3 changed files with 10 additions and 43 deletions

View File

@@ -18,10 +18,8 @@ package com.android.systemui.animation
import android.graphics.fonts.Font
import android.graphics.fonts.FontVariationAxis
import android.util.LruCache
import android.util.MathUtils
import android.util.MathUtils.abs
import androidx.annotation.VisibleForTesting
import java.lang.Float.max
import java.lang.Float.min
@@ -36,10 +34,6 @@ private const val FONT_ITALIC_MIN = 0f
private const val FONT_ITALIC_ANIMATION_STEP = 0.1f
private const val FONT_ITALIC_DEFAULT_VALUE = 0f
// Benchmarked via Perfetto, difference between 10 and 50 entries is about 0.3ms in
// frame draw time on a Pixel 6.
@VisibleForTesting const val FONT_CACHE_MAX_ENTRIES = 10
/** Provide interpolation of two fonts by adjusting font variation settings. */
class FontInterpolator {
@@ -87,8 +81,8 @@ class FontInterpolator {
// Font interpolator has two level caches: one for input and one for font with different
// variation settings. No synchronization is needed since FontInterpolator is not designed to be
// thread-safe and can be used only on UI thread.
private val interpCache = LruCache<InterpKey, Font>(FONT_CACHE_MAX_ENTRIES)
private val verFontCache = LruCache<VarFontKey, Font>(FONT_CACHE_MAX_ENTRIES)
private val interpCache = hashMapOf<InterpKey, Font>()
private val verFontCache = hashMapOf<VarFontKey, Font>()
// Mutable keys for recycling.
private val tmpInterpKey = InterpKey(null, null, 0f)
@@ -158,7 +152,7 @@ class FontInterpolator {
tmpVarFontKey.set(start, newAxes)
val axesCachedFont = verFontCache[tmpVarFontKey]
if (axesCachedFont != null) {
interpCache.put(InterpKey(start, end, progress), axesCachedFont)
interpCache[InterpKey(start, end, progress)] = axesCachedFont
return axesCachedFont
}
@@ -166,8 +160,8 @@ class FontInterpolator {
// Font.Builder#build won't throw IOException since creating fonts from existing fonts will
// not do any IO work.
val newFont = Font.Builder(start).setFontVariationSettings(newAxes.toTypedArray()).build()
interpCache.put(InterpKey(start, end, progress), newFont)
verFontCache.put(VarFontKey(start, newAxes), newFont)
interpCache[InterpKey(start, end, progress)] = newFont
verFontCache[VarFontKey(start, newAxes)] = newFont
return newFont
}

View File

@@ -24,10 +24,8 @@ import android.graphics.Canvas
import android.graphics.Typeface
import android.graphics.fonts.Font
import android.text.Layout
import android.util.LruCache
private const val DEFAULT_ANIMATION_DURATION: Long = 300
private const val TYPEFACE_CACHE_MAX_ENTRIES = 5
typealias GlyphCallback = (TextAnimator.PositionedGlyph, Float) -> Unit
/**
@@ -116,7 +114,7 @@ class TextAnimator(layout: Layout, private val invalidateCallback: () -> Unit) {
private val fontVariationUtils = FontVariationUtils()
private val typefaceCache = LruCache<String, Typeface>(TYPEFACE_CACHE_MAX_ENTRIES)
private val typefaceCache = HashMap<String, Typeface?>()
fun updateLayout(layout: Layout) {
textInterpolator.layout = layout
@@ -220,12 +218,12 @@ class TextAnimator(layout: Layout, private val invalidateCallback: () -> Unit) {
}
if (!fvar.isNullOrBlank()) {
textInterpolator.targetPaint.typeface = typefaceCache.get(fvar) ?: run {
textInterpolator.targetPaint.fontVariationSettings = fvar
textInterpolator.targetPaint.typeface?.also {
textInterpolator.targetPaint.typeface =
typefaceCache.getOrElse(fvar) {
textInterpolator.targetPaint.fontVariationSettings = fvar
typefaceCache.put(fvar, textInterpolator.targetPaint.typeface)
textInterpolator.targetPaint.typeface
}
}
}
if (color != null) {

View File

@@ -106,29 +106,4 @@ class FontInterpolatorTest : SysuiTestCase() {
val reversedFont = interp.lerp(endFont, startFont, 0.5f)
assertThat(resultFont).isSameInstanceAs(reversedFont)
}
@Test
fun testCacheMaxSize() {
val interp = FontInterpolator()
val startFont = Font.Builder(sFont)
.setFontVariationSettings("'wght' 100")
.build()
val endFont = Font.Builder(sFont)
.setFontVariationSettings("'wght' 1")
.build()
val resultFont = interp.lerp(startFont, endFont, 0.5f)
for (i in 0..FONT_CACHE_MAX_ENTRIES + 1) {
val f1 = Font.Builder(sFont)
.setFontVariationSettings("'wght' ${i * 100}")
.build()
val f2 = Font.Builder(sFont)
.setFontVariationSettings("'wght' $i")
.build()
interp.lerp(f1, f2, 0.5f)
}
val cachedFont = interp.lerp(startFont, endFont, 0.5f)
assertThat(resultFont).isNotSameInstanceAs(cachedFont)
}
}