mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-08-23 06:13:07 -06:00
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:
parent
dfc84c5874
commit
f32f765331
5 changed files with 43 additions and 13 deletions
|
|
@ -4,6 +4,7 @@
|
|||
#include <CtrlLib/CtrlLib.h>
|
||||
#include <Painter/Painter.h>
|
||||
#include <RichEdit/RichEdit.h>
|
||||
#include <plugin/bmp/bmp.h>
|
||||
|
||||
namespace Upp {
|
||||
|
||||
|
|
|
|||
|
|
@ -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 |
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue