From: Václav Slavík Date: Sun, 23 Jan 2000 01:03:30 +0000 (+0000) Subject: added intelligent scaling of icons -- cutting empty borders so that the icon is not... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/78316bbe3589b0d9bad4de1706d3e8a3215b0867 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 --- diff --git a/src/generic/filedlgg.cpp b/src/generic/filedlgg.cpp index e079149348..c3b2280e4c 100644 --- a/src/generic/filedlgg.cpp +++ b/src/generic/filedlgg.cpp @@ -156,11 +156,57 @@ static wxBitmap CreateAntialiasedBitmap(const wxImage& img) } p1 += 32 * 3, p2 += 32 * 3; } - + return small.ConvertToBitmap(); } +// 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) { if (!extension.IsEmpty()) @@ -188,8 +234,9 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) else { if (img.GetWidth() != 32 || img.GetHeight() != 32) - img.Rescale(32, 32); - m_ImageList.Add(CreateAntialiasedBitmap(img)); + m_ImageList.Add(CreateAntialiasedBitmap(CutEmptyBorders(img).Rescale(32, 32))); + else + m_ImageList.Add(CreateAntialiasedBitmap(img)); } m_HashTable.Put(extension, new wxFileIconEntry(id)); return id;