1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-03-31 22:05:10 +02:00

minor fixes:

- don't crash if image can't be player-colored (no palette)
- fixes #1447
- compile fix
This commit is contained in:
Ivan Savenko 2013-09-08 13:02:34 +00:00
parent 141c1a9854
commit 42879225f0
4 changed files with 18 additions and 76 deletions

View File

@ -282,9 +282,7 @@ void Graphics::loadHeroFlags()
void Graphics::blueToPlayersAdv(SDL_Surface * sur, PlayerColor player) void Graphics::blueToPlayersAdv(SDL_Surface * sur, PlayerColor player)
{ {
// if(player==1) //it is actually blue... if(sur->format->palette)
// return;
if(sur->format->BitsPerPixel == 8)
{ {
SDL_Color *palette = nullptr; SDL_Color *palette = nullptr;
if(player < PlayerColor::PLAYER_LIMIT) if(player < PlayerColor::PLAYER_LIMIT)
@ -300,75 +298,15 @@ void Graphics::blueToPlayersAdv(SDL_Surface * sur, PlayerColor player)
logGlobal->errorStream() << "Wrong player id in blueToPlayersAdv (" << player << ")!"; logGlobal->errorStream() << "Wrong player id in blueToPlayersAdv (" << player << ")!";
return; return;
} }
SDL_SetColors(sur, palette, 224, 32); SDL_SetColors(sur, palette, 224, 32);
//for(int i=0; i<32; ++i)
//{
// sur->format->palette->colors[224+i] = palette[i];
//}
} }
else if(sur->format->BitsPerPixel == 24) //should never happen in general else
{ {
for(int y=0; y<sur->h; ++y) //TODO: implement. H3 method works only for images with palettes.
{ // Add some kind of player-colored overlay?
for(int x=0; x<sur->w; ++x) // Or keep palette approach here and replace only colors of specific value(s)
{ // Or just wait for OpenGL support?
Uint8* cp = (Uint8*)sur->pixels + y*sur->pitch + x*3; logGlobal->warnStream() << "Image must have palette to be player-colored!";
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
{
if(cp[2]>cp[1] && cp[2]>cp[0])
{
std::vector<long long int> sort1;
sort1.push_back(cp[0]);
sort1.push_back(cp[1]);
sort1.push_back(cp[2]);
std::vector< std::pair<long long int, Uint8*> > sort2;
sort2.push_back(std::make_pair(graphics->playerColors[player.getNum()].r, &(cp[0])));
sort2.push_back(std::make_pair(graphics->playerColors[player.getNum()].g, &(cp[1])));
sort2.push_back(std::make_pair(graphics->playerColors[player.getNum()].b, &(cp[2])));
std::sort(sort1.begin(), sort1.end());
if(sort2[0].first>sort2[1].first)
std::swap(sort2[0], sort2[1]);
if(sort2[1].first>sort2[2].first)
std::swap(sort2[1], sort2[2]);
if(sort2[0].first>sort2[1].first)
std::swap(sort2[0], sort2[1]);
for(int hh=0; hh<3; ++hh)
{
(*sort2[hh].second) = (sort1[hh] + sort2[hh].first)/2.2;
}
}
}
else
{
if(
(/*(mode==0) && (cp[0]>cp[1]) && (cp[0]>cp[2])) ||
((mode==1) &&*/ (cp[2]<45) && (cp[0]>80) && (cp[1]<70) && ((cp[0]-cp[1])>40))
)
{
std::vector<long long int> sort1;
sort1.push_back(cp[2]);
sort1.push_back(cp[1]);
sort1.push_back(cp[0]);
std::vector< std::pair<long long int, Uint8*> > sort2;
sort2.push_back(std::make_pair(graphics->playerColors[player.getNum()].r, &(cp[2])));
sort2.push_back(std::make_pair(graphics->playerColors[player.getNum()].g, &(cp[1])));
sort2.push_back(std::make_pair(graphics->playerColors[player.getNum()].b, &(cp[0])));
std::sort(sort1.begin(), sort1.end());
if(sort2[0].first>sort2[1].first)
std::swap(sort2[0], sort2[1]);
if(sort2[1].first>sort2[2].first)
std::swap(sort2[1], sort2[2]);
if(sort2[0].first>sort2[1].first)
std::swap(sort2[0], sort2[1]);
for(int hh=0; hh<3; ++hh)
{
(*sort2[hh].second) = (sort1[hh]*0.8 + sort2[hh].first)/2;
}
}
}
}
}
} }
} }
@ -385,10 +323,11 @@ void Graphics::loadFonts()
{ {
std::string filename = bmpConf[i].String(); std::string filename = bmpConf[i].String();
if (ttfConf[filename].isNull()) // no ttf override if (!ttfConf[filename].isNull()) // no ttf override
fonts[i] = new CBitmapFont(filename);
else
fonts[i] = new CTrueTypeFont(ttfConf[filename]); fonts[i] = new CTrueTypeFont(ttfConf[filename]);
else
fonts[i] = new CBitmapFont(filename);
} }
} }

View File

@ -172,7 +172,6 @@ void CPicture::colorizeAndConvert(PlayerColor player)
void CPicture::colorize(PlayerColor player) void CPicture::colorize(PlayerColor player)
{ {
assert(bg); assert(bg);
assert(bg->format->BitsPerPixel == 8);
graphics->blueToPlayersAdv(bg, player); graphics->blueToPlayersAdv(bg, player);
} }

View File

@ -324,6 +324,9 @@ QStringList CModListView::findDependentMods(QString mod, bool excludeDisabled)
{ {
auto current = modModel->getMod(modName); auto current = modModel->getMod(modName);
if (!current.isInstalled())
continue;
if (current.getValue("depends").toStringList().contains(mod) && if (current.getValue("depends").toStringList().contains(mod) &&
!(current.isDisabled() && excludeDisabled)) !(current.isDisabled() && excludeDisabled))
ret += modName; ret += modName;

View File

@ -199,14 +199,15 @@ public:
h & names & faction & creatures & dwellings & dwellingNames & buildings & hordeLvl & mageLevel h & names & faction & creatures & dwellings & dwellingNames & buildings & hordeLvl & mageLevel
& primaryRes & warMachine & clientInfo & moatDamage; & primaryRes & warMachine & clientInfo & moatDamage;
auto findNull = [](const std::pair<BuildingID, ConstTransitivePtr<CBuilding>> &building)
{ return building.second == nullptr; };
//Fix #1444 corrupted save //Fix #1444 corrupted save
while(auto badElem = vstd::tryFindIf(buildings, [](const std::pair<BuildingID, ConstTransitivePtr<CBuilding>> &building) while(auto badElem = vstd::tryFindIf(buildings, findNull))
{ return building.second == nullptr; }))
{ {
std::cout << "#1444-like bug encountered, fixing buildings list by removing bogus entry " << badElem->first << " from " << faction->name << std::endl; std::cout << "#1444-like bug encountered, fixing buildings list by removing bogus entry " << badElem->first << " from " << faction->name << std::endl;
buildings.erase(badElem->first); buildings.erase(badElem->first);
} }
} }
}; };