// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
// icon_wnd.cpp: implementation of the CIconWnd class.
//
#include "stdafx.h"
#include "georges_edit.h"
#include "icon_wnd.h"
#include "nel/misc/path.h"
#include "nel/misc/file.h"
#include "nel/misc/bitmap.h"
using namespace NLMISC;
using namespace std;
string CIconWnd::IconPath;
CIconWnd::CIconWnd()
{
pWndIcon = NULL;
pWndIconColor = NULL;
pWndIconBack = NULL;
pWndIconBackColor = NULL;
pWndIconOver = NULL;
pWndIconOverColor = NULL;
pWndIconOver2 = NULL;
pWndIconOver2Color = NULL;
}
CIconWnd::~CIconWnd()
{
}
BEGIN_MESSAGE_MAP(CIconWnd, CWnd)
//{{AFX_MSG_MAP(CIconWnd)
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CIconWnd::OnPaint()
{
CPaintDC dc(this);
// update data
if (updateStr())
updateIcon();
// Get client dc
RECT client;
GetClientRect(&client);
dc.Rectangle(&client);
for (uint y=0 ; yasString();
for (uint i=0 ; isize() ; i++)
CPath::addSearchPath(var->asString(i), true, false, NULL);
}
else
{
nlinfo("!! IconPath missing in .cfg, Please complete the config file !!");
IconPath = "\\\\amiga\\3d\\Database\\Interfaces\\";
nlinfo("default to : IconPath = \"\\\\amiga\\3d\\Database\\Interfaces\\\"");
CPath::addSearchPath(IconPath, true, false, NULL);
}
}
NLMISC::CBitmap icon;
NLMISC::CRGBA color;
bitmap.reset();
bitmap.convertToType(NLMISC::CBitmap::RGBA);
bitmap.resample(40, 40);
// back icon
if (loadIcon(strIconBack, icon))
{
// back icon color
if (getColorFromStr(strIconBackColor, color))
modulateIcon(icon, color);
bitmap = icon;
// base icon
addIconLayer(bitmap, strIcon, strIconColor);
}
else
{
// base icon
loadIcon(strIcon, icon);
// base icon color
if (getColorFromStr(strIconColor, color))
modulateIcon(icon, color);
bitmap = icon;
}
// overlay icon
addIconLayer(bitmap, strIconOver, strIconOverColor);
// overlay 2 icon
addIconLayer(bitmap, strIconOver2, strIconOver2Color);
}
bool CIconWnd::loadIcon(const std::string &filename, NLMISC::CBitmap &bmp)
{
// Try to get the file path
string filepath = CPath::lookup(filename, false, false);
if (filepath == "")
{
bmp.makeDummy();
bmp.convertToType(NLMISC::CBitmap::RGBA);
bmp.resample(40, 40);
return false;
}
// load icon
CIFile f;
f.open(filepath);
bmp.load(f);
bmp.convertToType(NLMISC::CBitmap::RGBA);
bmp.resample(40, 40);
f.close();
return true;
}
bool CIconWnd::getColorFromStr(const std::string &s, NLMISC::CRGBA &c)
{
// Convert string to color
sint r, g, b;
if (sscanf (s.c_str(), "%d,%d,%d", &r, &g, &b) == 3)
{
clamp (r, 0, 255);
clamp (g, 0, 255);
clamp (b, 0, 255);
c = CRGBA(r, g, b);
return true;
}
return false;
}
void CIconWnd::blendIcons(NLMISC::CBitmap &dst, const NLMISC::CBitmap &src)
{
// blend between two icons
nlassert(dst.getWidth() == src.getWidth());
nlassert(dst.getHeight() == src.getHeight());
CObjectVector &data = dst.getPixels();
for (uint y=0 ; y &data = dst.getPixels();
for (uint y=0 ; yGetWindowText(buffer, 512);
std::string buf = tStrToUtf8(buffer);
if (buf != str)
{
str = buf;
return true;
}
}
return false;
}