#include "stdafx.h" #include "ColourTesterImageCtrl.h" #include "ColourTester.h" #ifdef _MSC_VER # ifndef NDEBUG # pragma comment(lib, "DevIL_DBG.lib") # pragma comment(lib, "DevILU_DBG.lib") # else # pragma comment(lib, "DevIL.lib") # pragma comment(lib, "DevILU.lib") # endif #endif #include "IL/il.h" #include "IL/ilu.h" BEGIN_EVENT_TABLE(ColourTesterImageCtrl, wxWindow) EVT_PAINT(ColourTesterImageCtrl::OnPaint) END_EVENT_TABLE() ColourTesterImageCtrl::ColourTesterImageCtrl(wxWindow* parent) : wxWindow(parent, wxID_ANY), m_Valid(false), m_ZoomAmount(1) { m_Colour[0] = 255; m_Colour[1] = 0; m_Colour[2] = 0; ilInit(); ilGenImages(1, (ILuint*)&m_OriginalImage); ilSetInteger(IL_KEEP_DXTC_DATA, IL_TRUE); } void ColourTesterImageCtrl::SetImageFile(const wxFileName& fn) { ilBindImage(m_OriginalImage); ilOriginFunc(IL_ORIGIN_UPPER_LEFT); ilEnable(IL_ORIGIN_SET); if (! ilLoadImage((TCHAR*)fn.GetFullPath().c_str())) { m_Valid = false; Refresh(); return; } m_Valid = true; m_DxtcFormat = ilGetInteger(IL_DXTC_DATA_FORMAT); ilConvertImage(IL_RGBA, IL_UNSIGNED_BYTE); // TODO: Check for IL errors { // I'm too lazy to add zoom buttons, so just use 2x zoom for <=256x256 images ILinfo info; iluGetImageInfo(&info); if (info.Width <= 256 && info.Height <= 256) m_ZoomAmount = 2; else m_ZoomAmount = 1; } CalculateImage(); // Send an event to indicate that the image has changed, so that // the status-bar text can be updated wxCommandEvent evt(wxEVT_MY_IMAGE_CHANGED); evt.SetEventObject(this); evt.SetString(fn.GetFullPath()); GetEventHandler()->ProcessEvent(evt); } wxString ColourTesterImageCtrl::GetImageFiletype() { wxString fmt = _("Not DXTC"); switch (ilGetInteger(IL_DXTC_DATA_FORMAT)) { case IL_DXT1: fmt = _T("DXT1"); break; case IL_DXT2: fmt = _T("DXT2"); break; case IL_DXT3: fmt = _T("DXT3"); break; case IL_DXT4: fmt = _T("DXT4"); break; case IL_DXT5: fmt = _T("DXT5"); break; } return wxString::Format(_T("%s - %dx%d"), fmt, ilGetInteger(IL_IMAGE_WIDTH), ilGetInteger(IL_IMAGE_HEIGHT)); } void ColourTesterImageCtrl::SetColour(const wxColour& colour) { m_Colour[0] = colour.Red(); m_Colour[1] = colour.Green(); m_Colour[2] = colour.Blue(); CalculateImage(); } void ColourTesterImageCtrl::SetZoom(int amount) { m_ZoomAmount = amount; CalculateImage(); } void ColourTesterImageCtrl::CalculateImage() { if (! m_Valid) return; ilBindImage(m_OriginalImage); ILubyte* data = ilGetData(); ILinfo info; iluGetImageInfo(&info); wxASSERT(info.Bpp == 4); unsigned char* newData = (unsigned char*)malloc(info.Width*info.Height*3); // wxImage desires malloc, not new[] for (ILubyte *p0 = data, *p1 = newData; p0 < data+info.Width*info.Height*4; p0 += 4, p1 += 3) { // Interpolate between texture and texture*colour, so // new = old*alpha + old*colour*(1-alpha) float alpha = p0[3]/255.f; p1[0] = p0[0]*alpha + p0[0]*m_Colour[0]*(1.f-alpha)/255.f; p1[1] = p0[1]*alpha + p0[1]*m_Colour[1]*(1.f-alpha)/255.f; p1[2] = p0[2]*alpha + p0[2]*m_Colour[2]*(1.f-alpha)/255.f; } m_FinalImage.SetData(newData, info.Width, info.Height); if (m_ZoomAmount != 1) m_FinalImage = m_FinalImage.Scale(info.Width*m_ZoomAmount, info.Height*m_ZoomAmount); m_FinalBitmap = wxBitmap(m_FinalImage); Refresh(); } void ColourTesterImageCtrl::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); dc.Clear(); if (m_Valid && m_FinalBitmap.Ok()) dc.DrawBitmap(m_FinalBitmap, 0, 0); }