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 zcmZvge^6A{702&BcKNxm4_JPP{B%JUT@Y{uG$5-*ei$&TL4Jw4C=yV_6*tBt#wAl{ z>Nrk<9-DD0wWPIEJ9QEiJHxcv@`tu`(xljNrnJ?BPMpLhb|jXzw$a+}eLvv6XCHI8 z?|tq$=bn4+dH21y1Mh~6pAQMPZNB=>tBkQU$Z#`b{)3E}@W+oJ4&Da9dMqLQl-cpe zj{&e7W<fgVdL|slz&^K_Ig=gW<P6xab$S>F>^CwC&JA(_@B_1c;EP}%nnReyVh&Y< z83X&B#vvbV9PFlnO@RHxG9Mt<n*>V=H8VaH*&pUN4Va;WjLm>mgv!R;kROl0{)k{g zLoH!yFy>bn`!iTL4wZ>ucfdk$aK<x}3igR%a+zR%2_kB(u@mr9vz$WJxD4!bnMqM| zhqYj(N`PE16o(h=OG6e~!2V`nKClNGCarNdV3EclAH)y#l_BZ?SXiijnGS*d9W%CC zBV%|lJX=S>zKxpEW?>NQtbR#?><r*PG|_P5VX%K020jn=Z-d@Nu&)j53fL2a?HJfo zjUJ!eIGD*2oG%a#Cjdh<5pp&OW-+iSurP~03%9`{3~U-~vmsk|!J;(&qyo7Q7_EUk z3$tK0Lkig;#@;myVg`#f*jmBv7?>R_-e9{X88AV)x7D@F21_y+yTBG0m>X;%WrfEF z(+qCQ(USpf?TuRn7Nw~$KE-;lEQ8lZFo%ZmHE0LR(J*e?36?9f`CX(JFwYQ-A8e_C z1;Fy<X$$<|4hO)N83s89R%Ea}0k&MnC_N%HxB~99d&3aaN)7JLgWWW+i(o5t?id>Z zd(NOY23DbCCN>UMDKj+(CN=^1fnL!x3AV;iOSi$kVPN;b)*09=SPd9I)DmHMX4L5z z?s_ZW^E${_GFXFwWrO`e7a(IUuov*`Q1=TySUK1w1FHx7se!eFy%;n&>;&9wV7*|? z1{MHoHL$~ATMX<d*j58O0ak-Yhq~<2&Nl?O#!%<y!M5wNU^0z>b!eCg+sRe1oys6Q z1N^uSwo9YO*(BJf`e1@=3h*WQ@jJIp_rUfTit9dDzF||E0o!ZPn+1E@z#f6^GqA^C z`z=BJZpdC^?0`Yh4EC~tg@eT!g0X_Vf*Gr|z;}RTuvZN%8|-xrlXlWVz#E#>aN{zt zZ)sDASgXL^(CG2B)`R`f5TF+<XbI)rN>)v*8|<3aANrOA0N=EP=@bXSzG-lH`nA#i zh>Ia6A6;t5pw-d2Ru&-{@qcG%Z}fN36%|vh#mA^M<_2(vt=hzBqdlIk*(2zPtsd+X zaT)!`mZVkp(gKmIe<IGSN0BFXQG}0$;?Ke?bh2&%d7@+JRBV#u(r&@<AwG!@*hRV* zn>II86lKOOf<JCElkSR+(?mQ)C*vxVz5#nAeW%1q|BXwsNGg;VUyi=_<K;NiF^tzy zcBMZ`ih+svi=j8u^C%@jj*d?_AD+HcHI-;<64V*q$%‹CbVERx<$bdWVMOP-hF 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 delta 6527 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 Hm)iaZq492M