co-maps/libs/indexer/map_style_reader.cpp
2025-11-22 13:58:55 +01:00

131 lines
3.8 KiB
C++

#include "map_style_reader.hpp"
#include "platform/platform.hpp"
#include "base/file_name_utils.hpp"
#include "base/logging.hpp"
namespace
{
std::string const kSuffixDark = "dark";
std::string const kSuffixLight = "light";
std::string const kSuffixDefaultDark = "_default_dark";
std::string const kSuffixDefaultLight = "_default_light";
std::string const kSuffixVehicleDark = "_vehicle_dark";
std::string const kSuffixVehicleLight = "_vehicle_light";
std::string const kSuffixOutdoorsLight = "_outdoors_light";
std::string const kSuffixOutdoorsDark = "_outdoors_dark";
std::string const kStylesOverrideDir = "styles";
#ifdef BUILD_DESIGNER
std::string const kSuffixDesignTool = "_design";
#endif // BUILD_DESIGNER
std::string GetStyleRulesSuffix(MapStyle mapStyle)
{
#ifdef BUILD_DESIGNER
return kSuffixDesignTool;
#else
switch (mapStyle)
{
case MapStyleDefaultDark: return kSuffixDefaultDark;
case MapStyleDefaultLight: return kSuffixDefaultLight;
case MapStyleVehicleDark: return kSuffixVehicleDark;
case MapStyleVehicleLight: return kSuffixVehicleLight;
case MapStyleOutdoorsLight: return kSuffixOutdoorsLight;
case MapStyleOutdoorsDark: return kSuffixOutdoorsDark;
case MapStyleMerged: return {};
case MapStyleCount: break;
}
LOG(LWARNING, ("Unknown map style", mapStyle));
return kSuffixDefaultLight;
#endif // BUILD_DESIGNER
}
std::string GetStyleResourcesSuffix(MapStyle mapStyle)
{
#ifdef BUILD_DESIGNER
return kSuffixDesignTool;
#else
// We use the same resources for all light/day and dark/night styles
// to avoid textures duplication and package size increasing.
switch (mapStyle)
{
case MapStyleDefaultDark:
case MapStyleVehicleDark:
case MapStyleOutdoorsDark: return kSuffixDark;
case MapStyleDefaultLight:
case MapStyleVehicleLight:
case MapStyleOutdoorsLight: return kSuffixLight;
case MapStyleMerged: return {};
case MapStyleCount: break;
}
LOG(LWARNING, ("Unknown map style", mapStyle));
return kSuffixLight;
#endif // BUILD_DESIGNER
}
} // namespace
StyleReader::StyleReader() : m_mapStyle(kDefaultMapStyle) {}
void StyleReader::SetCurrentStyle(MapStyle mapStyle)
{
m_mapStyle = mapStyle;
}
MapStyle StyleReader::GetCurrentStyle() const
{
return m_mapStyle;
}
bool StyleReader::IsCarNavigationStyle() const
{
return m_mapStyle == MapStyle::MapStyleVehicleLight || m_mapStyle == MapStyle::MapStyleVehicleDark;
}
ReaderPtr<Reader> StyleReader::GetDrawingRulesReader() const
{
std::string rulesFile = std::string("drules_proto") + GetStyleRulesSuffix(GetCurrentStyle()) + ".bin";
auto overriddenRulesFile = base::JoinPath(GetPlatform().WritableDir(), kStylesOverrideDir, rulesFile);
if (Platform::IsFileExistsByFullPath(overriddenRulesFile))
rulesFile = overriddenRulesFile;
#ifdef BUILD_DESIGNER
// For Designer tool we have to look first into the resource folder.
return GetPlatform().GetReader(rulesFile, "rwf");
#else
return GetPlatform().GetReader(rulesFile);
#endif
}
ReaderPtr<Reader> StyleReader::GetResourceReader(std::string const & file, std::string_view density) const
{
std::string resFile =
base::JoinPath("symbols", std::string{density}, GetStyleResourcesSuffix(GetCurrentStyle()), file);
auto overriddenResFile = base::JoinPath(GetPlatform().WritableDir(), kStylesOverrideDir, resFile);
if (GetPlatform().IsFileExistsByFullPath(overriddenResFile))
resFile = overriddenResFile;
#ifdef BUILD_DESIGNER
// For Designer tool we have to look first into the resource folder.
return GetPlatform().GetReader(resFile, "rwf");
#else
return GetPlatform().GetReader(resFile);
#endif
}
ReaderPtr<Reader> StyleReader::GetDefaultResourceReader(std::string const & file) const
{
return GetPlatform().GetReader(base::JoinPath("symbols/default", file));
}
StyleReader & GetStyleReader()
{
static StyleReader instance;
return instance;
}