0022879: Possible bug in Opengl_togl_begin_layer_mode.cxx
[occt.git] / src / V3d / V3d_ColorScale.cxx
1 // File:  V3d_ColorScale.cxx
2 // Created: Tue Jun 22 17:44:25 2004
3 // Author:  STV
4 //Copyright:  Open Cascade 2004
5
6 #include <V3d_ColorScale.ixx>
7
8 #include <V3d_View.hxx>
9 #include <V3d_LayerMgr.hxx>
10
11 #include <Visual3d_View.hxx>
12 #include <Visual3d_Layer.hxx>
13 #include <Visual3d_ViewManager.hxx>
14
15 #include <Aspect_Window.hxx>
16 #include <Aspect_ColorMap.hxx>
17 #include <Aspect_ColorMapEntry.hxx>
18 #include <Aspect_SequenceOfColor.hxx>
19 #include <Aspect_TypeOfColorScaleData.hxx>
20 #include <Aspect_TypeOfColorScalePosition.hxx>
21
22 #include <TCollection_AsciiString.hxx>
23 #include <TColStd_SequenceOfExtendedString.hxx>
24 #include <Graphic3d_NameOfFont.hxx>
25
26 V3d_ColorScale::V3d_ColorScale( const Handle(V3d_LayerMgr)& aMgr )
27 : Aspect_ColorScale(),
28 myLayerMgr( aMgr.operator->() ),
29 myDisplay( Standard_False )
30 {
31 }
32
33 void V3d_ColorScale::Display()
34 {
35   myDisplay = Standard_True;
36   UpdateColorScale();
37 }
38
39 void V3d_ColorScale::Erase()
40 {
41   myDisplay = Standard_False;
42   UpdateColorScale();
43 }
44
45 Standard_Boolean V3d_ColorScale::IsDisplayed() const
46 {
47   return myDisplay;
48 }
49
50 void V3d_ColorScale::UpdateColorScale()
51 {
52   myLayerMgr->Compute();
53 }
54
55 void V3d_ColorScale::PaintRect( const Standard_Integer X, const Standard_Integer Y,
56                                 const Standard_Integer W, const Standard_Integer H,
57                                 const Quantity_Color& aColor, const Standard_Boolean aFilled )
58 {
59   const Handle(Visual3d_Layer) &theLayer = myLayerMgr->Overlay();
60   if ( theLayer.IsNull() )
61     return;
62
63   theLayer->SetColor( aColor );
64   if ( aFilled )
65     theLayer->DrawRectangle( X, Y, W, H );
66   else {
67     theLayer->SetLineAttributes( Aspect_TOL_SOLID, 0.5 );
68     theLayer->BeginPolyline();
69     theLayer->AddVertex( X, Y, Standard_False );
70     theLayer->AddVertex( X, Y + H, Standard_True );
71     theLayer->AddVertex( X + W, Y + H, Standard_True );
72     theLayer->AddVertex( X + W, Y, Standard_True );
73     theLayer->AddVertex( X, Y, Standard_True );
74     theLayer->ClosePrimitive();
75   }
76 }
77
78 void V3d_ColorScale::PaintText( const TCollection_ExtendedString& aText,
79                                 const Standard_Integer X, const Standard_Integer Y,
80                                 const Quantity_Color& aColor )
81 {
82   const Handle(Visual3d_Layer) &theLayer = myLayerMgr->Overlay();
83   if ( theLayer.IsNull() )
84     return;
85
86   theLayer->SetColor( aColor );
87   theLayer->SetTextAttributes( Graphic3d_NOF_ASCII_MONO, Aspect_TODT_NORMAL, aColor );
88   TCollection_AsciiString theText( aText.ToExtString(), '?' );
89   Standard_Integer aTextH = GetTextHeight();
90   Standard_Integer aWidth, anAscent, aDescent;
91   TextSize(aText, aTextH, aWidth, anAscent, aDescent);
92   theLayer->DrawText( theText.ToCString(), X, Y + anAscent, aTextH);
93 }
94
95 Standard_Integer V3d_ColorScale::TextWidth( const TCollection_ExtendedString& aText ) const
96 {
97   Standard_Integer aWidth, anAscent, aDescent;
98   TextSize(aText, GetTextHeight(), aWidth, anAscent, aDescent);
99   return aWidth;
100 }
101
102 Standard_Integer V3d_ColorScale::TextHeight( const TCollection_ExtendedString& aText ) const
103 {
104   Standard_Integer aWidth, anAscent, aDescent;
105   TextSize(aText, GetTextHeight(), aWidth, anAscent, aDescent);
106   return anAscent+aDescent;
107 }
108
109 void V3d_ColorScale::TextSize (const TCollection_ExtendedString& AText,  const Standard_Integer AHeight, Standard_Integer& AWidth, Standard_Integer& AnAscent, Standard_Integer& ADescent) const 
110 {
111   const Handle(Visual3d_Layer) &theLayer = myLayerMgr->Overlay();
112   if ( !theLayer.IsNull() ) {
113     Standard_Real aWidth, anAscent, aDescent;
114     TCollection_AsciiString theText( AText.ToExtString(), '?' );
115     theLayer->TextSize(theText.ToCString(),AHeight,aWidth,anAscent,aDescent);
116     AWidth = (Standard_Integer)aWidth;
117     AnAscent = (Standard_Integer)anAscent;
118     ADescent = (Standard_Integer)aDescent;
119   } 
120   else {
121     AWidth=AnAscent=ADescent=0;
122   }
123 }
124
125 void V3d_ColorScale::DrawScale ()
126 {
127   const Handle(V3d_View) &theView = myLayerMgr->View();
128   if ( theView.IsNull() )
129     return;
130
131   const Handle(Aspect_Window) &theWin = theView->Window();
132   if ( theWin.IsNull() )
133     return;
134
135   Standard_Integer WinWidth( 0 ), WinHeight( 0 );
136   theWin->Size( WinWidth, WinHeight );
137
138   const Standard_Integer X = RealToInt(GetXPosition() * WinWidth);
139   const Standard_Integer Y = RealToInt(GetYPosition() * WinHeight);
140
141   const Standard_Integer W = RealToInt(GetWidth() * WinWidth);
142   const Standard_Integer H = RealToInt(GetHeight() * WinHeight);
143
144   Aspect_ColorScale::DrawScale( theView->BackgroundColor(), X, Y, W, H );
145 }