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
This commit is contained in:
cxl 2019-01-25 12:22:42 +00:00
parent dfc84c5874
commit f32f765331
5 changed files with 43 additions and 13 deletions

View file

@ -4,6 +4,7 @@
#include <CtrlLib/CtrlLib.h>
#include <Painter/Painter.h>
#include <RichEdit/RichEdit.h>
#include <plugin/bmp/bmp.h>
namespace Upp {

View file

@ -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<Image> 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++;
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

Before After
Before After

View file

@ -4,12 +4,12 @@ namespace Upp {
#include "bmphdr.h"
Vector<Image> ReadIcon(String data)
Vector<Image> ReadIcon(String data, bool just_best)
{
VectorMap<Size, Tuple2<int, Image> > best;
Vector<Image> 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<Image> 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;
}

View file

@ -62,7 +62,7 @@ enum {
WI_CURSOR = 0x10,
};
Vector<Image> ReadIcon(String data);
Vector<Image> ReadIcon(String data, bool just_best = false);
String WriteIcon(const Vector<Image>& icons, int flags = WI_COLOR);
}