Merge branch 'develop' into ryzomclassic-develop

ryzomclassic-develop
kaetemi 4 years ago
commit d0f9685ee8

@ -300,6 +300,13 @@ public:
virtual void serial(bool &b) ;
#ifndef NL_OS_CYGWIN
virtual void serial(char &b) ;
#endif
#ifdef NL_OS_WINDOWS
inline void serial(wchar_t &b)
{
nlctassert(sizeof(wchar_t) == sizeof(uint16));
serial(reinterpret_cast<uint16 &>(b));
}
#endif
virtual void serial(std::string &b) ;
virtual void serial(ucstring &b) ;

@ -546,7 +546,11 @@ template<> struct hash<uint64>
* \typedef ucchar
* An Unicode character (16 bits)
*/
#if defined(NL_OS_WINDOWS)
typedef wchar_t ucchar;
#else
typedef uint16 ucchar;
#endif
#ifndef NL_OVERRIDE
#define NL_OVERRIDE override

@ -30,17 +30,24 @@
* An unicode string class (16 bits per character).
* Add features to convert and assign \c ucstring to \c string and \c string to \c ucstring.
*/
#if defined(NL_OS_WINDOWS)
typedef std::wstring ucstringbase;
#else
typedef std::basic_string<ucchar> ucstringbase;
#endif
class ucstring : public ucstringbase
{
public:
ucstring() { }
ucstring (const ucstringbase &str) : ucstringbase (str) {}
ucstring(const ucstringbase &str)
: ucstringbase(str)
{
}
ucstring (const std::string &str) : ucstringbase ()
ucstring(const std::string &str)
: ucstringbase()
{
rawCopy(str);
}
@ -128,17 +135,7 @@ public:
}
/// Converts the controlled ucstring to a string str
void toString (std::string &str) const
{
str.resize (size ());
for (uint i = 0; i < str.size (); i++)
{
if (operator[](i) > 255)
str[i] = '?';
else
str[i] = (char) operator[](i);
}
}
void toString(std::string &str) const;
/// Converts the controlled ucstring and returns the resulting string
std::string toString() const
@ -149,43 +146,7 @@ public:
}
/// Convert this ucstring (16bits char) into a utf8 string
std::string toUtf8() const
{
std::string res;
ucstring::const_iterator first(begin()), last(end());
for (; first != last; ++first)
{
//ucchar c = *first;
uint nbLoop = 0;
if (*first < 0x80)
res += char(*first);
else if (*first < 0x800)
{
ucchar c = *first;
c = c >> 6;
c = c & 0x1F;
res += char(c) | 0xC0;
nbLoop = 1;
}
else /*if (*first < 0x10000)*/
{
ucchar c = *first;
c = c >> 12;
c = c & 0x0F;
res += char(c) | 0xE0;
nbLoop = 2;
}
for (uint i=0; i<nbLoop; ++i)
{
ucchar c = *first;
c = c >> ((nbLoop - i - 1) * 6);
c = c & 0x3F;
res += char(c) | 0x80;
}
}
return res;
}
std::string toUtf8() const;
ucstring substr(size_type pos = 0, size_type n = npos) const
{
@ -199,86 +160,7 @@ public:
}
/// Convert the utf8 string into this ucstring (16 bits char)
void fromUtf8(const std::string &stringUtf8)
{
// clear the string
erase();
uint8 c;
ucchar code;
sint iterations = 0;
std::string::const_iterator first(stringUtf8.begin()), last(stringUtf8.end());
for (; first != last; )
{
c = *first++;
code = c;
if ((code & 0xFE) == 0xFC)
{
code &= 0x01;
iterations = 5;
}
else if ((code & 0xFC) == 0xF8)
{
code &= 0x03;
iterations = 4;
}
else if ((code & 0xF8) == 0xF0)
{
code &= 0x07;
iterations = 3;
}
else if ((code & 0xF0) == 0xE0)
{
code &= 0x0F;
iterations = 2;
}
else if ((code & 0xE0) == 0xC0)
{
code &= 0x1F;
iterations = 1;
}
else if ((code & 0x80) == 0x80)
{
// If it's not a valid UTF8 string, just copy the line without utf8 conversion
rawCopy(stringUtf8);
return;
}
else
{
push_back(code);
iterations = 0;
}
if (iterations)
{
for (sint i = 0; i < iterations; i++)
{
if (first == last)
{
// If it's not a valid UTF8 string, just copy the line without utf8 conversion
rawCopy(stringUtf8);
return;
}
uint8 ch;
ch = *first ++;
if ((ch & 0xC0) != 0x80)
{
// If it's not a valid UTF8 string, just copy the line without utf8 conversion
rawCopy(stringUtf8);
return;
}
code <<= 6;
code |= (ucchar)(ch & 0x3F);
}
push_back(code);
}
}
}
void fromUtf8(const std::string &stringUtf8);
static ucstring makeFromUtf8(const std::string &stringUtf8)
{
@ -289,19 +171,7 @@ public:
}
private:
void rawCopy(const std::string &str)
{
// We need to convert the char into 8bits unsigned int before promotion to 16 bits
// otherwise, as char are signed on some compiler (MSCV for ex), the sign bit is extended to 16 bits.
resize(str.size());
std::string::const_iterator first(str.begin()), last(str.end());
iterator dest(begin());
for (;first != last; ++first, ++dest)
{
*dest = uint8(*first);
}
}
void rawCopy(const std::string &str);
};
inline ucstring operator+(const ucstringbase &ucstr, ucchar c)
@ -352,13 +222,16 @@ inline ucstring operator+(const std::string &c, const ucstringbase &ucstr)
return ret;
}
namespace NLMISC
{
namespace NLMISC {
// Traits for hash_map using CEntityId
struct CUCStringHashMapTraits
{
enum { bucket_size = 4, min_buckets = 8 };
enum
{
bucket_size = 4,
min_buckets = 8
};
CUCStringHashMapTraits() { }
size_t operator()(const ucstring &id) const
{

@ -1173,7 +1173,7 @@ void D3DWndProc(CDriverD3D *driver, HWND hWnd, UINT message, WPARAM wParam, LPAR
}
}
if (driver->_EventEmitter.getNumEmitters() > 0)
if (driver && driver->_EventEmitter.getNumEmitters() > 0)
{
CWinEventEmitter *we = NLMISC::safe_cast<CWinEventEmitter *>(driver->_EventEmitter.getEmitter(0));
// Process the message by the emitter

@ -1375,6 +1375,7 @@ CVertexBufferHardARB::~CVertexBufferHardARB()
#ifdef NL_DEBUG
if (_VertexPtr)
{
nlassert(_VertexArrayRange);
_VertexArrayRange->_MappedVBList.erase(_IteratorInMappedVBList);
}
#endif

@ -921,7 +921,7 @@ void CRenderTrav::changeVPLightSetupMaterial(const CMaterial &mat, bool exclude
Driver->setUniform4f(IDriver::VertexProgram, program->idxLighted().Diffuse[i], color);
}
nlassert(_VPNumLights < MaxVPLight);
if (i != _VPNumLights)
{
color= _VPLightDiffuse[i] * matDiff;

@ -775,9 +775,9 @@ CTransformShape *CScene::createInstance(const string &shapeName)
// Look if this instance get lightmap information
#if defined(__GNUC__) && __GNUC__ < 3
CMeshBase *pMB = (CMeshBase*)((IShape*)(pTShp->Shape));
CMeshBase *pMB = pTShp ? (CMeshBase*)((IShape*)(pTShp->Shape)) : NULL;
#else // not GNUC
CMeshBase *pMB = dynamic_cast<CMeshBase*>((IShape*)(pTShp->Shape));
CMeshBase *pMB = pTShp ? dynamic_cast<CMeshBase*>((IShape*)(pTShp->Shape)) : NULL;
#endif // not GNUC
CMeshBaseInstance *pMBI = dynamic_cast<CMeshBaseInstance*>( pTShp );
if( ( pMB != NULL ) && ( pMBI != NULL ) )

@ -256,13 +256,13 @@ void CShadowMapManager::renderGenerate(CScene *scene)
garbageShadowTextures(scene);
IDriver *driverForShadowGeneration= scene->getRenderTrav().getAuxDriver();
nlassert(driverForShadowGeneration);
CSmartPtr<NL3D::ITexture> previousRenderTarget = driverForShadowGeneration->getRenderTarget();
// Init
// ********
uint32 wndW= _BlurTextureW, wndH= _BlurTextureH;
// get some text/screen size.
if(driverForShadowGeneration)
driverForShadowGeneration->getWindowSize(wndW, wndH);
uint baseTextureSize= scene->getShadowMapTextureSize();
// Minimize the Dest Texture size, so the blurTexture don't get too heavy in VRAM.

@ -683,8 +683,7 @@ void CShapeBank::reset()
while( scmIt != ShapeCacheNameToShapeCache.end() )
{
CShapeCache *pShpCache = getShapeCachePtrFromShapeCacheName( scmIt->first );
if( pShpCache == NULL )
nlstop; // Should never happen
nlassert(pShpCache);
pShpCache->MaxSize = 0;
checkShapeCache( pShpCache );

@ -121,6 +121,8 @@ void CSurfaceLightGrid::getStaticLightSetup(NLMISC::CRGBA sunAmbient, const CVe
CLightInfluenceInterpolator::CCorner &corner= interp.Corners[y*2 + x];
// For all lights
uint lid;
if (igPointLights)
{
for (lid = 0; lid < CSurfaceLightGrid::NumLightPerCorner; lid++)
{
// get the id of the light in the ig
@ -134,6 +136,7 @@ void CSurfaceLightGrid::getStaticLightSetup(NLMISC::CRGBA sunAmbient, const CVe
corner.Lights[lid] = igPointLights + igLightId;
}
}
}
// Reset Empty slots.
for(; lid<CSurfaceLightGrid::NumLightPerCorner; lid++)
{
@ -152,7 +155,7 @@ void CSurfaceLightGrid::getStaticLightSetup(NLMISC::CRGBA sunAmbient, const CVe
// BiLinear Ambient Contribution.
//-------------
// If FF, then take Sun Ambient => leave color and alpha To 0.
if(cellCorner.LocalAmbientId!=0xFF)
if(igPointLights && cellCorner.LocalAmbientId!=0xFF)
{
CPointLight &pl= igPointLights[cellCorner.LocalAmbientId];
// take current ambient from pointLight

@ -2678,6 +2678,8 @@ void CTessFace::updateBindAndSplit()
}
else
{
nlassert(f0);
nlassert(f1);
// multipatch face case are detected when face->Patch==NULL !!!
if(f0->FLeft && f0->FLeft->Patch==NULL)
{
@ -2710,6 +2712,8 @@ void CTessFace::updateBindAndSplit()
}
else
{
nlassert(f0);
nlassert(f1);
if(f0->FLeft)
{
while(f0->FLeft->isLeaf())
@ -2781,6 +2785,8 @@ void CTessFace::updateBindAndSplit()
{
CTessFace *f;
sint i;
nlassert(f0);
nlassert(f1);
// Same reasoning for rectangular patchs, as above.
for(i=0;i<2;i++)

@ -161,9 +161,15 @@ namespace NLGUI
// ...
limitingParent = limitingParent->getParent();
}
if (limitingParent)
{
getParentContainer()->setW(totalWidth + getParentContainer()->getWReal() - limitingParent->getWReal());
}
else
{
nlwarning("No limiting parent for width");
}
}
// resize H
if (!entries.empty())
@ -178,10 +184,15 @@ namespace NLGUI
CInterfaceGroup *limitingParent = colEnclosing->getParent();
while (limitingParent && (limitingParent->getResizeFromChildH() || dynamic_cast<CGroupList *>(limitingParent)))
limitingParent = limitingParent->getParent();
nlassert(limitingParent);
if (limitingParent)
{
getParentContainer()->setH(col->getH() + getParentContainer()->getHReal() - limitingParent->getHReal());
}
else
{
nlwarning("No limiting parent for height");
}
}
}
}

@ -50,7 +50,7 @@ void xmlCheckNodeName (xmlNodePtr &node, const char *nodeName)
// Make an error message
char tmp[512];
smprintf (tmp, 512, "LogicStateMachine STATE_MACHINE XML Syntax error in block line %d, node %s should be %s",
node ? (int)node->line:-1, node->name, nodeName);
node ? (int)node->line:-1, node ? (const char *)node->name : "NULL", nodeName);
nlinfo (tmp);
nlstop;

@ -75,7 +75,7 @@ CBigFile::CHandleFile &CBigFile::CThreadFileArray::get(uint32 index)
// if the vector is not allocated, allocate it (empty entries filled with NULL => not opened FILE* in this thread)
if(index>=ptr->size())
{
ptr->resize(index+1);
ptr->resize((ptrdiff_t)index + 1);
}
return (*ptr)[index];
@ -278,11 +278,13 @@ bool CBigFile::BNP::readHeader(FILE *file)
}
char sFileName[256];
if (nStringSize)
{
if (fread(sFileName, 1, nStringSize, file) != nStringSize)
{
return false;
}
}
sFileName[nStringSize] = 0;
uint32 nFileSize2;

@ -4325,7 +4325,7 @@ void CBitmap::blend(CBitmap &Bm0, CBitmap &Bm1, uint16 factor, bool inputBitmapI
else
#endif //#ifdef NL_OS_WINDOWS
{
uint8 *endPix = dest + (numPix << 2);
uint8 *endPix = dest + ((ptrdiff_t)numPix << 2);
// no mmx version
uint blendFact = (uint) factor;
uint invblendFact = 256 - blendFact;

@ -215,7 +215,7 @@ void CCDBNodeBranch::init( xmlNodePtr node, IProgressCallback &progressCallBack,
else
{
if (!_Nodes.empty())
for ( _IdBits=1; _Nodes.size() > unsigned(1<<_IdBits) ; _IdBits++ ) {}
for ( _IdBits=1; _Nodes.size() > ((size_t)1 <<_IdBits) ; _IdBits++ ) {}
else
_IdBits = 0;
}

@ -807,6 +807,8 @@ public:
DWORD symSize = 10000;
PIMAGEHLP_SYMBOL sym = (PIMAGEHLP_SYMBOL) GlobalAlloc (GMEM_FIXED, symSize);
if (!sym) return str;
::ZeroMemory (sym, symSize);
sym->SizeOfStruct = symSize;
sym->MaxNameLength = symSize - sizeof(IMAGEHLP_SYMBOL);

@ -773,7 +773,7 @@ CEvalNumExpr::TReturnState CEvalNumExpr::evalExpression (double &finalResult, TT
case Exponent:
{
int exponent;
frexp( arg0, &exponent);
(void)frexp( arg0, &exponent);
value = (double)exponent;
}
break;
@ -1032,13 +1032,13 @@ CEvalNumExpr::TReturnState CEvalNumExpr::evalExpression (double &finalResult, TT
v0 -= v1;
break;
case ULeftShift:
v0 = (double)(((uint)floor (v0 + 0.5))<<((uint)floor (v1 + 0.5)));
v0 = (double)(uint)(((uint)floor (v0 + 0.5))<<((uint)floor (v1 + 0.5)));
break;
case URightShift:
v0 = (double)(((uint)floor (v0 + 0.5))>>((uint)floor (v1 + 0.5)));
break;
case SLeftShift:
v0 = (double)(((sint)floor (v0 + 0.5))<<((sint)floor (v1 + 0.5)));
v0 = (double)(sint)(((sint)floor (v0 + 0.5))<<((sint)floor (v1 + 0.5)));
break;
case SRightShift:
v0 = (double)(((sint)floor (v0 + 0.5))>>((sint)floor (v1 + 0.5)));

@ -339,7 +339,10 @@ std::string CI18N::getSystemLanguageCode ()
typedef int (WINAPI* GetUserDefaultLocaleNamePtr)(LPWSTR lpLocaleName, int cchLocaleName);
// get pointer on GetUserDefaultLocaleName, kernel32.dll is always in memory so no need to call LoadLibrary
GetUserDefaultLocaleNamePtr nlGetUserDefaultLocaleName = (GetUserDefaultLocaleNamePtr)GetProcAddress(GetModuleHandleA("kernel32.dll"), "GetUserDefaultLocaleName");
HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");
if (hKernel32)
{
GetUserDefaultLocaleNamePtr nlGetUserDefaultLocaleName = (GetUserDefaultLocaleNamePtr)GetProcAddress(hKernel32, "GetUserDefaultLocaleName");
// only use it if found
if (nlGetUserDefaultLocaleName)
@ -356,6 +359,7 @@ std::string CI18N::getSystemLanguageCode ()
_SystemLanguageCode = lang.substr(0, 2);
}
}
}
#endif
// use system locale (works under OS X, Linux and Windows)

@ -58,6 +58,8 @@ static string getFuncInfo (DWORD_TYPE funcAddr, DWORD_TYPE stackAddr)
DWORD symSize = 10000;
PIMAGEHLP_SYMBOL sym = (PIMAGEHLP_SYMBOL) GlobalAlloc (GMEM_FIXED, symSize);
if (!sym) return str;
::ZeroMemory (sym, symSize);
sym->SizeOfStruct = symSize;
sym->MaxNameLength = symSize - sizeof(IMAGEHLP_SYMBOL);

@ -72,10 +72,11 @@ void *CObjectArenaAllocator::alloc(uint size)
{
// use standard allocator
nlctassert(NL_DEFAULT_MEMORY_ALIGNMENT >= sizeof(uint));
uint8 *block = (uint8 *)aligned_malloc(NL_DEFAULT_MEMORY_ALIGNMENT + size, NL_DEFAULT_MEMORY_ALIGNMENT); //new uint8[size + sizeof(uint)]; // an additionnal uint is needed to store size of block
if (!block) return NULL;
uint8 *block = (uint8 *)aligned_malloc(NL_DEFAULT_MEMORY_ALIGNMENT + (ptrdiff_t)size, NL_DEFAULT_MEMORY_ALIGNMENT); //new uint8[size + sizeof(uint)]; // an additionnal uint is needed to store size of block
if (!block) throw std::bad_alloc();
#ifdef NL_DEBUG
_MemBlockToAllocID[block] = _AllocID;
++_AllocID;
#endif
*(uint *) block = size;
return block + NL_DEFAULT_MEMORY_ALIGNMENT;
@ -87,12 +88,10 @@ void *CObjectArenaAllocator::alloc(uint size)
_ObjectSizeToAllocator[entry] = new CFixedSizeAllocator(entry * _Granularity + NL_DEFAULT_MEMORY_ALIGNMENT, _MaxAllocSize / size); // an additionnal uint is needed to store size of block
}
void *block = _ObjectSizeToAllocator[entry]->alloc();
if (!block) throw std::bad_alloc();
nlassert(((uintptr_t)block % NL_DEFAULT_MEMORY_ALIGNMENT) == 0);
#ifdef NL_DEBUG
if (block)
{
_MemBlockToAllocID[block] = _AllocID;
}
++_AllocID;
#endif
*(uint *)block = size;

@ -1341,11 +1341,14 @@ void CFileContainer::addSearchBigFile (const string &sBigFilename, bool recurse,
fclose(Handle);
return;
}
if (nStringSize)
{
if (fread(FileName, 1, nStringSize, Handle) != nStringSize)
{
fclose(Handle);
return;
}
}
FileName[nStringSize] = 0;
uint32 nFileSize2;
if (fread (&nFileSize2, sizeof(uint32), 1, Handle) != 1)

@ -173,7 +173,7 @@ bool unpack7Zip(const std::string &sevenZipFile, const std::string &destFileName
filename.resize(nameLen);
// write filename into ucstring
SzArEx_GetFileNameUtf16(&db, 0, &filename[0]);
SzArEx_GetFileNameUtf16(&db, 0, reinterpret_cast<UInt16 *>(&filename[0]));
// write the extracted file
FILE *outputHandle = nlfopen(destFileName, "wb+");

@ -244,7 +244,7 @@ std::wstring utf8ToWide(const char *str, size_t len)
#if defined(NL_OS_WINDOWS)
return winCpToWide(str, len, CP_UTF8);
#else
// TODO: UTF-32 to UTF-8
// TODO: UTF-8 to UTF-32
nlassert(false);
#endif
}

@ -173,7 +173,8 @@ bool CSystemUtils::copyTextToClipboard(const ucstring &text)
{
// create a lock on this buffer
void *hLock = GlobalLock(mem);
if (hLock)
{
// copy text to this buffer
if (isUnicode)
wcscpy((wchar_t *)hLock, (const wchar_t *)text.c_str());
@ -191,6 +192,7 @@ bool CSystemUtils::copyTextToClipboard(const ucstring &text)
res = true;
}
}
CloseClipboard();
}

@ -0,0 +1,181 @@
// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// 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 <http://www.gnu.org/licenses/>.
#include "stdmisc.h"
#include "nel/misc/ucstring.h"
void ucstring::toString(std::string &str) const
{
str.resize(size());
for (uint i = 0; i < str.size(); i++)
{
if (operator[](i) > 255)
str[i] = '?';
else
str[i] = (char)operator[](i);
}
}
std::string ucstring::toUtf8() const
{
#if defined(NL_OS_WINDOWS)
// Use OS implementation
nlctassert(sizeof(wchar_t) == sizeof(ucchar));
nlctassert(sizeof(wchar_t) == sizeof(uint16));
return NLMISC::wideToUtf8(static_cast<const std::wstring &>(*this));
#else
std::string res;
ucstring::const_iterator first(begin()), last(end());
for (; first != last; ++first)
{
//ucchar c = *first;
uint nbLoop = 0;
if (*first < 0x80)
res += char(*first);
else if (*first < 0x800)
{
ucchar c = *first;
c = c >> 6;
c = c & 0x1F;
res += char(c) | 0xC0;
nbLoop = 1;
}
else /*if (*first < 0x10000)*/
{
ucchar c = *first;
c = c >> 12;
c = c & 0x0F;
res += char(c) | 0xE0;
nbLoop = 2;
}
for (uint i = 0; i < nbLoop; ++i)
{
ucchar c = *first;
c = c >> ((nbLoop - i - 1) * 6);
c = c & 0x3F;
res += char(c) | 0x80;
}
}
return res;
#endif
}
void ucstring::fromUtf8(const std::string &stringUtf8)
{
#if defined(NL_OS_WINDOWS)
// Use OS implementation
nlctassert(sizeof(wchar_t) == sizeof(ucchar));
nlctassert(sizeof(wchar_t) == sizeof(uint16));
nlctassert(sizeof(std::wstring) == sizeof(ucstring)); // These can be swapped on Windows
static_cast<std::wstring &>(*this) = nlmove(NLMISC::utf8ToWide(stringUtf8));
if (stringUtf8.size() && !size())
rawCopy(stringUtf8);
#else
// clear the string
erase();
uint8 c;
ucchar code;
sint iterations = 0;
std::string::const_iterator first(stringUtf8.begin()), last(stringUtf8.end());
for (; first != last;)
{
c = *first++;
code = c;
if ((code & 0xFE) == 0xFC)
{
code &= 0x01;
iterations = 5;
}
else if ((code & 0xFC) == 0xF8)
{
code &= 0x03;
iterations = 4;
}
else if ((code & 0xF8) == 0xF0)
{
code &= 0x07;
iterations = 3;
}
else if ((code & 0xF0) == 0xE0)
{
code &= 0x0F;
iterations = 2;
}
else if ((code & 0xE0) == 0xC0)
{
code &= 0x1F;
iterations = 1;
}
else if ((code & 0x80) == 0x80)
{
// If it's not a valid UTF8 string, just copy the line without utf8 conversion
rawCopy(stringUtf8);
return;
}
else
{
push_back(code);
iterations = 0;
}
if (iterations)
{
for (sint i = 0; i < iterations; i++)
{
if (first == last)
{
// If it's not a valid UTF8 string, just copy the line without utf8 conversion
rawCopy(stringUtf8);
return;
}
uint8 ch;
ch = *first++;
if ((ch & 0xC0) != 0x80)
{
// If it's not a valid UTF8 string, just copy the line without utf8 conversion
rawCopy(stringUtf8);
return;
}
code <<= 6;
code |= (ucchar)(ch & 0x3F);
}
push_back(code);
}
}
#endif
}
void ucstring::rawCopy(const std::string &str)
{
// We need to convert the char into 8bits unsigned int before promotion to 16 bits
// otherwise, as char are signed on some compiler (MSCV for ex), the sign bit is extended to 16 bits.
resize(str.size());
std::string::const_iterator first(str.begin()), last(str.end());
iterator dest(begin());
for (; first != last; ++first, ++dest)
{
*dest = uint8(*first);
}
}
/* end of file */

@ -209,11 +209,11 @@ void CWinThread::start ()
ThreadHandle = (void *) ::CreateThread (NULL, 0, ProxyFunc, this, 0, (DWORD *)&ThreadId);
// nldebug("NLMISC: thread %x started for runnable '%x'", typeid( Runnable ).name());
// OutputDebugString(toString(NL_LOC_MSG " NLMISC: thread %x started for runnable '%s'\n", ThreadId, typeid( *Runnable ).name()).c_str());
SetThreadPriorityBoost (ThreadHandle, TRUE); // FALSE == Enable Priority Boost
if (ThreadHandle == NULL)
{
throw EThread ( "Cannot create new thread" );
}
SetThreadPriorityBoost (ThreadHandle, TRUE); // FALSE == Enable Priority Boost
_SuspendCount = 0;
}

@ -1229,6 +1229,7 @@ class CHandlerEnterTell : public IActionHandler
{
CGroupContainer *pGC = pCGW->createFreeTeller(receiver);
if (pGC != NULL)
{
pGC->setActive(true);
CGroupEditBox *eb = dynamic_cast<CGroupEditBox *>(pGC->getGroup("eb"));
if (eb)
@ -1237,6 +1238,7 @@ class CHandlerEnterTell : public IActionHandler
}
}
}
}
};
REGISTER_ACTION_HANDLER( CHandlerEnterTell, "enter_tell");

@ -917,6 +917,7 @@ void CContinent::unselect()
// Setup the Root scene.
if (BackgroundIG)
{
nlassert(SceneRoot);
BackgroundIG->removeFromScene (*SceneRoot);
SceneRoot->deleteInstanceGroup (BackgroundIG);
BackgroundIG = NULL;

@ -101,7 +101,7 @@ bool CForageSourceCL::build( const CEntitySheet *sheet )
const CForageSourceSheet *forageSourceSheet = dynamic_cast<const CForageSourceSheet*>(sheet);
if ( ! forageSourceSheet )
{
nlwarning( "Bad sheet %s for forage source", sheet->Id.toString().c_str() );
nlwarning( "Bad sheet %s for forage source", sheet ? sheet->Id.toString().c_str() : "NULL" );
return false;
}
if ( ! setFx( forageSourceSheet->FxFilename ) )

@ -75,7 +75,7 @@ bool CFxCL::build( const CEntitySheet *sheet )
if ( (! _FXSheet) || (_FXSheet->PSList.empty()) )
{
_BadBuild = true;
nlwarning( "Bad sheet %s for fx", sheet->Id.toString().c_str() );
nlwarning( "Bad sheet %s for fx", sheet ? sheet->Id.toString().c_str() : "NULL" );
return false;
}

@ -1334,7 +1334,7 @@ class CSelectItemSheet : public IActionHandler
// check if user has the level to use the item (applies to item & plans)
if (ctrlSheet->getSheetCategory() == CDBCtrlSheet::Item)
{
if (csg->getName() == "buy_selection")
if (csg && csg->getName() == "buy_selection")
{
const CItemSheet *is = ctrlSheet->asItemSheet();
if (is)

@ -1191,6 +1191,8 @@ public:
if( pPM->avoidCyclicForPhrase(phraseCom) )
cyclic= false;
if (UserEntity)
{
// **** Launch the cast
// Cast only if their is a target, or if it is not a combat action
CEntityCL *target = EntitiesMngr.entity(UserEntity->targetSlot());
@ -1245,6 +1247,7 @@ public:
}
}
}
}
};
REGISTER_ACTION_HANDLER( CHandlerCastPhrase, "cast_phrase");
sint64 CHandlerCastPhrase::LastHitTime= 0;

@ -475,7 +475,7 @@ bool CDBGroupListSheetTrade::CSheetChildTrade::isSheetValid(CDBGroupListSheetTex
if ((pIS != NULL) && (!pIS->DropOrSell))
return false;
// test if this whole family of items can be sold
if( !ITEMFAMILY::isSellableByPlayer(pIS->Family) )
if((pIS != NULL) && !ITEMFAMILY::isSellableByPlayer(pIS->Family) )
return false;
}

@ -2981,10 +2981,10 @@ void CInterfaceManager::log(const ucstring &str, const std::string &cat)
{
const string finalString = string(NLMISC::IDisplayer::dateToHumanString()) + " (" + NLMISC::toUpper(cat) + ") * " + str.toUtf8();
fprintf(f, "%s\n", finalString.c_str());
}
fclose(f);
}
}
}
// ***************************************************************************
void CInterfaceManager::clearAllEditBox()

