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 cbfd06c67..263d620ac 100644 Binary files a/uppsrc/ide/icon.ico and b/uppsrc/ide/icon.ico differ 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); }