QHD fixed

This commit is contained in:
Mirek Fidler 2026-04-04 13:50:56 +02:00
parent 9873e8ed4c
commit 563b33de49
26 changed files with 582 additions and 396 deletions

View file

@ -1,13 +1,13 @@
LAYOUT(MyAppLayout, 216, 140)
ITEM(Label, dv___0, SetLabel(t_("Name")).LeftPosZ(8, 68).TopPosZ(8, 21))
ITEM(EditString, name, LeftPosZ(80, 128).TopPosZ(8, 19))
ITEM(Label, dv___2, SetLabel(t_("Last Name")).LeftPosZ(8, 68).TopPosZ(32, 21))
ITEM(EditString, lastname, LeftPosZ(80, 128).TopPosZ(32, 19))
ITEM(Label, dv___4, SetLabel(t_("City")).LeftPosZ(8, 68).TopPosZ(56, 21))
ITEM(EditString, city, LeftPosZ(80, 128).TopPosZ(56, 19))
ITEM(Label, dv___6, SetLabel(t_("Street")).LeftPosZ(8, 68).TopPosZ(80, 21))
ITEM(EditString, street, LeftPosZ(80, 128).TopPosZ(80, 19))
ITEM(Button, ok, SetLabel(t_("OK")).HCenterPosZ(64, 0).BottomPosZ(8, 24))
ITEM(Button, cancel, SetLabel(t_("Cancel")).RightPosZ(8, 64).BottomPosZ(8, 24))
ITEM(Upp::Label, dv___0, SetLabel(t_("Name")).LeftPosZ(8, 68).TopPosZ(8, 21))
ITEM(Upp::EditString, name, LeftPosZ(80, 128).TopPosZ(8, 19))
ITEM(Upp::Label, dv___2, SetLabel(t_("Last Name")).LeftPosZ(8, 68).TopPosZ(32, 21))
ITEM(Upp::EditString, lastname, LeftPosZ(80, 128).TopPosZ(32, 19))
ITEM(Upp::Label, dv___4, SetLabel(t_("City")).LeftPosZ(8, 68).TopPosZ(56, 21))
ITEM(Upp::EditString, city, LeftPosZ(80, 128).TopPosZ(56, 19))
ITEM(Upp::Label, dv___6, SetLabel(t_("Street")).LeftPosZ(8, 68).TopPosZ(80, 21))
ITEM(Upp::EditString, street, LeftPosZ(80, 128).TopPosZ(80, 19))
ITEM(Upp::Button, ok, SetLabel(t_("OK")).HCenterPosZ(64, 0).BottomPosZ(8, 24))
ITEM(Upp::Button, cancel, SetLabel(t_("Cancel")).RightPosZ(8, 64).BottomPosZ(8, 24))
END_LAYOUT

View file

@ -110,12 +110,12 @@ close 232,17,35
int Ctrl::GetWin32TitleBarHeight(const TopWindow *tw)
{
return max(tw->custom_titlebar_cy, IsUHDMode() ? 60 : 31);
return max(tw->custom_titlebar_cy, DPI(31));
}
int Ctrl::GetWin32TitleBarButtonWidth()
{
return IsUHDMode() ? 94 : 47;
return DPI(47);
}
Rect Ctrl::GetTitleBarRect(const TopWindow *win) // TODO (image, cy)

View file

@ -473,10 +473,11 @@ struct ZoomIconMaker : ImageMaker {
ImagePainter w(sz);
w.Clear(RGBAZero());
w.Move(DPI(11), DPI(11)).Line(DPI(16), DPI(16)).Stroke(DPI(2), SBlack());
w.Circle(DPI(7), DPI(7), IsUHDMode() ? 12 : 6.5).Stroke(IsUHDMode() ? 3 : 1, SBlack());
int scale = GetDPIScale();
w.Circle(DPI(7), DPI(7), scale > DPI_100 ? scale * 3 : 6.5).Stroke(scale - 1, SBlack());
String txt = AsString(int(zoom * 100));
Image numbers = IsUHDMode() ? CtrlImg::Numbers2() : CtrlImg::Numbers1();
int gcx = IsUHDMode() ? 6 : 4;
Image numbers = scale >= DPI_200 ? CtrlImg::Numbers2() : CtrlImg::Numbers1();
int gcx = 3 + scale / 2;
Size tsz(txt.GetCount() * gcx, numbers.GetHeight());
int y = DPI(7) - tsz.cy / 2;
int x = DPI(7) - tsz.cx / 2;

View file

@ -129,7 +129,7 @@ void Font::SyncStdFont()
}
LLOG("SyncStdFont " << StdFontSize);
SyncUHDMode();
SyncDPIScale();
}
void (*whenSetStdFont)();

View file

