-class wxFileIconEntry : public wxObject
-{
-public:
- wxFileIconEntry(int i) { id = i; }
-
- int id;
-};
-
-
-class wxFileIconsTable
-{
-public:
- wxFileIconsTable();
-
- int GetIconID(const wxString& extension, const wxString& mime = wxEmptyString);
- wxImageList *GetImageList() { return &m_ImageList; }
-
-protected:
- wxImageList m_ImageList;
- wxHashTable m_HashTable;
-};
-
-static wxFileIconsTable *g_IconsTable = NULL;
-
-#define FI_FOLDER 0
-#define FI_UNKNOWN 1
-#define FI_EXECUTABLE 2
-
-wxFileIconsTable::wxFileIconsTable() :
- m_ImageList(16, 16),
- m_HashTable(wxKEY_STRING)
-{
- m_HashTable.DeleteContents(TRUE);
- // FI_FOLDER:
- m_ImageList.Add(wxArtProvider::GetBitmap(wxART_FOLDER, wxART_CMN_DIALOG));
- // FI_UNKNOWN:
- m_ImageList.Add(wxArtProvider::GetBitmap(wxART_NORMAL_FILE, wxART_CMN_DIALOG));
- // FI_EXECUTABLE:
- if (GetIconID(wxEmptyString, _T("application/x-executable")) == FI_UNKNOWN)
- {
- m_ImageList.Add(wxArtProvider::GetBitmap(wxART_EXECUTABLE_FILE, wxART_CMN_DIALOG));
- m_HashTable.Delete(_T("exe"));
- m_HashTable.Put(_T("exe"), new wxFileIconEntry(FI_EXECUTABLE));
- }
- /* else put into list by GetIconID
- (KDE defines application/x-executable for *.exe and has nice icon)
- */
-}
-
-
-
-#if wxUSE_MIMETYPE
-// VS: we don't need this function w/o wxMimeTypesManager because we'll only have
-// one icon and we won't resize it
-
-static wxBitmap CreateAntialiasedBitmap(const wxImage& img)
-{
- wxImage smallimg (16, 16);
- unsigned char *p1, *p2, *ps;
- unsigned char mr = img.GetMaskRed(),
- mg = img.GetMaskGreen(),
- mb = img.GetMaskBlue();
-
- unsigned x, y;
- unsigned sr, sg, sb, smask;
-
- p1 = img.GetData(), p2 = img.GetData() + 3 * 32, ps = smallimg.GetData();
- smallimg.SetMaskColour(mr, mr, mr);
-
- for (y = 0; y < 16; y++)
- {
- for (x = 0; x < 16; x++)
- {
- sr = sg = sb = smask = 0;
- if (p1[0] != mr || p1[1] != mg || p1[2] != mb)
- sr += p1[0], sg += p1[1], sb += p1[2];
- else smask++;
- p1 += 3;
- if (p1[0] != mr || p1[1] != mg || p1[2] != mb)
- sr += p1[0], sg += p1[1], sb += p1[2];
- else smask++;
- p1 += 3;
- if (p2[0] != mr || p2[1] != mg || p2[2] != mb)
- sr += p2[0], sg += p2[1], sb += p2[2];
- else smask++;
- p2 += 3;
- if (p2[0] != mr || p2[1] != mg || p2[2] != mb)
- sr += p2[0], sg += p2[1], sb += p2[2];
- else smask++;
- p2 += 3;
-
- if (smask > 2)
- ps[0] = ps[1] = ps[2] = mr;
- else
- ps[0] = sr >> 2, ps[1] = sg >> 2, ps[2] = sb >> 2;
- ps += 3;
- }
- p1 += 32 * 3, p2 += 32 * 3;
- }
-
- return wxBitmap(smallimg);
-}
-
-// 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));
-}
-#endif // wxUSE_MIMETYPE
-
-
-
-int wxFileIconsTable::GetIconID(const wxString& extension, const wxString& mime)