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.
This commit is contained in:
Artur Wieczorek
2019-11-24 18:51:29 +01:00
parent fee30940b6
commit 7b86958b25
2 changed files with 47 additions and 30 deletions

View File

@@ -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;

View File

@@ -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<const wxColour &>(*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<const wxColour &>(*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("#??????");
}
}