From eeaf7170e0b4d08fcc0a2fa2a7688c22e4d47003 Mon Sep 17 00:00:00 2001 From: "wenjie.guo" Date: Wed, 20 Dec 2023 11:59:26 +0800 Subject: [PATCH] FIX: do not show the background bitmap when model is white. Jira: STUDIO-5620 Signed-off-by: wenjie.guo Change-Id: Ic61ba2ca53d071c815323b980abf79c067770b58 (cherry picked from commit cc55e02e753e3ae88d1a0bd0d9fc51aab9ab7fd8) --- src/slic3r/GUI/GUI_App.hpp | 1 + src/slic3r/GUI/SelectMachine.cpp | 8 ++++---- src/slic3r/GUI/SelectMachine.hpp | 28 ++++++++++++++++++++++++++-- src/slic3r/GUI/StatusPanel.cpp | 16 +++++++++++++--- src/slic3r/GUI/StatusPanel.hpp | 3 ++- 5 files changed, 46 insertions(+), 10 deletions(-) diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp index fae2fc91f..913277aff 100644 --- a/src/slic3r/GUI/GUI_App.hpp +++ b/src/slic3r/GUI/GUI_App.hpp @@ -34,6 +34,7 @@ #define TIMEOUT_RESPONSE 15 #define BE_UNACTED_ON 0x00200001 +#define SHOW_BACKGROUND_BITMAP_PIXEL_THRESHOLD 80 #ifndef _MSW_DARK_MODE #define _MSW_DARK_MODE 1 #endif // _MSW_DARK_MODE diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index f3114df10..639505a20 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -45,7 +45,6 @@ wxDEFINE_EVENT(EVT_CLEAR_IPADDRESS, wxCommandEvent); static wxString task_canceled_text = _L("Task canceled"); - std::string get_print_status_info(PrintDialogStatus status) { switch(status) { @@ -4447,9 +4446,10 @@ void EditDevNameDialog::on_edit_name(wxCommandEvent &e) Fit(); } - void ThumbnailPanel::set_thumbnail(wxImage img) + void ThumbnailPanel::set_thumbnail(wxImage &img) { - m_bitmap = img; + m_brightness_value = get_brightness_value(img); + m_bitmap = img; //Paint the background bitmap to the thumbnail bitmap with wxMemoryDC wxMemoryDC dc; bitmap_with_background.Create(wxSize(m_bitmap.GetWidth(), m_bitmap.GetHeight())); @@ -4468,7 +4468,7 @@ void EditDevNameDialog::on_edit_name(wxCommandEvent &e) void ThumbnailPanel::render(wxDC& dc) { - if (wxGetApp().dark_mode()) { + if (wxGetApp().dark_mode() && m_brightness_value < SHOW_BACKGROUND_BITMAP_PIXEL_THRESHOLD) { #ifdef __WXMSW__ wxMemoryDC memdc; wxBitmap bmp(GetSize()); diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index 0be748e71..3852156f4 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -62,6 +62,30 @@ enum PrintFromType { FROM_SDCARD_VIEW, }; +static int get_brightness_value(wxImage image) { + wxImage grayImage = image.ConvertToGreyscale(); + + int width = grayImage.GetWidth(); + int height = grayImage.GetHeight(); + + int totalLuminance = 0; + unsigned char alpha; + int num_none_transparent = 0; + for (int y = 0; y < height; y+=2) { + + for (int x = 0; x < width; x+=2) { + + alpha = image.GetAlpha(x, y); + if (alpha != 0) { + wxColour pixelColor = grayImage.GetRed(x, y); + totalLuminance += pixelColor.Red(); + num_none_transparent = num_none_transparent + 1; + } + } + } + return totalLuminance / num_none_transparent; +} + class Material { public: @@ -513,12 +537,12 @@ public: void OnPaint(wxPaintEvent &event); void PaintBackground(wxDC &dc); void OnEraseBackground(wxEraseEvent &event); - void set_thumbnail(wxImage img); + void set_thumbnail(wxImage &img); void render(wxDC &dc); private: ScalableBitmap m_background_bitmap; wxBitmap bitmap_with_background; - + int m_brightness_value{ -1 }; }; }} // namespace Slic3r::GUI diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index e1b60d4a1..0271c53d2 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -547,11 +547,19 @@ void PrintingTaskPanel::create_panel(wxWindow* parent) void PrintingTaskPanel::paint(wxPaintEvent&) { wxPaintDC dc(m_bitmap_thumbnail); - if (wxGetApp().dark_mode()) - dc.DrawBitmap(m_bitmap_background.bmp(), 0, 0); + if (wxGetApp().dark_mode()) { + if (m_brightness_value > 0 && m_brightness_value < SHOW_BACKGROUND_BITMAP_PIXEL_THRESHOLD) { + dc.DrawBitmap(m_bitmap_background.bmp(), 0, 0); + dc.SetTextForeground(*wxBLACK); + } + else + dc.SetTextForeground(*wxWHITE); + } + else + dc.SetTextForeground(*wxBLACK); dc.DrawBitmap(m_thumbnail_bmp_display, wxPoint(0, 0)); - dc.SetTextForeground(*wxBLACK); dc.SetFont(Label::Body_12); + if (m_plate_index >= 0) { wxString plate_id_str = wxString::Format("%d", m_plate_index); dc.DrawText(plate_id_str, wxPoint(4, 4)); @@ -1876,6 +1884,7 @@ void StatusPanel::on_webrequest_state(wxWebRequestEvent &evt) img_list.insert(std::make_pair(m_request_url, img)); wxImage resize_img = img.Scale(m_project_task_panel->get_bitmap_thumbnail()->GetSize().x, m_project_task_panel->get_bitmap_thumbnail()->GetSize().y, wxIMAGE_QUALITY_HIGH); m_project_task_panel->set_thumbnail_img(resize_img); + m_project_task_panel->set_brightness_value(get_brightness_value(resize_img)); } if (obj) { m_project_task_panel->set_plate_index(obj->m_plate_index); @@ -3021,6 +3030,7 @@ void StatusPanel::update_cloud_subtask(MachineObject *obj) img = it->second; wxImage resize_img = img.Scale(m_project_task_panel->get_bitmap_thumbnail()->GetSize().x, m_project_task_panel->get_bitmap_thumbnail()->GetSize().y); m_project_task_panel->set_thumbnail_img(resize_img); + m_project_task_panel->set_brightness_value(get_brightness_value(resize_img)); } if (this->obj) { m_project_task_panel->set_plate_index(obj->m_plate_index); diff --git a/src/slic3r/GUI/StatusPanel.hpp b/src/slic3r/GUI/StatusPanel.hpp index e550dd3b8..52b848642 100644 --- a/src/slic3r/GUI/StatusPanel.hpp +++ b/src/slic3r/GUI/StatusPanel.hpp @@ -204,6 +204,7 @@ private: ProgressBar* m_gauge_progress; Label* m_error_text; PrintingTaskType m_type; + int m_brightness_value{ -1 }; public: void init_bitmaps(); @@ -225,6 +226,7 @@ public: void show_priting_use_info(bool show, wxString time = wxEmptyString, wxString weight = wxEmptyString); void show_profile_info(bool show, wxString profile = wxEmptyString); void set_thumbnail_img(const wxBitmap& bmp); + void set_brightness_value(int value) { m_brightness_value = value; } void set_plate_index(int plate_idx = -1); void market_scoring_show(); void market_scoring_hide(); @@ -244,7 +246,6 @@ public: void set_star_count_dirty(bool dirty) { m_star_count_dirty = dirty; } void set_has_reted_text(bool has_rated); void paint(wxPaintEvent&); - }; class StatusBasePanel : public wxScrolledWindow