From 2bc43810a883a7ecd6d09cd7a7264210390eb222 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Tue, 10 Feb 2026 11:06:57 +0100 Subject: [PATCH] Improve display of homebrew without an icon in the game browser --- CMakeLists.txt | 1 - UI/GameInfoCache.cpp | 17 +++++++---------- UI/GameScreen.cpp | 4 ++-- UI/MainScreen.cpp | 11 ++++++++--- UI/UIAtlas.cpp | 1 + android/buildassets.sh | 1 - assets/ui_images/images.svg | 15 ++++++++++----- assets/unknown.png | Bin 2371 -> 0 bytes 8 files changed, 28 insertions(+), 22 deletions(-) delete mode 100644 assets/unknown.png diff --git a/CMakeLists.txt b/CMakeLists.txt index 44e31829aa..43030de041 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2869,7 +2869,6 @@ set(NativeAssets assets/ppge_atlas.zim assets/ppge_atlas.meta assets/rargray.png - assets/unknown.png assets/zip.png assets/sfx_back.wav assets/sfx_confirm.wav diff --git a/UI/GameInfoCache.cpp b/UI/GameInfoCache.cpp index 1f014101ef..ec9620a9e3 100644 --- a/UI/GameInfoCache.cpp +++ b/UI/GameInfoCache.cpp @@ -630,8 +630,7 @@ public: } else if (File::Exists(screenshot_jpg)) { ReadLocalFileToString(screenshot_jpg, &info_->icon.data, &info_->lock); } else { - // Read standard icon - ReadVFSToString("unknown.png", &info_->icon.data, &info_->lock); + // No icon. } } info_->icon.dataLoaded = true; @@ -688,9 +687,7 @@ handleELF: } else if (File::Exists(screenshot_jpg)) { ReadLocalFileToString(screenshot_jpg, &info_->icon.data, &info_->lock); } else { - // Read standard icon - VERBOSE_LOG(Log::Loader, "Loading unknown.png because there was an ELF"); - ReadVFSToString("unknown.png", &info_->icon.data, &info_->lock); + // No icon } info_->icon.dataLoaded = true; } @@ -854,13 +851,13 @@ handleELF: Path screenshot_jpg = GetSysDirectory(DIRECTORY_SCREENSHOT) / (info_->id + "_00000.jpg"); Path screenshot_png = GetSysDirectory(DIRECTORY_SCREENSHOT) / (info_->id + "_00000.png"); // Try using png/jpg screenshots first - if (File::Exists(screenshot_png)) + if (File::Exists(screenshot_png)) { info_->icon.dataLoaded = ReadLocalFileToString(screenshot_png, &info_->icon.data, &info_->lock); - else if (File::Exists(screenshot_jpg)) + } else if (File::Exists(screenshot_jpg)) { info_->icon.dataLoaded = ReadLocalFileToString(screenshot_jpg, &info_->icon.data, &info_->lock); - else { - DEBUG_LOG(Log::Loader, "Loading unknown.png because no icon was found"); - info_->icon.dataLoaded = ReadVFSToString("unknown.png", &info_->icon.data, &info_->lock); + } else { + // This should be very rare. + info_->icon.dataLoaded = true; } } } diff --git a/UI/GameScreen.cpp b/UI/GameScreen.cpp index 153a27baa0..004191fce2 100644 --- a/UI/GameScreen.cpp +++ b/UI/GameScreen.cpp @@ -187,14 +187,14 @@ void GameScreen::CreateContentViews(UI::ViewGroup *parent) { if (portrait) { mainGameInfo = new LinearLayout(ORIENT_VERTICAL); leftColumn->Add(new Spacer(8.0f)); - if (fileTypeHasIcon) { + if (fileTypeHasIcon && !(info_->icon.dataLoaded && info_->icon.data.empty())) { leftColumn->Add(new GameImageView(gamePath_, GameInfoFlags::ICON, 2.0f, new LinearLayoutParams(UI::Margins(0)))); } leftColumn->Add(mainGameInfo); } else { mainGameInfo = new LinearLayout(ORIENT_VERTICAL, new LinearLayoutParams(1.0f)); ViewGroup *badgeHolder = new LinearLayout(ORIENT_HORIZONTAL); - if (fileTypeHasIcon) { + if (fileTypeHasIcon && !(info_->icon.dataLoaded && info_->icon.data.empty())) { badgeHolder->Add(new GameImageView(gamePath_, GameInfoFlags::ICON, 2.0f, new LinearLayoutParams(144 * 2, 80 * 2, UI::Margins(0)))); } badgeHolder->Add(mainGameInfo); diff --git a/UI/MainScreen.cpp b/UI/MainScreen.cpp index 156d3d63b7..266b8fc20b 100644 --- a/UI/MainScreen.cpp +++ b/UI/MainScreen.cpp @@ -295,7 +295,7 @@ void GameButton::Draw(UIContext &dc) { bool drawBackground = true; switch (ginfo->fileType) { case IdentifiedFileType::PSP_ELF: imageIcon = ImageID("I_DEBUGGER"); drawBackground = false; break; - case IdentifiedFileType::UNKNOWN_ELF: imageIcon = ImageID("I_DEBUGGER"); break; + case IdentifiedFileType::UNKNOWN_ELF: imageIcon = ImageID("I_CROSS"); drawBackground = false; break; case IdentifiedFileType::PPSSPP_GE_DUMP: imageIcon = ImageID("I_DISPLAY"); break; case IdentifiedFileType::PSX_ISO: case IdentifiedFileType::PSP_PS1_PBP: imageIcon = ImageID("I_PSX_ISO"); break; @@ -325,8 +325,13 @@ void GameButton::Draw(UIContext &dc) { } } - if (ginfo->Ready(GameInfoFlags::ICON) && ginfo->icon.texture && drawBackground) { - texture = ginfo->icon.texture; + if (ginfo->Ready(GameInfoFlags::ICON)) { + if (ginfo->icon.texture && drawBackground) { + texture = ginfo->icon.texture; + } else if (drawBackground) { + // No icon, but drawBackground is set. Let's show a plain icon. + imageIcon = ImageID("I_APP"); + } } int x = bounds_.x; diff --git a/UI/UIAtlas.cpp b/UI/UIAtlas.cpp index ee9fcef233..fd71c28fba 100644 --- a/UI/UIAtlas.cpp +++ b/UI/UIAtlas.cpp @@ -179,6 +179,7 @@ static const ImageMeta imageIDs[] = { {"I_PS3_ISO", false}, {"I_UNKNOWN_ISO", false}, {"I_UMD_VIDEO_ISO", false}, + {"I_APP", false}, }; static std::string PNGNameFromID(std::string_view id) { diff --git a/android/buildassets.sh b/android/buildassets.sh index bd7384ad16..6b61ce8f75 100644 --- a/android/buildassets.sh +++ b/android/buildassets.sh @@ -1,7 +1,6 @@ mkdir -p assets cp ../assets/7z.png assets/ cp ../assets/rargray.png assets/ -cp ../assets/unknown.png assets/ cp ../assets/zip.png assets/ cp ../assets/*.zim assets/ cp ../assets/*.meta assets/ diff --git a/assets/ui_images/images.svg b/assets/ui_images/images.svg index da0fc93d01..49e10b7e6f 100644 --- a/assets/ui_images/images.svg +++ b/assets/ui_images/images.svg @@ -25,8 +25,8 @@ inkscape:deskcolor="#d1d1d1" inkscape:document-units="px" inkscape:zoom="2.8284275" - inkscape:cx="86.797346" - inkscape:cy="251.19965" + inkscape:cx="173.06436" + inkscape:cy="581.41847" inkscape:window-width="3840" inkscape:window-height="2071" inkscape:window-x="-9" @@ -4354,11 +4354,11 @@ id="path3-5" style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.0196305" />>q0DSzCK=JtCVVY4ONK(<1M`AWuX#k{5BE z$d+Gv0a8F%DygC{Etv-mfyh)*B^12?L3J1->HnZ2@>eCW^vY~d2@bC%WlkF-ol{3t zS(o0ltEMh&KBT2~Le0K>Sriy0^{#C*VqxYX2?sR?Z5A`t0cGlaGaUvrl7^k3nf_gn zVlkkC(nm^AX{q6uX9N)>%}ZJ?K0=?|P^!8KwIc%bC{Z^yFN+dUEZOv#oZSux3hy)` zCnP{@Y~oNj9-6+uoWx-hGEV{Vv+)cZD&wK)3r>2#jK{PzfCi3zVxj5VCxnAqOZQLX zhU!V%!fL6s%SrmdQ%`y#p~?URXI_@=%t-pVAGKi`SeepVilsxzB^aI7C&VgvkO3 zc*Klhm%Il`2oN=99ig2#bPEMX*`G@x%Sow1`%3ldW4C;^)b^B$h35?;vR{)wl3}TT&N?S(x^5Tdtgg<^>j=DRz zPYP;3jycpEBkbyz>)I>)npUZK-IPXX)q;G}F+q6BEx#(x@-+Rx8Rsa1|g z@FD*HA`*S=wbJr*L8K|FlLiGp$$wLNp8V4oqqGdsPtz2xps@Y&lTD(t08%Xp5@Q0b z4jmM!efE}d&KfO*_ro}hd#}vz`j0xJO$|D^8e+{!gK~hD|LsI-&;HhRowG_tKaH!^ zYPf1&e)~OZjXh})9A!$JdW$joNS@WNw(A#tzep`Tch>wOs7)cv8=vexMQLqN`_JeY zi&QMOORevmbLH8LWjh~|8br_o0Y92kCaW51XU_X+SpMmy>sP<`dlEz|Nj3Dx?|)qQ z50Tm{DUUszftsgAOjw*#7F&3Hf3ur@|Ng6#F=vg@S}CPdr_BMnpbb7o+7Irov0K=J zK#goe&|&vdNMoFHJ$dMaK{3_`7kQJPVhm;L?X*={iyIRt`bAOSlH*>OBZW5Bb&KA0 z)@a3_N_{SE^u_uQV%+TNn6YG5DFHt4*SnY#p|m!x?{k2(O1^m*@$bG|I_6!*8Uf*+ ze~ar~!^QO^2aNg4{S=bR6{@mN0G-*rJ%*vFSL(iOXl_W~%#u@a7i|4Bsw9V&%d0T!G5vv?ah&y@D$RITVSt1QQC zEbFy7Qq)T^$rJss=kM9`-IL06so8w?R#8;z(-kSyA)*DVlU;))1wYNx#W=41MZ?6$ zelj^eoiVu-!BcS{K(G#*Kx+<`b*=4g@`$f-rg(UT9DkelZ6?}Enno9 z`!C49J|Gv1&e;4nxHyce_T4hL`2x4^Do!QhgFctgp9S=wTlCIoMJFeIoZS7yP0(Fy z34>}*6`nalGyz!-lQi9;?`ixv$A<`w5CI2bB=1BHJ@8;h&K#aOLgTnvE{Bjneb-r) zK!j5 zX{_yx5lTqp2=uHA2p`rpFTB4%|oPC8IdZ)&?d=SYfLTL=@3K_ieZ}0+fSfRjMfaQbH<)o!z^&g zTaM3Bb-wD1m6T2AQ-pr}*cbrir>eG#2SbFQn`@A)MJ-T>lOHdn#k3zjG`Xk=1VI8) zjNqwB@@9z`>Ogd&j189@qVd^#&QcKps5;IfXks0q8>?i22t!nZydPGVAEx!;cbqdy z5(ugq0>qA1*5nNU;+{IdFbO~@K!c6JD=kJ^Y}~49$QdcXgY{iNoF^i&|g4rYb1Hf zvtza)JE9>i05K!LfQg$?KQSE!t;L}kh(rx!956X;PA!j02RMwVkvy{55R%3Mlz1?* z2gNKHA~Eaz$beJtZ(kcB$r7M)=YSA&eQhFbM+QT>$?(jGMNhd6iDpC9K+Uun8E-rZ zL>%w{DL3QM(5pDL%!VLm7Q~skqgIqF&I^X>$k%p5Yb4`VT9>;2dd~Ne^*Q zlm72SvLwLRP><|l4mu{9zl6odL+fwQ2t=ld=RN0;V?!we@iK&MzrzxdD5&0k_Wx<; pbQg3@3F&ZzzZZ~H(J-?i?GM(HHT