From 7b86958b255eea8eb85285926fdeb9afc38cab25 Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Sun, 24 Nov 2019 18:51:29 +0100 Subject: [PATCH] Fix wxColour::GetAsString called for non-solid colour Don't return RGB values if colour is not solid and hence cannot be represented with these values. Non-solid colour should be reported as an unknown RGB value, e.g. '??????'. Closes #18596. --- interface/wx/colour.h | 3 ++ src/common/colourcmn.cpp | 74 ++++++++++++++++++++++++---------------- 2 files changed, 47 insertions(+), 30 deletions(-) diff --git a/interface/wx/colour.h b/interface/wx/colour.h index 6fda827039..8f3a8535bc 100644 --- a/interface/wx/colour.h +++ b/interface/wx/colour.h @@ -118,6 +118,9 @@ public: @c wxC2S_CSS_SYNTAX (which is the only one supporting alpha) is not specified in flags. + @note For non-solid (i.e. non-RGB) colour this function returns + "rgb(??, ?? ??)" or "#??????". + @since 2.7.0 */ virtual wxString GetAsString(long flags = wxC2S_NAME | wxC2S_CSS_SYNTAX) const; diff --git a/src/common/colourcmn.cpp b/src/common/colourcmn.cpp index 0ae45ceac8..9d0b40a46c 100644 --- a/src/common/colourcmn.cpp +++ b/src/common/colourcmn.cpp @@ -220,44 +220,58 @@ wxString wxColourBase::GetAsString(long flags) const { wxString colName; - const int alpha = Alpha(); - const bool isOpaque = alpha == wxALPHA_OPAQUE; - - // we can't use the name format if the colour is not opaque as the alpha - // information would be lost - if ( (flags & wxC2S_NAME) && isOpaque ) + if ( IsSolid() ) { - colName = wxTheColourDatabase->FindName( - static_cast(*this)).MakeLower(); + const int alpha = Alpha(); + const bool isOpaque = alpha == wxALPHA_OPAQUE; + + // we can't use the name format if the colour is not opaque as the alpha + // information would be lost + if ( (flags & wxC2S_NAME) && isOpaque ) + { + colName = wxTheColourDatabase->FindName( + static_cast(*this)).MakeLower(); + } + + if ( colName.empty() ) + { + const int red = Red(), + green = Green(), + blue = Blue(); + + if ( flags & wxC2S_CSS_SYNTAX ) + { + // no name for this colour; return it in CSS syntax + if ( isOpaque ) + { + colName.Printf(wxT("rgb(%d, %d, %d)"), red, green, blue); + } + else // use rgba() form + { + colName.Printf(wxT("rgba(%d, %d, %d, %s)"), + red, green, blue, + wxString::FromCDouble(alpha / 255., 3)); + } + } + else if ( flags & wxC2S_HTML_SYNTAX ) + { + // no name for this colour; return it in HTML syntax + if ( isOpaque ) + colName.Printf(wxT("#%02X%02X%02X"), red, green, blue); + else + colName.Printf(wxT("#%02X%02X%02X%02X"), red, green, blue, alpha); + } + } } - - if ( colName.empty() ) + else { - const int red = Red(), - green = Green(), - blue = Blue(); - if ( flags & wxC2S_CSS_SYNTAX ) { - // no name for this colour; return it in CSS syntax - if ( isOpaque ) - { - colName.Printf(wxT("rgb(%d, %d, %d)"), red, green, blue); - } - else // use rgba() form - { - colName.Printf(wxT("rgba(%d, %d, %d, %s)"), - red, green, blue, - wxString::FromCDouble(alpha / 255., 3)); - } + colName = wxS("rgb(??, ??, \?\?)"); // \? form to avoid ??) trigraph } else if ( flags & wxC2S_HTML_SYNTAX ) { - // no name for this colour; return it in HTML syntax - if ( isOpaque ) - colName.Printf(wxT("#%02X%02X%02X"), red, green, blue); - else - colName.Printf(wxT("#%02X%02X%02X%02X"), red, green, blue, alpha); + colName = wxS("#??????"); } }