added intelligent scaling of icons -- cutting empty borders so that the icon is not too small
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5603 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -161,6 +161,52 @@ static wxBitmap CreateAntialiasedBitmap(const wxImage& img)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// finds empty borders and return non-empty area of image:
|
||||||
|
static wxImage CutEmptyBorders(const wxImage& img)
|
||||||
|
{
|
||||||
|
unsigned char mr = img.GetMaskRed(),
|
||||||
|
mg = img.GetMaskGreen(),
|
||||||
|
mb = img.GetMaskBlue();
|
||||||
|
unsigned char *dt = img.GetData(), *dttmp;
|
||||||
|
unsigned w = img.GetWidth(), h = img.GetHeight();
|
||||||
|
|
||||||
|
unsigned top, bottom, left, right, i;
|
||||||
|
bool empt;
|
||||||
|
|
||||||
|
#define MK_DTTMP(x,y) dttmp = dt + ((x + y * w) * 3)
|
||||||
|
#define NOEMPTY_PIX(empt) if (dttmp[0] != mr || dttmp[1] != mg || dttmp[2] != mb) {empt = FALSE; break;}
|
||||||
|
|
||||||
|
for (empt = TRUE, top = 0; empt && top < h; top++)
|
||||||
|
{
|
||||||
|
MK_DTTMP(0, top);
|
||||||
|
for (i = 0; i < w; i++, dttmp+=3)
|
||||||
|
NOEMPTY_PIX(empt)
|
||||||
|
}
|
||||||
|
for (empt = TRUE, bottom = h-1; empt && bottom > top; bottom--)
|
||||||
|
{
|
||||||
|
MK_DTTMP(0, bottom);
|
||||||
|
for (i = 0; i < w; i++, dttmp+=3)
|
||||||
|
NOEMPTY_PIX(empt)
|
||||||
|
}
|
||||||
|
for (empt = TRUE, left = 0; empt && left < w; left++)
|
||||||
|
{
|
||||||
|
MK_DTTMP(left, 0);
|
||||||
|
for (i = 0; i < h; i++, dttmp+=3*w)
|
||||||
|
NOEMPTY_PIX(empt)
|
||||||
|
}
|
||||||
|
for (empt = TRUE, right = w-1; empt && right > left; right--)
|
||||||
|
{
|
||||||
|
MK_DTTMP(right, 0);
|
||||||
|
for (i = 0; i < h; i++, dttmp+=3*w)
|
||||||
|
NOEMPTY_PIX(empt)
|
||||||
|
}
|
||||||
|
top--, left--, bottom++, right++;
|
||||||
|
|
||||||
|
return img.GetSubImage(wxRect(left, top, right - left + 1, bottom - top + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
|
int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
|
||||||
{
|
{
|
||||||
if (!extension.IsEmpty())
|
if (!extension.IsEmpty())
|
||||||
@@ -188,8 +234,9 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (img.GetWidth() != 32 || img.GetHeight() != 32)
|
if (img.GetWidth() != 32 || img.GetHeight() != 32)
|
||||||
img.Rescale(32, 32);
|
m_ImageList.Add(CreateAntialiasedBitmap(CutEmptyBorders(img).Rescale(32, 32)));
|
||||||
m_ImageList.Add(CreateAntialiasedBitmap(img));
|
else
|
||||||
|
m_ImageList.Add(CreateAntialiasedBitmap(img));
|
||||||
}
|
}
|
||||||
m_HashTable.Put(extension, new wxFileIconEntry(id));
|
m_HashTable.Put(extension, new wxFileIconEntry(id));
|
||||||
return id;
|
return id;
|
||||||
|
Reference in New Issue
Block a user