2023-02-22 16:04:00 +01:00
|
|
|
package jp.juggler.subwaytooter.util
|
|
|
|
|
|
|
|
import android.graphics.RectF
|
|
|
|
import jp.juggler.subwaytooter.api.entity.TootInstance
|
2023-02-26 00:15:57 +01:00
|
|
|
import jp.juggler.subwaytooter.pref.PrefI
|
2023-02-22 16:04:00 +01:00
|
|
|
import jp.juggler.subwaytooter.table.SavedAccount
|
2023-02-26 00:15:57 +01:00
|
|
|
import jp.juggler.subwaytooter.table.daoImageAspect
|
2023-02-22 16:04:00 +01:00
|
|
|
import jp.juggler.util.log.LogCategory
|
|
|
|
import kotlin.math.min
|
|
|
|
|
|
|
|
enum class EmojiSizeMode {
|
|
|
|
Square,
|
|
|
|
Wide,
|
|
|
|
}
|
|
|
|
|
2023-02-26 00:15:57 +01:00
|
|
|
fun SavedAccount?.emojiSizeMode(): EmojiSizeMode =
|
|
|
|
when (PrefI.ipEmojiWideMode.value) {
|
|
|
|
PrefI.EMOJI_WIDE_ENABLE -> EmojiSizeMode.Wide
|
|
|
|
PrefI.EMOJI_WIDE_DISABLE -> EmojiSizeMode.Square
|
|
|
|
else /* PrefI.EMOJI_WIDE_AUTO */ -> {
|
|
|
|
val ti = this?.let { TootInstance.getCached(it) }
|
|
|
|
when {
|
|
|
|
ti == null -> EmojiSizeMode.Square
|
|
|
|
ti.isMisskey || !ti.fedibirdCapabilities.isNullOrEmpty() -> EmojiSizeMode.Wide
|
|
|
|
else -> EmojiSizeMode.Square
|
|
|
|
}
|
|
|
|
}
|
2023-02-22 16:04:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* カスタム絵文字のSpanやビューの描画領域やサイズを計算する
|
|
|
|
*/
|
|
|
|
class EmojiImageRect(
|
|
|
|
private val sizeMode: EmojiSizeMode,
|
2023-02-26 00:36:14 +01:00
|
|
|
var scale: Float = 1f,
|
2023-02-22 22:59:35 +01:00
|
|
|
val scaleRatio: Float = 1f,
|
|
|
|
val descentRatio: Float = 0f,
|
2023-02-22 16:04:00 +01:00
|
|
|
val maxEmojiWidth: Float,
|
2023-02-26 00:15:57 +01:00
|
|
|
// val layout: (Int, Int) -> Unit,
|
2023-02-22 16:04:00 +01:00
|
|
|
) {
|
|
|
|
companion object {
|
|
|
|
private val log = LogCategory("EmojiImageRect")
|
|
|
|
|
2023-02-22 22:59:35 +01:00
|
|
|
val imageAspectCache = HashMap<String, Float>()
|
2023-02-22 16:04:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
val rectDst = RectF()
|
|
|
|
var emojiWidth = 0f
|
|
|
|
var emojiHeight = 0f
|
|
|
|
var transY = 0f
|
|
|
|
|
|
|
|
/**
|
|
|
|
* lastAspect に基づいて rectDst と transY を更新する
|
|
|
|
*/
|
|
|
|
fun updateRect(
|
|
|
|
url: String,
|
|
|
|
aspectArg: Float? = null,
|
|
|
|
textSize: Float,
|
|
|
|
baseline: Float,
|
|
|
|
) {
|
|
|
|
// テキストサイズをスケーリングした基本高さ
|
|
|
|
val h = textSize * scaleRatio * scale
|
|
|
|
|
|
|
|
// ベースラインから上下方向にずらすオフセット
|
|
|
|
val cDescent = emojiHeight * descentRatio
|
|
|
|
this.transY = baseline - emojiHeight + cDescent
|
|
|
|
updateRect(url, aspectArg, h)
|
|
|
|
}
|
|
|
|
|
|
|
|
fun updateRect(
|
|
|
|
url: String,
|
|
|
|
aspectArg: Float? = null,
|
|
|
|
h: Float,
|
|
|
|
) {
|
|
|
|
this.emojiHeight = h
|
|
|
|
val aspect = when (aspectArg) {
|
2023-02-26 00:15:57 +01:00
|
|
|
null -> {
|
|
|
|
imageAspectCache[url]
|
|
|
|
?: daoImageAspect.load(url)?.also { imageAspectCache[url] = it }
|
|
|
|
?: 1f
|
|
|
|
}
|
2023-02-22 16:04:00 +01:00
|
|
|
else -> {
|
2023-02-26 00:15:57 +01:00
|
|
|
if (url.isNotEmpty()) imageAspectCache[url] = aspectArg
|
2023-02-22 16:04:00 +01:00
|
|
|
aspectArg
|
|
|
|
}
|
|
|
|
}.takeIf { it > 0f } ?: 1f
|
|
|
|
|
|
|
|
when {
|
|
|
|
// 横長画像で、それを許可するモード
|
|
|
|
aspect > 1.36f && sizeMode == EmojiSizeMode.Wide -> {
|
|
|
|
// 絵文字のアスペクト比から描画範囲の幅と高さを決める
|
|
|
|
val dstWidth = min(maxEmojiWidth, aspect * emojiHeight)
|
|
|
|
val dstHeight = dstWidth / aspect
|
|
|
|
val dstX = 0f
|
|
|
|
val dstY = (emojiHeight - dstHeight) / 2f
|
|
|
|
rectDst.set(dstX, dstY, dstX + dstWidth, dstY + dstHeight)
|
|
|
|
emojiWidth = dstWidth
|
|
|
|
}
|
|
|
|
|
|
|
|
else -> {
|
|
|
|
// 絵文字のアスペクト比から描画範囲の幅と高さを決める
|
|
|
|
val dstWidth: Float
|
|
|
|
val dstHeight: Float
|
|
|
|
if (aspect >= 1f) {
|
|
|
|
dstWidth = emojiHeight
|
|
|
|
dstHeight = emojiHeight / aspect
|
|
|
|
} else {
|
|
|
|
dstHeight = emojiHeight
|
|
|
|
dstWidth = emojiHeight * aspect
|
|
|
|
}
|
|
|
|
val dstX = (emojiHeight - dstWidth) / 2f
|
|
|
|
val dstY = (emojiHeight - dstHeight) / 2f
|
|
|
|
rectDst.set(dstX, dstY, dstX + dstWidth, dstY + dstHeight)
|
2023-02-26 00:15:57 +01:00
|
|
|
emojiWidth = emojiHeight
|
2023-02-22 16:04:00 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|