@ -81,6 +81,7 @@ class ImageBuffer : NoCopy {
void InitAttrs();
friend class Image;
friend void iml_ReplaceAll(Image& tgt, const Image& src);
public:
void SetKind(int k) { kind = k; }
@ -179,7 +180,7 @@ private:
friend struct scImageMaker;
void SetAuxData(uint64 data);
friend void iml_ReplaceAll(Image& tgt, Image& src);
friend void iml_ReplaceAll(Image& tgt, const Image& src);
public:
Size GetSize() const { return data ? data->buffer.GetSize() : Size(0, 0); }
@ -274,13 +275,6 @@ Vector<ImageIml> UnpackImlDataUncompressed(const String& data);
Vector<ImageIml> UnpackImlData(const void *ptr, int len);
Vector<ImageIml> UnpackImlData(const String& d);
enum {
GUI_MODE_NORMAL = 0,
GUI_MODE_DARK = 1,
GUI_MODE_UHD = 2,
GUI_MODE_DARK_UHD = 3,
};
enum {
IML_IMAGE_FLAG_FIXED = 0x1,
IML_IMAGE_FLAG_FIXED_COLORS = 0x2,
@ -288,28 +282,31 @@ enum {
IML_IMAGE_FLAG_UHD = 0x8,
IML_IMAGE_FLAG_DARK = 0x10,
IML_IMAGE_FLAG_S3 = 0x20,
IML_IMAGE_FLAG_QHD = 0x40,
};
Image MakeImlImage(const String& id, Function<ImageIml (int, const String&)> GetRaw, dword global_flags);
Image MakeImlImage(const String& id, Event<int, ImageIml&, String&> GetRaw);
class Iml {
struct IImage : Moveable<IImage> {
std::atomic<bool> loaded;
Image image;
IImage() { loaded = false; }
IImage() { loaded = false; }
};
struct Data : Moveable<Data> {
const char *data;
int len, count;
};
Vector<Data> data[4]; // 0 normal, 1 HiDPI - HD, 2 DK - Dark, 3 HDK - HiDPI + dark
VectorMap<String, IImage> map;
Vector<Data> data;
const char **name;
dword global_flags = 0;
bool premultiply;
Index<String> ex_name[3]; // 0 HiDPI - HD, 1 DK - Dark, 2 HDK - HiDPI + dark
VectorMap<String, IImage> map;
Index<String> id;
int version = 0;
void Init(int n);
@ -322,15 +319,15 @@ public:
int Find(const String& id) const { return map.Find(id); }
void Set(int i, const Image& img);
ImageIml GetRaw(int mode, int i); // tries to get image for mode, can return Null
ImageIml GetRaw(int mode, const String& id); // tries to get image for mode by id, can return Null
ImageIml GetRaw(int i);
// these methods serve for .iml import
Iml(const char **name, int n);//Deprecated - legacy .iml
void AddData(const byte *data, int len, int count, int mode = 0);
void AddData(const byte *data, int len, int count);
void AddId(int mode1, const char *name);
void Premultiplied() { premultiply = false; }
void GlobalFlag(dword f) { global_flags |= f; }
void Version(int v) { version = v; }
static void ResetAll(); // clears all .iml caches
static void SkinAll(); // reskins all .iml caches

View file

@ -7,7 +7,7 @@ Image WithHotSpots(const Image& m, Point hotspot, Point hotspot2 = Point(0, 0));
Image WithHotSpots(const Image& m, int x1, int y1, int x2, int y2);
Image WithHotSpot(const Image& m, int x1, int y1);
void ScanOpaque(Image& m);
void ScanOpaque(Image& m);
void DstSrcOp(ImageBuffer& dest, Point p, const Image& src, const Rect& srect,
void (*op)(RGBA *t, const RGBA *s, int n), bool co = false);
@ -262,23 +262,41 @@ Image MinifyCached(const Image& img, int nx, int ny, bool co = false);
Image DownSample3x(const Image& src, bool co = false);
Image DownSample2x(const Image& src, bool co = false);
Image DPISmartRescale(const Image& src, Size sz);
Image DPISmartRescaleCached(const Image& src, Size sz);
Image Upscale2x(const Image& src);
Image Downscale2x(const Image& src);
Image Downscale6x(const Image& src);
void SetUHDMode(bool b = true);
bool IsUHDMode();
void SyncUHDMode();
enum {
DPI_100 = 2, // Normal resolution
DPI_150 = 3, // QHD
DPI_200 = 4, // UHD
DPI_300 = 6,
DPI_600 = 12, // Used for 'master' Image drawn without aliasing
};
// Image DPI(const Image& m);
Image DPI(const Image& img, int expected);
void SetDPIScale(int scale);
int GetDPIScale();
double GetDPIScaleRatio();
void SyncDPIScale();
inline int DPI(int a) { extern int DPIScaleGlobal_; return (DPIScaleGlobal_ * a) >> 1; }
inline double DPI(double a) { extern double DPIScaleGlobalF_; return DPIScaleGlobalF_ * a; }
inline int DPI(int a) { return IsUHDMode() ? 2 * a : a; }
inline double DPI(double a) { return IsUHDMode() ? 2 * a : a; }
inline Size DPI(Size sz) { return IsUHDMode() ? 2 * sz : sz; }
inline Size DPI(int cx, int cy) { return Size(DPI(cx), DPI(cy)); }
inline Size DPI(Size sz) { return DPI(sz.cx, sz.cy); }
int ImlFlagsToDPIScale(int imlflags);
int DPIScaleToImlFlags(int dpiscale);
inline int DPI2(int dpi200val, int dpi100val) {
int scale = GetDPIScale();
return (dpi200val - dpi100val) * (scale - DPI_100) / 2 + dpi100val;
}
inline Image DPI(const Image& a, const Image& b) { return IsUHDMode() ? b : a; }
struct RGBAV {
dword r, g, b, a;

View file

@ -41,10 +41,13 @@ Vector<ImageIml> UnpackImlData(const String& d)
return UnpackImlData(~d, d.GetLength());
}
void iml_ReplaceAll(Image& tgt, Image& src)
void iml_ReplaceAll(Image& tgt, const Image& src)
{ // this very special function replaces all unmodified instances of Image with new content
if(tgt.GetSize() == src.GetSize() && tgt.data) {
tgt.data->buffer = src.data->buffer;
Image h = src; // make sure src has refcount 1, basically 'clone'
ImageBuffer ib = h;
h = ib;
if(tgt.GetSize() == h.GetSize() && tgt.data && src.data) {
tgt.data->buffer = h.data->buffer;
tgt.data->NewSerial();
}
else
@ -72,15 +75,59 @@ void Iml::Skin()
}
}
void Iml::AddData(const byte *s, int len, int count)
{
Data& d = data.Add();
d.data = (const char *)s;
d.len = len;
d.count = count;
data.Shrink();
}
void Iml::AddId(int mode1, const char *name)
{
map.Add(name);
}
ImageIml Iml::GetRaw(int i)
{
for(const Data& d : data) {
if(i < d.count) {
ImageIml m = MakeValue(
[&] {
String key;
RawCat(key, d.data); // all is static
RawCat(key, i);
return key;
},
[&](Value& v) {
Vector<ImageIml>& m = CreateRawValue<Vector<ImageIml>>(v);
m = UnpackImlData(d.data, d.len);
int sz = 0;
for(ImageIml& img : m) {
sz += img.image.GetLength();
if(premultiply)
img.image = Premultiply(img.image);
if(version == 0) // cleanup some bits that are set for legacy reasons
img.flags &= 0x3f;
}
return sz;
}
).To<Vector<ImageIml>>()[i];
m.flags |= global_flags;
return m;
}
i -= d.count;
}
return ImageIml();
}
static StaticMutex sImlLock;
void Iml::Set(int i, const Image& img)
{ // TODO: MT
IImage& m = map[i];
Image h = img; // make sure h has refcount 1, basically 'clone'
ImageBuffer ib = h;
h = ib;
iml_ReplaceAll(m.image, h);
iml_ReplaceAll(m.image, img);
m.loaded = true;
}
@ -90,7 +137,13 @@ Image Iml::Get(int i)
if(!m.loaded) {
Mutex::Lock __(sImlLock);
if(!m.loaded) {
Image h = MakeImlImage(GetId(i), [&](int mode, const String& id) { return GetRaw(mode, id); }, global_flags);
Image h = MakeImlImage(GetId(i), [&](int i, ImageIml& m, String& id) {
id.Clear();
if(i < GetCount()) {
id = map.GetKey(i);
m = GetRaw(i);
}
});
iml_ReplaceAll(m.image, h);
m.loaded = true;
}
@ -98,89 +151,94 @@ Image Iml::Get(int i)
return m.image;
}
ImageIml Iml::GetRaw(int mode, int i)
int ImlFlagsToDPIScale(int imlflags) {
int scale = DPI_100;
if(imlflags & IML_IMAGE_FLAG_UHD)
scale = DPI_200;
if(imlflags & IML_IMAGE_FLAG_S3)
scale *= 3;
if(imlflags & IML_IMAGE_FLAG_QHD)
scale++;
return scale;
}
int DPIScaleToImlFlags(int dpiscale) {
return dpiscale == DPI_600 ? IML_IMAGE_FLAG_S3|IML_IMAGE_FLAG_UHD
: get_i(dpiscale, 0, 0,
0, // DPI_100
IML_IMAGE_FLAG_QHD, // DPI_150
IML_IMAGE_FLAG_UHD, // DPI_200
IML_IMAGE_FLAG_UHD|IML_IMAGE_FLAG_QHD, // 'DPI_250' - not used
IML_IMAGE_FLAG_S3 // DPI_300
);
}
Image MakeImlImage(const String& id, Event<int, ImageIml&, String&> GetRaw)
{
Mutex::Lock __(sImlLock);
if(data[mode].GetCount()) {
int ii = 0;
while(ii < data[mode].GetCount()) {
const Data& d = data[mode][ii];
if(i < d.count) {
static const char *cached_data[4];
static Vector<ImageIml> cached[4];
if(cached_data[mode] != d.data) { // cache single .iml
cached_data[mode] = d.data;
cached[mode] = UnpackImlData(d.data, d.len);
if(premultiply)
for(int i = 0; i < cached[mode].GetCount(); i++)
cached[mode][i].image = Premultiply(cached[mode][i].image);
}
return cached[mode][i];
int ii = 0;
ImageIml best;
ImageIml exact_scale;
int scale = GetDPIScale();
bool dark = IsDarkTheme();
int best_dark = 10; // minimize this
int best_scale = -1; // maximize this
for(;;) {
ImageIml im;
String iid;
GetRaw(ii++, im, iid);
if(IsNull(iid))
break;
int q = iid.Find("__");
if(q > 0)
iid.Trim(q);
if(iid == id) {
bool isdark = im.flags & IML_IMAGE_FLAG_DARK;
int iscale = ImlFlagsToDPIScale(im.flags);
if(isdark == dark && iscale == scale) // found perfect match
return im.image;
if(iscale == scale)
exact_scale = im;
int idark = !!isdark - dark;
if(CombineCompare(best_dark, idark)(iscale, best_scale) > 0) { // prioritize color, then find highest scale
best = im;
best_dark = idark;
best_scale = iscale;
}
i -= d.count;
ii++;
}
}
return ImageIml();
}
ImageIml Iml::GetRaw(int mode, const String& id)
{
ASSERT(mode >= 0 && mode < 4);
int ii = -1;
if(mode == 0)
ii = map.Find(id);
else
ii = ex_name[mode - 1].Find(id);
return ii >= 0 ? GetRaw(mode, ii) : ImageIml();
}
auto AdjustColor0 = [&](const Image& img, dword flags) { // flip light to dark if needed
if(dark && !(flags & (IML_IMAGE_FLAG_FIXED|IML_IMAGE_FLAG_FIXED_COLORS)))
return DarkTheme(img);
return img;
};
Image MakeImlImage(const String& id, Function<ImageIml(int, const String& id)> GetRaw, dword global_flags)
{
int mode = IsUHDMode() * GUI_MODE_UHD + IsDarkTheme() * GUI_MODE_DARK;
const static int mode_candidates[4][4] = {
{ GUI_MODE_NORMAL, GUI_MODE_UHD, -1 },
{ GUI_MODE_DARK, GUI_MODE_DARK_UHD, GUI_MODE_NORMAL, GUI_MODE_UHD },
{ GUI_MODE_UHD, GUI_MODE_NORMAL, -1 },
{ GUI_MODE_DARK_UHD, GUI_MODE_DARK, GUI_MODE_UHD, GUI_MODE_NORMAL }
if(best_dark && !IsNull(exact_scale.image)) { // dark color version not found, but we have exact scale
return AdjustColor0(exact_scale.image, exact_scale.flags);
}
auto AdjustColor = [&](const Image& m) { // flip light to dark if needed
return best_dark ? AdjustColor0(m, best.flags) : m;
};
ImageIml im;
Image original;
const int *candidates = mode_candidates[mode];
if(best.flags & (IML_IMAGE_FLAG_FIXED|IML_IMAGE_FLAG_FIXED_SIZE))
return AdjustColor(best.image);
for(int i = 0; i < 4 && candidates[i] >= 0; i++) {
int cmode = candidates[i];
auto Mode = [&](dword m, const char *s) { return cmode & m ? String(s) : String(); };
im = GetRaw(GUI_MODE_NORMAL, id + Mode(GUI_MODE_UHD, "__UHD") + Mode(GUI_MODE_DARK, "__DARK"));
if(IsNull(im.image))
im = GetRaw(cmode, id); // try alternative iml
if(!IsNull(im.image)) {
original = im.image;
if(im.flags & IML_IMAGE_FLAG_S3)
im.image = DownSample3x(im.image);
break;
}
if(best_scale == DPI_600) {
if(scale == DPI_100)
return AdjustColor(Downscale6x(best.image));
if(scale == DPI_150)
return AdjustColor(Downscale2x(DownSample2x(best.image)));
if(scale == DPI_200)
return AdjustColor(DownSample3x(best.image));
if(scale == DPI_300)
return AdjustColor(DownSample2x(best.image));
}
if(IsNull(im.image))
return Null;
if(!(mode & GUI_MODE_UHD) && (im.flags & IML_IMAGE_FLAG_UHD) && !((im.flags | global_flags) & (IML_IMAGE_FLAG_FIXED|IML_IMAGE_FLAG_FIXED_SIZE))) {
if(im.flags & IML_IMAGE_FLAG_S3)
im.image = Downscale6x(original);
else
im.image = Downscale2x(im.image);
}
if((mode & GUI_MODE_UHD) && !(im.flags & IML_IMAGE_FLAG_UHD) && !((im.flags | global_flags) & (IML_IMAGE_FLAG_FIXED|IML_IMAGE_FLAG_FIXED_SIZE)))
im.image = Upscale2x(im.image);
if((mode & GUI_MODE_DARK) && !(im.flags & IML_IMAGE_FLAG_DARK) && !((im.flags | global_flags) & (IML_IMAGE_FLAG_FIXED|IML_IMAGE_FLAG_FIXED_COLORS)))
im.image = DarkTheme(im.image);
ScanOpaque(im.image);
return im.image;
return DPISmartRescale(best.image, scale * best.image.GetSize() / best_scale);
}
Iml::Iml(const char **name, int n)
@ -190,20 +248,6 @@ Iml::Iml(const char **name, int n)
Init(n);
}
void Iml::AddData(const byte *s, int len, int count, int mode)
{
Data& d = data[mode].Add();
d.data = (const char *)s;
d.len = len;
d.count = count;
data[mode].Shrink();
}
void Iml::AddId(int mode1, const char *name)
{
ex_name[mode1].Add(name);
}
void Iml::ResetAll()
{
for(int i = 0; i < GetImlCount(); i++)

View file

@ -102,18 +102,50 @@ Image Upscale2x(const Image& src)
return Image(h);
}
Image Downscale2x(const Image& src)
Image DPIRescale(const Image& src, Size sz)
{
if(IsNull(src))
return src;
Size s2 = src.Get2ndSpot(); // see above...
Image m = RescaleFilter(src, src.GetSize() / 2, s2.cx > 0 || s2.cy > 0 ? FILTER_BILINEAR : FILTER_LANCZOS3);
Size s2 = src.Get2ndSpot();
Size sz0 = src.GetSize();
if(sz0 == sz)
return src;
// When 2nd spot is defined, it is likely Chameleon rescaling item (e.g. button)
// in that case, filtering by smarter rescale methods could lead to artifacts (stay BILINEAR)
Image m = RescaleFilter(src, sz, s2.cx > 0 || s2.cy > 0 ? FILTER_BILINEAR : FILTER_LANCZOS3);
ImageBuffer h(m);
h.SetHotSpot(s2 / 2);
h.Set2ndSpot(src.Get2ndSpot() / 2);
h.SetHotSpot(s2 * sz / sz0);
h.Set2ndSpot(src.Get2ndSpot() * sz / sz0);
return Image(h);
}
Image DPISmartRescale(const Image& src, Size sz)
{
Image m = src;
for(;;) {
Size isz = m.GetSize();
if(isz.cx * isz.cy == 0)
return Null;
if(isz.cx >= sz.cx && isz.cy >= sz.cy)
break;
m = Upscale2x(m);
}
return DPIRescale(m, sz);
}
Image DPISmartRescaleCached(const Image& src, Size sz)
{
return MakeImage(
[&] { StringBuffer s; RawCat(s, src.GetSerialId()); RawCat(s, sz); return (String)s; },
[&] { return DPISmartRescale(src, sz); }
);
}
Image Downscale2x(const Image& src)
{
return DPIRescale(src, src.GetSize() / 2);
}
Image Downscale6x(const Image& src)
{
if(IsNull(src))
@ -126,31 +158,34 @@ Image Downscale6x(const Image& src)
return Image(h);
}
static bool sUHDMode;
int DPIScaleGlobal_;
double DPIScaleGlobalF_;
void SetUHDMode(bool b)
void SetDPIScale(int scale)
{
Iml::ResetAll();
sUHDMode = b;
DPIScaleGlobal_ = scale;
DPIScaleGlobalF_ = 0.5 * scale;
}
bool IsUHDMode()
int GetDPIScale()
{
return sUHDMode;
return DPIScaleGlobal_;
}
void SyncUHDMode()
double GetDPIScaleRatio()
{
bool uhd = GetStdFontCy() > 24;
if(uhd != IsUHDMode())
SetUHDMode(uhd);
return DPIScaleGlobalF_;
}
Image DPI(const Image& img, int expected)
void SyncDPIScale()
{
if(img.GetSize().cy <= expected && IsUHDMode())
return AdjustImage(img, Upscale2x);
return img;
int fcy = GetStdFontCy();
int scale = clamp((fcy + 3) / 8, 2, 5);
if(scale == 5)
scale = DPI_300;
if(scale != GetDPIScale())
SetDPIScale(scale);
}
};

View file

@ -1,10 +1,12 @@
//#BLITZ_APPROVE
#define IMAGE_META(k, v)
#define IMAGE_VERSION(v)
#define IMAGE_SCAN(s)
#define IMAGE_PACKED(n, d)
#define PREMULTIPLIED
#define VERSION(x)
#define IMAGE_BEGIN_DATA
#define IMAGE_DATA(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,aa,ab,ac,ad,ae,af,b0,b1,b2,b3,b4,b5,b6,b7,b8,b9,ba,bb,bc,bd,be,bf)
#define IMAGE_END_DATA(n, c)
@ -50,6 +52,7 @@ public:
#undef IMAGE_SCAN
#undef IMAGE_PACKED
#undef IMAGE_META
#undef IMAGE_VERSION
#undef IMAGE_BEGIN_DATA
#undef IMAGE_END_DATA
@ -58,4 +61,8 @@ public:
#ifndef IMAGE_KEEP
#undef IMAGECLASS
#undef IMAGEFILE
#undef PREMULTIPLIED
#undef VERSION
#endif

View file

@ -1,8 +1,10 @@
//#BLITZ_APPROVE
#define VERSION(v)
#define PREMULTIPLIED
#define IMAGE_META(k, v)
#define PREMULTIPLIED
#define IMAGE_ID(n)
#define IMAGE_BEGIN_DATA
#define IMAGE_END_DATA(n, c)
@ -65,30 +67,6 @@ UPP::Iml& IMAGECLASS::Iml() {
#include IMAGEFILE
#ifdef IMAGEFILE_DARK
#undef IMAGE_ID
#undef IMAGE_END_DATA
#define IMAGE_ID(n) iml.AddId(0, #n);
#define IMAGE_END_DATA(n, c) }; iml.AddData(data, n, c, 1); }
#include IMAGEFILE_DARK
#endif
#ifdef IMAGEFILE_UHD
#undef IMAGE_ID
#undef IMAGE_END_DATA
#define IMAGE_ID(n) iml.AddId(1, #n);
#define IMAGE_END_DATA(n, c) }; iml.AddData(data, n, c, 2); }
#include IMAGEFILE_UHD
#endif
#ifdef IMAGEFILE_DARK_UHD
#undef IMAGE_ID
#undef IMAGE_END_DATA
#define IMAGE_ID(n) iml.AddId(2, #n);
#define IMAGE_END_DATA(n, c) }; iml.AddData(data, n, c, 3); }
#include IMAGEFILE_DARK_UHD
#endif
#undef IMAGE_BEGIN_DATA
#undef IMAGE_END_DATA
#undef IMAGE_DATA
@ -100,10 +78,13 @@ UPP::Iml& IMAGECLASS::Iml() {
#undef PREMULTIPLIED
#define PREMULTIPLIED iml.Premultiplied();
#undef VERSION
#define VERSION(v) iml.Version(v);
#include IMAGEFILE
#undef PREMULTIPLIED
#define PREMULTIPLIED
#undef VERSION
#define VERSION(v)
}
return iml;
}
@ -176,6 +157,9 @@ static COMBINE(IMAGECLASS, __Reg) COMBINE(IMAGECLASS, ___Reg);
#undef IMAGE_META
#undef PREMULTIPLIED
#undef VERSION
#ifdef IMAGEFILE_UHD
#undef IMAGEFILE_UHD
#endif

View file

@ -1,52 +1,34 @@
topic "Ultra High Definition Displays support";
[i448;a25;kKO9;2 $$1,0#37138531426314131252341829483380:class]
[l288;2 $$2,2#27521748481378242620020725143825:desc]
[0 $$3,0#96390100711032703541132217272105:end]
[H6;0 $$4,0#05600065144404261032431302351956:begin]
[i448;a25;kKO9;2 $$5,0#37138531426314131252341829483370:item]
[l288;a4;*@5;1 $$6,6#70004532496200323422659154056402:requirement]
[l288;i1121;b17;O9;~~~.1408;2 $$7,0#10431211400427159095818037425705:param]
[i448;b42;O9;2 $$8,8#61672508125594000341940100500538:tparam]
[b42;2 $$9,9#13035079074754324216151401829390:normal]
[2 $$0,0#00000000000000000000000000000000:Default]
[{_}
[ {{10000@(113.42.0) [s0;%% [*@7;4 Ultra High Definition Displays support]]}}&]
[s0;i448;a25;kKO9;@(0.0.255) &]
[ {{10000F(128)G(128)@1 [s0;%% [* Function List]]}}&]
[s0;%% &]
[s5;:Upp`:`:SetUHDMode`(bool`): [@(0.0.255) void]_[* SetUHDMode]([@(0.0.255) bool]_[*@3 b])&]
[s2;%% Sets the UHD mode.&]
[s3;%% &]
[s4; &]
[s5;:Upp`:`:IsUHDMode`(`): [@(0.0.255) bool]_[* IsUHDMode]()&]
[s2;%% Returns true if UHD mode is active.&]
[s3; &]
[s4; &]
[s5;:Upp`:`:SyncUHDMode`(`): [@(0.0.255) void]_[* SyncUHDMode]()&]
[s2;%% Sets the UHD mode if current GUI font is bigger than 27 pixels
(in windows, that corresponds to text size bigger than approximately
160%).&]
[s3; &]
[s4; &]
[s5;:Upp`:`:DPI`(const Upp`:`:Image`&`): [_^Upp`:`:Image^ Image]_[* DPI]([@(0.0.255) const]_
[_^Upp`:`:Image^ Image][@(0.0.255) `&]_[*@3 img])&]
[s2;%% Eventually upscales or downscales [%-*@3 img] based on its UHD
flag and current mode. Standard images are upscaled 2x in UHD
mode, UHD images are downscaled 2x in standard mode.&]
[s3;%% &]
[s4; &]
[s5;:Upp`:`:DPI`(const Upp`:`:Image`&`,int`): [_^Upp`:`:Image^ Image]_[* DPI]([@(0.0.255) c
onst]_[_^Upp`:`:Image^ Image][@(0.0.255) `&]_[*@3 img], [@(0.0.255) int]_[*@3 expected])&]
[s2;%% Upscales [%-*@3 img] 2x if its height is less than or equal
to [%-*@3 expected] and UHD mode is active.&]
[s3;%% &]
[s4; &]
[s5;:Upp`:`:DPI`(int`): [@(0.0.255) int]_[* DPI]([@(0.0.255) int]_[*@3 a])&]
[s2;%% Returns 2 `* [%-*@3 a] if UHD is active and [%-*@3 a] otherwise.&]
[s3;%% &]
[s4; &]
[s5;:Upp`:`:DPI`(Upp`:`:Size`): [_^Upp`:`:Size^ Size]_[* DPI]([_^Upp`:`:Size^ Size]_[*@3 sz])
&]
[s2;%% Returns 2 `* [%-*@3 sz] if UHD is active and [%-*@3 sz] otherwise.&]
[s3;%% &]
topic "GUI Scaling";
[i448;a25;kKO9;2 $$1,0#37138531426314131252341829483380:class]
[l288;2 $$2,2#27521748481378242620020725143825:desc]
[0 $$3,0#96390100711032703541132217272105:end]
[H6;0 $$4,0#05600065144404261032431302351956:begin]
[i448;a25;kKO9;2 $$5,0#37138531426314131252341829483370:item]
[l288;a4;*@5;1 $$6,6#70004532496200323422659154056402:requirement]
[l288;i1121;b17;O9;~~~.1408;2 $$7,0#10431211400427159095818037425705:param]
[i448;b42;O9;2 $$8,8#61672508125594000341940100500538:tparam]
[b42;2 $$9,9#13035079074754324216151401829390:normal]
[2 $$0,0#00000000000000000000000000000000:Default]
[{_}
[ {{10000@(113.42.0) [s0;%% [*@7;4 GUI Scaling]]}}&]
[s0;i448;a25;kKO9;@(0.0.255) &]
[ {{10000F(128)G(128)@1 [s0;%% [* Function List]]}}&]
[s0;%% &]
[s3; &]
[s4; &]
[s5;:Upp`:`:DPI`(const Upp`:`:Image`&`): [_^Upp`:`:Image^ Image]_[* DPI]([@(0.0.255) const]_
[_^Upp`:`:Image^ Image][@(0.0.255) `&]_[*@3 img])&]
[s2;%% Eventually upscales or downscales [%-*@3 img] based on its UHD
flag and current mode. Standard images are upscaled 2x in UHD
mode, UHD images are downscaled 2x in standard mode.&]
[s3;%% &]
[s4; &]
[s5;:Upp`:`:DPI`(int`): [@(0.0.255) int]_[* DPI]([@(0.0.255) int]_[*@3 a])&]
[s2;%% Returns 2 `* [%-*@3 a] if UHD is active and [%-*@3 a] otherwise.&]
[s3;%% &]
[s4; &]
[s5;:Upp`:`:DPI`(Upp`:`:Size`): [_^Upp`:`:Size^ Size]_[* DPI]([_^Upp`:`:Size^ Size]_[*@3 sz])
&]
[s2;%% Returns 2 `* [%-*@3 sz] if UHD is active and [%-*@3 sz] otherwise.&]
[s3;%% &]
[s0;%% ]]

View file

@ -0,0 +1,6 @@
TITLE("GUI Scaling")
COMPRESSED
120,156,141,82,239,79,219,48,16,253,87,44,21,80,139,186,234,238,108,199,78,242,165,31,24,63,180,73,155,134,248,20,5,106,90,211,69,107,83,150,164,99,3,193,223,190,115,72,71,209,96,172,138,98,247,238,222,243,123,207,201,10,165,108,234,72,167,223,62,124,138,83,18,59,59,56,132,158,52,40,173,150,168,40,226,23,74,36,77,82,161,165,88,89,41,45,36,211,133,171,235,60,91,144,181,45,136,134,212,35,163,9,141,178,202,162,52,150,24,75,0,4,134,52,42,105,73,39,51,95,79,243,12,120,92,242,25,113,36,99,64,0,131,8,146,12,72,173,16,37,49,5,25,66,208,137,47,103,121,118,28,165,1,160,24,0,58,2,128,136,217,148,2,102,15,48,37,81,2,73,141,177,142,146,75,63,47,202,60,251,219,146,126,211,146,129,164,104,252,178,115,228,84,186,63,214,41,50,52,26,70,61,195,199,42,205,135,197,193,145,100,24,81,164,99,212,138,37,41,160,164,242,223,215,69,229,151,190,108,58,134,2,145,48,189,68,147,178,132,135,135,135,17,42,120,76,
202,176,22,4,214,77,200,53,246,97,80,199,16,107,139,22,164,81,164,13,91,191,118,149,91,118,78,46,21,165,157,15,59,180,189,8,35,78,20,44,235,215,49,19,0,155,224,149,131,212,252,72,155,52,29,56,224,2,40,30,198,61,14,73,106,48,49,24,101,180,98,39,132,17,114,144,16,252,243,53,36,229,170,90,186,69,158,5,0,132,172,223,248,37,7,254,202,173,23,108,247,238,226,94,100,226,238,14,67,121,220,231,43,28,41,26,193,64,100,53,164,187,187,34,219,31,155,84,137,163,179,19,113,58,117,139,162,156,231,249,253,253,94,30,218,207,111,106,220,135,17,140,216,214,64,112,123,67,121,216,71,178,131,163,246,61,198,39,86,113,184,46,167,77,177,42,197,199,162,110,158,56,185,25,54,50,109,23,245,184,232,52,57,187,190,158,36,147,228,224,243,201,164,63,93,149,117,35,186,202,201,210,205,253,100,111,50,72,68,118,113,190,93,60,23,237,146,95,240,105,140,203,251,217,150,196,150,131,91,47,67,182,39,39,123,129,97,44,69,177,156,231,131,32,135,130,
202,247,63,248,115,89,187,197,226,151,88,95,215,28,141,175,197,170,18,179,213,77,217,253,203,118,223,109,96,226,210,213,126,38,216,109,209,212,226,236,248,64,92,45,220,92,184,114,38,166,235,170,98,38,177,92,205,252,72,156,54,92,115,213,140,81,172,163,22,174,242,27,250,153,160,159,162,40,91,116,24,30,182,187,173,185,63,71,111,38,235,13,89,203,253,24,107,151,239,203,193,22,101,211,230,184,229,158,75,47,7,216,53,216,160,219,74,229,139,111,214,85,89,11,18,147,253,77,0,46,23,197,213,163,88,22,202,151,254,195,183,206,159,218,171,230,171,175,110,138,250,191,68,118,251,211,226,214,63,191,244,80,57,23,225,189,165,248,149,46,159,91,223,190,161,155,7,254,41,60,244,95,81,222,126,199,121,254,27,86,89,138,21,

View file

@ -0,0 +1,4 @@
TOPIC("DPI_en-us")
#include "DPI_en-us.tppi"
END_TOPIC

View file

@ -135,8 +135,10 @@ Size SplashCtrl::MakeLogo(Ctrl& parent, Array<Ctrl>& ctrl, bool splash)
#endif
if(items.GetCount())
h << classes.GetCount() << " classes, " << items.GetCount() << " items\n";
if(IsUHDMode())
h << "UHD ";
int scale = GetDPIScale();
h << decode(scale, DPI_150, "QHD ", DPI_200, "UHD ", DPI_300, "XHD ",
AsString(50 * scale) + "% ");
#ifdef GUI_GTK
if(Ctrl::IsXWayland())

View file

@ -1,20 +1,20 @@
LAYOUT(ImageLayout, 168, 252)
LAYOUT(ImageLayout, 168, 328)
ITEM(Upp::Label, dv___0, SetLabel(t_("Name")).LeftPosZ(8, 40).TopPosZ(8, 19))
ITEM(Upp::EditString, name, LeftPosZ(52, 108).TopPosZ(8, 19))
ITEM(Upp::Label, dv___2, SetLabel(t_("Size")).LeftPosZ(8, 40).TopPosZ(32, 19))
ITEM(Upp::EditIntSpin, cx, Min(1).Max(8192).LeftPosZ(52, 44).TopPosZ(32, 19))
ITEM(Upp::Label, dv___4, SetLabel(t_("x")).LeftPosZ(100, 12).TopPosZ(32, 16))
ITEM(Upp::EditIntSpin, cy, Min(1).Max(8192).LeftPosZ(116, 44).TopPosZ(32, 19))
ITEM(Upp::Option, fixed, SetLabel(t_("Fixed")).LeftPosZ(8, 156).TopPosZ(56, 16))
ITEM(Upp::Option, fixed_colors, SetLabel(t_("Fixed colors")).LeftPosZ(12, 156).TopPosZ(72, 16))
ITEM(Upp::Option, fixed_size, SetLabel(t_("Fixed size")).LeftPosZ(12, 156).TopPosZ(88, 16))
ITEM(Upp::Option, uhd, SetLabel(t_("UHD variant")).LeftPosZ(8, 156).TopPosZ(112, 16))
ITEM(Upp::Option, dark, SetLabel(t_("Dark variant")).LeftPosZ(8, 156).TopPosZ(128, 16))
ITEM(Upp::Option, s3, SetLabel(t_("Supersampled 3x")).LeftPosZ(8, 156).TopPosZ(152, 16))
ITEM(Upp::Option, exp, SetLabel(t_("Export as icon.ico and .png")).LeftPosZ(8, 160).TopPosZ(176, 16))
ITEM(Upp::Button, ok, SetLabel(t_("OK")).LeftPosZ(28, 64).TopPosZ(220, 24))
ITEM(Upp::Button, cancel, SetLabel(t_("Cancel")).LeftPosZ(96, 64).TopPosZ(220, 24))
ITEM(Upp::Label, estimated_size, SetAlign(Upp::ALIGN_RIGHT).LeftPosZ(8, 156).TopPosZ(196, 19))
ITEM(Upp::Option, fixed, SetLabel(t_("Fixed")).LeftPosZ(8, 156).TopPosZ(60, 16))
ITEM(Upp::Option, fixed_colors, SetLabel(t_("Fixed colors")).LeftPosZ(12, 156).TopPosZ(76, 16))
ITEM(Upp::Option, fixed_size, SetLabel(t_("Fixed size")).LeftPosZ(12, 156).TopPosZ(92, 16))
ITEM(Upp::Option, dark, SetLabel(t_("Dark variant")).LeftPosZ(8, 156).TopPosZ(228, 16))
ITEM(Upp::Option, exp, SetLabel(t_("Export as icon.ico and .png")).LeftPosZ(8, 160).TopPosZ(248, 16))
ITEM(Upp::Button, ok, SetLabel(t_("OK")).LeftPosZ(28, 64).TopPosZ(296, 24))
ITEM(Upp::Button, cancel, SetLabel(t_("Cancel")).LeftPosZ(96, 64).TopPosZ(296, 24))
ITEM(Upp::Label, estimated_size, SetAlign(Upp::ALIGN_RIGHT).LeftPosZ(8, 156).TopPosZ(272, 19))
ITEM(Upp::LabelBox, dv___14, SetLabel(t_("Target resolution")).LeftPosZ(8, 152).TopPosZ(112, 108))
ITEM(Upp::Switch, scale, SetLabel(t_("600% (master)\n100% HD\n150% QHD\n200% UHD\n300% XHD")).LeftPosZ(16, 140).TopPosZ(132, 84))
END_LAYOUT
LAYOUT(ImageSizeLayout, 168, 68)

View file

@ -46,9 +46,8 @@ void AlphaImageInfo::Serialize(Stream& stream)
stream % size % hotspot % encoding;
}
void ScanIML(CParser& parser, Array<ImlImage>& out_images,
VectorMap<String, String>& out_settings)
{
void ScanIML(CParser& parser, Array<ImlImage>& out_images, VectorMap<String, String>& out_settings)
{ // This is for backward compatibility with the very old iml format
String name, bid;
bool exp = false;
while(!parser.IsEof())
@ -189,6 +188,12 @@ bool LoadIml(const String& data, Array<ImlImage>& img, int& format)
format = 0;
try {
bool premultiply = !p.Id("PREMULTIPLIED");
int version = 0;
if(p.Id("VERSION")) {
p.Char('(');
version = p.ReadNumber();
p.Char(')');
}
Vector<String> name;
Vector<bool> exp;
while(p.Id("IMAGE_ID")) {
@ -242,10 +247,19 @@ bool LoadIml(const String& data, Array<ImlImage>& img, int& format)
for(int i = 0; i < count; i++) {
ImlImage& c = img.Add();
(ImageIml &)c = m[i];
if(version == 0)
c.flags &= IML_IMAGE_FLAG_QHD;
c.name = name[ii];
c.exp = exp[ii++];
c.name.TrimEnd("__DARK");
c.name.TrimEnd("__UHD");
c.name.TrimEnd("__100");
c.name.TrimEnd("__150");
c.name.TrimEnd("__200");
c.name.TrimEnd("__250");
c.name.TrimEnd("__300");
c.name.TrimEnd("__350");
c.name.TrimEnd("__600");
if(premultiply)
c.image = Premultiply(c.image);
}
@ -272,16 +286,16 @@ bool LoadIml(const String& data, Array<ImlImage>& img, int& format)
String SaveIml(const Array<ImlImage>& iml, int format, const String& eol) {
StringStream out;
out << "PREMULTIPLIED" << eol;
Index<String> names;
out << "VERSION(20260403)" << eol;
Index<String> saved_names;
for(int i = 0; i < iml.GetCount(); i++) {
const ImlImage& c = iml[i];
names.FindAdd(c.name);
out << "IMAGE_ID(" << c.name;
if((c.flags & (IML_IMAGE_FLAG_UHD|IML_IMAGE_FLAG_DARK)) == 0)
int scale = ImlFlagsToDPIScale(c.flags);
if(saved_names.Find(c.name) < 0)
saved_names.FindAdd(c.name);
if(c.flags & IML_IMAGE_FLAG_UHD)
out << "__UHD";
else
out << "__" << AsString(scale * 50);
if(c.flags & IML_IMAGE_FLAG_DARK)
out << "__DARK";
out << ")";
@ -290,10 +304,6 @@ String SaveIml(const Array<ImlImage>& iml, int format, const String& eol) {
out << eol;
}
for(String id : names) // allow UHD versions to be downscaled
if(saved_names.Find(id) < 0)
out << "IMAGE_ID(" << id << ")" << eol;
int ii = 0;
while(ii < iml.GetCount()) {
int bl = 0;

View file

@ -13,12 +13,10 @@ String IconDes::FormatImageName(const Slot& c)
if(c.flags & IML_IMAGE_FLAG_FIXED_SIZE)
r << " Sz";
}
if(c.flags & IML_IMAGE_FLAG_UHD)
r << " HD";
if(c.flags & IML_IMAGE_FLAG_DARK)
r << " Dk";
if(c.flags & IML_IMAGE_FLAG_S3)
r << " S3";
int scale = ImlFlagsToDPIScale(c.flags);
r << decode(scale, DPI_100, " 100%", DPI_150, " 150%", DPI_200, " 200%", DPI_300, " 300%", "");
if(c.exp)
r << " X";
return r;
@ -84,11 +82,11 @@ void IconDes::PrepareImageDlg(WithImageLayout<TopWindow>& dlg)
dlg.fixed <<= !!(flags & IML_IMAGE_FLAG_FIXED);
dlg.fixed_colors <<= !!(flags & IML_IMAGE_FLAG_FIXED_COLORS);
dlg.fixed_size <<= !!(flags & IML_IMAGE_FLAG_FIXED_SIZE);
dlg.uhd <<= !!(flags & IML_IMAGE_FLAG_UHD);
dlg.dark <<= !!(flags & IML_IMAGE_FLAG_DARK);
dlg.s3 <<= !!(flags & IML_IMAGE_FLAG_S3);
int scale = ImlFlagsToDPIScale(flags);
dlg.scale = decode(scale, DPI_100, 1, DPI_150, 2, DPI_200, 3, DPI_300, 4, 0);
for(Ctrl& q : dlg)
if(dynamic_cast<Option *>(&q))
@ -113,12 +111,9 @@ dword IconDes::GetFlags(WithImageLayout<TopWindow>& dlg)
flags |= IML_IMAGE_FLAG_FIXED_COLORS;
if(dlg.fixed_size)
flags |= IML_IMAGE_FLAG_FIXED_SIZE;
if(dlg.uhd)
flags |= IML_IMAGE_FLAG_UHD;
if(dlg.dark)
flags |= IML_IMAGE_FLAG_DARK;
if(dlg.s3)
flags |= IML_IMAGE_FLAG_S3;
flags |= DPIScaleToImlFlags(get_i((int)~dlg.scale, DPI_600, DPI_100, DPI_150, DPI_200, DPI_300));
return flags;
}

View file

@ -29,7 +29,7 @@ void IconShow::Paint(Draw& w)
if(flags & IML_IMAGE_FLAG_UHD) {
isz.cx += isz.cx + gap;
isz.cy += (isz.cy + 1) / 2 + gap;
if(IsUHDMode())
if(GetDPIScale() >= DPI_200)
isz.cy += msz.cy + gap;
}
else {
@ -53,7 +53,7 @@ void IconShow::Paint(Draw& w)
if(flags & IML_IMAGE_FLAG_UHD) {
s2 = Downscale2x(image);
s2dk = Downscale2x(DarkTheme(image));
if(IsUHDMode()) {
if(GetDPIScale() >= DPI_200) {
s22 = Magnify(s2, 2, 2, true);
s2dk2 = Magnify(s2dk, 2, 2, true);
}
@ -81,7 +81,7 @@ void IconShow::Paint(Draw& w)
pos.y += msz.cy + gap;
w.DrawImage(pos.x, pos.y, s2);
w.DrawImage(x2, pos.y, s2dk);
if((flags & IML_IMAGE_FLAG_UHD) && IsUHDMode()) {
if((flags & IML_IMAGE_FLAG_UHD) && GetDPIScale() >= DPI_200) {
pos.y += (msz.cy + 1) / 2 + gap;
w.DrawImage(pos.x, pos.y, s22);
w.DrawImage(x2, pos.y, s2dk2);

View file

@ -91,9 +91,13 @@ void InsertImageDlg::Load()
id.TrimEnd("__DARK");
id.TrimEnd("__UHD");
if(map.Find(id) < 0) {
Image m = MakeImlImage(id, [&](int mode, const String& id) {
return mode ? ImlImage() : img.Get(id, ImlImage());
}, 0);
Image m = MakeImlImage(id, [&](int ii, ImageIml& m, String& id) {
id.Clear();
if(ii < img.GetCount()) {
id = img.GetKey(ii);
m = img[ii];
}
});
Size isz = m.GetSize();
if(max(isz.cx, isz.cy) > DPI(32))
m = Rescale(m, GetFitSize(isz, DPI(32), DPI(32)));

View file

@ -82,10 +82,10 @@ WebSearchTab::WebSearchTab()
{
list.AddColumn("Name", 5);
list.AddColumn("URI", 5);
if(IsUHDMode())
if(GetDPIScale() >= DPI_200)
list.AddIndex();
list.AddColumn("Icon").SetDisplay(Single<IconDisplay>());
if(!IsUHDMode())
if(GetDPIScale() < DPI_200)
list.AddIndex();
list.Moving().RowName("search engine").Removing();
list.WhenLeftDouble = [=] { Edit(); };
@ -243,9 +243,9 @@ void Ide::OnlineSearchMenu(Bar& menu, const String& what, bool accel)
Image& m = search_icon.At(i);
if(!b) {
b = true;
m = StreamRaster::LoadStringAny(Decode64(search_engines[i][IsUHDMode() ? "Icon32" : "Icon16"]));
m = StreamRaster::LoadStringAny(Decode64(search_engines[i][GetDPIScale() == DPI_100 ? "Icon16" : "Icon32"]));
}
return m;
return DPISmartRescaleCached(m, DPI(16, 16));
};
String name, uri;

View file

@ -748,7 +748,7 @@ struct PackageDisplay : Display {
if(IsNull(icon))
icon = IdeImg::Package();
else
icon = DPI(icon, 16);
icon = DPISmartRescaleCached(icon, DPI(16, 16));
w.DrawRect(r, paper);
w.DrawImage(r.left, r.top + (r.Height() - icon.GetHeight()) / 2, icon);
w.DrawText(r.left + DPI(20), r.top + (r.Height() - Draw::GetStdFontCy()) / 2, txt, fnt, ink);
@ -808,7 +808,7 @@ void SelectPackageDlg::SyncList(const String& find)
icon = pkg.upphub ? IdeImg::HubPackage() : IdeImg::Package();
}
nest_list.Add(pkg.nest);
clist.Add(pkg.package, DPI(icon, 16));
clist.Add(pkg.package, DPISmartRescaleCached(icon, DPI(16, 16)));
alist.Add(pkg.package, GetFileName(pkg.nest), pkg.description, icon);
alist.SetDisplay(alist.GetCount() - 1, 0, pkg.main ? bpd : pd);
}
@ -940,7 +940,7 @@ void SelectPackageDlg::Load(const String& find)
if(d.ispackage) {
String icon_path;
if(IsUHDMode())
if(GetDPIScale() >= DPI_200)
icon_path = AppendFileName(path, "icon32x32.png");
if(IsNull(icon_path) || !FileExists(icon_path))
icon_path = AppendFileName(path, "icon16x16.png");

View file

@ -591,7 +591,7 @@ void Ide::MakeIcon() {
int fh = 112;
Size sz(0, 0);
Font font;
while(fh > (IsUHDMode() ? 64 : 80)) {
while(fh > DPI2(64, 80)) {
font = StdFont(fh);
sz = GetTextSize(mp, font) + 8 * Size(4, 2);
if(sz.cx <= isz.cx)
@ -632,11 +632,17 @@ void Ide::SetIcon()
state_icon = new_state_icon;
MakeIcon();
#ifdef PLATFORM_WIN32
auto DoIcon = [&](const Image& shd, const Image& uhd) {
if(GetDPIScale() == DPI_100)
Icon(shd);
else
Icon(DPISmartRescaleCached(uhd, DPI(16, 16)));
};
switch(state_icon) {
case 1: Icon(DPI(IdeImg::IconDebugging(), IdeImg::IconDebuggingLarge())); break;
case 2: Icon(DPI(IdeImg::IconRunning(), IdeImg::IconRunningLarge())); break;
case 3: Icon(DPI(IdeImg::IconBuilding(), IdeImg::IconBuildingLarge())); break;
default: Icon(DPI(IdeImg::Icon(), IdeImg::PackageLarge()));
case 1: DoIcon(IdeImg::IconDebugging(), IdeImg::IconDebuggingLarge()); break;
case 2: DoIcon(IdeImg::IconRunning(), IdeImg::IconRunningLarge()); break;
case 3: DoIcon(IdeImg::IconBuilding(), IdeImg::IconBuildingLarge()); break;
default: DoIcon(IdeImg::Icon(), IdeImg::PackageLarge());
}
#else
switch(state_icon) {

View file

@ -3564,115 +3564,115 @@ IMAGE_DATA(182,198,66,129,25,124,107,255,121,211,96,6,117,253,231,239,191,68,247
IMAGE_END_DATA(2688, 7)
IMAGE_BEGIN_DATA
IMAGE_DATA(120,156,237,154,9,84,85,199,25,199,39,166,89,76,114,82,202,57,245,52,66,226,146,164,169,54,213,36,45,167,106,211)
IMAGE_DATA(152,165,146,196,156,36,71,13,213,108,152,189,198,5,131,96,140,17,23,192,39,251,99,127,172,178,139,44,2,17,84,100)
IMAGE_DATA(17,217,4,89,4,65,112,137,128,138,8,8,138,40,32,32,112,191,206,55,143,161,247,189,188,157,37,182,205,156,243,63)
IMAGE_DATA(247,222,185,247,155,223,55,223,124,115,239,204,131,73,70,196,136,104,42,102,102,100,151,167,39,105,138,136,32,2,10,207)
IMAGE_DATA(177,78,163,209,112,185,231,30,50,37,50,146,220,1,32,32,22,214,209,123,83,213,241,156,157,201,133,176,48,50,20,21)
IMAGE_DATA(69,96,255,126,2,167,79,19,24,26,34,48,56,72,224,212,41,121,29,222,195,103,240,89,177,63,225,225,164,79,204,186)
IMAGE_DATA(120,145,192,190,125,4,170,170,228,74,76,148,215,137,159,65,27,180,125,245,85,18,158,156,76,160,182,86,206,67,21,23)
IMAGE_DATA(19,144,72,166,128,167,167,189,32,147,249,10,219,182,61,47,96,29,250,50,48,64,160,186,154,0,218,188,242,10,137,141)
IMAGE_DATA(141,37,3,103,207,18,56,113,130,64,69,133,156,23,28,124,15,200,100,118,194,165,75,151,232,179,213,244,252,53,129,251)
IMAGE_DATA(83,94,78,32,47,143,64,78,14,1,127,127,50,32,147,145,206,174,46,2,87,175,18,168,175,39,208,208,64,192,199,199)
IMAGE_DATA(8,14,30,60,8,205,205,205,224,229,101,47,56,59,255,67,216,190,253,69,193,197,229,89,33,43,139,0,170,178,146,128)
IMAGE_DATA(147,19,233,228,246,55,111,18,232,232,32,112,233,18,1,63,63,35,72,77,77,165,49,60,13,206,206,171,169,157,131,144)
IMAGE_DATA(155,155,11,187,118,73,232,145,0,10,125,69,123,234,3,179,239,236,36,112,237,26,129,214,86,2,110,110,43,132,178,178)
IMAGE_DATA(50,230,123,73,73,9,59,22,21,21,193,246,237,86,66,65,129,220,190,172,140,208,246,72,39,29,143,254,158,30,2,183)
IMAGE_DATA(110,17,144,133,45,16,92,247,86,9,209,41,133,52,158,181,212,207,44,160,1,130,136,136,8,216,186,245,107,234,135,49)
IMAGE_DATA(28,57,34,239,123,73,9,1,119,119,210,183,98,5,201,194,235,192,240,185,32,217,219,32,252,80,220,14,118,145,245,224)
IMAGE_DATA(191,39,27,236,237,23,50,27,169,244,81,72,73,145,247,27,185,200,167,113,135,247,222,35,121,116,8,239,127,102,238,156)
IMAGE_DATA(196,77,33,167,168,237,53,56,88,122,29,162,115,174,194,39,110,149,2,230,16,143,23,218,225,24,98,46,108,216,64,46)
IMAGE_DATA(78,157,74,214,81,219,135,48,7,214,249,86,246,38,21,182,67,234,241,107,16,159,215,70,249,13,96,239,245,178,128,177)
IMAGE_DATA(192,241,194,177,77,75,99,241,234,122,246,89,226,65,243,216,68,156,191,31,236,200,189,17,122,184,25,246,28,189,10,182)
IMAGE_DATA(33,117,240,194,194,121,167,2,3,137,128,118,216,95,154,251,64,243,108,223,125,247,145,231,85,229,255,195,70,83,63,124)
IMAGE_DATA(221,38,187,243,21,235,35,93,198,51,23,56,97,221,67,15,17,243,165,75,73,206,242,229,164,240,145,71,200,219,186,204)
IMAGE_DATA(61,67,202,226,233,100,250,120,181,61,97,101,206,156,223,228,136,53,81,220,41,83,30,180,178,180,124,10,204,205,77,104)
IMAGE_DATA(66,254,158,9,207,177,14,239,141,39,27,251,137,28,169,244,113,58,241,103,41,8,235,240,222,120,196,130,115,147,146,140)
IMAGE_DATA(233,75,210,4,28,28,158,134,210,210,103,70,216,120,142,117,120,15,159,25,35,63,172,104,27,29,216,22,138,191,168,81)
IMAGE_DATA(156,33,22,214,137,159,225,245,216,6,182,165,15,119,209,162,169,140,139,125,194,241,197,35,94,99,255,196,12,85,194,103)
IMAGE_DATA(84,217,98,155,154,252,192,220,17,115,149,199,23,133,245,202,253,84,142,139,38,91,238,135,56,79,57,23,253,174,173,157)
IMAGE_DATA(204,132,207,161,239,124,140,241,136,215,88,143,247,213,241,117,177,69,33,139,251,193,115,75,220,46,158,43,143,49,94,107)
IMAGE_DATA(98,235,99,203,253,228,239,142,200,72,99,250,161,51,1,30,3,229,152,106,226,112,169,27,15,101,27,100,108,218,100,66)
IMAGE_DATA(63,242,198,10,252,166,38,2,249,249,147,153,31,154,198,152,251,206,227,172,107,126,98,155,200,141,143,159,76,57,68,37)
IMAGE_DATA(159,11,175,85,197,130,207,43,241,220,215,150,159,188,207,200,67,46,151,38,190,56,22,202,125,90,181,234,79,148,99,35)
IMAGE_DATA(4,4,248,179,133,154,166,252,228,177,230,125,214,135,47,246,131,183,155,152,248,56,4,4,72,133,166,166,38,218,223,14)
IMAGE_DATA(186,200,147,169,204,49,62,70,170,184,250,242,185,48,22,14,14,214,66,99,99,35,180,180,180,64,70,70,6,248,250,250)
IMAGE_DATA(170,124,255,96,159,213,113,13,229,163,252,253,125,88,223,43,43,43,169,253,123,2,242,164,82,41,93,212,185,211,133,225)
IMAGE_DATA(78,65,91,159,71,203,247,243,243,17,234,235,235,225,216,177,99,96,109,189,92,112,112,88,70,23,217,251,224,204,153,51)
IMAGE_DATA(224,232,104,47,232,194,53,148,159,156,252,48,120,123,123,11,53,53,53,112,252,248,113,200,206,206,134,204,204,76,218,86)
IMAGE_DATA(62,20,22,22,130,157,221,199,6,243,113,108,213,113,165,65,139,5,199,0,79,186,33,115,167,27,146,98,186,56,45,7)
IMAGE_DATA(60,226,226,188,160,160,0,112,145,191,99,199,102,65,34,249,157,206,108,20,230,8,255,70,243,53,13,230,186,152,237,17)
IMAGE_DATA(184,88,8,205,104,129,192,67,205,224,30,127,150,109,10,112,147,226,228,228,36,236,220,105,47,216,219,111,23,108,108,44)
IMAGE_DATA(245,98,99,126,168,91,43,225,55,129,199,130,177,211,155,33,187,242,6,100,86,116,128,123,114,35,108,9,169,166,249,189)
IMAGE_DATA(77,40,42,154,52,242,158,82,126,175,104,235,243,240,119,88,109,65,191,150,89,190,47,4,81,118,22,229,238,205,189,10)
IMAGE_DATA(209,71,90,33,141,110,20,236,99,46,192,215,18,7,65,252,158,212,133,175,169,207,202,229,143,102,111,250,4,30,104,134)
IMAGE_DATA(204,19,29,108,115,33,59,112,5,118,211,49,72,46,106,135,205,225,13,176,94,98,169,23,95,151,62,243,50,139,178,253)
IMAGE_DATA(210,154,225,112,57,101,211,13,149,95,218,21,8,161,113,72,42,108,131,239,194,26,96,173,227,74,65,156,31,154,248,250)
IMAGE_DATA(244,153,151,205,225,245,144,94,126,157,197,219,103,127,19,4,211,188,219,87,208,6,182,161,13,176,124,221,23,130,242,220)
IMAGE_DATA(80,199,199,58,93,251,44,46,235,3,206,211,113,190,14,33,135,105,206,211,49,72,164,108,27,202,158,185,224,179,20,62)
IMAGE_DATA(79,197,115,68,153,143,125,22,207,43,125,203,203,31,185,150,99,142,37,230,183,65,92,110,27,88,7,213,193,140,249,159)
IMAGE_DATA(165,240,251,124,173,198,223,87,98,62,239,243,104,247,32,47,126,236,87,187,196,177,22,222,218,90,5,211,69,108,113,225)
IMAGE_DATA(177,64,97,127,71,211,103,67,11,143,197,88,244,249,255,186,104,251,101,80,67,1,21,210,203,30,106,254,35,67,237,255)
IMAGE_DATA(219,249,6,216,141,216,27,200,253,165,252,82,84,23,124,25,192,118,197,186,199,230,206,240,120,105,227,178,198,183,60,190)
IMAGE_DATA(0,60,226,181,174,237,189,96,249,106,163,117,141,12,148,69,235,181,78,28,228,136,109,176,136,175,183,5,187,195,249,214)
IMAGE_DATA(86,181,47,33,244,85,147,253,10,111,43,168,111,107,99,54,118,118,215,152,196,246,216,95,110,167,92,176,30,239,159,107)
IMAGE_DATA(110,86,107,175,141,255,79,207,181,80,221,208,160,214,94,91,255,109,61,237,161,180,182,86,85,255,71,218,192,56,171,138)
IMAGE_DATA(255,27,27,223,135,194,19,39,32,175,180,148,61,15,144,59,34,165,241,0,215,136,111,225,67,159,85,172,191,120,164,126)
IMAGE_DATA(65,38,221,121,100,210,157,79,122,110,174,86,123,241,61,126,255,135,244,116,166,100,186,155,208,102,175,74,177,116,215,23)
IMAGE_DATA(155,152,8,49,9,9,26,251,207,219,248,52,253,211,17,225,117,104,100,36,132,70,68,64,72,88,152,220,31,11,11,38)
IMAGE_DATA(53,185,248,19,123,31,127,127,38,111,186,3,215,197,94,89,206,174,174,224,236,226,2,78,206,206,134,124,68,71,251,225)
IMAGE_DATA(213,173,76,39,122,253,161,160,136,202,116,92,28,209,161,88,91,179,32,88,252,76,120,139,162,34,2,198,198,36,65,84)
IMAGE_DATA(167,46,49,71,59,112,24,227,70,42,107,94,129,92,252,251,230,112,12,70,248,47,152,153,193,86,137,4,26,59,59,85)
IMAGE_DATA(202,64,62,22,143,132,4,2,243,230,201,251,96,97,33,255,251,42,214,225,181,169,41,221,190,123,16,88,178,108,42,227)
IMAGE_DATA(92,190,117,11,26,111,222,132,139,29,29,80,71,95,184,103,175,92,17,243,13,137,139,41,246,21,153,24,119,20,255,27)
IMAGE_DATA(47,114,121,253,118,58,185,154,123,122,160,181,183,23,90,110,223,134,203,212,135,11,215,175,195,143,45,45,172,158,136,94)
IMAGE_DATA(188,98,233,24,23,5,174,178,48,6,21,231,207,51,246,181,193,65,104,235,239,135,43,221,221,44,6,248,209,194,122,3)
IMAGE_DATA(249,22,56,222,24,115,117,252,198,70,121,46,72,92,151,194,14,26,131,147,245,245,140,215,212,213,197,250,143,124,140,135)
IMAGE_DATA(158,252,34,108,83,83,159,213,249,130,121,241,152,137,9,164,100,100,64,125,123,59,251,104,226,88,232,201,55,229,125,71)
IMAGE_DATA(63,176,77,77,92,244,19,115,97,245,186,191,128,221,206,157,144,116,248,48,99,227,216,159,190,124,153,197,97,180,227,207)
IMAGE_DATA(115,77,85,159,241,62,178,80,24,111,20,246,27,217,167,46,92,96,245,163,225,227,220,19,243,148,207,209,55,169,76,6)
IMAGE_DATA(181,141,141,140,121,154,30,107,240,127,19,232,130,163,146,230,37,214,27,200,103,247,121,124,49,207,197,115,17,239,225,53)
IMAGE_DATA(250,177,248,237,231,224,100,93,29,84,209,252,171,162,71,228,86,156,59,7,101,167,79,179,122,162,121,254,171,253,152,154)
IMAGE_DATA(154,254,150,190,115,102,83,158,63,91,48,120,120,188,44,154,251,185,148,157,48,242,30,218,29,27,11,229,103,206,48,33)
IMAGE_DATA(183,164,166,6,138,171,170,216,57,81,177,56,209,176,16,25,225,115,46,151,135,199,234,225,57,55,91,113,145,67,243,61)
IMAGE_DATA(56,42,10,138,171,171,25,179,232,228,73,40,172,168,128,124,252,9,151,94,27,202,87,126,14,251,139,243,1,253,16,219)
IMAGE_DATA(230,151,149,201,69,121,40,92,236,229,150,148,64,78,113,49,171,31,43,62,10,199,68,28,23,124,238,72,81,145,130,178)
IMAGE_DATA(143,29,131,172,194,66,200,160,11,71,188,30,75,190,242,152,224,115,135,233,226,148,41,47,143,29,211,143,30,133,67,57)
IMAGE_DATA(57,112,48,59,155,93,143,37,95,149,109,90,102,166,92,89,89,236,152,74,181,159,230,4,46,124,241,122,188,249,184,184)
IMAGE_DATA(22,43,233,192,1,72,74,75,131,196,212,84,149,11,239,177,230,199,167,164,40,40,46,57,25,226,146,146,216,226,29,175)
IMAGE_DATA(13,229,235,170,152,248,120,185,232,38,1,143,209,168,184,56,136,218,187,151,93,235,216,142,186,162,176,41,80,22,222,15)
IMAGE_DATA(143,137,81,80,88,116,52,132,209,247,193,110,186,249,192,107,34,218,56,136,165,133,171,51,63,152,110,110,196,10,66,237)
IMAGE_DATA(222,13,129,33,33,236,122,188,249,254,129,129,114,5,5,141,156,251,5,4,128,47,253,46,225,249,120,243,189,232,230,76)
IMAGE_DATA(65,62,62,224,233,237,13,82,47,47,118,61,222,124,55,15,15,69,185,187,131,43,149,139,155,27,187,30,45,95,155,118)
IMAGE_DATA(57,57,169,21,250,160,197,126,180,69,35,31,53,70,28,181,124,29,245,75,209,165,168,250,101,240,103,46,58,127,8,136)
IMAGE_DATA(234,1,7,125,139,58,123,11,58,105,19,232,71,198,80,251,217,179,103,51,105,107,67,157,125,194,240,175,96,232,199,207)
IMAGE_DATA(193,31,109,255,117,45,119,155,253,40,243,239,191,182,252,79,252,3,241,88,149,25,115,205,215,160,118,197,159,234,70,109)
IMAGE_DATA(217,91,7,168,239,99,135,21,243,35,211,230,168,179,76,223,70,212,50,109,12,171,97,178,217,93,205,180,33,184,146,233)
IMAGE_DATA(155,160,10,166,245,178,50,166,181,126,37,76,182,190,89,221,40,206,19,243,125,50,90,97,34,37,230,59,38,156,31,154)
IMAGE_DATA(72,182,149,244,232,16,234,110,225,227,88,79,36,255,43,183,92,38,49,127,34,165,204,255,62,230,60,244,15,12,234,253)
IMAGE_DATA(50,53,180,32,235,115,167,35,119,13,127,115,244,57,5,62,158,163,250,134,213,219,63,192,212,221,43,215,173,222,59,76)
IMAGE_DATA(157,61,253,76,215,187,122,153,218,110,220,102,106,105,239,97,106,106,235,98,106,104,185,197,36,110,255,19,73,230,221,195)
IMAGE_DATA(167,239,52,49,255,206,208,144,92,131,131,76,220,159,219,119,6,152,122,250,228,226,254,220,188,45,87,71,119,31,83,251)
IMAGE_DATA(173,94,166,182,78,185,90,175,221,102,18,243,45,237,211,239,26,62,190,203,197,252,65,202,70,13,12,139,251,211,143,190)
IMAGE_DATA(80,245,14,200,213,67,199,4,213,221,39,87,87,175,92,223,196,46,100,250,50,252,121,40,62,91,8,45,55,110,50,137)
IMAGE_DATA(249,31,109,59,56,174,124,219,248,69,96,67,133,62,20,156,203,209,200,199,111,152,2,95,16,152,56,95,217,159,254,97)
IMAGE_DATA(245,81,95,80,60,63,185,63,95,71,205,135,141,9,111,130,125,218,7,240,125,242,187,176,60,240,15,80,92,151,71,25)
IMAGE_DATA(189,195,26,132,15,236,82,39,132,143,250,118,223,219,204,135,242,139,71,85,242,109,66,171,84,242,149,197,249,235,247,252)
IMAGE_DATA(157,201,42,102,62,211,170,40,51,166,47,35,254,204,100,151,98,193,20,86,232,192,100,155,248,46,124,19,247,58,152,123)
IMAGE_DATA(61,70,125,40,96,172,229,91,226,71,197,255,161,66,166,81,73,229,190,144,80,230,205,20,90,176,131,249,176,129,198,132)
IMAGE_DATA(251,32,230,175,15,40,87,228,15,107,104,88,202,126,172,141,158,167,200,58,225,199,196,121,251,40,59,174,204,11,188,178)
IMAGE_DATA(109,153,34,139,93,33,32,207,14,86,237,49,135,149,225,11,192,204,233,65,120,103,219,14,152,244,0,249,53,74,95,254)
IMAGE_DATA(154,232,191,106,228,35,91,204,247,203,217,204,124,240,161,71,244,193,42,110,17,243,225,209,103,38,189,133,124,43,191,82)
IMAGE_DATA(149,223,31,97,88,220,143,33,202,70,125,78,231,148,152,43,205,92,207,228,114,120,13,147,228,208,87,10,114,56,248,47)
IMAGE_DATA(112,201,88,15,129,249,142,224,158,105,3,31,69,188,8,75,131,230,194,83,91,201,224,228,39,201,226,137,228,187,100,88)
IMAGE_DATA(43,242,103,18,243,181,62,199,245,250,254,126,24,50,139,241,227,75,189,152,246,28,247,96,138,44,114,101,10,59,230,204)
IMAGE_DATA(36,57,180,154,73,154,101,11,1,249,14,224,150,105,11,95,237,121,3,222,9,120,14,158,182,123,20,30,156,70,22,98)
IMAGE_DATA(254,141,55,31,217,174,52,238,200,182,8,158,207,216,147,167,221,187,144,231,255,42,105,1,107,151,127,103,180,105,73,192)
IMAGE_DATA(76,72,166,113,215,54,7,67,11,37,32,203,219,1,46,148,253,121,180,57,101,47,128,167,236,140,126,178,129,156,62,103)
IMAGE_DATA(209,26,244,129,139,175,207,190,112,206,97,250,84,146,197,180,210,49,131,9,249,168,55,189,77,153,94,243,156,194,244,55)
IMAGE_DATA(55,35,38,75,58,199,144,203,216,116,188,63,163,236,165,65,243,24,123,242,180,95,45,84,230,143,117,153,181,149,244,112)
IMAGE_DATA(254,202,200,215,96,73,144,25,152,88,145,166,241,230,42,243,145,141,122,124,211,164,190,251,77,200,252,137,226,79,251,142)
IMAGE_DATA(244,44,116,159,113,231,37,233,147,240,196,150,123,225,129,39,200,184,199,92,153,143,210,149,253,111,100,165,11,174,0,0)
IMAGE_DATA(120,156,237,154,9,84,85,199,25,199,39,102,53,201,73,45,231,212,211,8,137,75,76,83,109,170,73,90,78,213,166,49)
IMAGE_DATA(75,37,137,57,73,142,26,170,217,48,123,141,11,6,193,24,35,42,139,79,246,199,254,88,101,23,217,137,160,34,139,200)
IMAGE_DATA(38,200,34,8,130,75,20,84,68,64,68,68,17,1,129,251,117,190,121,12,189,239,229,237,44,49,109,230,156,255,185,247)
IMAGE_DATA(206,189,223,252,190,249,230,155,123,103,30,76,152,68,38,17,77,197,212,148,236,244,244,36,77,17,17,68,64,225,57,214)
IMAGE_DATA(105,52,26,42,247,220,67,38,71,70,146,59,0,4,196,194,58,122,111,138,58,158,179,51,57,31,22,70,6,163,162,8)
IMAGE_DATA(236,221,75,224,228,73,2,131,131,4,6,6,8,156,56,33,175,195,123,248,12,62,43,246,39,60,156,244,138,89,23,46)
IMAGE_DATA(16,72,74,34,80,93,45,87,98,162,188,78,252,12,218,160,237,171,175,146,240,148,20,2,117,117,114,30,170,164,132,128)
IMAGE_DATA(68,50,25,60,61,237,5,153,204,87,216,182,237,121,1,235,208,151,254,126,2,53,53,4,208,230,149,87,72,108,108,44)
IMAGE_DATA(233,63,125,154,192,177,99,4,42,43,229,188,224,224,123,64,38,179,21,46,94,188,72,159,173,161,231,175,9,220,159,138)
IMAGE_DATA(10,2,249,249,4,114,115,9,248,251,147,126,153,140,116,118,117,17,184,114,133,64,125,61,129,134,6,2,62,62,147,96)
IMAGE_DATA(255,254,253,208,220,220,12,94,94,246,130,179,243,63,133,237,219,95,20,92,92,158,21,178,179,9,160,170,170,8,56,57)
IMAGE_DATA(145,78,110,127,227,6,129,142,14,2,23,47,18,240,243,155,4,105,105,105,52,134,39,193,217,121,53,181,115,16,242,242)
IMAGE_DATA(242,96,231,78,9,61,18,64,161,175,104,79,125,96,246,157,157,4,218,219,9,180,182,18,112,115,91,33,148,151,151,51)
IMAGE_DATA(223,75,75,75,217,177,184,184,24,182,111,183,20,10,11,229,246,229,229,132,182,71,58,233,120,244,117,119,19,184,121,147)
IMAGE_DATA(128,44,108,129,224,186,167,90,136,78,45,162,241,172,163,126,102,3,13,16,68,68,68,192,214,173,95,83,63,140,224,208)
IMAGE_DATA(33,121,223,75,75,9,184,187,147,222,21,43,72,54,94,7,134,207,5,201,158,6,225,135,146,171,96,27,89,15,254,187)
IMAGE_DATA(115,192,222,126,33,179,145,74,31,131,212,84,121,191,145,139,124,26,119,120,239,61,146,79,135,240,129,103,230,206,73,220)
IMAGE_DATA(20,114,130,218,182,195,254,178,107,16,157,123,5,62,113,171,18,48,135,120,188,208,14,199,16,115,97,195,6,114,97,202)
IMAGE_DATA(20,178,142,218,62,140,57,176,206,183,170,39,185,232,42,164,29,109,135,248,252,54,202,111,0,123,175,151,5,140,5,142)
IMAGE_DATA(23,142,109,122,58,139,87,215,179,207,18,15,154,199,198,226,252,253,192,46,239,122,232,193,102,216,125,248,10,216,132,156)
IMAGE_DATA(131,23,22,206,59,17,24,72,4,180,195,254,210,220,7,154,103,73,247,223,79,158,87,149,255,143,76,154,242,225,235,214)
IMAGE_DATA(57,157,175,88,29,234,50,154,177,192,9,235,30,126,152,152,45,93,74,114,151,47,39,69,143,62,74,222,214,101,238,25)
IMAGE_DATA(82,22,79,35,211,198,170,237,113,43,115,230,252,54,87,172,241,226,78,158,252,144,165,133,197,76,48,51,51,166,9,249)
IMAGE_DATA(7,38,60,199,58,188,55,150,108,236,39,114,164,210,39,232,196,159,165,32,172,195,123,99,17,11,206,77,78,54,162,47)
IMAGE_DATA(73,99,112,112,120,26,202,202,158,25,102,227,57,214,225,61,124,102,148,252,176,164,109,116,96,91,40,254,162,70,113,134)
IMAGE_DATA(88,88,39,126,134,215,99,27,216,150,62,220,69,139,166,48,46,246,9,199,23,143,120,141,253,19,51,84,9,159,81,101)
IMAGE_DATA(139,109,106,242,3,115,71,204,85,30,95,20,214,43,247,83,57,46,154,108,185,31,226,60,229,92,244,187,174,110,34,19)
IMAGE_DATA(62,135,190,243,49,198,35,94,99,61,222,87,199,215,197,22,133,44,238,7,207,45,113,187,120,174,60,198,120,173,137,173)
IMAGE_DATA(143,45,247,147,191,59,34,35,141,232,135,206,24,120,12,148,99,170,137,195,165,110,60,148,109,144,177,105,147,49,253,200)
IMAGE_DATA(27,41,240,155,154,8,20,20,76,100,126,104,26,99,238,59,143,179,174,249,137,109,34,55,62,126,34,229,16,149,124,46)
IMAGE_DATA(188,86,21,11,62,175,196,115,95,91,126,242,62,35,15,185,92,154,248,226,88,40,247,105,213,170,63,83,142,181,16,16)
IMAGE_DATA(224,207,22,106,154,242,147,199,154,247,89,31,190,216,15,222,110,98,226,19,16,16,32,21,154,154,154,104,127,59,232,34)
IMAGE_DATA(79,166,50,199,248,24,169,226,234,203,231,194,88,56,56,88,9,141,141,141,208,210,210,2,153,153,153,224,235,235,171,242)
IMAGE_DATA(253,131,125,86,199,53,148,143,242,247,247,97,125,175,170,170,162,246,239,9,200,147,74,165,116,81,231,78,23,134,59,4)
IMAGE_DATA(109,125,30,41,223,207,207,71,168,175,175,135,35,71,142,128,149,213,114,193,193,97,25,93,100,39,193,169,83,167,192,209)
IMAGE_DATA(209,94,208,133,107,40,63,37,229,17,240,246,246,22,106,107,107,225,232,209,163,144,147,147,3,89,89,89,180,173,2,40)
IMAGE_DATA(42,42,2,91,219,143,13,230,227,216,170,227,74,131,22,11,142,1,158,116,67,230,78,55,36,37,116,113,90,1,120,196)
IMAGE_DATA(197,121,97,97,33,224,34,223,206,110,179,32,145,252,94,103,54,10,115,132,127,163,249,154,6,115,93,204,246,8,92,44)
IMAGE_DATA(132,102,182,64,224,129,102,112,143,63,205,54,5,184,73,113,114,114,18,118,236,176,23,236,237,183,11,214,214,22,122,177)
IMAGE_DATA(49,63,212,173,149,240,155,192,99,193,216,25,205,144,83,117,29,178,42,59,192,61,165,17,182,132,212,208,252,222,38,20)
IMAGE_DATA(23,79,24,126,79,41,191,87,180,245,121,232,59,172,182,160,95,203,44,222,23,130,40,59,155,114,247,228,93,129,232,67)
IMAGE_DATA(173,144,78,55,10,246,49,231,225,107,137,131,32,126,79,234,194,215,212,103,229,242,39,211,55,125,2,247,53,67,214,177)
IMAGE_DATA(14,182,185,144,237,187,12,187,232,24,164,20,95,133,205,225,13,176,94,98,161,23,95,151,62,243,50,139,178,253,210,155)
IMAGE_DATA(225,96,5,101,211,13,149,95,250,101,8,161,113,72,46,106,131,239,194,26,96,173,227,74,65,156,31,154,248,250,244,153)
IMAGE_DATA(151,205,225,245,144,81,113,141,197,219,103,111,19,4,211,188,75,42,108,3,155,208,6,88,190,238,11,65,121,110,168,227)
IMAGE_DATA(99,157,174,125,22,151,245,1,103,233,56,95,131,144,131,52,231,233,24,36,82,182,53,101,207,88,240,89,42,159,167,226)
IMAGE_DATA(57,162,204,199,62,139,231,149,190,229,229,143,92,43,48,199,18,11,218,32,46,175,13,172,130,206,193,244,249,159,165,242)
IMAGE_DATA(251,124,173,198,223,87,98,62,239,243,72,247,32,47,126,236,87,183,196,177,14,222,218,90,13,211,68,108,113,225,177,64)
IMAGE_DATA(97,127,71,210,103,67,11,143,197,104,244,249,255,186,104,251,101,80,67,1,21,210,203,30,106,255,43,67,237,127,233,124)
IMAGE_DATA(3,236,134,237,13,228,254,90,126,45,42,203,125,248,50,128,237,138,149,143,207,157,238,241,210,198,101,141,111,121,124,1)
IMAGE_DATA(120,196,107,93,27,124,193,226,213,70,171,90,25,40,139,214,107,157,56,200,17,219,96,17,95,111,11,118,135,179,173,173)
IMAGE_DATA(106,95,66,232,171,38,251,21,222,150,80,223,214,198,108,108,109,219,153,196,246,216,95,110,167,92,176,30,239,159,105,110)
IMAGE_DATA(86,107,175,141,255,47,207,181,80,211,208,160,214,94,91,255,109,60,237,161,172,174,78,85,255,135,219,192,56,171,138,255)
IMAGE_DATA(27,27,223,135,162,99,199,32,191,172,140,61,15,144,55,44,165,241,0,215,136,111,225,67,159,85,172,191,120,164,126,65)
IMAGE_DATA(22,221,121,100,209,157,79,70,94,158,86,123,241,61,126,255,135,140,12,166,20,186,155,208,102,175,74,177,116,215,23,155)
IMAGE_DATA(152,8,49,9,9,26,251,207,219,248,52,227,211,97,225,117,104,100,36,132,70,68,64,72,88,152,220,31,115,115,38,53)
IMAGE_DATA(185,248,19,123,31,127,127,38,111,186,3,215,197,94,89,206,174,174,224,236,226,2,78,206,206,134,124,68,71,250,225,213)
IMAGE_DATA(169,220,135,127,38,152,166,251,243,197,84,38,99,225,136,46,197,202,138,5,193,252,103,194,155,23,23,19,48,50,34,9)
IMAGE_DATA(162,58,117,137,57,210,129,195,24,55,82,89,241,10,228,226,223,55,135,98,48,204,127,193,212,20,182,74,36,208,216,217)
IMAGE_DATA(169,82,6,242,177,120,36,36,16,152,55,79,222,7,115,115,249,223,87,177,14,175,77,76,232,246,221,131,192,146,101,83)
IMAGE_DATA(24,231,210,205,155,208,120,227,6,92,232,232,128,115,244,133,123,250,242,101,49,223,144,184,152,96,95,145,137,113,71,241)
IMAGE_DATA(191,241,34,151,215,111,167,147,171,185,187,27,90,123,122,160,229,246,109,184,68,125,56,127,237,26,252,216,210,194,234,137)
IMAGE_DATA(232,197,43,150,142,113,81,224,42,11,99,80,121,246,44,99,183,15,12,64,91,95,31,92,190,117,139,197,0,63,90,88)
IMAGE_DATA(111,32,223,28,199,27,99,174,142,223,216,40,207,5,137,235,82,176,163,49,56,94,95,207,120,77,93,93,172,255,200,199)
IMAGE_DATA(120,232,201,47,198,54,53,245,89,157,47,152,23,143,27,27,67,106,102,38,212,95,189,202,62,154,56,22,122,242,77,120)
IMAGE_DATA(223,209,15,108,83,19,23,253,196,92,88,189,238,175,96,187,99,7,36,31,60,200,216,56,246,39,47,93,98,113,24,233)
IMAGE_DATA(248,243,92,83,213,103,188,143,44,20,198,27,133,253,70,246,137,243,231,89,253,72,248,56,247,196,60,229,115,244,77,42)
IMAGE_DATA(147,65,93,99,35,99,158,164,199,90,252,223,4,186,224,168,162,121,137,245,6,242,217,125,30,95,204,115,241,92,196,123)
IMAGE_DATA(120,141,126,44,126,251,57,56,126,238,28,84,211,252,171,166,71,228,86,158,57,3,229,39,79,178,122,162,121,254,171,253)
IMAGE_DATA(152,154,152,252,142,190,115,102,83,158,63,91,48,120,120,188,44,154,251,121,148,157,48,252,30,218,21,27,11,21,167,78)
IMAGE_DATA(49,33,183,180,182,22,74,170,171,217,57,81,177,56,209,176,16,25,230,115,46,151,135,199,234,161,57,55,91,113,145,67)
IMAGE_DATA(243,61,56,42,10,74,106,106,24,179,248,248,113,40,170,172,132,2,252,9,151,94,27,202,87,126,14,251,139,243,1,253)
IMAGE_DATA(16,219,22,148,151,203,69,121,40,92,236,229,149,150,66,110,73,9,171,31,45,62,10,199,68,28,23,124,238,80,113,177)
IMAGE_DATA(130,114,142,28,129,236,162,34,200,164,11,71,188,30,77,190,242,152,224,115,7,233,226,148,41,63,159,29,51,14,31,134)
IMAGE_DATA(3,185,185,176,63,39,135,93,143,38,95,149,109,122,86,150,92,217,217,236,152,70,181,151,230,4,46,124,241,122,172,249)
IMAGE_DATA(184,184,22,43,121,223,62,72,78,79,135,196,180,52,149,11,239,209,230,199,167,166,42,40,46,37,5,226,146,147,217,226)
IMAGE_DATA(29,175,13,229,235,170,152,248,120,185,232,38,1,143,209,168,184,56,136,218,179,135,93,235,216,142,186,162,176,41,80,22)
IMAGE_DATA(222,15,143,137,81,80,88,116,52,132,209,247,193,46,186,249,192,107,34,218,56,136,165,133,171,51,63,152,110,110,196,10)
IMAGE_DATA(66,237,218,5,129,33,33,236,122,172,249,254,129,129,114,5,5,13,159,251,5,4,128,47,253,46,225,249,88,243,189,232)
IMAGE_DATA(230,76,65,62,62,224,233,237,13,82,47,47,118,61,214,124,55,15,15,69,185,187,131,43,149,139,155,27,187,30,41,95)
IMAGE_DATA(155,118,58,57,169,21,250,160,197,126,164,69,35,31,53,74,28,181,124,29,245,107,209,165,168,250,101,240,103,46,58,127)
IMAGE_DATA(8,136,234,1,7,125,139,58,123,115,58,105,19,232,71,198,80,251,217,179,103,51,105,107,67,157,125,194,208,175,96,232)
IMAGE_DATA(199,207,193,31,105,255,117,45,119,155,253,8,243,239,23,91,254,39,254,129,120,180,202,244,185,102,107,80,59,227,79,220)
IMAGE_DATA(66,109,217,115,14,80,223,199,14,41,230,71,166,205,81,167,153,190,141,168,99,218,24,86,203,100,189,171,134,105,67,112)
IMAGE_DATA(21,211,55,65,149,76,235,101,229,76,107,253,74,153,108,124,179,111,161,56,79,204,247,201,108,133,241,148,152,239,152,112)
IMAGE_DATA(118,112,60,217,150,210,195,131,168,187,133,143,99,61,158,252,175,220,242,152,196,252,241,148,50,255,251,152,179,208,215,63)
IMAGE_DATA(160,247,203,212,208,130,172,207,157,14,221,53,252,205,209,103,20,248,120,142,234,29,82,79,95,63,211,173,30,185,110,246)
IMAGE_DATA(220,97,234,236,238,99,186,214,213,195,212,118,253,54,83,203,213,110,166,166,182,46,166,134,150,155,76,226,246,63,145,100)
IMAGE_DATA(221,61,124,250,78,19,243,239,12,14,202,53,48,192,196,253,185,125,167,159,169,187,87,46,238,207,141,219,114,117,220,234)
IMAGE_DATA(101,186,122,179,135,169,173,83,174,214,246,219,76,98,190,133,125,198,93,195,199,119,185,152,63,64,217,168,254,33,113,127)
IMAGE_DATA(250,208,23,170,158,126,185,186,233,152,160,110,245,202,213,213,35,215,55,177,11,153,190,12,127,30,74,78,23,65,203,245)
IMAGE_DATA(27,76,98,254,71,219,246,143,41,223,38,126,17,88,83,161,15,133,103,114,53,242,241,27,166,192,23,4,38,206,87,246)
IMAGE_DATA(167,111,72,189,212,23,20,207,79,238,207,215,81,243,97,99,194,155,96,159,254,1,124,159,242,46,44,15,252,35,148,156)
IMAGE_DATA(203,167,140,158,33,13,192,7,182,105,227,194,71,125,155,244,54,243,161,226,194,97,149,124,235,208,106,149,124,101,113,254)
IMAGE_DATA(250,221,255,96,178,140,153,207,180,42,202,148,233,203,136,191,48,217,166,154,51,133,21,57,48,217,36,190,11,223,196,189)
IMAGE_DATA(14,102,94,143,83,31,10,25,107,249,150,248,17,241,127,168,148,105,84,114,133,47,36,148,123,51,133,22,218,49,31,54)
IMAGE_DATA(208,152,112,31,196,252,245,1,21,138,252,33,13,14,73,217,143,181,209,243,20,89,199,252,152,56,47,137,178,227,202,189)
IMAGE_DATA(192,43,199,134,41,178,196,21,2,242,109,97,213,110,51,88,25,190,0,76,157,30,130,119,182,217,193,132,7,201,111,80)
IMAGE_DATA(250,242,215,68,255,77,35,31,217,98,190,95,238,102,230,131,15,61,162,15,150,113,139,152,15,143,61,51,225,45,228,91)
IMAGE_DATA(250,149,169,252,254,8,67,226,126,12,82,54,234,115,58,167,196,92,105,214,122,38,151,131,107,152,36,7,190,82,144,195)
IMAGE_DATA(254,127,131,75,230,122,8,44,112,4,247,44,107,248,40,226,69,88,26,52,23,102,110,37,3,19,159,34,139,199,147,239)
IMAGE_DATA(146,105,165,200,159,65,204,214,250,28,213,235,251,251,97,200,44,198,143,47,243,98,218,125,212,131,41,178,216,149,41,236)
IMAGE_DATA(136,51,147,228,192,106,38,105,182,13,4,20,56,128,91,150,13,124,181,251,13,120,39,224,57,120,218,246,49,120,104,42)
IMAGE_DATA(89,136,249,55,214,124,100,187,210,184,35,219,60,120,62,99,79,156,122,239,66,158,255,171,164,133,172,93,254,157,209,166)
IMAGE_DATA(37,1,51,32,133,198,93,219,28,12,45,146,128,44,223,14,92,40,251,243,104,51,202,94,0,51,109,39,253,100,3,57)
IMAGE_DATA(109,206,162,53,232,3,23,95,159,125,225,156,203,244,169,36,155,105,165,99,38,19,242,81,111,122,155,48,189,230,57,153)
IMAGE_DATA(233,239,110,147,152,44,232,28,67,46,99,211,241,254,140,178,151,6,205,99,236,137,83,239,91,168,204,31,237,50,107,43)
IMAGE_DATA(233,230,252,149,145,175,193,146,32,83,48,182,36,77,99,205,85,230,35,27,245,196,166,9,189,15,24,147,249,227,197,159)
IMAGE_DATA(250,29,233,94,232,62,253,206,75,210,167,224,201,45,247,194,131,79,146,49,143,185,50,31,165,43,251,63,150,32,11,182)
IMAGE_END_DATA(3488, 7)
IMAGE_BEGIN_DATA

View file

@ -0,0 +1,10 @@
uses
CtrlLib;
file
test.iml,
main.cpp;
mainconfig
"" = "GUI";

27
upptst/IMLScale/main.cpp Normal file
View file

@ -0,0 +1,27 @@
#include <CtrlLib/CtrlLib.h>
using namespace Upp;
#define IMAGECLASS TestImg
#define IMAGEFILE <IMLScale/test.iml>
#include <Draw/iml_header.h>
#define IMAGECLASS TestImg
#define IMAGEFILE <IMLScale/test.iml>
#include <Draw/iml_source.h>
struct MyApp : TopWindow {
void Paint(Draw& w) override;
};
void MyApp::Paint(Draw& w)
{
w.DrawRect(GetSize(), White());
w.DrawImage(100, 100, TestImg::Test());
w.DrawImage(500, 100, TestImg::Master());
}
GUI_APP_MAIN
{
MyApp().Run();
}

54
upptst/IMLScale/test.iml Normal file
View file

@ -0,0 +1,54 @@
PREMULTIPLIED
VERSION(20260403)
IMAGE_ID(Test)
IMAGE_ID(Test__150)
IMAGE_ID(Test__200)
IMAGE_ID(Test__300)
IMAGE_ID(Master)
IMAGE_BEGIN_DATA
IMAGE_DATA(120,156,237,90,75,110,3,33,12,157,101,151,93,118,89,41,61,64,143,208,101,78,147,251,228,64,185,86,91,177,176,228)
IMAGE_DATA(18,120,177,193,12,76,250,158,228,69,24,108,191,121,124,12,211,110,111,219,235,166,240,51,218,70,225,153,227,159,78,167)
IMAGE_DATA(111,253,251,122,189,254,156,207,231,111,121,166,245,149,246,200,248,250,89,106,191,92,46,119,57,162,226,223,110,183,187,54)
IMAGE_DATA(75,252,124,158,213,226,215,218,34,249,151,198,32,82,255,244,60,50,126,239,252,137,0,227,219,226,143,180,175,143,237,109)
IMAGE_DATA(215,98,176,74,241,240,130,124,48,200,7,227,8,124,82,33,171,21,85,141,212,134,138,134,20,171,116,104,176,174,235,188)
IMAGE_DATA(93,124,19,39,13,41,94,173,124,74,7,129,82,46,205,39,249,151,184,212,242,247,242,41,197,208,124,80,252,4,25,71)
IMAGE_DATA(225,27,193,71,98,150,248,232,24,53,164,184,210,39,130,143,244,149,119,108,225,35,135,218,196,5,213,32,15,31,233,219)
IMAGE_DATA(203,103,164,62,214,249,19,57,94,178,134,180,31,90,95,178,38,37,191,246,29,189,190,116,126,61,110,122,63,211,237,163)
IMAGE_DATA(247,159,60,222,163,121,218,187,63,123,47,75,37,212,46,69,81,56,66,61,157,9,242,193,216,235,254,226,177,151,207,237)
IMAGE_DATA(125,83,152,78,136,182,206,132,181,130,252,231,130,252,231,226,153,249,203,65,185,244,53,94,144,95,144,91,124,74,31,2)
IMAGE_DATA(180,165,254,181,203,240,17,248,139,161,191,106,172,192,191,118,128,214,7,247,124,28,142,192,95,191,67,222,231,40,252,75)
IMAGE_DATA(126,71,227,95,186,228,142,226,239,57,107,145,63,231,207,30,252,229,195,82,233,195,75,137,191,37,174,212,199,61,248,123)
IMAGE_DATA(247,31,253,188,4,225,170,243,174,180,255,39,200,152,229,103,16,189,78,245,124,140,230,159,158,181,214,223,90,31,109,121)
IMAGE_DATA(206,145,231,31,244,95,5,136,127,66,254,209,92,127,224,31,205,63,229,110,57,127,30,1,228,63,23,228,63,23,228,63)
IMAGE_DATA(23,150,186,65,27,111,239,231,237,115,83,152,78,136,118,124,35,254,130,250,96,80,31,12,234,131,65,125,48,168,15,6)
IMAGE_DATA(245,193,160,62,24,212,7,131,250,96,80,31,12,234,131,65,125,48,172,250,180,106,88,243,107,29,143,154,223,168,123,184)
IMAGE_DATA(199,207,27,31,245,159,173,79,203,59,88,124,162,180,28,165,143,39,134,247,61,188,241,123,250,204,212,199,227,211,187,46)
IMAGE_DATA(123,243,122,177,215,122,205,159,247,236,91,150,118,47,47,175,223,106,250,228,190,165,223,61,188,188,126,173,241,30,249,246)
IMAGE_DATA(232,147,199,142,222,195,60,126,171,234,147,199,136,224,212,226,247,172,250,180,154,231,29,173,92,44,60,123,226,183,172,175)
IMAGE_DATA(103,215,135,251,143,47,46,235,215,189,159,165,221,195,169,197,111,37,125,30,245,183,196,91,69,31,43,207,232,189,227,191)
IMAGE_DATA(234,19,165,227,10,250,120,198,217,219,215,147,127,143,241,110,229,21,165,79,111,141,107,173,115,181,120,40,143,213,188,252)
IMAGE_DATA(123,246,91,107,142,71,239,105,141,133,114,68,232,82,139,75,252,5,245,193,160,62,24,212,7,131,250,96,80,31,12,234)
IMAGE_DATA(131,65,125,48,168,15,6,245,193,160,62,24,45,247,58,26,45,183,95,230,21,222,4,0,0,0,0,0,0,0,0,0)
IMAGE_END_DATA(736, 4)
IMAGE_BEGIN_DATA
IMAGE_DATA(120,156,237,211,81,110,131,48,16,69,209,44,167,203,234,146,186,227,246,171,18,138,68,194,248,141,33,192,57,210,72,85)
IMAGE_DATA(10,198,56,55,95,63,143,239,199,194,175,49,198,24,99,140,49,198,152,227,6,150,244,67,66,63,36,244,67,66,63,36)
IMAGE_DATA(244,67,66,63,36,244,67,66,63,36,244,67,66,63,36,244,67,66,63,36,244,67,66,63,36,244,67,66,63,36,244,67)
IMAGE_DATA(66,63,36,244,67,66,63,36,244,67,66,63,36,244,67,66,63,36,244,67,66,63,36,244,67,66,63,36,244,67,66,63)
IMAGE_DATA(36,102,244,51,122,127,242,220,206,222,103,236,191,122,182,71,175,213,113,86,87,232,103,214,89,164,247,127,122,63,29,223)
IMAGE_DATA(245,157,250,233,56,223,79,248,206,187,215,234,62,183,244,187,24,221,71,242,14,221,103,112,167,126,210,179,239,232,231,249)
IMAGE_DATA(179,119,247,172,173,49,250,188,145,51,72,174,219,178,191,25,247,116,172,165,159,158,251,59,174,221,251,158,174,181,238,212)
IMAGE_DATA(207,218,30,103,254,230,170,244,115,158,126,70,206,161,227,157,95,57,83,63,213,247,223,171,159,231,207,215,174,175,190,115)
IMAGE_DATA(71,63,213,115,168,234,56,195,100,127,157,107,165,107,39,231,213,221,207,187,253,125,194,89,140,236,99,100,47,250,201,251)
IMAGE_DATA(25,189,230,221,61,179,206,163,107,15,179,250,153,177,207,244,188,170,159,29,209,207,187,53,174,222,79,215,217,204,236,231)
IMAGE_DATA(255,243,45,215,237,253,155,170,188,219,150,53,247,106,110,116,173,228,156,238,214,79,245,57,213,247,235,184,126,244,158,100)
IMAGE_DATA(173,174,239,250,238,253,204,232,225,12,253,116,237,115,118,63,203,255,63,255,189,117,141,234,190,70,90,220,186,214,149,251)
IMAGE_DATA(25,121,183,61,251,169,92,83,89,191,186,167,234,25,236,209,66,178,167,228,188,210,223,230,29,251,25,57,135,171,246,83)
IMAGE_DATA(189,254,168,243,170,252,127,121,205,94,123,234,58,139,173,207,78,247,50,179,159,87,247,156,189,159,138,174,51,169,58,91)
IMAGE_DATA(63,107,207,239,216,39,44,233,135,132,126,72,232,135,132,126,72,232,135,132,126,72,232,135,132,126,72,232,135,132,126,72)
IMAGE_DATA(232,135,132,126,72,232,135,132,126,72,232,135,132,126,72,232,135,132,126,72,232,135,132,126,72,232,135,132,126,72,232,135)
IMAGE_DATA(132,126,72,232,135,132,126,72,232,135,132,126,72,232,135,132,126,72,232,135,132,126,72,84,251,49,198,24,99,140,49,198)
IMAGE_DATA(24,211,59,127,230,146,26,71,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
IMAGE_END_DATA(576, 1)