From 3dc7e3ae5b7e13218afda306639d6919042e699d Mon Sep 17 00:00:00 2001 From: Jinhao Date: Thu, 2 Nov 2017 17:55:14 +0800 Subject: [PATCH] fix bug where picture throws if image is empty --- include/nana/gui/widgets/picture.hpp | 1 - source/gui/widgets/picture.cpp | 48 +++++++++++++++------------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/include/nana/gui/widgets/picture.hpp b/include/nana/gui/widgets/picture.hpp index 9050f8be..d4805662 100644 --- a/include/nana/gui/widgets/picture.hpp +++ b/include/nana/gui/widgets/picture.hpp @@ -36,7 +36,6 @@ namespace nana void attached(widget_reference, graph_reference) override; private: void refresh(graph_reference) override; - void _m_draw_background(unsigned,unsigned); private: implement * const impl_; }; diff --git a/source/gui/widgets/picture.cpp b/source/gui/widgets/picture.cpp index b1e40aae..e9747a4e 100644 --- a/source/gui/widgets/picture.cpp +++ b/source/gui/widgets/picture.cpp @@ -48,6 +48,22 @@ namespace nana std::unique_ptr bground; //If it is not a null ptr, the widget is stretchable mode bool stretchable{ false }; //If it is true, the widget is stretchable mode without changing aspect ratio. }backimg; + + void draw_background(const size& dimension) + { + if (graph_ptr && (!API::dev::copy_transparent_background(*wdg_ptr, *graph_ptr))) + { + if (dimension.width < graph_ptr->size().width || dimension.height < graph_ptr->size().height || backimg.image.alpha()) + { + if (gradual_bground.gradual_from.invisible() || gradual_bground.gradual_to.invisible()) + graph_ptr->rectangle(true, wdg_ptr->bgcolor()); + else if (gradual_bground.gradual_from == gradual_bground.gradual_to) + graph_ptr->rectangle(true, gradual_bground.gradual_from); + else + graph_ptr->gradual_rectangle(::nana::rectangle{ graph_ptr->size() }, gradual_bground.gradual_from, gradual_bground.gradual_to, !gradual_bground.horizontal); + } + } + } }; class content_measurer @@ -106,6 +122,13 @@ namespace nana if (!backimg.bground) { + if (backimg.image.empty()) + { + impl_->draw_background({}); + graph.setsta(); + return; + } + auto valid_area = backimg.valid_area; if (valid_area.empty()) valid_area.dimension(backimg.image.size()); @@ -142,7 +165,7 @@ namespace nana } } - _m_draw_background(fit_size.width, fit_size.height); + impl_->draw_background(fit_size); backimg.image.stretch(valid_area, graph, ::nana::rectangle{ pos, fit_size }); } @@ -173,7 +196,7 @@ namespace nana break; } - _m_draw_background(valid_area.width, valid_area.height); + impl_->draw_background(valid_area.dimension()); if ( ! backimg.image.empty()) backimg.image.paste(valid_area, graph, pos); @@ -181,7 +204,7 @@ namespace nana } else { - _m_draw_background(graphsize.width, graphsize.height); + impl_->draw_background(graphsize); color invalid_clr_for_call; backimg.bground->draw(graph, invalid_clr_for_call, invalid_clr_for_call, rectangle{ graphsize }, element_state::normal); @@ -189,25 +212,6 @@ namespace nana graph.setsta(); } - - void drawer::_m_draw_background(unsigned w, unsigned h) - { - auto graph = impl_->graph_ptr; - - if (graph && (!API::dev::copy_transparent_background(*impl_->wdg_ptr, *graph))) - { - if (w < graph->size().width || h < graph->size().height || impl_->backimg.image.alpha()) - { - auto & bground = impl_->gradual_bground; - if (bground.gradual_from.invisible() || bground.gradual_to.invisible()) - graph->rectangle(true, impl_->wdg_ptr->bgcolor()); - else if (bground.gradual_from == bground.gradual_to) - graph->rectangle(true, bground.gradual_from); - else - graph->gradual_rectangle(::nana::rectangle{ graph->size() }, bground.gradual_from, bground.gradual_to, !bground.horizontal); - } - } - } //end class drawer }//end namespace picture }//end namespace drawerbase