aboutsummaryrefslogtreecommitdiff
path: root/src/Body.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Body.cpp')
-rw-r--r--src/Body.cpp92
1 files changed, 20 insertions, 72 deletions
diff --git a/src/Body.cpp b/src/Body.cpp
index 09d3051..803cece 100644
--- a/src/Body.cpp
+++ b/src/Body.cpp
@@ -144,7 +144,6 @@ namespace QuickMedia {
}
Body::~Body() {
- item_thumbnail_textures.clear();
items.clear();
malloc_trim(0);
}
@@ -334,7 +333,7 @@ namespace QuickMedia {
void Body::clear_cache() {
clear_text_cache();
- clear_thumbnails();
+ malloc_trim(0);
}
void Body::clear_text_cache() {
@@ -345,11 +344,6 @@ namespace QuickMedia {
}
}
- void Body::clear_thumbnails() {
- item_thumbnail_textures.clear();
- malloc_trim(0);
- }
-
BodyItem* Body::get_selected() const {
if(selected_item < 0 || selected_item >= (int)items.size() || !items[selected_item]->visible)
return nullptr;
@@ -580,7 +574,6 @@ namespace QuickMedia {
int num_items = items.size();
if(num_items == 0 || size.y <= 0.0f) {
- item_thumbnail_textures.clear();
for(auto &body_item : items) {
clear_body_item_cache(body_item.get());
if(body_item->embedded_item)
@@ -596,10 +589,6 @@ namespace QuickMedia {
return;
}
- for(auto &thumbnail_it : item_thumbnail_textures) {
- thumbnail_it.second->referenced = false;
- }
-
if(prev_selected_item < 0 || prev_selected_item >= (int)items.size()) {
prev_selected_item = selected_item;
}
@@ -848,15 +837,6 @@ namespace QuickMedia {
if(!items_cut_off_set)
items_cut_off = false;
- for(auto it = item_thumbnail_textures.begin(); it != item_thumbnail_textures.end();) {
- if(!it->second->referenced) {
- it = item_thumbnail_textures.erase(it);
- loaded_textures_changed = true;
- } else {
- ++it;
- }
- }
-
// TODO: Only do this for items that are not visible, do not loop all items.
// TODO: Improve performance! right now it can use up to 5-7% cpu with a lot of items!
for(auto &body_item : items) {
@@ -867,11 +847,6 @@ namespace QuickMedia {
clear_body_item_cache(body_item->embedded_item.get());
}
- if(loaded_textures_changed) {
- loaded_textures_changed = false;
- malloc_trim(0);
- }
-
mouse_left_clicked = false;
if(clicked_body_item) {
auto clicked_body_item_tmp = clicked_body_item; // tmp because below call to body_item_select_callback may call this same draw function
@@ -1116,18 +1091,10 @@ namespace QuickMedia {
}
void Body::draw_item(sf::RenderWindow &window, BodyItem *item, const sf::Vector2f &pos, const sf::Vector2f &size, const float item_height, const int item_index, const Json::Value &content_progress, bool include_embedded_item, bool merge_with_previous) {
- // TODO: Instead of generating a new hash everytime to access textures, cache the hash of the thumbnail url
+ sf::Vector2i thumbnail_size = get_item_thumbnail_size(item);
std::shared_ptr<ThumbnailData> item_thumbnail;
- if(draw_thumbnails && !item->thumbnail_url.empty()) {
- auto item_thumbnail_it = item_thumbnail_textures.find(item->thumbnail_url);
- if(item_thumbnail_it == item_thumbnail_textures.end()) {
- item_thumbnail = std::make_shared<ThumbnailData>();
- item_thumbnail_textures.insert(std::make_pair(item->thumbnail_url, item_thumbnail));
- } else {
- item_thumbnail = item_thumbnail_it->second;
- }
- item_thumbnail->referenced = true;
- }
+ if(draw_thumbnails && !item->thumbnail_url.empty())
+ item_thumbnail = AsyncImageLoader::get_instance().get_thumbnail(item->thumbnail_url, item->thumbnail_is_local, thumbnail_size);
if(body_item_render_callback && include_embedded_item)
body_item_render_callback(item);
@@ -1156,13 +1123,13 @@ namespace QuickMedia {
}
float text_offset_x = padding_x;
- if(draw_thumbnails && item_thumbnail && !merge_with_previous) {
+ if(item_thumbnail && !merge_with_previous) {
// TODO: Verify if this is safe. The thumbnail is being modified in another thread
if(item_thumbnail->loading_state == LoadingState::APPLIED_TO_TEXTURE && item_thumbnail->texture.getNativeHandle() != 0) {
image.setTexture(item_thumbnail->texture, true);
auto image_size = image.getTexture()->getSize();
sf::Vector2f image_size_f(image_size.x, image_size.y);
- sf::Vector2f content_size = to_vec2f(get_item_thumbnail_size(item));
+ sf::Vector2f content_size = to_vec2f(thumbnail_size);
auto new_image_size = clamp_to_size(image_size_f, content_size);
auto image_scale = get_ratio(image_size_f, new_image_size);
image.setScale(image_scale);
@@ -1177,7 +1144,7 @@ namespace QuickMedia {
// We want the next image fallback to have the same size as the successful image rendering, because its likely the image fallback will have the same size (for example thumbnails on youtube)
//image_fallback.setSize(sf::Vector2f(width_ratio * image_size.x, height_ratio * image_size.y));
} else if(!item->thumbnail_url.empty()) {
- sf::Vector2f content_size = to_vec2f(get_item_thumbnail_size(item));
+ sf::Vector2f content_size = to_vec2f(thumbnail_size);
sf::Color fallback_color(52, 58, 70);
if(thumbnail_mask_shader && item->thumbnail_mask_type == ThumbnailMaskType::CIRCLE) {
@@ -1204,7 +1171,7 @@ namespace QuickMedia {
text_offset_x += image_padding_x + content_size.x;
}
} else if(item->thumbnail_size.x > 0) {
- text_offset_x += image_padding_x + get_item_thumbnail_size(item).x;
+ text_offset_x += image_padding_x + thumbnail_size.x;
}
const float timestamp_text_y = std::floor(item_pos.y + padding_y - std::floor(6.0f * get_ui_scale()));
@@ -1320,39 +1287,20 @@ namespace QuickMedia {
if(load_texture)
item->last_drawn_time = elapsed_time_sec;
+ sf::Vector2i content_size = get_item_thumbnail_size(item);
float image_height = 0.0f;
float text_offset_x = padding_x;
- if(draw_thumbnails && !item->thumbnail_url.empty() && !merge_with_previous) {
- sf::Vector2i content_size = get_item_thumbnail_size(item);
+ if(draw_thumbnails && load_texture && !item->thumbnail_url.empty() && !merge_with_previous) {
image_height = content_size.y;
-
- std::shared_ptr<ThumbnailData> item_thumbnail;
- auto item_thumbnail_it = item_thumbnail_textures.find(item->thumbnail_url);
- if(item_thumbnail_it == item_thumbnail_textures.end()) {
- if(load_texture) {
- item_thumbnail = std::make_shared<ThumbnailData>();
- item_thumbnail_textures.insert(std::make_pair(item->thumbnail_url, item_thumbnail));
- }
- } else {
- item_thumbnail = item_thumbnail_it->second;
- }
-
- if(load_texture && item_thumbnail) {
- item_thumbnail->referenced = true;
-
- if(!item->thumbnail_url.empty() && item_thumbnail->loading_state == LoadingState::NOT_LOADED)
- AsyncImageLoader::get_instance().load_thumbnail(item->thumbnail_url, item->thumbnail_is_local, content_size, item_thumbnail);
-
- if(item_thumbnail->loading_state == LoadingState::FINISHED_LOADING && item_thumbnail->image->getSize().x > 0 && item_thumbnail->image->getSize().y > 0) {
- if(!item_thumbnail->texture.loadFromImage(*item_thumbnail->image))
- fprintf(stderr, "Warning: failed to load texture from image: %s\n", item->thumbnail_url.c_str());
- item_thumbnail->texture.setSmooth(true);
- //item_thumbnail->texture.generateMipmap();
- item_thumbnail->image.reset();
- item_thumbnail->loading_state = LoadingState::APPLIED_TO_TEXTURE;
- item_thumbnail->texture_applied_time.restart();
- loaded_textures_changed = true;
- }
+ std::shared_ptr<ThumbnailData> item_thumbnail = AsyncImageLoader::get_instance().get_thumbnail(item->thumbnail_url, item->thumbnail_is_local, content_size);
+
+ if(item_thumbnail && item_thumbnail->loading_state == LoadingState::FINISHED_LOADING && item_thumbnail->image->getSize().x > 0 && item_thumbnail->image->getSize().y > 0) {
+ if(!item_thumbnail->texture.loadFromImage(*item_thumbnail->image))
+ fprintf(stderr, "Warning: failed to load texture from image: %s\n", item->thumbnail_url.c_str());
+ item_thumbnail->texture.setSmooth(true);
+ //item_thumbnail->texture.generateMipmap();
+ item_thumbnail->image.reset();
+ item_thumbnail->loading_state = LoadingState::APPLIED_TO_TEXTURE;
}
if(item_thumbnail && item_thumbnail->loading_state == LoadingState::APPLIED_TO_TEXTURE && item_thumbnail->texture.getNativeHandle() != 0) {
@@ -1365,7 +1313,7 @@ namespace QuickMedia {
text_offset_x += image_padding_x + content_size.x;
}
} else if(item->thumbnail_size.x > 0) {
- text_offset_x += image_padding_x + get_item_thumbnail_size(item).x;
+ text_offset_x += image_padding_x + content_size.x;
}
if(load_texture)