diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp index eb8c7fce8..c97a6bb0d 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.cpp @@ -576,10 +576,8 @@ void GLGizmoEmboss::initialize() 2 * style.FramePadding.x; m_gui_cfg.emplace(cfg); - // TODO: What to do when icon was NOT loaded? Generate them? - bool success = init_icons(); - assert(success); - + init_icons(); + const AppConfig *app_cfg = wxGetApp().app_config; size_t activ_index = -1; FontList font_list = load_font_list_from_app_config(app_cfg, activ_index); @@ -2081,7 +2079,7 @@ std::string GLGizmoEmboss::create_volume_name() m_text); } -bool GLGizmoEmboss::init_icons() +void GLGizmoEmboss::init_icons() { // icon order has to match the enum IconType std::vector filenames{ @@ -2108,29 +2106,35 @@ bool GLGizmoEmboss::init_icons() states.push_back(std::make_pair(0, false)); // Hovered states.push_back(std::make_pair(2, false)); // Disabled - unsigned int sprite_size_px = std::ceil(m_gui_cfg->icon_width); - // make size pair number - if (sprite_size_px % 2 != 0) ++sprite_size_px; bool compress = false; - return m_icons_texture.load_from_svg_files_as_sprites_array(filenames, - states, - sprite_size_px, - compress); + bool is_loaded = m_icons_texture.load_from_svg_files_as_sprites_array( + filenames, states, m_gui_cfg->icon_width, compress); + + if (!is_loaded || + m_icons_texture.get_width() < states.size() * m_gui_cfg->icon_width || + m_icons_texture.get_height() < filenames.size() * m_gui_cfg->icon_width) { + // bad load of icons, but all usage of m_icons_texture check that texture is initialized + assert(false); + m_icons_texture.reset(); + } } void GLGizmoEmboss::draw_icon(IconType icon, IconState state) { // canot draw count assert(icon != IconType::_count); - if (icon == IconType::_count) return; + if (icon == IconType::_count) return; unsigned int icons_texture_id = m_icons_texture.get_id(); int tex_width = m_icons_texture.get_width(); int tex_height = m_icons_texture.get_height(); - int icon_width = m_gui_cfg->icon_width; // is icon loaded - if ((icons_texture_id == 0) || (tex_width <= 1) || (tex_height <= 1)) + if ((icons_texture_id == 0) || (tex_width <= 1) || (tex_height <= 1)){ + ImGui::Text("▮"); return; + } + + int icon_width = m_gui_cfg->icon_width; ImTextureID tex_id = (void *) (intptr_t) (GLuint) icons_texture_id; int start_x = static_cast(state) * (icon_width + 1) + 1, start_y = static_cast(icon) * (icon_width + 1) + 1; @@ -2145,12 +2149,21 @@ void GLGizmoEmboss::draw_icon(IconType icon, IconState state) void GLGizmoEmboss::draw_transparent_icon() { + unsigned int icons_texture_id = m_icons_texture.get_id(); + int tex_width = m_icons_texture.get_width(); + int tex_height = m_icons_texture.get_height(); + // is icon loaded + if ((icons_texture_id == 0) || (tex_width <= 1) || (tex_height <= 1)) { + ImGui::Text("▯"); + return; + } + + ImTextureID tex_id = (void *) (intptr_t) (GLuint) icons_texture_id; + int icon_width = m_gui_cfg->icon_width; + ImVec2 icon_size(icon_width, icon_width); + ImVec2 pixel_size(1.f / tex_width, 1.f / tex_height); // zero pixel is transparent in texture - ImGui::Image((void *) (intptr_t) (GLuint) m_icons_texture.get_id(), - ImVec2(m_gui_cfg->icon_width, m_gui_cfg->icon_width), - ImVec2(0, 0), - ImVec2(1.f / m_icons_texture.get_width(), - 1.f / m_icons_texture.get_height())); + ImGui::Image(tex_id, icon_size, ImVec2(0, 0), pixel_size); } bool GLGizmoEmboss::draw_clickable( diff --git a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp index f442f789e..cf6c5998b 100644 --- a/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp +++ b/src/slic3r/GUI/Gizmos/GLGizmoEmboss.hpp @@ -157,7 +157,7 @@ private: float style_combobox_width = 0.f; float delete_pos_x = 0.f; float max_font_name_width = 0.f; - unsigned int icon_width = 0.f; + unsigned int icon_width = 0; float min_style_image_height = 0.f; int max_style_image_width = 0.f; @@ -225,7 +225,7 @@ private: // drawing icons GLTexture m_icons_texture; - bool init_icons(); + void init_icons(); enum class IconType : unsigned { rename = 0, erase,