From f32f765331bcc966dcc80f433136a15eb16cd78b Mon Sep 17 00:00:00 2001 From: cxl Date: Fri, 25 Jan 2019 12:22:42 +0000 Subject: [PATCH] plugin/bmp: LoadIco now has just_best parameter, IconDes: can now import .ico files git-svn-id: svn://ultimatepp.org/upp/trunk@12715 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/IconDes/IconDes.h | 1 + uppsrc/IconDes/List.cpp | 33 ++++++++++++++++++++++++--------- uppsrc/ide/icon.ico | Bin 10134 -> 10134 bytes uppsrc/plugin/bmp/Icon.cpp | 20 +++++++++++++++++--- uppsrc/plugin/bmp/bmp.h | 2 +- 5 files changed, 43 insertions(+), 13 deletions(-) diff --git a/uppsrc/IconDes/IconDes.h b/uppsrc/IconDes/IconDes.h index 7dbf9f24c..cef051991 100644 --- a/uppsrc/IconDes/IconDes.h +++ b/uppsrc/IconDes/IconDes.h @@ -4,6 +4,7 @@ #include #include #include +#include namespace Upp { diff --git a/uppsrc/IconDes/List.cpp b/uppsrc/IconDes/List.cpp index 86973c4ef..c38e6a3bb 100644 --- a/uppsrc/IconDes/List.cpp +++ b/uppsrc/IconDes/List.cpp @@ -264,7 +264,7 @@ FileSel& IconDes::ImgFile() { static FileSel sel; ONCELOCK { - sel.Type("Image files", "*.png *.bmp *.jpg *.jpeg *.gif"); + sel.Type("Image files", "*.png *.bmp *.jpg *.jpeg *.gif *.ico"); sel.AllFilesType(); sel.Multi(); #ifdef _MULTITHREADED @@ -285,14 +285,29 @@ void IconDes::InsertFile() if(!ImgFile().ExecuteOpen()) return; for(int i = 0; i < ImgFile().GetCount(); i++) { String fn = ImgFile()[i]; - Image m = StreamRaster::LoadFileAny(fn); - if(IsNull(m)) - Exclamation(DeQtf(fn) + " not an image."); - String id = Filter(GetFileTitle(fn), CharFilterImageId); - if(!IsAlpha(*id) && *id != '_') - id = '_' + id; - SetRes(m, IMAGE_RESOLUTION_STANDARD); - ImageInsert(id, m); + Index ml; + if(ToLower(GetFileExt(fn)) == ".ico") + for(Image m : ReadIcon(LoadFile(fn), true)) + ml.FindAdd(m); + else { + Image mm = StreamRaster::LoadFileAny(fn); + if(IsNull(mm)) + Exclamation(DeQtf(fn) + " not an image."); + else + ml.Add(mm); + } + int ii = 0; + DDUMP(ml.GetCount()); + for(Image m : ml) { + String id = Filter(GetFileTitle(fn), CharFilterImageId); + if(!IsAlpha(*id) && *id != '_') + id = '_' + id; + if(ii) + id << "_" << ii; + SetRes(m, IMAGE_RESOLUTION_STANDARD); + ImageInsert(id, m); + ii++; + } } } diff --git a/uppsrc/ide/icon.ico b/uppsrc/ide/icon.ico index cbfd06c67e7d1b9a1f6cd71053b5d0221ef6e79a..263d620ac4c67391a0ba1cfd60057430defebc9f 100644 GIT binary patch literal 10134 zcmeHNy^rfe5a0MCv7z8n(9jTtlkSx#M>Pj(vohen*-E5}i zpJ@I!nrrpBQtMAGeWBDJpLO~-Bc;CkqSODGDE0HTQg0|6AP{!MSEcSL?ggnKEPuq{ zecOg6n*DyyV?Zpn+itfF2JGQ4F(BKzovZbvvf-Gb11B#Gp`brmaUEpn*gzI%U)RRho)m#?qy8qIyJ47{@6mqMZE+3If${>>i}Qv4_&)9cINutY)x;YsaHCE1!#2-&P?Cj=?HO8 zIr!~4mh&v!n9m&eCS`0IciCEq^IHE_w!CF&z_ z*q0Gy7Y_FVHe%n$IfetxLexj%uy0#&e-5w_`##Pw7}B{!eIyS1w)j|i_m5{Tihq~` za+G}gIM?8m&O+2j;;^q%znng69ZtkIc^&URc+6rs5dMHzTy)QcB8TGBJjVtP*%)ju z#yQ`Aj1Bxy4#@FR_UcXNpPJ76aW2lY!HT@HilJOP?rj;;?`!RD0)tU!B8U(%+b z@uJixePgdwI%M?u+H=6*VSwG=L+M9UqI>$C!>1z2)DPc&uZkv9zyI>9Dw0M`@Cu^& zhUO@o@AAKwE2?1VVHZ2U=;r-q*z(&AHAWiI^*xby3cNV{@n?E_D8$VjvDH@^jwWn zIybL-gO${snL-XrW8mwlvxBI+ zYXfTW5L=?o3qrSNgA!7o-WY`S+90B5179zR(A$JwF!aiCNY_l)GBF1HuE7M8t=9$- zJsX7d^tNJ%pxzjS_1Yk!XM>m?2Clwa40>A)YwIK}636Aw9i~86v1R z24TH6IM5eNTs9y|h}K(Q%H^GgK0x{;g!KWpe=|*=4K@8Iz7OgTD0}~9OY)HKgJ042 z$o)qT3Viml=3B#iLXH=hOsC`L(G>wylR77^)MSn8Vv%f8vLJq=c|HeMDu2YasIm(7 z#2=XN(p7N_O?ro`N9X-Kr`Ksq|HsIuA)n{|;X3&cJ@WW@vEbT`Zd`YAI-O3(_4DF( zI_2dp=#@XI>&0zVb@IA?cH~W6yYjkzGWLK-HkcO^87pqk(?{>R%akskP?b;=$qF46@AB^NXTeeh3ZlxW_?=~+N{(b0g!s1%e literal 10134 zcmeHNzi%r=5MJk;%UwlW(9mERq`U?Z$thj9a5@(#()E!dS)`+iTT4jb4*m=({stE` zG!%#mBx=g{2R!MRZ+2&Y-R;KDF@6-8XgxPO^L;Zrx3`!0J*5V!RF{{EhDjS|II+D?>=+>f6kQp`E#Y-5FJv0cEF!X&58Gf(o(K? zv*Vm?I-7DlntmAO=TuT=p&vf|W zfMeKL*}G4b+7)hW=uC-+@5ePTz~Y=4)0oqcb7o`CHkx{s!#hCT?d+Mpxx+K$k+Sja zK9>C~+SHe4NqhU&63mg2t-<6EFy34`v-a@18EipW=G>sG%(S ze2O*l!xPmZxuKCi#veU@riPQ{Pt@sm|x#F+`H#S=kA94;aR-qr?5ae``F)8 za!m-zu75f^lziBih>`d{%^X2$HnJGuVXUnn-sPvyk50sWK#fvwpXN32l7o*dMtB&@ z8Raf??*(EczE3kpkeZDwMtB%&SKMC%VkEv#GY6*(KC&3$VXV!M&WArdbJG0X8c?Iu z+oyRA!P42tVuXjW!TM$Qd3`uAzp3l_^9PSvt_I4#2Ny58=YyD2{4~$p(5V=cJK{Lz z`;T)Yf2s!5c&hw;HT=iK!ij;0e&6YWmzcn~o5$6Oq@QS>b>4a5U49I$;~4A$`$ z65zoBKj?%z!W+NDY0UtDEI#ym9Cn@YdW8e|#RskHu?&IF^K+c!e}6nmcQxnmew@3O zemV~4<2f>|P_V>H-mabKKS+*(mtVWUr~4>1XnwD^ws3P1^h)rKqux)-qOgI*U{IH3 zQIle+mdpCFEbFDQG5PpdYG+*+B=zj^5f_-#_AIoQvzhoAw_MHyUxR;0L-^SqdUjRS z#c)_xu0-M*T732beLUXx!TOxt^!&RM&e-;((DjuV2+~(tpHHBb zI={nb)eIZNlfGrWEf&=^JjD$@Bf&f4c)!o-K5b~7vF!8v+R0)xC*FinH~4b+2<3Q&F+<#lqU#?Y5ZSEauy-Z8Qgy AaR2}S diff --git a/uppsrc/plugin/bmp/Icon.cpp b/uppsrc/plugin/bmp/Icon.cpp index baec2b88e..d48648686 100644 --- a/uppsrc/plugin/bmp/Icon.cpp +++ b/uppsrc/plugin/bmp/Icon.cpp @@ -4,12 +4,12 @@ namespace Upp { #include "bmphdr.h" -Vector ReadIcon(String data) +Vector ReadIcon(String data, bool just_best) { + VectorMap > best; Vector out; const byte *in = data; int count = Peek16le(in + OFFSETOF(BMP_ICONDIR, idCount)); - out.SetCount(count); for(int i = 0; i < count; i++) { const byte *hdr = in + sizeof(BMP_ICONDIR) + i * sizeof(BMP_ICONDIRENTRY); dword offset = Peek32le(hdr + OFFSETOF(BMP_ICONDIRENTRY, dwImageOffset)); @@ -97,8 +97,22 @@ Vector ReadIcon(String data) while(--cx); } } - out[i] = buffer; + Image m = buffer; + if(just_best) { + int q = best.Find(m.GetSize()); + auto x = MakeTuple(bitcount, m); + if(q < 0) + best.Add(m.GetSize(), x); + else + if(bitcount > best[q].a) + best[q] = x; + } + else + out.Add(m); } + if(just_best) + for(auto x : best) + out.Add(x.b); return out; } diff --git a/uppsrc/plugin/bmp/bmp.h b/uppsrc/plugin/bmp/bmp.h index 7c4a84e31..b71ffd713 100644 --- a/uppsrc/plugin/bmp/bmp.h +++ b/uppsrc/plugin/bmp/bmp.h @@ -62,7 +62,7 @@ enum { WI_CURSOR = 0x10, }; -Vector ReadIcon(String data); +Vector ReadIcon(String data, bool just_best = false); String WriteIcon(const Vector& icons, int flags = WI_COLOR); }