@ -3576,14 +3576,13 @@ void CSPhraseManager::updatePhraseProgressionDB()
break;
}
}
}
// if show, but only if full learnt, skip it if not fully learnt
if (phrase->ShowInAPOnlyIfLearnt && !known)
{
continue;
}
}
// fill with the phrase id

@ -1211,9 +1211,10 @@ void initShardDisplay()
{
CCtrlButton *pCB = dynamic_cast<CCtrlButton*>(CWidgetManager::getInstance()->getElementFromId(GROUP_LIST_SHARD ":s0:but"));
if (pCB != NULL)
{
pCB->setPushed(true);
CAHManager::getInstance()->runActionHandler(pCB->getActionOnLeftClick(), pCB, pCB->getParamsOnLeftClick());
}
}
pList->invalidateCoords();
}

@ -98,7 +98,7 @@ protected:
{
CGroupMap *gm = CTool::getWorldMap();
if (!gm) dest = CVector::Null;
gm->worldToWindow(dest, src);
else gm->worldToWindow(dest, src);
}
};

@ -2227,6 +2227,7 @@ void CClientEditionModule::addToSaveList(const std::string& filename, const std:
if (!ok)
{
delete sv;
return;
}
else
{

@ -6302,7 +6302,7 @@ CInstance *CEditor::getInstanceUnderPos(float x, float y, float distSelection, b
objectSelected= precInstanceUnderPos->getDisplayerVisual();
}
if (objectSelected->getSelectionType() == ISelectableObject::GroundProjected)
if (objectSelected && objectSelected->getSelectionType() == ISelectableObject::GroundProjected)
{
if (borderSelected && borderSelected != objectSelected)
{

@ -202,7 +202,7 @@ CCtrlPolygon *CPrimRender::newCtrlPolygon() const
{
CGroupMap *gm = CTool::getWorldMap();
if (!gm) dest = CVector::Null;
gm->worldToWindow(dest, src);
else gm->worldToWindow(dest, src);
}
};
CViewBase::TCtorParam param;

@ -204,7 +204,7 @@ CTimedFXManager::TFXGroupHandle CTimedFXManager::add(const std::vector<CTimedFX>
//sint32 debugDay;
if (!(fi.FXSheet && fi.FXSheet->Mode == CSeasonFXSheet::AlwaysStarted))
{
if (fi.FXSheet->Mode == CSeasonFXSheet::Spawn)
if (fi.FXSheet && fi.FXSheet->Mode == CSeasonFXSheet::Spawn)
{
// compute next spawn date
float cycleLength = fi.FXSheet ? fi.FXSheet->CycleDuration : _DayLength;

@ -37,7 +37,7 @@ CWeatherFunction::CWeatherFunction()
void CWeatherFunction::buildFromSheet(const CWeatherFunctionSheet &sheet, const CWeatherManager &wm)
{
// copy common part of objects (parameters)
*static_cast<CWeatherFunctionParameters *>(this) = *static_cast<const CWeatherFunctionParameters *>(&sheet);
static_cast<CWeatherFunctionParameters &>(*this) = static_cast<const CWeatherFunctionParameters &>(sheet);
// get pointer on the setup from their names
_WeatherSetups.resize(sheet.SetupNames.size());
nlassert(sheet.SetupWeights.size() == sheet.SetupNames.size());

@ -53,7 +53,7 @@ public:
static void releaseInstance();
public:
typedef struct
typedef struct TElement
{
uint32 Index;
NLMISC::CSheetId SheetId;
@ -66,7 +66,7 @@ public:
}
} TElement;
typedef struct
typedef struct TElementList
{
// elements list for a visual slot.
std::vector<TElement> Element;

Loading…
Cancel
Save