From 9dfef8c22987c12a6aad47a8913e60943d8578e7 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Fri, 14 May 2021 16:40:49 +0200 Subject: Move thumbnail loading/unloading to AsyncImageLoader --- src/Body.cpp | 92 +++++++++++++----------------------------------------------- 1 file changed, 20 insertions(+), 72 deletions(-) (limited to 'src/Body.cpp') 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 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(); - 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 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(); - 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 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) -- cgit v1.2.3