From 98c1098b86ddddfc032d5be609fe065fff2f507d Mon Sep 17 00:00:00 2001 From: Hafiz Date: Wed, 4 Jun 2025 18:13:34 -0500 Subject: [PATCH] Scales up quest pixel art in party details Introduces a forceScaleUp option to PixelArtView, used for gifs on the party details. --- .../social/party/PartyDetailFragment.kt | 1 + .../common/habitica/views/PixelArtView.kt | 22 +++++++++++-------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt index e6922f67c..4648acb48 100644 --- a/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt +++ b/Habitica/src/main/java/com/habitrpg/android/habitica/ui/fragments/social/party/PartyDetailFragment.kt @@ -285,6 +285,7 @@ class PartyDetailFragment : BaseFragment() { binding?.questTitleView?.text = questContent.text binding?.questScrollImageView?.loadImage("inventory_quest_scroll_" + questContent.key) if (questContent.hasGifImage()) { + binding?.questImageView?.forceScaleUp = true binding?.questImageView?.loadImage("quest_" + questContent.key, "gif") } else { context?.let { context -> diff --git a/common/src/main/java/com/habitrpg/common/habitica/views/PixelArtView.kt b/common/src/main/java/com/habitrpg/common/habitica/views/PixelArtView.kt index 633515e38..08b5d0540 100644 --- a/common/src/main/java/com/habitrpg/common/habitica/views/PixelArtView.kt +++ b/common/src/main/java/com/habitrpg/common/habitica/views/PixelArtView.kt @@ -16,6 +16,7 @@ constructor( defStyleAttr: Int = 0 ) : androidx.appcompat.widget.AppCompatImageView(context, attrs, defStyleAttr) { private var targetRect = Rect(0, 0, 0, 0) + var forceScaleUp: Boolean = false var bitmap: Bitmap? = null set(value) { @@ -44,22 +45,24 @@ constructor( private fun updateTargetRect() { var targetWidth = bitmap?.width ?: 0 var targetHeight = bitmap?.height ?: 0 - val smallestSide = min(width, height) - val divisor = if (targetWidth % 3 == 0 && targetHeight % 3 == 0) 3 else 2 + val smallestSide = if (forceScaleUp) width else min(width, height) + val divisor = if (forceScaleUp) 1 else if (targetWidth % 3 == 0 && targetHeight % 3 == 0) 3 else 2 - val factor = + val factor = if (forceScaleUp) { + if (smallestSide > 0 && targetWidth > 0) { + (smallestSide.toFloat() / (targetWidth.toFloat() / divisor)).toInt().coerceAtLeast(1) + } else 1 + } else { min( if (smallestSide > 0 && targetWidth > 0 && smallestSide != targetWidth) { smallestSide / (targetWidth / divisor) - } else { - 1 - }, + } else 1, if (smallestSide > 0 && targetHeight > 0 && smallestSide != targetHeight) { smallestSide / (targetHeight / divisor) - } else { - 1 - } + } else 1 ) + } + targetWidth = (targetWidth / divisor) * factor targetHeight = (targetHeight / divisor) * factor val left = (width - targetWidth) / 2 @@ -67,6 +70,7 @@ constructor( targetRect = Rect(left, top, left + targetWidth, top + targetHeight) } + override fun onDraw(canvas: Canvas) { if (bitmap == null) { super.onDraw(canvas)