From e2130fb3ba0137fab3d9723d291672d72b9c093d Mon Sep 17 00:00:00 2001
From: nakst <>
Date: Sun, 5 Sep 2021 21:27:29 +0100
Subject: [PATCH] fix file manager thumbnail view with high dpi

---
 apps/file_manager/ui.cpp |   2 +-
 desktop/text.cpp         |  18 +++++++++++++++---
 desktop/theme.cpp        |  15 +++++----------
 res/Themes/Theme.dat     | Bin 53376 -> 53824 bytes
 4 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/apps/file_manager/ui.cpp b/apps/file_manager/ui.cpp
index ff225af..39201db 100644
--- a/apps/file_manager/ui.cpp
+++ b/apps/file_manager/ui.cpp
@@ -690,7 +690,7 @@ int ListItemMessage(EsElement *element, EsMessage *message) {
 			if (thumbnail && thumbnail->bits) {
 				EsRectangle destination = EsPainterBoundsClient(message->painter);
 				EsRectangle source = ES_RECT_2S(thumbnail->width, thumbnail->height);
-				destination = EsRectangleFit(destination, source, false);
+				destination = EsRectangleFit(destination, source, true /* allow scaling up */);
 				// EsDrawBlock(message->painter, EsRectangleAdd(destination, ES_RECT_1(2)), 0x20000000);
 				EsDrawBitmapScaled(message->painter, destination, source, thumbnail->bits, thumbnail->width * 4, 0xFF);
 				return ES_HANDLED;
diff --git a/desktop/text.cpp b/desktop/text.cpp
index 5850151..ea2770c 100644
--- a/desktop/text.cpp
+++ b/desktop/text.cpp
@@ -1124,6 +1124,7 @@ IconPackImage *IconPackReadImage(uint32_t id, uint32_t size, int *type) {
 	uint32_t variant = 0;
 
 	while (true) {
+		// Look for a perfect match of size and direction.
 		variant = EsBufferReadInt(&iconManagement.pack);
 		if (!variant) break;
 		if ((variant == size || variant == 1) && !rtl) { found = true; break; }
@@ -1131,6 +1132,7 @@ IconPackImage *IconPackReadImage(uint32_t id, uint32_t size, int *type) {
 	}
 
 	if (!found) {
+		// Look for the smallest bigger size.
 		iconManagement.pack.position = start;
 
 		while (true) {
@@ -1163,11 +1165,21 @@ IconPackImage *IconPackReadImage(uint32_t id, uint32_t size, int *type) {
 		}
 	}
 
-	// skipSizeSearch:;
-
 	if (!found) {
+		// Look for the biggest size.
 		iconManagement.pack.position = start;
-		EsBufferReadInt(&iconManagement.pack);
+		uintptr_t previous = 0;
+
+		while (true) {
+			if (!EsBufferReadInt(&iconManagement.pack) && previous) { 
+				iconManagement.pack.position = previous; 
+				found = true; 
+				break; 
+			}
+
+			previous = iconManagement.pack.position;
+			iconManagement.pack.position = EsBufferReadInt(&iconManagement.pack);
+		}
 	}
 
 	EsBufferReadInt(&iconManagement.pack);
diff --git a/desktop/theme.cpp b/desktop/theme.cpp
index 75ab043..118413d 100644
--- a/desktop/theme.cpp
+++ b/desktop/theme.cpp
@@ -203,7 +203,8 @@ typedef struct ThemeMetrics {
 	int16_t maximumWidth, maximumHeight;
 	int16_t gapMajor, gapMinor, gapWrap;
 	uint32_t textColor, selectedBackground, selectedText, iconColor;
-	int8_t textAlign, textSize, fontWeight, iconSize;
+	int8_t textAlign, fontWeight;
+	int16_t textSize, iconSize;
 	bool isItalic, ellipsis, layoutVertical;
 } ThemeMetrics;
 
@@ -1255,7 +1256,8 @@ struct UIStyle {
 
 	// General information.
 
-	uint8_t textSize, textAlign;
+	uint8_t textAlign;
+	uint16_t textSize;
 	uint32_t textColor;
 	EsFont font;
 
@@ -1874,14 +1876,6 @@ UIStyle *ThemeStyleInitialise(UIStyleKey key) {
 
 	// Apply scaling to the metrics.
 
-	int8_t *scale8[] = {
-		&style->metrics->textSize, &style->metrics->iconSize,
-	};
-
-	for (uintptr_t i = 0; i < sizeof(scale8) / sizeof(scale8[0]); i++) {
-		*(scale8[i]) = *(scale8[i]) * key.scale;
-	}
-
 	int16_t *scale16[] = {
 		&style->metrics->insets.l, &style->metrics->insets.r, &style->metrics->insets.t, &style->metrics->insets.b,
 		&style->metrics->clipInsets.l, &style->metrics->clipInsets.r, &style->metrics->clipInsets.t, &style->metrics->clipInsets.b,
@@ -1890,6 +1884,7 @@ UIStyle *ThemeStyleInitialise(UIStyleKey key) {
 		&style->metrics->preferredWidth, &style->metrics->preferredHeight,
 		&style->metrics->minimumWidth, &style->metrics->minimumHeight,
 		&style->metrics->maximumWidth, &style->metrics->maximumHeight,
+		&style->metrics->textSize, &style->metrics->iconSize,
 	};
 
 	for (uintptr_t i = 0; i < sizeof(scale16) / sizeof(scale16[0]); i++) {
diff --git a/res/Themes/Theme.dat b/res/Themes/Theme.dat
index 6e5fee0b5f2291e1f5b6922273a08ca998023175..707549dc4e883ea9a3ac653dbe8ff85557fa37e2 100644
GIT binary patch
delta 6738
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

delta 6527
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
Hm)iaZq492M