From 007d2de3c4635db3b321a07c13ddaa9f74728e2e Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Tue, 7 Jun 2011 22:27:35 +0000 Subject: [PATCH] Handle colours with alpha channel correctly in wxSVGFileDC. wxColour::GetAsString(wxC2S_HTML_SYNTAX) doesn't accept colours with alpha channel as alpha is not representable in HTML syntax, so avoid calling this function with such colours, remove the alpha component in the caller before using it instead. Also slightly simplify wxBrushString() and wxPenString() functions code in wxSVGFileDC implementation. Closes #13214. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@67883 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/common/dcsvg.cpp | 82 ++++++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 37 deletions(-) diff --git a/src/common/dcsvg.cpp b/src/common/dcsvg.cpp index 449ad4791a..9aeb7e9530 100644 --- a/src/common/dcsvg.cpp +++ b/src/common/dcsvg.cpp @@ -46,55 +46,63 @@ inline wxString NumStr(double f) return wxString::FromCDouble(f, 2); } -wxString wxPenString(wxColour c, int style = wxPENSTYLE_SOLID) +// Return the colour representation as HTML-like "#rrggbb" string and also +// returns its alpha as opacity number in 0..1 range. +wxString Col2SVG(wxColour c, float *opacity) { - wxString s = wxT("stroke:") + c.GetAsString(wxC2S_HTML_SYNTAX) + wxT("; "); - // Use the color's alpha value (if not opaque) for the opacity. - // Note that a transparent pen will override the alpha value. - if (c.Alpha() != wxALPHA_OPAQUE && style != wxPENSTYLE_TRANSPARENT) + if ( c.Alpha() != wxALPHA_OPAQUE ) { - s += wxString::Format(wxT("stroke-opacity:%s; "), NumStr(c.Alpha()/255.)); + *opacity = c.Alpha()/255.; + + // Remove the alpha before using GetAsString(wxC2S_HTML_SYNTAX) as it + // doesn't support colours with alpha channel. + c = wxColour(c.GetRGB()); } - else + else // No alpha. { - switch ( style ) - { - case wxPENSTYLE_SOLID: - s += wxT("stroke-opacity:1.0; "); - break; - case wxPENSTYLE_TRANSPARENT: - s += wxT("stroke-opacity:0.0; "); - break; - default : - wxASSERT_MSG(false, wxT("wxSVGFileDC::Requested Pen Style not available")); - } + *opacity = 1.; } - return s; + + return c.GetAsString(wxC2S_HTML_SYNTAX); } -wxString wxBrushString(wxColour c, int style = wxBRUSHSTYLE_SOLID) +wxString wxPenString(wxColour c, int style = wxPENSTYLE_SOLID) { - wxString s = wxT("fill:") + c.GetAsString(wxC2S_HTML_SYNTAX) + wxT("; "); - // Use the color's alpha value (if not opaque) for the opacity. - // Note that a transparent brush will override the alpha value. - if (c.Alpha() != wxALPHA_OPAQUE && style != wxBRUSHSTYLE_TRANSPARENT) + float opacity; + wxString s = wxT("stroke:") + Col2SVG(c, &opacity) + wxT("; "); + + switch ( style ) { - s += wxString::Format(wxT("fill-opacity:%s; "), NumStr(c.Alpha()/255.)); + case wxPENSTYLE_SOLID: + s += wxString::Format(wxT("stroke-opacity:%s; "), NumStr(opacity)); + break; + case wxPENSTYLE_TRANSPARENT: + s += wxT("stroke-opacity:0.0; "); + break; + default : + wxASSERT_MSG(false, wxT("wxSVGFileDC::Requested Pen Style not available")); } - else + + return s; +} + +wxString wxBrushString(wxColour c, int style = wxBRUSHSTYLE_SOLID) +{ + float opacity; + wxString s = wxT("fill:") + Col2SVG(c, &opacity) + wxT("; "); + + switch ( style ) { - switch ( style ) - { - case wxBRUSHSTYLE_SOLID: - s += wxT("fill-opacity:1.0; "); - break; - case wxBRUSHSTYLE_TRANSPARENT: - s += wxT("fill-opacity:0.0; "); - break; - default : - wxASSERT_MSG(false, wxT("wxSVGFileDC::Requested Brush Style not available")); - } + case wxBRUSHSTYLE_SOLID: + s += wxString::Format(wxT("fill-opacity:%s; "), NumStr(opacity)); + break; + case wxBRUSHSTYLE_TRANSPARENT: + s += wxT("fill-opacity:0.0; "); + break; + default : + wxASSERT_MSG(false, wxT("wxSVGFileDC::Requested Brush Style not available")); } + return s; } -- 2.47.2