Loading packages/SystemUI/animation/src/com/android/systemui/animation/FontInterpolator.kt +5 −11 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 { Loading Loading @@ -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) Loading Loading @@ -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 } Loading @@ -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 } Loading packages/SystemUI/animation/src/com/android/systemui/animation/TextAnimator.kt +5 −7 Original line number Diff line number Diff line Loading @@ -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 /** Loading Loading @@ -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 Loading Loading @@ -220,11 +218,11 @@ class TextAnimator(layout: Layout, private val invalidateCallback: () -> Unit) { } if (!fvar.isNullOrBlank()) { textInterpolator.targetPaint.typeface = typefaceCache.get(fvar) ?: run { textInterpolator.targetPaint.typeface = typefaceCache.getOrElse(fvar) { textInterpolator.targetPaint.fontVariationSettings = fvar textInterpolator.targetPaint.typeface?.also { typefaceCache.put(fvar, textInterpolator.targetPaint.typeface) } textInterpolator.targetPaint.typeface } } Loading packages/SystemUI/tests/src/com/android/systemui/animation/FontInterpolatorTest.kt +0 −25 Original line number Diff line number Diff line Loading @@ -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) } } Loading
packages/SystemUI/animation/src/com/android/systemui/animation/FontInterpolator.kt +5 −11 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 { Loading Loading @@ -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) Loading Loading @@ -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 } Loading @@ -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 } Loading
packages/SystemUI/animation/src/com/android/systemui/animation/TextAnimator.kt +5 −7 Original line number Diff line number Diff line Loading @@ -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 /** Loading Loading @@ -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 Loading Loading @@ -220,11 +218,11 @@ class TextAnimator(layout: Layout, private val invalidateCallback: () -> Unit) { } if (!fvar.isNullOrBlank()) { textInterpolator.targetPaint.typeface = typefaceCache.get(fvar) ?: run { textInterpolator.targetPaint.typeface = typefaceCache.getOrElse(fvar) { textInterpolator.targetPaint.fontVariationSettings = fvar textInterpolator.targetPaint.typeface?.also { typefaceCache.put(fvar, textInterpolator.targetPaint.typeface) } textInterpolator.targetPaint.typeface } } Loading
packages/SystemUI/tests/src/com/android/systemui/animation/FontInterpolatorTest.kt +0 −25 Original line number Diff line number Diff line Loading @@ -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) } }