mirror of
https://github.com/Detanup01/gbe_fork.git
synced 2024-11-27 05:04:01 +08:00
* encapsulate image load/get functions + fix access in current code
* don't add new image resource if current one exists
This commit is contained in:
parent
80bc1e2490
commit
4d06c010a3
@ -208,6 +208,8 @@ private:
|
|||||||
std::map<std::string, Leaderboard_config> leaderboards{};
|
std::map<std::string, Leaderboard_config> leaderboards{};
|
||||||
std::map<std::string, Stat_config> stats{};
|
std::map<std::string, Stat_config> stats{};
|
||||||
|
|
||||||
|
std::map<size_t, struct Image_Data> images{};
|
||||||
|
|
||||||
//supported languages
|
//supported languages
|
||||||
std::set<std::string> supported_languages_set{};
|
std::set<std::string> supported_languages_set{};
|
||||||
std::string supported_languages{};
|
std::string supported_languages{};
|
||||||
@ -265,8 +267,6 @@ public:
|
|||||||
// enable owning Steam Applications IDs (mostly builtin apps + dedicated servers)
|
// enable owning Steam Applications IDs (mostly builtin apps + dedicated servers)
|
||||||
bool enable_builtin_preowned_ids = false;
|
bool enable_builtin_preowned_ids = false;
|
||||||
|
|
||||||
std::map<int, struct Image_Data> images{};
|
|
||||||
|
|
||||||
//subscribed lobby/group ids
|
//subscribed lobby/group ids
|
||||||
std::set<uint64> subscribed_groups{};
|
std::set<uint64> subscribed_groups{};
|
||||||
std::vector<Group_Clans> subscribed_groups_clans{};
|
std::vector<Group_Clans> subscribed_groups_clans{};
|
||||||
@ -383,6 +383,7 @@ public:
|
|||||||
|
|
||||||
//images
|
//images
|
||||||
int add_image(const std::string &data, uint32 width, uint32 height);
|
int add_image(const std::string &data, uint32 width, uint32 height);
|
||||||
|
Image_Data* get_image(int handle);
|
||||||
|
|
||||||
// overlay auto accept stuff
|
// overlay auto accept stuff
|
||||||
void acceptAnyOverlayInvites(bool value);
|
void acceptAnyOverlayInvites(bool value);
|
||||||
|
@ -859,9 +859,9 @@ std::vector<image_pixel_t> Local_Storage::load_image(std::string const& image_pa
|
|||||||
std::vector<image_pixel_t> res{};
|
std::vector<image_pixel_t> res{};
|
||||||
int width{}, height{};
|
int width{}, height{};
|
||||||
image_pixel_t* img = (image_pixel_t*)stbi_load(image_path.c_str(), &width, &height, nullptr, 4);
|
image_pixel_t* img = (image_pixel_t*)stbi_load(image_path.c_str(), &width, &height, nullptr, 4);
|
||||||
if (img != nullptr)
|
PRINT_DEBUG("stbi_load('%s') -> %s", image_path.c_str(), (img ? "loaded" : stbi_failure_reason()));
|
||||||
{
|
if (img) {
|
||||||
res.resize(width*height);
|
res.resize(width * height);
|
||||||
std::copy(img, img + width * height, res.begin());
|
std::copy(img, img + width * height, res.begin());
|
||||||
|
|
||||||
stbi_image_free(img);
|
stbi_image_free(img);
|
||||||
@ -875,19 +875,18 @@ std::string Local_Storage::load_image_resized(std::string const& image_path, std
|
|||||||
{
|
{
|
||||||
std::string resized_image{};
|
std::string resized_image{};
|
||||||
const size_t resized_img_size = resolution * resolution * 4;
|
const size_t resized_img_size = resolution * resolution * 4;
|
||||||
|
if (image_path.size()) {
|
||||||
if (image_path.length() > 0) {
|
|
||||||
int width = 0;
|
int width = 0;
|
||||||
int height = 0;
|
int height = 0;
|
||||||
unsigned char *img = stbi_load(image_path.c_str(), &width, &height, nullptr, 4);
|
unsigned char *img = stbi_load(image_path.c_str(), &width, &height, nullptr, 4);
|
||||||
PRINT_DEBUG("stbi_load('%s') -> %s", image_path.c_str(), (img == nullptr ? stbi_failure_reason() : "loaded"));
|
PRINT_DEBUG("stbi_load('%s') -> %s", image_path.c_str(), (img ? "loaded" : stbi_failure_reason()));
|
||||||
if (img != nullptr) {
|
if (img) {
|
||||||
std::vector<char> out_resized(resized_img_size);
|
std::vector<char> out_resized(resized_img_size);
|
||||||
stbir_resize_uint8(img, width, height, 0, (unsigned char*)&out_resized[0], resolution, resolution, 0, 4);
|
stbir_resize_uint8(img, width, height, 0, (unsigned char*)&out_resized[0], resolution, resolution, 0, 4);
|
||||||
resized_image = std::string((char*)&out_resized[0], out_resized.size());
|
resized_image = std::string((char*)&out_resized[0], out_resized.size());
|
||||||
stbi_image_free(img);
|
stbi_image_free(img);
|
||||||
}
|
}
|
||||||
} else if (image_data.length() > 0) {
|
} else if (image_data.size()) {
|
||||||
std::vector<char> out_resized(resized_img_size);
|
std::vector<char> out_resized(resized_img_size);
|
||||||
stbir_resize_uint8((unsigned char*)image_data.c_str(), 184, 184, 0, (unsigned char*)&out_resized[0], resolution, resolution, 0, 4);
|
stbir_resize_uint8((unsigned char*)image_data.c_str(), 184, 184, 0, (unsigned char*)&out_resized[0], resolution, resolution, 0, 4);
|
||||||
resized_image = std::string((char*)&out_resized[0], out_resized.size());
|
resized_image = std::string((char*)&out_resized[0], out_resized.size());
|
||||||
|
@ -353,13 +353,33 @@ std::map<std::string, Stat_config>::const_iterator Settings::setStatDefiniton(co
|
|||||||
|
|
||||||
int Settings::add_image(const std::string &data, uint32 width, uint32 height)
|
int Settings::add_image(const std::string &data, uint32 width, uint32 height)
|
||||||
{
|
{
|
||||||
int last = static_cast<int>(images.size()) + 1;
|
auto previous_it = std::find_if(images.begin(), images.end(), [&](const std::pair<const size_t, Image_Data> &item) {
|
||||||
struct Image_Data dt;
|
return item.second.data == data
|
||||||
|
&& item.second.height == height
|
||||||
|
&& item.second.width == width;
|
||||||
|
});
|
||||||
|
if (images.end() != previous_it) {
|
||||||
|
return static_cast<int>(previous_it->first);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Image_Data dt{};
|
||||||
dt.width = width;
|
dt.width = width;
|
||||||
dt.height = height;
|
dt.height = height;
|
||||||
dt.data = data;
|
dt.data = data;
|
||||||
images[last] = dt;
|
|
||||||
return last;
|
auto new_handle = images.size() + 1; // never return 0, it is a bad handle for most ISteamUserStats APIs
|
||||||
|
images[new_handle] = dt;
|
||||||
|
|
||||||
|
return static_cast<int>(new_handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
Image_Data* Settings::get_image(int handle)
|
||||||
|
{
|
||||||
|
auto image_it = images.find(handle);
|
||||||
|
if (images.end() == image_it) {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return &image_it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1280,9 +1280,15 @@ void Steam_Friends::Callback(Common_Message *msg)
|
|||||||
f->set_name(settings->get_local_name());
|
f->set_name(settings->get_local_name());
|
||||||
f->set_appid(settings->get_local_game_id().AppID());
|
f->set_appid(settings->get_local_game_id().AppID());
|
||||||
f->set_lobby_id(settings->get_lobby().ConvertToUint64());
|
f->set_lobby_id(settings->get_lobby().ConvertToUint64());
|
||||||
|
|
||||||
int avatar_number = GetLargeFriendAvatar(settings->get_local_steam_id());
|
int avatar_number = GetLargeFriendAvatar(settings->get_local_steam_id());
|
||||||
if (settings->images[avatar_number].data.length() > 0) f->set_avatar(settings->images[avatar_number].data);
|
auto avatar_info = settings->get_image(avatar_number);
|
||||||
else f->set_avatar("");
|
if (avatar_info && avatar_info->data.size()) {
|
||||||
|
f->set_avatar(avatar_info->data);
|
||||||
|
} else {
|
||||||
|
f->set_avatar("");
|
||||||
|
}
|
||||||
|
|
||||||
msg_.set_allocated_friend_(f);
|
msg_.set_allocated_friend_(f);
|
||||||
network->sendTo(&msg_, true);
|
network->sendTo(&msg_, true);
|
||||||
}
|
}
|
||||||
|
@ -81,11 +81,11 @@ bool Steam_Utils::GetImageSize( int iImage, uint32 *pnWidth, uint32 *pnHeight )
|
|||||||
|
|
||||||
if (!iImage || !pnWidth || !pnHeight) return false;
|
if (!iImage || !pnWidth || !pnHeight) return false;
|
||||||
|
|
||||||
auto image = settings->images.find(iImage);
|
auto image_info = settings->get_image(iImage);
|
||||||
if (settings->images.end() == image) return false;
|
if (!image_info) return false;
|
||||||
|
|
||||||
*pnWidth = image->second.width;
|
*pnWidth = image_info->width;
|
||||||
*pnHeight = image->second.height;
|
*pnHeight = image_info->height;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -99,10 +99,10 @@ bool Steam_Utils::GetImageRGBA( int iImage, uint8 *pubDest, int nDestBufferSize
|
|||||||
|
|
||||||
if (!iImage || !pubDest || nDestBufferSize <= 0) return false;
|
if (!iImage || !pubDest || nDestBufferSize <= 0) return false;
|
||||||
|
|
||||||
auto image = settings->images.find(iImage);
|
auto image_info = settings->get_image(iImage);
|
||||||
if (settings->images.end() == image) return false;
|
if (!image_info) return false;
|
||||||
|
|
||||||
image->second.data.copy((char *)pubDest, nDestBufferSize);
|
image_info->data.copy((char *)pubDest, nDestBufferSize);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user