0028641: Data Exchange - Support alpha-channel of color
authorika <ika@opencascade.com>
Mon, 27 Mar 2017 07:18:05 +0000 (10:18 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 14 Apr 2017 10:03:27 +0000 (13:03 +0300)
Use Quantity_ColorRGBA instead Quantity_Color in XCAFDoc_Color attribute
Add methods to color tool for processing RGBA
Update Color driver
Update Draw commands

src/BinMXCAFDoc/BinMXCAFDoc_ColorDriver.cxx
src/XCAFDoc/XCAFDoc_Color.cxx
src/XCAFDoc/XCAFDoc_Color.hxx
src/XCAFDoc/XCAFDoc_ColorTool.cxx
src/XCAFDoc/XCAFDoc_ColorTool.hxx
src/XDEDRAW/XDEDRAW.cxx
src/XDEDRAW/XDEDRAW_Colors.cxx
tests/bugs/xde/bug28641 [new file with mode: 0644]

index 0d2d34f..57a3420 100644 (file)
@@ -49,9 +49,13 @@ Standard_Boolean BinMXCAFDoc_ColorDriver::Paste(const BinObjMgt_Persistent& theS
 {
   Handle(XCAFDoc_Color) anAtt = Handle(XCAFDoc_Color)::DownCast(theTarget);
   Standard_Real R, G, B;
+  Standard_ShortReal alpha;
   Standard_Boolean isOk = theSource >> R >> G >> B;
   if(isOk) {
-    anAtt->Set(R, G, B);
+    Standard_Boolean isRGBA = theSource >> alpha;
+    if (!isRGBA)
+      alpha = 1.0;
+    anAtt->Set(R, G, B, alpha);
   }
   return isOk;
 }
@@ -66,7 +70,9 @@ void BinMXCAFDoc_ColorDriver::Paste(const Handle(TDF_Attribute)& theSource,
 {
   Handle(XCAFDoc_Color) anAtt = Handle(XCAFDoc_Color)::DownCast(theSource);
   Standard_Real R, G, B;
+  Standard_ShortReal alpha;
   anAtt->GetRGB(R, G, B);
-  theTarget << R << G << B;
+  alpha = anAtt->GetAlpha();
+  theTarget << R << G << B << alpha;
 }
 
index d9c5511..e1f1ad9 100644 (file)
@@ -15,6 +15,7 @@
 
 
 #include <Quantity_Color.hxx>
+#include <Quantity_ColorRGBA.hxx>
 #include <Standard_GUID.hxx>
 #include <Standard_Type.hxx>
 #include <TDF_Attribute.hxx>
@@ -60,6 +61,23 @@ const Standard_GUID& XCAFDoc_Color::GetID()
   return A;
 }
 
+ //=======================================================================
+ //function : Set
+ //purpose  : 
+ //=======================================================================
+
+ Handle(XCAFDoc_Color) XCAFDoc_Color::Set(const TDF_Label& L,
+   const Quantity_ColorRGBA& C)
+ {
+   Handle(XCAFDoc_Color) A;
+   if (!L.FindAttribute(XCAFDoc_Color::GetID(), A)) {
+     A = new XCAFDoc_Color();
+     L.AddAttribute(A);
+   }
+   A->Set(C);
+   return A;
+ }
+
 //=======================================================================
 //function : Set
 //purpose  : 
@@ -83,16 +101,17 @@ const Standard_GUID& XCAFDoc_Color::GetID()
 //=======================================================================
 
 Handle(XCAFDoc_Color) XCAFDoc_Color::Set(const TDF_Label& L,
-                                                    const Standard_Real R,
-                                                    const Standard_Real G,
-                                                    const Standard_Real B) 
+                                         const Standard_Real R,
+                                         const Standard_Real G,
+                                         const Standard_Real B,
+                                         const Standard_Real alpha) 
 {
   Handle(XCAFDoc_Color) A;
   if (!L.FindAttribute (XCAFDoc_Color::GetID(), A)) {
     A = new XCAFDoc_Color ();
     L.AddAttribute(A);
   }
-  A->Set (R,G,B); 
+  A->Set (R,G,B, alpha); 
   return A;
 }
 
@@ -104,6 +123,17 @@ Handle(XCAFDoc_Color) XCAFDoc_Color::Set(const TDF_Label& L,
 void XCAFDoc_Color::Set(const Quantity_Color& C) 
 {
   Backup();
+  myColor.SetRGB(C);
+}
+
+//=======================================================================
+//function : Set
+//purpose  : 
+//=======================================================================
+
+void XCAFDoc_Color::Set(const Quantity_ColorRGBA& C)
+{
+  Backup();
   myColor = C;
 }
 
@@ -115,7 +145,7 @@ void XCAFDoc_Color::Set(const Quantity_Color& C)
  void XCAFDoc_Color::Set(const Quantity_NameOfColor C) 
 {
   Backup();
-  myColor.SetValues(C);
+  myColor.SetRGB(C);
 }
 
 //=======================================================================
@@ -124,11 +154,15 @@ void XCAFDoc_Color::Set(const Quantity_Color& C)
 //=======================================================================
 
  void XCAFDoc_Color::Set(const Standard_Real R,
-                              const Standard_Real G,
-                              const Standard_Real B) 
+                         const Standard_Real G,
+                         const Standard_Real B,
+                         const Standard_Real alpha) 
 {
   Backup();
-  myColor.SetValues(R,G,B, Quantity_TOC_RGB);
+  Quantity_Color aColor;
+  aColor.SetValues(R, G, B, Quantity_TOC_RGB);
+  myColor.SetRGB(aColor);
+  myColor.SetAlpha((Standard_ShortReal)alpha);
 }
 
 //=======================================================================
@@ -138,6 +172,16 @@ void XCAFDoc_Color::Set(const Quantity_Color& C)
 
 const Quantity_Color& XCAFDoc_Color::GetColor() const
 {
+  return myColor.GetRGB();
+}
+
+//=======================================================================
+//function : GetColorRGBA
+//purpose  : 
+//=======================================================================
+
+const Quantity_ColorRGBA& XCAFDoc_Color::GetColorRGBA() const
+{
   return myColor;
 }
 
@@ -148,7 +192,7 @@ const Quantity_Color& XCAFDoc_Color::GetColor() const
 
  Quantity_NameOfColor XCAFDoc_Color::GetNOC() const
 {
-  return myColor.Name();
+  return myColor.GetRGB().Name();
 }
 
 //=======================================================================
@@ -160,8 +204,18 @@ const Quantity_Color& XCAFDoc_Color::GetColor() const
                                  Standard_Real& G,
                                  Standard_Real& B) const
 {
-  myColor.Values(R,G,B, Quantity_TOC_RGB);
+  myColor.GetRGB().Values(R,G,B, Quantity_TOC_RGB);
 }
