From 316e3395adec1fea9965317339a4641620979eaa Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Wed, 26 Oct 2016 12:08:03 +0300 Subject: [PATCH 1/3] Fixed crash on loading multipatch texture with height of 256 http://forum.zdoom.org/viewtopic.php?t=53953 --- src/textures/multipatchtexture.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/textures/multipatchtexture.cpp b/src/textures/multipatchtexture.cpp index cb2d5d803..e1e6faf3e 100644 --- a/src/textures/multipatchtexture.cpp +++ b/src/textures/multipatchtexture.cpp @@ -297,8 +297,6 @@ FMultiPatchTexture::FMultiPatchTexture (const void *texdef, FPatchLookup *patchl Printf ("Texture %s is left without any patches\n", Name.GetChars()); } - CheckForHacks (); - DefinitionLump = deflumpnum; } @@ -1370,6 +1368,8 @@ void FMultiPatchTexture::ResolvePatches() delete[] Inits; Inits = nullptr; + CheckForHacks(); + // If this texture is just a wrapper around a single patch, we can simply // forward GetPixels() and GetColumn() calls to that patch. From 28fefdabc76efef99d81f53e63552a9e570b6786 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 26 Oct 2016 11:56:15 +0200 Subject: [PATCH 2/3] - added a 'listall' option to FTextureManager::ListTextures, so that the multipatchtexture lookup can find multiple older versions with the same use type. This fixes an issue with DUMP 2 which looked for patches of the same name as the texture currently being defined and where the patches had the same use type as the composite texture. The function as implemented would only find the newly added composite and print an error. --- src/textures/multipatchtexture.cpp | 2 +- src/textures/texturemanager.cpp | 13 ++++++++----- src/textures/textures.h | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/textures/multipatchtexture.cpp b/src/textures/multipatchtexture.cpp index e1e6faf3e..12cc02ea9 100644 --- a/src/textures/multipatchtexture.cpp +++ b/src/textures/multipatchtexture.cpp @@ -1324,7 +1324,7 @@ void FMultiPatchTexture::ResolvePatches() if (texno == id) // we found ourselves. Try looking for another one with the same name which is not a multipatch texture itself. { TArray list; - TexMan.ListTextures(Inits[i].TexName, list); + TexMan.ListTextures(Inits[i].TexName, list, true); for (int i = list.Size() - 1; i >= 0; i--) { if (list[i] != id && !TexMan[list[i]]->bMultiPatch) diff --git a/src/textures/texturemanager.cpp b/src/textures/texturemanager.cpp index 07ed71a3b..aa760c221 100644 --- a/src/textures/texturemanager.cpp +++ b/src/textures/texturemanager.cpp @@ -267,7 +267,7 @@ FTextureID FTextureManager::CheckForTexture (const char *name, int usetype, BITF // //========================================================================== -int FTextureManager::ListTextures (const char *name, TArray &list) +int FTextureManager::ListTextures (const char *name, TArray &list, bool listall) { int i; @@ -293,11 +293,14 @@ int FTextureManager::ListTextures (const char *name, TArray &list) // NULL textures must be ignored. if (tex->UseType!=FTexture::TEX_Null) { - unsigned int j; - for(j = 0; j < list.Size(); j++) + unsigned int j = list.Size(); + if (!listall) { - // Check for overriding definitions from newer WADs - if (Textures[list[j].GetIndex()].Texture->UseType == tex->UseType) break; + for (j = 0; j < list.Size(); j++) + { + // Check for overriding definitions from newer WADs + if (Textures[list[j].GetIndex()].Texture->UseType == tex->UseType) break; + } } if (j==list.Size()) list.Push(FTextureID(i)); } diff --git a/src/textures/textures.h b/src/textures/textures.h index 407500f18..064610f50 100644 --- a/src/textures/textures.h +++ b/src/textures/textures.h @@ -350,7 +350,7 @@ public: FTextureID CheckForTexture (const char *name, int usetype, BITFIELD flags=TEXMAN_TryAny); FTextureID GetTexture (const char *name, int usetype, BITFIELD flags=0); - int ListTextures (const char *name, TArray &list); + int ListTextures (const char *name, TArray &list, bool listall = false); void AddTexturesLump (const void *lumpdata, int lumpsize, int deflumpnum, int patcheslump, int firstdup=0, bool texture1=false); void AddTexturesLumps (int lump1, int lump2, int patcheslump); From 5309209039be90040306786a6e0478fcd9389227 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Wed, 26 Oct 2016 12:03:28 +0200 Subject: [PATCH 3/3] - print a developer warning if the texture manager had to resolve a circular reference. --- src/textures/multipatchtexture.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/textures/multipatchtexture.cpp b/src/textures/multipatchtexture.cpp index 12cc02ea9..860c59b3a 100644 --- a/src/textures/multipatchtexture.cpp +++ b/src/textures/multipatchtexture.cpp @@ -1338,6 +1338,11 @@ void FMultiPatchTexture::ResolvePatches() if (Inits[i].HasLine) Inits[i].sc.Message(MSG_WARNING, "Texture '%s' references itself as patch\n", Inits[i].TexName.GetChars()); else Printf(TEXTCOLOR_YELLOW "Texture '%s' references itself as patch\n", Inits[i].TexName.GetChars()); } + else + { + // If it could be resolved, just print a developer warning. + DPrintf(DMSG_WARNING, "Resolved self-referencing texture by picking an older entry for %s", Inits[i].TexName.GetChars()); + } } if (!texno.isValid())