protected:
wxImageList m_ImageList;
wxHashTable m_HashTable;
- wxMimeTypesManager m_Mime;
};
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
}
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())
}
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));
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;