X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/eaf40b230e00a249af2cc9e3b06406b3a64fd167..5333ab8e8ef81e3ae71fef22b42542c51b122258:/src/generic/filedlgg.cpp diff --git a/src/generic/filedlgg.cpp b/src/generic/filedlgg.cpp index ea76456652..c3b2280e4c 100644 --- a/src/generic/filedlgg.cpp +++ b/src/generic/filedlgg.cpp @@ -84,7 +84,6 @@ class wxFileIconsTable protected: wxImageList m_ImageList; wxHashTable m_HashTable; - wxMimeTypesManager m_Mime; }; static wxFileIconsTable *g_IconsTable = NULL; @@ -95,8 +94,7 @@ static wxFileIconsTable *g_IconsTable = NULL; wxFileIconsTable::wxFileIconsTable() : m_ImageList(16, 16), - m_HashTable(wxKEY_STRING), - m_Mime() + m_HashTable(wxKEY_STRING) { m_HashTable.DeleteContents(TRUE); m_ImageList.Add(wxBitmap(folder_xpm)); // FI_FOLDER @@ -158,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()) @@ -172,10 +216,10 @@ int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime) } wxFileType *ft = (mime.IsEmpty()) ? - m_Mime.GetFileTypeFromExtension(extension) : - m_Mime.GetFileTypeFromMimeType(mime); + wxTheMimeTypesManager -> GetFileTypeFromExtension(extension) : + wxTheMimeTypesManager -> GetFileTypeFromMimeType(mime); wxIcon ic; - if (ft == NULL || (!ft -> GetIcon(&ic))) + if (ft == NULL || (!ft -> GetIcon(&ic)) || (!ic.Ok())) { int newid = FI_UNKNOWN; m_HashTable.Put(extension, new wxFileIconEntry(newid)); @@ -190,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;