]> git.saurik.com Git - wxWidgets.git/commitdiff
added support for alpha channel to wxColour to/from string conversion functions ...
authorVadim Zeitlin <vadim@wxwidgets.org>
Thu, 12 Jul 2007 08:36:24 +0000 (08:36 +0000)
committerVadim Zeitlin <vadim@wxwidgets.org>
Thu, 12 Jul 2007 08:36:24 +0000 (08:36 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@47361 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/latex/wx/colour.tex
src/common/colourcmn.cpp

index 16d19ef3a606f092ea85d42412d23e078e44b841..dadb7cfa6ed0e6dd16461f93cd05ff51db3826cd 100644 (file)
@@ -115,20 +115,24 @@ Returns the blue intensity.
 
 \constfunc{wxString}{GetAsString}{\param{long}{ flags}}
 
 
 \constfunc{wxString}{GetAsString}{\param{long}{ flags}}
 
-Converts this colour to a \helpref{wxString}{wxstring}
+Converts this colour to a \helpref{wxString}{wxstring} 
 using the given {\it flags}.
 
 using the given {\it flags}.
 
-The supported flags are {\bf wxC2S\_NAME}, to obtain the colour
-name (e.g. wxColour(255,0,0) -> \texttt{``red"}), {\bf wxC2S\_CSS\_SYNTAX}, to obtain
-the colour in the \texttt{``rgb(r,g,b)"} syntax
-(e.g. wxColour(255,0,0) -> \texttt{``rgb(255,0,0)"}), and {\bf wxC2S\_HTML\_SYNTAX}, to obtain
-the colour as  \texttt{``\#"} followed by 6 hexadecimal digits
-(e.g. wxColour(255,0,0) -> \texttt{``\#FF0000"}).
+The supported flags are \textbf{wxC2S\_NAME}, to obtain the colour name (e.g.
+wxColour(255,0,0) -> \texttt{``red"}), \textbf{wxC2S\_CSS\_SYNTAX}, to obtain
+the colour in the \texttt{``rgb(r,g,b)"} or \texttt{``rgba(r,g,b,a)"} syntax
+(e.g. wxColour(255,0,0,85) -> \texttt{``rgba(255,0,0,0.333)"}), and 
+\textbf{wxC2S\_HTML\_SYNTAX}, to obtain the colour as  \texttt{``\#"} followed
+by 6 hexadecimal digits (e.g. wxColour(255,0,0) -> \texttt{``\#FF0000"}).
 
 
-This function never fails and always returns a non-empty string.
+This function never fails and always returns a non-empty string but asserts if
+the colour has alpha channel (i.e. is non opaque) but
+\textbf{wxC2S\_CSS\_SYNTAX} (which is the only one supporting alpha) is not
+specified in flags.
 
 \newsince{2.7.0}
 
 
 \newsince{2.7.0}
 
+
 \membersection{wxColour::GetPixel}\label{wxcolourgetpixel}
 
 \constfunc{long}{GetPixel}{\void}
 \membersection{wxColour::GetPixel}\label{wxcolourgetpixel}
 
 \constfunc{long}{GetPixel}{\void}
@@ -170,7 +174,11 @@ Returns the red intensity.
 
 Sets the RGB intensity values using the given values (first overload), extracting them from the packed long (second overload), using the given string (third overloard).
 
 
 Sets the RGB intensity values using the given values (first overload), extracting them from the packed long (second overload), using the given string (third overloard).
 
-When using third form, Set() accepts: colour names (those listed in \helpref{wxTheColourDatabase}{wxcolourdatabase}), the CSS-like \texttt{``RGB(r,g,b)"} syntax (case insensitive) and the HTML-like syntax (i.e. \texttt{``\#"} followed by 6 hexadecimal digits for red, green, blue components).
+When using third form, Set() accepts: colour names (those listed in 
+\helpref{wxTheColourDatabase}{wxcolourdatabase}), the CSS-like 
+\texttt{``rgb(r,g,b)"} or \texttt{``rgba(r,g,b,a)"} syntax (case insensitive) 
+and the HTML-like syntax (i.e. \texttt{``\#"} followed by 6 hexadecimal digits 
+for red, green, blue components).
 
 Returns \true if the conversion was successful, \false otherwise.
 
 
 Returns \true if the conversion was successful, \false otherwise.
 
index a6626f91e2d0bb00b4ef83ff76ca99defd5aa007..4868f808f2d5ad27cb0b0a18451207da50065559 100644 (file)
@@ -39,19 +39,34 @@ bool wxColourBase::FromString(const wxString& str)
     if ( str.empty() )
         return false;       // invalid or empty string
 
     if ( str.empty() )
         return false;       // invalid or empty string
 
-    if ( wxStrncmp(str, wxT("RGB"), 3) == 0 ||
-         wxStrncmp(str, wxT("rgb"), 3) == 0 )
+    if ( wxStrnicmp(str, wxT("RGB"), 3) == 0 )
     {
         // CSS-like RGB specification
     {
         // CSS-like RGB specification
-        // according to http://www.w3.org/TR/REC-CSS2/syndata.html#color-units
+        // according to http://www.w3.org/TR/css3-color/#colorunits
         // values outside 0-255 range are allowed but should be clipped
         // values outside 0-255 range are allowed but should be clipped
-        int red, green, blue;
-        if (wxSscanf(str.wx_str() + 3, wxT("(%d, %d, %d)"), &red, &green, &blue) != 3)
-            return false;
-
-        Set((unsigned char)wxClip(red,0,255),
-            (unsigned char)wxClip(green,0,255),
-            (unsigned char)wxClip(blue,0,255));
+        int red, green, blue,
+            alpha = wxALPHA_OPAQUE;
+        if ( str.length() > 3 && (str[3] == wxT('a') || str[3] == wxT('A')) )
+        {
+            float a;
+            // TODO: use locale-independent function
+            if ( wxSscanf(str.wx_str() + 4, wxT("( %d , %d , %d , %f )"),
+                                                &red, &green, &blue, &a) != 4 )
+                return false;
+
+            alpha = wxRound(a * 255);
+        }
+        else // no 'a' following "rgb"
+        {
+            if ( wxSscanf(str.wx_str() + 3, wxT("( %d , %d , %d )"),
+                                                &red, &green, &blue) != 3 )
+                return false;
+        }
+
+        Set((unsigned char)wxClip(red, 0, 255),
+            (unsigned char)wxClip(green, 0, 255),
+            (unsigned char)wxClip(blue, 0, 255),
+            (unsigned char)wxClip(alpha, 0, 255));
     }
     else if ( str[0] == wxT('#') && wxStrlen(str) == 7 )
     {
     }
     else if ( str[0] == wxT('#') && wxStrlen(str) == 7 )
     {
@@ -88,23 +103,46 @@ wxString wxColourBase::GetAsString(long flags) const
 {
     wxString colName;
 
 {
     wxString colName;
 
-    if (flags & wxC2S_NAME)
-        colName = wxTheColourDatabase->FindName((const wxColour &)(*this)).MakeLower();
+    const bool isOpaque = Alpha() == wxALPHA_OPAQUE;
 
 
-    if ( colName.empty() && (flags & wxC2S_CSS_SYNTAX) )
+    // 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 )
     {
     {
-        // no name for this colour; return it in CSS syntax
-        colName.Printf(wxT("rgb(%d, %d, %d)"),
-                       Red(), Green(), Blue());
+        colName = wxTheColourDatabase->FindName(
+                    wx_static_cast(const wxColour &, *this)).MakeLower();
     }
     }
-    else if ( colName.empty() && (flags & wxC2S_HTML_SYNTAX) )
+
+    if ( colName.empty() )
     {
     {
-        // no name for this colour; return it in HTML syntax
-        colName.Printf(wxT("#%02X%02X%02X"),
-                       Red(), Green(), Blue());
+        const int red = Red(),
+                  blue = Blue(),
+                  green = Green();
+
+        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
+            {
+                // TODO: use locale-independent function
+                colName.Printf(wxT("rgba(%d, %d, %d, %.3f)"),
+                               red, green, blue, Alpha() / 255.);
+            }
+        }
+        else if ( flags & wxC2S_HTML_SYNTAX )
+        {
+            wxASSERT_MSG( isOpaque, "alpha is lost in HTML syntax" );
+
+            // no name for this colour; return it in HTML syntax
+            colName.Printf(wxT("#%02X%02X%02X"), red, green, blue);
+        }
     }
 
     }
 
-    // this function always returns a non-empty string
+    // this function should alway returns a non-empty string
     wxASSERT_MSG(!colName.empty(),
                  wxT("Invalid wxColour -> wxString conversion flags"));
 
     wxASSERT_MSG(!colName.empty(),
                  wxT("Invalid wxColour -> wxString conversion flags"));