Merge branch 'master' into jgrpp
# Conflicts: # src/animated_tile.cpp # src/cargopacket.h # src/cheat_gui.cpp # src/company_cmd.cpp # src/company_gui.cpp # src/date.cpp # src/disaster_vehicle.cpp # src/dock_gui.cpp # src/economy.cpp # src/engine.cpp # src/error_gui.cpp # src/fontcache/spritefontcache.cpp # src/game/game_gui.cpp # src/game/game_text.cpp # src/gfx.cpp # src/graph_gui.cpp # src/highscore_gui.cpp # src/industry_cmd.cpp # src/lang/dutch.txt # src/lang/english_AU.txt # src/lang/english_US.txt # src/lang/finnish.txt # src/lang/french.txt # src/lang/italian.txt # src/lang/portuguese.txt # src/lang/russian.txt # src/lang/turkish.txt # src/lang/vietnamese.txt # src/main_gui.cpp # src/misc_gui.cpp # src/network/network_gui.cpp # src/network/network_server.cpp # src/newgrf.cpp # src/newgrf.h # src/newgrf_generic.cpp # src/news_gui.cpp # src/openttd.cpp # src/os/unix/unix.cpp # src/os/windows/font_win32.cpp # src/os/windows/win32.cpp # src/rail_gui.cpp # src/road_gui.cpp # src/saveload/afterload.cpp # src/saveload/misc_sl.cpp # src/saveload/oldloader_sl.cpp # src/saveload/saveload.cpp # src/saveload/saveload.h # src/script/script_gui.cpp # src/settings_table.cpp # src/signs_gui.cpp # src/smallmap_gui.cpp # src/smallmap_gui.h # src/spritecache.cpp # src/spritecache.h # src/spriteloader/grf.cpp # src/station_cmd.cpp # src/statusbar_gui.cpp # src/stdafx.h # src/strgen/strgen_base.cpp # src/subsidy.cpp # src/table/settings/difficulty_settings.ini # src/texteff.cpp # src/timetable_cmd.cpp # src/timetable_gui.cpp # src/toolbar_gui.cpp # src/town_cmd.cpp # src/town_gui.cpp # src/townname.cpp # src/vehicle.cpp # src/waypoint_cmd.cpp # src/widgets/dropdown.cpp # src/window.cpp
This commit is contained in:
@@ -211,7 +211,7 @@ bool SpriteExists(SpriteID id)
|
||||
*/
|
||||
SpriteType GetSpriteType(SpriteID sprite)
|
||||
{
|
||||
if (!SpriteExists(sprite)) return ST_INVALID;
|
||||
if (!SpriteExists(sprite)) return SpriteType::Invalid;
|
||||
return GetSpriteCache(sprite)->GetType();
|
||||
}
|
||||
|
||||
@@ -491,6 +491,18 @@ static void *ReadRecolourSprite(SpriteFile &file, uint num)
|
||||
return dest;
|
||||
}
|
||||
|
||||
static const char *GetSpriteTypeName(SpriteType type)
|
||||
{
|
||||
static const char * const sprite_types[] = {
|
||||
"normal", // SpriteType::Normal
|
||||
"map generator", // SpriteType::MapGen
|
||||
"character", // SpriteType::Font
|
||||
"recolour", // SpriteType::Recolour
|
||||
};
|
||||
|
||||
return sprite_types[static_cast<byte>(type)];
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a sprite from disk.
|
||||
* @param sc Location of sprite.
|
||||
@@ -508,10 +520,10 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty
|
||||
SpriteFile &file = *sc->file;
|
||||
size_t file_pos = sc->file_pos;
|
||||
|
||||
SCOPE_INFO_FMT([&], "ReadSprite: pos: " PRINTF_SIZE ", id: %u, file: (%s), type: %u", file_pos, id, file.GetSimplifiedFilename().c_str(), sprite_type);
|
||||
SCOPE_INFO_FMT([&], "ReadSprite: pos: " PRINTF_SIZE ", id: %u, file: (%s), type: %s", file_pos, id, file.GetSimplifiedFilename().c_str(), GetSpriteTypeName(sprite_type));
|
||||
|
||||
assert(sprite_type != ST_RECOLOUR);
|
||||
assert(IsMapgenSpriteID(id) == (sprite_type == ST_MAPGEN));
|
||||
assert(sprite_type != SpriteType::Recolour);
|
||||
assert(IsMapgenSpriteID(id) == (sprite_type == SpriteType::MapGen));
|
||||
assert(sc->GetType() == sprite_type);
|
||||
|
||||
DEBUG(sprite, 9, "Load sprite %d", id);
|
||||
@@ -521,7 +533,7 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty
|
||||
sprite[ZOOM_LVL_NORMAL].type = sprite_type;
|
||||
|
||||
SpriteLoaderGrf sprite_loader(file.GetContainerVersion());
|
||||
if (sprite_type != ST_MAPGEN && sc->GetHasNonPalette() && encoder->Is32BppSupported()) {
|
||||
if (sprite_type != SpriteType::MapGen && sc->GetHasNonPalette() && encoder->Is32BppSupported()) {
|
||||
/* Try for 32bpp sprites first. */
|
||||
sprite_avail = sprite_loader.LoadSprite(sprite, file, file_pos, sprite_type, true, sc->count, sc->flags);
|
||||
}
|
||||
@@ -530,12 +542,12 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty
|
||||
}
|
||||
|
||||
if (sprite_avail == 0) {
|
||||
if (sprite_type == ST_MAPGEN) return nullptr;
|
||||
if (sprite_type == SpriteType::MapGen) return nullptr;
|
||||
if (id == SPR_IMG_QUERY) usererror("Okay... something went horribly wrong. I couldn't load the fallback sprite. What should I do?");
|
||||
return (void*)GetRawSprite(SPR_IMG_QUERY, ST_NORMAL, allocator, encoder);
|
||||
return (void*)GetRawSprite(SPR_IMG_QUERY, SpriteType::Normal, allocator, encoder);
|
||||
}
|
||||
|
||||
if (sprite_type == ST_MAPGEN) {
|
||||
if (sprite_type == SpriteType::MapGen) {
|
||||
/* Ugly hack to work around the problem that the old landscape
|
||||
* generator assumes that those sprites are stored uncompressed in
|
||||
* the memory, and they are only read directly by the code, never
|
||||
@@ -565,10 +577,10 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty
|
||||
|
||||
if (!ResizeSprites(sprite, sprite_avail, encoder)) {
|
||||
if (id == SPR_IMG_QUERY) usererror("Okay... something went horribly wrong. I couldn't resize the fallback sprite. What should I do?");
|
||||
return (void*)GetRawSprite(SPR_IMG_QUERY, ST_NORMAL, allocator, encoder);
|
||||
return (void*)GetRawSprite(SPR_IMG_QUERY, SpriteType::Normal, allocator, encoder);
|
||||
}
|
||||
|
||||
if (sprite->type == ST_FONT && _font_zoom != ZOOM_LVL_NORMAL) {
|
||||
if (sprite->type == SpriteType::Font && _font_zoom != ZOOM_LVL_NORMAL) {
|
||||
/* Make ZOOM_LVL_NORMAL be ZOOM_LVL_GUI */
|
||||
sprite[ZOOM_LVL_NORMAL].width = sprite[_font_zoom].width;
|
||||
sprite[ZOOM_LVL_NORMAL].height = sprite[_font_zoom].height;
|
||||
@@ -686,7 +698,7 @@ bool LoadNextSprite(int load_index, SpriteFile &file, uint file_sprite_id)
|
||||
file.ReadByte();
|
||||
return false;
|
||||
}
|
||||
type = ST_RECOLOUR;
|
||||
type = SpriteType::Recolour;
|
||||
data = ReadRecolourSprite(file, num);
|
||||
} else if (file.GetContainerVersion() >= 2 && grf_type == 0xFD) {
|
||||
if (num != 4) {
|
||||
@@ -703,15 +715,15 @@ bool LoadNextSprite(int load_index, SpriteFile &file, uint file_sprite_id)
|
||||
} else {
|
||||
file_pos = SIZE_MAX;
|
||||
}
|
||||
type = ST_NORMAL;
|
||||
type = SpriteType::Normal;
|
||||
} else {
|
||||
file.SkipBytes(7);
|
||||
type = SkipSpriteData(file, grf_type, num - 8) ? ST_NORMAL : ST_INVALID;
|
||||
type = SkipSpriteData(file, grf_type, num - 8) ? SpriteType::Normal : SpriteType::Invalid;
|
||||
/* Inline sprites are not supported for container version >= 2. */
|
||||
if (file.GetContainerVersion() >= 2) return false;
|
||||
}
|
||||
|
||||
if (type == ST_INVALID) return false;
|
||||
if (type == SpriteType::Invalid) return false;
|
||||
|
||||
if (load_index == -1) {
|
||||
if (data != nullptr) _last_sprite_allocation.Clear();
|
||||
@@ -725,8 +737,8 @@ bool LoadNextSprite(int load_index, SpriteFile &file, uint file_sprite_id)
|
||||
bool is_mapgen = IsMapgenSpriteID(load_index);
|
||||
|
||||
if (is_mapgen) {
|
||||
if (type != ST_NORMAL) usererror("Uhm, would you be so kind not to load a NewGRF that changes the type of the map generator sprites?");
|
||||
type = ST_MAPGEN;
|
||||
if (type != SpriteType::Normal) usererror("Uhm, would you be so kind not to load a NewGRF that changes the type of the map generator sprites?");
|
||||
type = SpriteType::MapGen;
|
||||
}
|
||||
|
||||
SpriteCache *sc = AllocateSpriteCache(load_index);
|
||||
@@ -807,14 +819,14 @@ static void DeleteEntriesFromSpriteCache(size_t target)
|
||||
SpriteID i = 0;
|
||||
for (; i != _spritecache.size() && candidate_bytes < target; i++) {
|
||||
SpriteCache *sc = GetSpriteCache(i);
|
||||
if (sc->GetType() != ST_RECOLOUR && sc->GetPtr() != nullptr) {
|
||||
if (sc->GetType() != SpriteType::Recolour && sc->GetPtr() != nullptr) {
|
||||
push({ sc->lru, i, sc->buffer.GetSize() });
|
||||
if (candidate_bytes >= target) break;
|
||||
}
|
||||
}
|
||||
for (; i != _spritecache.size(); i++) {
|
||||
SpriteCache *sc = GetSpriteCache(i);
|
||||
if (sc->GetType() != ST_RECOLOUR && sc->GetPtr() != nullptr && sc->lru <= candidates.front().lru) {
|
||||
if (sc->GetType() != SpriteType::Recolour && sc->GetPtr() != nullptr && sc->lru <= candidates.front().lru) {
|
||||
push({ sc->lru, i, sc->buffer.GetSize() });
|
||||
while (!candidates.empty() && candidate_bytes - candidates.front().size >= target) {
|
||||
pop();
|
||||
@@ -875,7 +887,7 @@ void *SimpleSpriteAlloc(size_t size)
|
||||
|
||||
/**
|
||||
* Handles the case when a sprite of different type is requested than is present in the SpriteCache.
|
||||
* For ST_FONT sprites, it is normal. In other cases, default sprite is loaded instead.
|
||||
* For SpriteType::Font sprites, it is normal. In other cases, default sprite is loaded instead.
|
||||
* @param sprite ID of loaded sprite
|
||||
* @param requested requested sprite type
|
||||
* @param sc the currently known sprite cache for the requested sprite
|
||||
@@ -884,34 +896,27 @@ void *SimpleSpriteAlloc(size_t size)
|
||||
*/
|
||||
static void *HandleInvalidSpriteRequest(SpriteID sprite, SpriteType requested, SpriteCache *sc, AllocatorProc *allocator)
|
||||
{
|
||||
static const char * const sprite_types[] = {
|
||||
"normal", // ST_NORMAL
|
||||
"map generator", // ST_MAPGEN
|
||||
"character", // ST_FONT
|
||||
"recolour", // ST_RECOLOUR
|
||||
};
|
||||
|
||||
SpriteType available = sc->GetType();
|
||||
if (requested == ST_FONT && available == ST_NORMAL) {
|
||||
if (sc->GetPtr() == nullptr) sc->SetType(ST_FONT);
|
||||
if (requested == SpriteType::Font && available == SpriteType::Normal) {
|
||||
if (sc->GetPtr() == nullptr) sc->SetType(SpriteType::Font);
|
||||
return GetRawSprite(sprite, sc->GetType(), allocator);
|
||||
}
|
||||
|
||||
byte warning_level = sc->GetWarned() ? 6 : 0;
|
||||
sc->SetWarned(true);
|
||||
DEBUG(sprite, warning_level, "Tried to load %s sprite #%d as a %s sprite. Probable cause: NewGRF interference", sprite_types[available], sprite, sprite_types[requested]);
|
||||
DEBUG(sprite, warning_level, "Tried to load %s sprite #%d as a %s sprite. Probable cause: NewGRF interference", GetSpriteTypeName(available), sprite, GetSpriteTypeName(requested));
|
||||
|
||||
switch (requested) {
|
||||
case ST_NORMAL:
|
||||
case SpriteType::Normal:
|
||||
if (sprite == SPR_IMG_QUERY) usererror("Uhm, would you be so kind not to load a NewGRF that makes the 'query' sprite a non-normal sprite?");
|
||||
FALLTHROUGH;
|
||||
case ST_FONT:
|
||||
return GetRawSprite(SPR_IMG_QUERY, ST_NORMAL, allocator);
|
||||
case ST_RECOLOUR:
|
||||
case SpriteType::Font:
|
||||
return GetRawSprite(SPR_IMG_QUERY, SpriteType::Normal, allocator);
|
||||
case SpriteType::Recolour:
|
||||
if (sprite == PALETTE_TO_DARK_BLUE) usererror("Uhm, would you be so kind not to load a NewGRF that makes the 'PALETTE_TO_DARK_BLUE' sprite a non-remap sprite?");
|
||||
return GetRawSprite(PALETTE_TO_DARK_BLUE, ST_RECOLOUR, allocator);
|
||||
case ST_MAPGEN:
|
||||
/* this shouldn't happen, overriding of ST_MAPGEN sprites is checked in LoadNextSprite()
|
||||
return GetRawSprite(PALETTE_TO_DARK_BLUE, SpriteType::Recolour, allocator);
|
||||
case SpriteType::MapGen:
|
||||
/* this shouldn't happen, overriding of SpriteType::MapGen sprites is checked in LoadNextSprite()
|
||||
* (the only case the check fails is when these sprites weren't even loaded...) */
|
||||
default:
|
||||
NOT_REACHED();
|
||||
@@ -929,8 +934,8 @@ static void *HandleInvalidSpriteRequest(SpriteID sprite, SpriteType requested, S
|
||||
*/
|
||||
void *GetRawSprite(SpriteID sprite, SpriteType type, AllocatorProc *allocator, SpriteEncoder *encoder)
|
||||
{
|
||||
assert(type != ST_MAPGEN || IsMapgenSpriteID(sprite));
|
||||
assert(type < ST_INVALID);
|
||||
assert(type != SpriteType::MapGen || IsMapgenSpriteID(sprite));
|
||||
assert(type < SpriteType::Invalid);
|
||||
|
||||
if (!SpriteExists(sprite)) {
|
||||
DEBUG(sprite, 1, "Tried to load non-existing sprite #%d. Probable cause: Wrong/missing NewGRFs", sprite);
|
||||
@@ -974,22 +979,22 @@ uint32 GetSpriteMainColour(SpriteID sprite_id, PaletteID palette_id)
|
||||
if (!SpriteExists(sprite_id)) return 0;
|
||||
|
||||
SpriteCache *sc = GetSpriteCache(sprite_id);
|
||||
if (sc->GetType() != ST_NORMAL) return 0;
|
||||
if (sc->GetType() != SpriteType::Normal) return 0;
|
||||
|
||||
const byte * const remap = (palette_id == PAL_NONE ? nullptr : GetNonSprite(GB(palette_id, 0, PALETTE_WIDTH), ST_RECOLOUR) + 1);
|
||||
const byte * const remap = (palette_id == PAL_NONE ? nullptr : GetNonSprite(GB(palette_id, 0, PALETTE_WIDTH), SpriteType::Recolour) + 1);
|
||||
|
||||
SpriteFile &file = *sc->file;
|
||||
size_t file_pos = sc->file_pos;
|
||||
|
||||
SpriteLoader::Sprite sprites[ZOOM_LVL_COUNT];
|
||||
sprites[ZOOM_LVL_NORMAL].type = ST_NORMAL;
|
||||
sprites[ZOOM_LVL_NORMAL].type = SpriteType::Normal;
|
||||
SpriteLoaderGrf sprite_loader(file.GetContainerVersion());
|
||||
uint8 sprite_avail;
|
||||
const uint8 screen_depth = BlitterFactory::GetCurrentBlitter()->GetScreenDepth();
|
||||
|
||||
/* Try to read the 32bpp sprite first. */
|
||||
if (screen_depth == 32 && sc->GetHasNonPalette()) {
|
||||
sprite_avail = sprite_loader.LoadSprite(sprites, file, file_pos, ST_NORMAL, true, sc->count, sc->flags);
|
||||
sprite_avail = sprite_loader.LoadSprite(sprites, file, file_pos, SpriteType::Normal, true, sc->count, sc->flags);
|
||||
if (sprite_avail != 0) {
|
||||
SpriteLoader::Sprite *sprite = &sprites[FindFirstBit(sprite_avail)];
|
||||
/* Return the average colour. */
|
||||
@@ -1019,7 +1024,7 @@ uint32 GetSpriteMainColour(SpriteID sprite_id, PaletteID palette_id)
|
||||
}
|
||||
|
||||
/* No 32bpp, try 8bpp. */
|
||||
sprite_avail = sprite_loader.LoadSprite(sprites, file, file_pos, ST_NORMAL, false, sc->count, sc->flags);
|
||||
sprite_avail = sprite_loader.LoadSprite(sprites, file, file_pos, SpriteType::Normal, false, sc->count, sc->flags);
|
||||
if (sprite_avail != 0) {
|
||||
SpriteLoader::Sprite *sprite = &sprites[FindFirstBit(sprite_avail)];
|
||||
SpriteLoader::CommonPixel *pixel = sprite->data;
|
||||
@@ -1078,7 +1083,7 @@ void GfxClearSpriteCache()
|
||||
/* Clear sprite ptr for all cached items */
|
||||
for (uint i = 0; i != _spritecache.size(); i++) {
|
||||
SpriteCache *sc = GetSpriteCache(i);
|
||||
if (sc->GetType() != ST_RECOLOUR && sc->GetPtr() != nullptr) DeleteEntryFromSpriteCache(i);
|
||||
if (sc->GetType() != SpriteType::Recolour && sc->GetPtr() != nullptr) DeleteEntryFromSpriteCache(i);
|
||||
}
|
||||
|
||||
VideoDriver::GetInstance()->ClearSystemSprites();
|
||||
@@ -1093,7 +1098,7 @@ void GfxClearFontSpriteCache()
|
||||
/* Clear sprite ptr for all cached font items */
|
||||
for (uint i = 0; i != _spritecache.size(); i++) {
|
||||
SpriteCache *sc = GetSpriteCache(i);
|
||||
if (sc->GetType() == ST_FONT && sc->GetPtr() != nullptr) DeleteEntryFromSpriteCache(i);
|
||||
if (sc->GetType() == SpriteType::Font && sc->GetPtr() != nullptr) DeleteEntryFromSpriteCache(i);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user