+
+ //=======================================================================
+ //function : GetRGBA
+ //purpose  : 
+ //=======================================================================
+
+ Standard_ShortReal XCAFDoc_Color::GetAlpha() const
+ {
+   return myColor.Alpha();
+ }
 //=======================================================================
 //function : ID
 //purpose  : 
@@ -179,7 +233,7 @@ const Standard_GUID& XCAFDoc_Color::ID() const
 
  void XCAFDoc_Color::Restore(const Handle(TDF_Attribute)& With) 
 {
-  myColor = Handle(XCAFDoc_Color)::DownCast(With)->GetColor();
+  myColor = Handle(XCAFDoc_Color)::DownCast(With)->GetColorRGBA();
 }
 
 //=======================================================================
index 110cc34..db94e72 100644 (file)
 #include <Standard_Type.hxx>
 
 #include <Quantity_Color.hxx>
+#include <Quantity_ColorRGBA.hxx>
 #include <TDF_Attribute.hxx>
 #include <Quantity_NameOfColor.hxx>
 #include <Standard_Real.hxx>
 class Standard_GUID;
 class TDF_Label;
 class Quantity_Color;
+class Quantity_ColorRGBA;
 class TDF_Attribute;
 class TDF_RelocationTable;
 
@@ -45,25 +47,32 @@ public:
   Standard_EXPORT static const Standard_GUID& GetID();
   
   Standard_EXPORT static Handle(XCAFDoc_Color) Set (const TDF_Label& label, const Quantity_Color& C);
+
+  Standard_EXPORT static Handle(XCAFDoc_Color) Set (const TDF_Label& label, const Quantity_ColorRGBA& C);
   
   Standard_EXPORT static Handle(XCAFDoc_Color) Set (const TDF_Label& label, const Quantity_NameOfColor C);
   
   //! Find, or create, a Color attribute and set it's value
   //! the Color attribute is returned.
-  Standard_EXPORT static Handle(XCAFDoc_Color) Set (const TDF_Label& label, const Standard_Real R, const Standard_Real G, const Standard_Real B);
+  Standard_EXPORT static Handle(XCAFDoc_Color) Set (const TDF_Label& label, const Standard_Real R, const Standard_Real G, const Standard_Real B, const Standard_Real alpha = 1.0);
   
   Standard_EXPORT void Set (const Quantity_Color& C);
+
+  Standard_EXPORT void Set (const Quantity_ColorRGBA& C);
   
   Standard_EXPORT void Set (const Quantity_NameOfColor C);
   
-  Standard_EXPORT void Set (const Standard_Real R, const Standard_Real G, const Standard_Real B);
+  Standard_EXPORT void Set (const Standard_Real R, const Standard_Real G, const Standard_Real B, const Standard_Real alpha = 1.0);
   
   Standard_EXPORT const Quantity_Color& GetColor() const;
+
+  Standard_EXPORT const Quantity_ColorRGBA& GetColorRGBA() const;
   
   Standard_EXPORT Quantity_NameOfColor GetNOC() const;
   
-  //! Returns True if there is a reference on the same label
   Standard_EXPORT void GetRGB (Standard_Real& R, Standard_Real& G, Standard_Real& B) const;
+
+  Standard_EXPORT Standard_ShortReal GetAlpha() const;
   
   Standard_EXPORT const Standard_GUID& ID() const Standard_OVERRIDE;
   
@@ -86,7 +95,7 @@ protected:
 private:
 
 
-  Quantity_Color myColor;
+  Quantity_ColorRGBA myColor;
 
 
 };
index 0354e1c..6e6402e 100644 (file)
@@ -76,14 +76,29 @@ Standard_Boolean XCAFDoc_ColorTool::IsColor (const TDF_Label& lab) const
 Standard_Boolean XCAFDoc_ColorTool::GetColor (const TDF_Label& lab,
                                               Quantity_Color& col) const
 {
-  if ( lab.Father() != Label() ) return Standard_False;
-  
+  Quantity_ColorRGBA aCol;
+  Standard_Boolean isDone = GetColor(lab, aCol);
+  if (isDone)
+    col = aCol.GetRGB();
+  return isDone;
+}
+
+//=======================================================================
+//function : GetColor
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDoc_ColorTool::GetColor(const TDF_Label& lab,
+  Quantity_ColorRGBA& col) const
+{
+  if (lab.Father() != Label()) return Standard_False;
+
   Handle(XCAFDoc_Color) ColorAttribute;
-  if ( ! lab.FindAttribute ( XCAFDoc_Color::GetID(), ColorAttribute ))
+  if (!lab.FindAttribute(XCAFDoc_Color::GetID(), ColorAttribute))
     return Standard_False;
-  
-  col = ColorAttribute->GetColor();
-  
+
+  col = ColorAttribute->GetColorRGBA();
+
   return Standard_True;
 }
 
@@ -94,12 +109,24 @@ Standard_Boolean XCAFDoc_ColorTool::GetColor (const TDF_Label& lab,
 
 Standard_Boolean XCAFDoc_ColorTool::FindColor (const Quantity_Color& col, TDF_Label& lab) const
 {
-  TDF_ChildIDIterator it(Label(),XCAFDoc_Color::GetID());
+  Quantity_ColorRGBA aCol;
+  aCol.SetRGB(col);
+  return FindColor(aCol, lab);
+}
+
+//=======================================================================
+//function : FindColor
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDoc_ColorTool::FindColor(const Quantity_ColorRGBA& col, TDF_Label& lab) const
+{
+  TDF_ChildIDIterator it(Label(), XCAFDoc_Color::GetID());
   for (; it.More(); it.Next()) {
     TDF_Label aLabel = it.Value()->Label();
-    Quantity_Color C;
-    if ( ! GetColor ( aLabel, C ) ) continue;
-    if ( C.IsEqual ( col ) ) {
+    Quantity_ColorRGBA C;
+    if (!GetColor(aLabel, C)) continue;
+    if (C.IsEqual(col)) {
       lab = aLabel;
       return Standard_True;
     }
@@ -112,7 +139,7 @@ Standard_Boolean XCAFDoc_ColorTool::FindColor (const Quantity_Color& col, TDF_La
 //purpose  : 
 //=======================================================================
 
-TDF_Label XCAFDoc_ColorTool::FindColor (const Quantity_Color& col) const
+TDF_Label XCAFDoc_ColorTool::FindColor (const Quantity_ColorRGBA& col) const
 {
   TDF_Label L;
   FindColor ( col, L );
@@ -120,36 +147,63 @@ TDF_Label XCAFDoc_ColorTool::FindColor (const Quantity_Color& col) const
 }
 
 //=======================================================================
+//function : FindColor
+//purpose  : 
+//=======================================================================
+
+TDF_Label XCAFDoc_ColorTool::FindColor(const Quantity_Color& col) const
+{
+  TDF_Label L;
+  FindColor(col, L);
+  return L;
+}
+
+//=======================================================================
 //function : AddColor
 //purpose  : 
 //=======================================================================
 
 TDF_Label XCAFDoc_ColorTool::AddColor (const Quantity_Color& col) const
 {
+  Quantity_ColorRGBA aCol;
+  aCol.SetRGB(col);
+  return AddColor(aCol);
+}
+
+//=======================================================================
+//function : AddColor
+//purpose  : 
+//=======================================================================
+
+TDF_Label XCAFDoc_ColorTool::AddColor(const Quantity_ColorRGBA& col) const
+{
   TDF_Label L;
-  if ( FindColor ( col, L ) ) return L;
+  if (FindColor(col, L)) return L;
 
   // create a new color entry
-  
+
   TDF_TagSource aTag;
-  L = aTag.NewChild ( Label() );
+  L = aTag.NewChild(Label());
 
   XCAFDoc_Color::Set(L, col);
-  
+
 #ifdef AUTONAMING
   // set name according to color value
   TCollection_AsciiString str;
-  str += col.StringName ( col.Name() );
+  Quantity_Color aColor = col.GetRGB();
+  str += aColor.StringName(aColor.Name());
   str += " (";
-  str += TCollection_AsciiString ( col.Red() );
+  str += TCollection_AsciiString(aColor.Red());
   str += ",";
-  str += TCollection_AsciiString ( col.Green() );
+  str += TCollection_AsciiString(aColor.Green());
   str += ",";
-  str += TCollection_AsciiString ( col.Blue() );
+  str += TCollection_AsciiString(aColor.Blue());
+  str += ",";
+  str += TCollection_AsciiString(col.Alpha());
   str += ")";
-  TDataStd_Name::Set ( L, str );
+  TDataStd_Name::Set(L, str);
 #endif
-  
+
   return L;
 }
 
@@ -210,6 +264,19 @@ void XCAFDoc_ColorTool::SetColor (const TDF_Label& L,
 }
 
 //=======================================================================
+//function : SetColor
+//purpose  : 
+//=======================================================================
+
+void XCAFDoc_ColorTool::SetColor(const TDF_Label& L,
+  const Quantity_ColorRGBA& Color,
+  const XCAFDoc_ColorType type) const
+{
+  TDF_Label colorL = AddColor(Color);
+  SetColor(L, colorL, type);
+}
+
+//=======================================================================
 //function : UnSetColor
 //purpose  : 
 //=======================================================================
@@ -261,6 +328,20 @@ Standard_Boolean XCAFDoc_ColorTool::GetColor (const TDF_Label& L,
 }
 
 //=======================================================================
+//function : GetColor
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDoc_ColorTool::GetColor(const TDF_Label& L,
+  const XCAFDoc_ColorType type,
+  Quantity_ColorRGBA& color)
+{
+  TDF_Label colorL;
+  if (!GetColor(L, type, colorL)) return Standard_False;
+  return GetColor(colorL, color);
+}
+
+//=======================================================================
 //function : SetColor
 //purpose  : 
 //=======================================================================
@@ -289,6 +370,19 @@ Standard_Boolean XCAFDoc_ColorTool::SetColor (const TopoDS_Shape& S,
 }
 
 //=======================================================================
+//function : SetColor
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDoc_ColorTool::SetColor(const TopoDS_Shape& S,
+  const Quantity_ColorRGBA& Color,
+  const XCAFDoc_ColorType type)
+{
+  TDF_Label colorL = AddColor(Color);
+  return SetColor(S, colorL, type);
+}
+
+//=======================================================================
 //function : UnSetColor
 //purpose  : 
 //=======================================================================
@@ -344,6 +438,20 @@ Standard_Boolean XCAFDoc_ColorTool::GetColor (const TopoDS_Shape& S,
 }
 
 //=======================================================================
+//function : GetColor
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDoc_ColorTool::GetColor(const TopoDS_Shape& S,
+                                             const XCAFDoc_ColorType type,
+                                             Quantity_ColorRGBA& color)
+{
+  TDF_Label colorL;
+  if (!GetColor(S, type, colorL)) return Standard_False;
+  return GetColor(colorL, color);
+}
+
+//=======================================================================
 //function : GetID
 //purpose  : 
 //=======================================================================
@@ -460,27 +568,43 @@ Standard_Boolean XCAFDoc_ColorTool::SetInstanceColor (const TopoDS_Shape& theSha
                                                       const Quantity_Color& color,
                                                       const Standard_Boolean IsCreateSHUO)
 {
+  Quantity_ColorRGBA aCol;
+  aCol.SetRGB(color);
+  return SetInstanceColor(theShape, type, aCol, IsCreateSHUO);
+}
+
+//=======================================================================
+//function : SetInstanceColor
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDoc_ColorTool::SetInstanceColor(const TopoDS_Shape& theShape,
+                                                     const XCAFDoc_ColorType type,
+                                                     const Quantity_ColorRGBA& color,
+                                                     const Standard_Boolean IsCreateSHUO)
+{
   // find shuo label structure 
   TDF_LabelSequence aLabels;
-  if ( !ShapeTool()->FindComponent( theShape, aLabels ) )
+  if (!ShapeTool()->FindComponent(theShape, aLabels))
     return Standard_False;
   Handle(XCAFDoc_GraphNode) aSHUO;
   // set the SHUO structure for this component if it is not exist
-  if ( !ShapeTool()->FindSHUO( aLabels, aSHUO ) ) {
+  if (!ShapeTool()->FindSHUO(aLabels, aSHUO)) {
     if (aLabels.Length() == 1) {
       // set color directly for component as NAUO
       SetColor(aLabels.Value(1), color, type);
       return Standard_True;
     }
-    else if ( !IsCreateSHUO ||  !ShapeTool()->SetSHUO( aLabels, aSHUO ) ) {
+    else if (!IsCreateSHUO || !ShapeTool()->SetSHUO(aLabels, aSHUO)) {
       return Standard_False;
     }
   }
   TDF_Label aSHUOLabel = aSHUO->Label();
-  SetColor( aSHUOLabel, color, type );
+  SetColor(aSHUOLabel, color, type);
   return Standard_True;
 }
 
+
 //=======================================================================
 //function : GetInstanceColor
 //purpose  : 
@@ -490,38 +614,55 @@ Standard_Boolean XCAFDoc_ColorTool::GetInstanceColor (const TopoDS_Shape& theSha
                                                       const XCAFDoc_ColorType type,
                                                       Quantity_Color& color)
 {
+  Quantity_ColorRGBA aCol;
+  Standard_Boolean isDone = GetInstanceColor(theShape, type, aCol);
+  if (isDone)
+    color = aCol.GetRGB();
+  return isDone;
+}
+
+//=======================================================================
+//function : GetInstanceColor
+//purpose  : 
+//=======================================================================
+
+Standard_Boolean XCAFDoc_ColorTool::GetInstanceColor(const TopoDS_Shape& theShape,
+  const XCAFDoc_ColorType type,
+  Quantity_ColorRGBA& color)
+{
   // find shuo label structure 
   TDF_LabelSequence aLabels;
-  if ( !ShapeTool()->FindComponent( theShape, aLabels ) )
+  if (!ShapeTool()->FindComponent(theShape, aLabels))
     return Standard_False;
   Handle(XCAFDoc_GraphNode) aSHUO;
   // get shuo from document by label structure
   TDF_Label aCompLab = aLabels.Value(aLabels.Length());
   while (aLabels.Length() > 1) {
-    if ( !ShapeTool()->FindSHUO( aLabels, aSHUO ) ) {
+    if (!ShapeTool()->FindSHUO(aLabels, aSHUO)) {
       // try to find other shuo 
       aLabels.Remove(aLabels.Length());
       continue;
-    } else {
+    }
+    else {
       TDF_Label aSHUOLabel = aSHUO->Label();
-      if (GetColor ( aSHUOLabel, type, color ) )
+      if (GetColor(aSHUOLabel, type, color))
         return Standard_True;
-      else 
+      else
         // try to find other shuo 
         aLabels.Remove(aLabels.Length());
     }
   }
   // attempt to get color exactly of component
-  if (GetColor( aCompLab, type, color ))
+  if (GetColor(aCompLab, type, color))
     return Standard_True;
-  
+
   // attempt to get color of solid
   TopLoc_Location aLoc;
   TopoDS_Shape S0 = theShape;
-  S0.Location( aLoc );
-  TDF_Label aRefLab = ShapeTool()->FindShape( S0 );
+  S0.Location(aLoc);
+  TDF_Label aRefLab = ShapeTool()->FindShape(S0);
   if (!aRefLab.IsNull())
-    return GetColor( aRefLab, type, color );
+    return GetColor(aRefLab, type, color);
   // no color assigned
   return Standard_False;
 }
index 87a226f..0ef9cee 100644 (file)
@@ -27,6 +27,7 @@ class XCAFDoc_ShapeTool;
 class TDF_Label;
 class Standard_GUID;
 class Quantity_Color;
+class Quantity_ColorRGBA;
 class TopoDS_Shape;
 class TDF_Attribute;
 class TDF_RelocationTable;
@@ -67,20 +68,39 @@ public:
   //! Returns False if the label is not in colortable
   //! or does not define a color
   Standard_EXPORT Standard_Boolean GetColor (const TDF_Label& lab, Quantity_Color& col) const;
+
+  //! Returns color defined by label lab
+  //! Returns False if the label is not in colortable
+  //! or does not define a color
+  Standard_EXPORT Standard_Boolean GetColor(const TDF_Label& lab, Quantity_ColorRGBA& col) const;
   
   //! Finds a color definition in a colortable and returns
   //! its label if found
   //! Returns False if color is not found in colortable
   Standard_EXPORT Standard_Boolean FindColor (const Quantity_Color& col, TDF_Label& lab) const;
+
+  //! Finds a color definition in a colortable and returns
+  //! its label if found
+  //! Returns False if color is not found in colortable
+  Standard_EXPORT Standard_Boolean FindColor(const Quantity_ColorRGBA& col, TDF_Label& lab) const;
   
   //! Finds a color definition in a colortable and returns
   //! its label if found (or Null label else)
   Standard_EXPORT TDF_Label FindColor (const Quantity_Color& col) const;
+
+  //! Finds a color definition in a colortable and returns
+  //! its label if found (or Null label else)
+  Standard_EXPORT TDF_Label FindColor(const Quantity_ColorRGBA& col) const;
   
   //! Adds a color definition to a colortable and returns
   //! its label (returns existing label if the same color
   //! is already defined)
   Standard_EXPORT TDF_Label AddColor (const Quantity_Color& col) const;
+
+  //! Adds a color definition to a colortable and returns
+  //! its label (returns existing label if the same color
+  //! is already defined)
+  Standard_EXPORT TDF_Label AddColor(const Quantity_ColorRGBA& col) const;
   
   //! Removes color from the colortable
   Standard_EXPORT void RemoveColor (const TDF_Label& lab) const;
@@ -104,6 +124,12 @@ public:
   //! in the colortable
   //! Adds a color as necessary
   Standard_EXPORT void SetColor (const TDF_Label& L, const Quantity_Color& Color, const XCAFDoc_ColorType type) const;
+
+  //! Sets a link with GUID defined by <type> (see
+  //! XCAFDoc::ColorRefGUID()) from label <L> to color <Color>
+  //! in the colortable
+  //! Adds a color as necessary
+  Standard_EXPORT void SetColor(const TDF_Label& L, const Quantity_ColorRGBA& Color, const XCAFDoc_ColorType type) const;
   
   //! Removes a link with GUID defined by <type> (see
   //! XCAFDoc::ColorRefGUID()) from label <L> to color
@@ -120,6 +146,10 @@ public:
   //! Returns color assigned to <L> as <type>
   //! Returns False if no such color is assigned
   Standard_EXPORT Standard_Boolean GetColor (const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_Color& color);
+
+  //! Returns color assigned to <L> as <type>
+  //! Returns False if no such color is assigned
+  Standard_EXPORT Standard_Boolean GetColor(const TDF_Label& L, const XCAFDoc_ColorType type, Quantity_ColorRGBA& color);
   
   //! Sets a link with GUID defined by <type> (see
   //! XCAFDoc::ColorRefGUID()) from label <L> to color
@@ -133,6 +163,13 @@ public:
   //! Adds a color as necessary
   //! Returns False if cannot find a label for shape S
   Standard_EXPORT Standard_Boolean SetColor (const TopoDS_Shape& S, const Quantity_Color& Color, const XCAFDoc_ColorType type);
+
+  //! Sets a link with GUID defined by <type> (see
+  //! XCAFDoc::ColorRefGUID()) from label <L> to color <Color>
+  //! in the colortable
+  //! Adds a color as necessary
+  //! Returns False if cannot find a label for shape S
+  Standard_EXPORT Standard_Boolean SetColor(const TopoDS_Shape& S, const Quantity_ColorRGBA& Color, const XCAFDoc_ColorType type);
   
   //! Removes a link with GUID defined by <type> (see
   //! XCAFDoc::ColorRefGUID()) from label <L> to color
@@ -150,6 +187,10 @@ public:
   //! Returns color assigned to <L> as <type>
   //! Returns False if no such color is assigned
   Standard_EXPORT Standard_Boolean GetColor (const TopoDS_Shape& S, const XCAFDoc_ColorType type, Quantity_Color& color);
+
+  //! Returns color assigned to <L> as <type>
+  //! Returns False if no such color is assigned
+  Standard_EXPORT Standard_Boolean GetColor(const TopoDS_Shape& S, const XCAFDoc_ColorType type, Quantity_ColorRGBA& color);
   
   //! Return TRUE if object on this label is visible, FALSE if invisible.
   Standard_EXPORT Standard_Boolean IsVisible (const TDF_Label& L) const;
@@ -163,9 +204,18 @@ public:
   //! NOTE: create SHUO structeure if it is necessary and if <isCreateSHUO>
   Standard_EXPORT Standard_Boolean SetInstanceColor (const TopoDS_Shape& theShape, const XCAFDoc_ColorType type, const Quantity_Color& color, const Standard_Boolean isCreateSHUO = Standard_True);
   
+  //! Sets the color of component that styled with SHUO structure
+  //! Returns FALSE if no sush component found
+  //! NOTE: create SHUO structeure if it is necessary and if <isCreateSHUO>
+  Standard_EXPORT Standard_Boolean SetInstanceColor(const TopoDS_Shape& theShape, const XCAFDoc_ColorType type, const Quantity_ColorRGBA& color, const Standard_Boolean isCreateSHUO = Standard_True);
+
   //! Gets the color of component that styled with SHUO structure
   //! Returns FALSE if no sush component or color type
   Standard_EXPORT Standard_Boolean GetInstanceColor (const TopoDS_Shape& theShape, const XCAFDoc_ColorType type, Quantity_Color& color);
+
+  //! Gets the color of component that styled with SHUO structure
+  //! Returns FALSE if no sush component or color type
+  Standard_EXPORT Standard_Boolean GetInstanceColor(const TopoDS_Shape& theShape, const XCAFDoc_ColorType type, Quantity_ColorRGBA& color);
   
   //! Gets the visibility status of component that styled with SHUO structure
   //! Returns FALSE if no sush component
index 34a0d28..0a8ece6 100644 (file)
@@ -303,7 +303,7 @@ static void StatAssembly(const TDF_Label L,
     NbAreaProp++;
   }
   Handle(XCAFDoc_ColorTool) CTool = XCAFDoc_DocumentTool::ColorTool(aDoc->Main());
-  Quantity_Color col;
+  Quantity_ColorRGBA col;
   Standard_Boolean IsColor = Standard_False;
   if(CTool->GetColor(L,XCAFDoc_ColorGen,col))
     IsColor = Standard_True;
@@ -313,8 +313,8 @@ static void StatAssembly(const TDF_Label L,
     IsColor = Standard_True;
   if(IsColor) {
     TCollection_AsciiString Entry1;
-    Entry1 = col.StringName(col.Name());
-    if(PrintStructMode) di<<"Color("<<Entry1.ToCString()<<") ";
+    Entry1 = col.GetRGB().StringName(col.GetRGB().Name());
+    if(PrintStructMode) di<<"Color("<<Entry1.ToCString()<<" "<<col.Alpha()<<") ";
     NbShapesWithColor++;
   }
   Handle(XCAFDoc_LayerTool) LTool = XCAFDoc_DocumentTool::LayerTool(aDoc->Main());
@@ -723,10 +723,10 @@ static Standard_Integer XAttributeValue (Draw_Interpretor& di, Standard_Integer
   }
   else if ( att->IsKind(STANDARD_TYPE(XCAFDoc_Color)) ) {
     Handle(XCAFDoc_Color) val = Handle(XCAFDoc_Color)::DownCast ( att );
-    Quantity_Color C = val->GetColor();
+    Quantity_ColorRGBA C = val->GetColorRGBA();
     char string[260];
-    Sprintf ( string, "%s (%g, %g, %g)", C.StringName ( C.Name() ),
-             C.Red(), C.Green(), C.Blue() );
+    Sprintf ( string, "%s (%g, %g, %g, %g)", C.GetRGB().StringName ( C.GetRGB().Name() ),
+      C.GetRGB().Red(), C.GetRGB().Green(), C.GetRGB().Blue(), C.Alpha());
     di << string;
   }
   else if ( att->IsKind(STANDARD_TYPE(XCAFDoc_DimTol)) ) {
index 6690324..985bfdb 100644 (file)
@@ -1,4 +1,4 @@
-// Created on: 2000-08-04
+\feff// Created on: 2000-08-04
 // Created by: Pavel TELKOV
 // Copyright (c) 2000-2014 OPEN CASCADE SAS
 //
@@ -17,7 +17,9 @@
 #include <DBRep.hxx>
 #include <DDocStd.hxx>
 #include <Draw.hxx>
+#include <Precision.hxx>
 #include <Quantity_Color.hxx>
+#include <Quantity_ColorRGBA.hxx>
 #include <TCollection_AsciiString.hxx>
 #include <TDF_Label.hxx>
 #include <TDF_LabelSequence.hxx>
@@ -35,7 +37,7 @@
 static Standard_Integer setColor (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
 {
   if (argc < 6) {
-    di<<"Use: "<<argv[0]<<" Doc {Label|Shape} R G B [curve|surf]\n";
+    di<<"Use: "<<argv[0]<<" Doc {Label|Shape} R G B [alpha] [curve|surf]\n";
     return 1;
   }
   Handle(TDocStd_Document) Doc;   
@@ -45,16 +47,29 @@ static Standard_Integer setColor (Draw_Interpretor& di, Standard_Integer argc, c
   TDF_Label aLabel;
   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
   Quantity_Color Col ( Draw::Atof(argv[3]), Draw::Atof(argv[4]), Draw::Atof(argv[5]), Quantity_TOC_RGB );
+
+  Quantity_ColorRGBA aColRGBA;
+  aColRGBA.SetRGB(Col);
+  if (argc > 6 && (argv[6][0] != 's' && argv[6][0] != 'c')) {
+    aColRGBA.SetAlpha((Standard_ShortReal)(Draw::Atof(argv[6])));
+  }
   
   Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
-  const XCAFDoc_ColorType ctype = ( argc <= 6 ? XCAFDoc_ColorGen : ( argv[6][0] == 's' ? XCAFDoc_ColorSurf : XCAFDoc_ColorCurv ) );
+  XCAFDoc_ColorType ctype = XCAFDoc_ColorGen;
+  if (argc > 6) {
+    if (argv[argc - 1][0] == 's')
+      ctype = XCAFDoc_ColorSurf;
+    else if (argv[argc - 1][0] == 'c')
+      ctype = XCAFDoc_ColorCurv;
+  }
+
   if ( !aLabel.IsNull() ) {
-    myColors->SetColor ( aLabel, Col, ctype );
+    myColors->SetColor(aLabel, aColRGBA, ctype);
   }
   else {
     TopoDS_Shape aShape= DBRep::Get(argv[2]);
     if ( !aShape.IsNull() ) {
-      myColors->SetColor ( aShape, Col, ctype );
+      myColors->SetColor(aShape, aColRGBA, ctype);
     }
   }
   return 0;
@@ -73,10 +88,13 @@ static Standard_Integer getColor (Draw_Interpretor& di, Standard_Integer argc, c
   TDF_Label aLabel;
   TDF_Tool::Label(Doc->GetData(), argv[2], aLabel);
   Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
-  Quantity_Color col;
+  Quantity_ColorRGBA col;
   if ( !myColors->GetColor(aLabel, col) ) return 0;
   
-  di << col.StringName ( col.Name() );
+  if ((1 - col.Alpha()) < Precision::Confusion())
+    di << col.GetRGB().StringName(col.GetRGB().Name());
+  else
+    di << col.GetRGB().StringName ( col.GetRGB().Name() ) << " (" << col.Alpha() << ")";
    
   return 0;
 }
@@ -101,12 +119,13 @@ static Standard_Integer getShapeColor (Draw_Interpretor& di, Standard_Integer ar
   Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
   const XCAFDoc_ColorType ctype = ( argc <= 3 ? XCAFDoc_ColorGen : ( argv[3][0] == 's' ? XCAFDoc_ColorSurf : XCAFDoc_ColorCurv ) );
 
-  Quantity_Color col;
+  Quantity_ColorRGBA col;
   if ( !myColors->GetColor(aLabel, ctype, col) ) return 0;
 
-  TCollection_AsciiString Entry;
-  Entry = col.StringName ( col.Name() );
-  di << Entry.ToCString();
+  if ((1 - col.Alpha()) < Precision::Confusion())
+    di << col.GetRGB().StringName(col.GetRGB().Name());
+  else
+    di << col.GetRGB().StringName(col.GetRGB().Name()) << " (" << col.Alpha() << ")";
 
   return 0;
 }
@@ -123,14 +142,17 @@ static Standard_Integer getAllColors (Draw_Interpretor& di, Standard_Integer arg
 
   TDF_Label aLabel;
   Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
-  Quantity_Color col;
+  Quantity_ColorRGBA col;
   TDF_LabelSequence Labels;
   myColors->GetColors(Labels);
   if (Labels.Length() >= 1) {
     for ( Standard_Integer i = 1; i<= Labels.Length(); i++) {
       aLabel = Labels.Value(i);
       if ( !myColors->GetColor(aLabel, col) ) continue;
-      di << col.StringName ( col.Name() );
+      if ((1 - col.Alpha()) < Precision::Confusion())
+        di << col.GetRGB().StringName(col.GetRGB().Name());
+      else
+        di << col.GetRGB().StringName(col.GetRGB().Name()) << " (" << col.Alpha() << ")";
       di << " ";
     }
   }
@@ -140,8 +162,8 @@ static Standard_Integer getAllColors (Draw_Interpretor& di, Standard_Integer arg
 
 static Standard_Integer addColor (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
 {
-  if (argc!=5) {
-    di<<"Use: "<<argv[0]<<" DocName R G B\n";
+  if (argc < 5) {
+    di<<"Use: "<<argv[0]<<" DocName R G B [alpha]\n";
     return 1;
   }
   Handle(TDocStd_Document) Doc;   
@@ -152,7 +174,13 @@ static Standard_Integer addColor (Draw_Interpretor& di, Standard_Integer argc, c
   Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
 
   Quantity_Color Col ( Draw::Atof(argv[2]), Draw::Atof(argv[3]), Draw::Atof(argv[4]), Quantity_TOC_RGB );
-  aLabel = myColors->AddColor(Col);
+  if (argc == 6) {
+    Quantity_ColorRGBA aColRGBA(Col);
+    aColRGBA.SetAlpha((Standard_ShortReal)(Draw::Atof(argv[5])));
+    aLabel = myColors->AddColor(aColRGBA);
+  }
+  else 
+    aLabel = myColors->AddColor(Col);
   
   TCollection_AsciiString Entry;
   TDF_Tool::Entry(aLabel, Entry);
@@ -180,8 +208,8 @@ static Standard_Integer removeColor (Draw_Interpretor& di, Standard_Integer argc
 
 static Standard_Integer findColor (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
 {
-  if (argc!=5) {
-    di<<"Use: "<<argv[0]<<" DocName R G B\n";
+  if (argc < 5) {
+    di<<"Use: "<<argv[0]<<" DocName R G B [alpha]\n";
     return 1;
   }
   Handle(TDocStd_Document) Doc;   
@@ -189,11 +217,16 @@ static Standard_Integer findColor (Draw_Interpretor& di, Standard_Integer argc,
   if ( Doc.IsNull() ) { di << argv[1] << " is not a document\n"; return 1; }
 
   Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
-  
-  Quantity_Color Col ( Draw::Atof(argv[2]), Draw::Atof(argv[3]), Draw::Atof(argv[4]), Quantity_TOC_RGB );
-  
   TCollection_AsciiString Entry;
-  TDF_Tool::Entry(myColors->FindColor(Col), Entry);
+  Quantity_Color Col(Draw::Atof(argv[2]), Draw::Atof(argv[3]), Draw::Atof(argv[4]), Quantity_TOC_RGB);
+  if (argc == 5) {
+    TDF_Tool::Entry(myColors->FindColor(Col), Entry);
+  }
+  else {
+    Quantity_ColorRGBA aColRGBA(Col);
+    aColRGBA.SetAlpha((Standard_ShortReal)Draw::Atof(argv[5]));
+    TDF_Tool::Entry(myColors->FindColor(aColRGBA), Entry);
+  }
   di << Entry.ToCString();
   return 0;
 }
@@ -308,7 +341,7 @@ static Standard_Integer getStyledcolor (Draw_Interpretor& di, Standard_Integer a
   TopoDS_Shape aShape;
   aShape = DBRep::Get(argv[2]);
 
-  Quantity_Color col;
+  Quantity_ColorRGBA col;
   XCAFDoc_ColorType type;
   if ( argv[3] && argv[3][0] == 's' )
     type = XCAFDoc_ColorSurf;
@@ -319,9 +352,10 @@ static Standard_Integer getStyledcolor (Draw_Interpretor& di, Standard_Integer a
   Handle(XCAFDoc_ColorTool) localTool = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
   if (localTool->GetInstanceColor( aShape, type, col) ) 
   {
-    TCollection_AsciiString Entry;
-    Entry = col.StringName ( col.Name() );
-    di << Entry.ToCString();
+    if ((1 - col.Alpha()) < Precision::Confusion())
+      di << col.GetRGB().StringName(col.GetRGB().Name());
+    else
+      di << col.GetRGB().StringName(col.GetRGB().Name()) << " (" << col.Alpha() << ")";
   }
   return 0;
 }
@@ -329,7 +363,7 @@ static Standard_Integer getStyledcolor (Draw_Interpretor& di, Standard_Integer a
 static Standard_Integer setStyledcolor (Draw_Interpretor& di, Standard_Integer argc, const char** argv)
 {
   if (argc<6) {
-    di<<"Use: "<<argv[0]<<" Doc shape R G B type(s/c)\n";
+    di<<"Use: "<<argv[0]<<" Doc shape R G B [alpha] type(s/c)\n";
     return 1;
   }
   Handle(TDocStd_Document) Doc;   
@@ -339,15 +373,22 @@ static Standard_Integer setStyledcolor (Draw_Interpretor& di, Standard_Integer a
   aShape = DBRep::Get(argv[2]);
 
   Quantity_Color col ( Draw::Atof(argv[3]), Draw::Atof(argv[4]), Draw::Atof(argv[5]), Quantity_TOC_RGB );
-  XCAFDoc_ColorType type;
-  if ( argv[6] && argv[6][0] == 's' )
-    type = XCAFDoc_ColorSurf;
-  else if ( argv[6] && argv[6][0] == 'c' )
-    type = XCAFDoc_ColorCurv;
-  else
-    type = XCAFDoc_ColorGen;
+  Quantity_ColorRGBA aColRGBA;
+  aColRGBA.SetRGB(col);
+  if (argc > 6 && (argv[6][0] != 's' && argv[6][0] != 'c')) {
+    aColRGBA.SetAlpha((Standard_ShortReal)(Draw::Atof(argv[6])));
+  }
+
+  Handle(XCAFDoc_ColorTool) myColors = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
+  XCAFDoc_ColorType ctype = XCAFDoc_ColorGen;
+  if (argc > 6) {
+    if (argv[argc - 1][0] == 's')
+      ctype = XCAFDoc_ColorSurf;
+    else if (argv[argc - 1][0] == 'c')
+      ctype = XCAFDoc_ColorCurv;
+  }
   Handle(XCAFDoc_ColorTool) localTool = XCAFDoc_DocumentTool::ColorTool(Doc->Main());
-  if (!localTool->SetInstanceColor( aShape, type, col) ) 
+  if (!localTool->SetInstanceColor(aShape, ctype, aColRGBA))
   {
     di << "cannot set color for the indicated component\n";
     return 1;
@@ -372,7 +413,7 @@ void XDEDRAW_Colors::InitCommands(Draw_Interpretor& di)
   
   Standard_CString g = "XDE color's commands";
   
-  di.Add ("XSetColor","Doc {Label|Shape} R G B [c|s]\t: Set color [R G B] to shape given by Label, "
+  di.Add ("XSetColor","Doc {Label|Shape} R G B [alpha] [c|s]\t: Set color [R G B] to shape given by Label, "
                       "type of color 's' - for surface, 'c' - for curve (default generic)",
                   __FILE__, setColor, g);
 
@@ -385,13 +426,13 @@ void XDEDRAW_Colors::InitCommands(Draw_Interpretor& di)
   di.Add ("XGetAllColors","Doc \t: Print all colors that defined in document",
                   __FILE__, getAllColors, g);
   
-  di.Add ("XAddColor","Doc R G B \t: Add color in document to color table",
+  di.Add ("XAddColor","Doc R G B [alpha]\t: Add color in document to color table",
                   __FILE__, addColor, g);
   
   di.Add ("XRemoveColor","Doc Label \t: Remove color in document from color table",
                   __FILE__, removeColor, g);
 
-  di.Add ("XFindColor","Doc R G B \t: Find label where indicated color is situated",
+  di.Add ("XFindColor","Doc R G B [alpha]\t: Find label where indicated color is situated",
                   __FILE__, findColor, g);
 
   di.Add ("XUnsetColor","Doc {Label|Shape} ColorType \t: Unset color ",
@@ -409,7 +450,7 @@ void XDEDRAW_Colors::InitCommands(Draw_Interpretor& di)
   di.Add ("XGetInstanceColor","Doc Shape \t: Return the color of component shape ",
                   __FILE__, getStyledcolor, g);
 
-  di.Add ("XSetInstanceColor","Doc Shape color type \t: sets color for component of shape if SHUO structure exists already ",
+  di.Add ("XSetInstanceColor","Doc Shape R G B [alpha] type \t: sets color for component of shape if SHUO structure exists already ",
                   __FILE__, setStyledcolor, g);
 
 }
diff --git a/tests/bugs/xde/bug28641 b/tests/bugs/xde/bug28641
new file mode 100644 (file)
index 0000000..c6a4ddc
--- /dev/null
@@ -0,0 +1,76 @@
+puts "========"
+puts "OCC28641"
+puts "========"
+puts ""
+####################################################
+# Data Exchange - Support alpha-channel of color
+####################################################
+
+pload OCAF
+
+# Create document with View
+NewDocument D_First BinXCAF
+box b 1 1 1
+explode b e
+explode b f
+XAddShape D_First b
+XSetColor D_First b_1 1 0 0 s
+XSetColor D_First b_2 1 1 0 0.3 s
+XSetColor D_First b_11 1 1 1 0.2 c
+XSetColor D_First b_10 0 1 1 c
+XAddColor D_First 0.5 0.5 1 0.1
+
+# Write file
+SaveAs D_First ${imagedir}/bug28521.xbf
+Close D_First
+# Read document
+XOpen ${imagedir}/bug28521.xbf D_Second
+
+# Results validation
+set isOK 1
+set color ""
+set alpha ""
+set prec 1e-7
+#0:1:2:1
+set res [XGetColor D_Second 0:1:2:1]
+if {$res != "RED"} {
+  set isOK 0
+}
+#0:1:2:2
+set res [XGetColor D_Second 0:1:2:2]
+regexp {([A-Z0-9]+) \(([0-9.+eE]+)\)} $res full color alpha
+if {$color != "YELLOW"} {
+  set isOK 0
+}
+if {[expr abs(0.3 - $alpha)] > $prec} {
+  set isOK 0
+}
+#0:1:2:3
+set res [XGetColor D_Second 0:1:2:3]
+regexp {([A-Z0-9]+) \(([0-9.+eE]+)\)} $res full color alpha
+if {$color != "WHITE"} {
+  set isOK 0
+}
+if {[expr abs(0.2 - $alpha)] > $prec} {
+  set isOK 0
+}
+#0:1:2:4
+set res [XGetColor D_Second 0:1:2:4]
+if {$res != "CYAN1"} {
+  set isOK 0
+}
+#0:1:2:5
+set res [XGetColor D_Second 0:1:2:5]
+regexp {([A-Z0-9]+) \(([0-9.+eE]+)\)} $res full color alpha
+if {$color != "LIGHTSLATEBLUE"} {
+  set isOK 0
+}
+if {[expr abs(0.1 - $alpha)] > $prec} {
+  set isOK 0
+}
+
+if {$isOK == 0} {
+  puts "Error: wrong color."
+}
+
+Close D_Second