0023418: Crash on the object displaying when running DRAW on remote station. OpenGL...
[occt.git] / src / OpenGl / OpenGl_GraphicDriver_Layer.cxx
index 3b263d9..9c884b1 100755 (executable)
@@ -1,18 +1,35 @@
-// File:      OpenGl_GraphicDriver_Layer.cxx
-// Created:   20 October 2011
-// Author:    Sergey ZERCHANINOV
-// Copyright: OPEN CASCADE 2011
+// Created on: 2011-10-20
+// Created by: Sergey ZERCHANINOV
+// Copyright (c) 2011-2012 OPEN CASCADE SAS
+//
+// The content of this file is subject to the Open CASCADE Technology Public
+// License Version 6.5 (the "License"). You may not use the content of this file
+// except in compliance with the License. Please obtain a copy of the License
+// at http://www.opencascade.org and read it completely before using this file.
+//
+// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
+// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
+//
+// The Original Code and all software distributed under the License is
+// distributed on an "AS IS" basis, without warranty of any kind, and the
+// Initial Developer hereby disclaims all such warranties, including without
+// limitation, any warranties of merchantability, fitness for a particular
+// purpose or non-infringement. Please see the License for the specific terms
+// and conditions governing the rights and limitations under the License.
+
+
+#include <OpenGl_GlCore11.hxx>
 
 #include <OpenGl_GraphicDriver.hxx>
 
-#include <OSD_FontAspect.hxx>
-
-#include <OpenGl_tgl_all.hxx>
+#include <Font_FontAspect.hxx>
 
 #include <OpenGl_Display.hxx>
 #include <OpenGl_AspectText.hxx>
 #include <OpenGl_TextParam.hxx>
 
+#include <GL/glu.h>
+
 /*----------------------------------------------------------------------*/
 
 struct OpenGl_LAYER_PROP
@@ -47,7 +64,7 @@ static const CALL_DEF_CONTEXTTEXT myDefaultContextText =
   { 1.F, 1.F, 1.F }, //ColorSubTitle
   0, //TextZoomable
   0.F, //TextAngle
-  (int)OSD_FA_Regular //TextFontAspect
+  (int)Font_FA_Regular //TextFontAspect
 };
 
 static Standard_Boolean TheLayerIsOpen = Standard_False;
@@ -81,7 +98,7 @@ void InitLayerProp (const int AListId)
 
 void OpenGl_GraphicDriver::Layer (Aspect_CLayer2d& ACLayer)
 {
-  ACLayer.ptrLayer = (call_def_ptrLayer) malloc (sizeof (CALL_DEF_PTRLAYER));
+  ACLayer.ptrLayer = new CALL_DEF_PTRLAYER();
   ACLayer.ptrLayer->listIndex = glGenLists(1);
 }
 
@@ -110,9 +127,6 @@ void OpenGl_GraphicDriver::BeginLayer (const Aspect_CLayer2d& ACLayer)
   InitLayerProp(ptrLayer->listIndex);
   if (!TheLayerProp.ListId) return;
 
-  glEnable(GL_TEXTURE_2D);
-  //GLboolean stat = glIsEnabled( GL_TEXTURE_2D );
-
   glNewList (TheLayerProp.ListId, GL_COMPILE);
   TheLayerIsOpen = Standard_True;
 }
@@ -243,20 +257,24 @@ void OpenGl_GraphicDriver::SetTextAttributes (const Standard_CString Font, const
 {
   if (!TheLayerProp.ListId || openglDisplay.IsNull()) return;
 
-  if ( strcmp ( TheLayerProp.AspectText.Font(), Font ) != 0 ||
-          (int)TheLayerProp.AspectText.DisplayType() != AType )
+  // get current subtitle text color
+  const TEL_COLOUR &aSubColor = TheLayerProp.AspectText.SubtitleColor ();
+
+  // update if there are any modifications
+  if (strcmp (TheLayerProp.AspectText.Font(), Font) != 0   ||
+      (int)TheLayerProp.AspectText.DisplayType() != AType  ||
+      aSubColor.rgb[0] != (float)R || 
+      aSubColor.rgb[1] != (float)G ||
+      aSubColor.rgb[2] != (float)B)
   {
     CALL_DEF_CONTEXTTEXT aContextText = myDefaultContextText;
 
-    aContextText.Font = (char*)Font;
+    aContextText.Font = Font;
     aContextText.DisplayType = AType;
-    aContextText.Color.r = R;
-    aContextText.Color.g = G;
-    aContextText.Color.b = B;
+    aContextText.ColorSubTitle.r = R;
+    aContextText.ColorSubTitle.g = G;
+    aContextText.ColorSubTitle.b = B;
     TheLayerProp.AspectText.SetContext(aContextText);
-
-    TheLayerProp.FontCurrent = openglDisplay->FindFont(TheLayerProp.AspectText.Font(), TheLayerProp.AspectText.FontAspect(), TheLayerProp.TextParam.Height);
-
     TheLayerProp.FontChanged = Standard_True;
   }
 }
@@ -271,26 +289,143 @@ void OpenGl_GraphicDriver::Text (const Standard_CString AText, const Standard_Sh
   {
     TheLayerProp.TextParam.Height = (int )height;
     TheLayerProp.FontCurrent = openglDisplay->FindFont(TheLayerProp.AspectText.Font(), TheLayerProp.AspectText.FontAspect(), (int )height);
-       TheLayerProp.FontChanged = Standard_False;
+    TheLayerProp.FontChanged = Standard_False;
   }
 
-  TCollection_ExtendedString estr(AText);
-  const Techar *s = (const Techar *)estr.ToExtString();
+  TCollection_ExtendedString aExtStr(AText);
+  const Techar *aTChStr = (const Techar *)aExtStr.ToExtString();
 
   //szv: conversion of Techar to wchar_t
-  wchar_t *s1 = (wchar_t*)s;
+  wchar_t *aWChStr = (wchar_t*)aTChStr;
   if (sizeof(Techar) != sizeof(wchar_t))
   {
-    Tint i = 0; while (s[i++]);
-    s1 = new wchar_t[i];
-    i = 0; while (s1[i++] = (wchar_t)(*s++));
+    Tint i = 0; while (aTChStr[i++]);
+    aWChStr = new wchar_t[i];
+    i = 0; while (aWChStr[i++] = (wchar_t)(*aTChStr++));
+  }
+
+  const Aspect_TypeOfDisplayText aDispType =
+    TheLayerProp.AspectText.DisplayType();
+
+  // display type of text
+  if (aDispType != Aspect_TODT_NORMAL)
+  {
+    switch (aDispType)
+    {
+      // blend type
+      case Aspect_TODT_BLEND:
+      {
+        glEnable(GL_COLOR_LOGIC_OP);
+        glLogicOp(GL_XOR);
+      }
+      break;
+      
+      // subtitle type
+      case Aspect_TODT_SUBTITLE:
+      {
+        GLint aViewport[4];
+        GLdouble aModelMatrix[16], aProjMatrix[16];
+        glGetIntegerv (GL_VIEWPORT, aViewport);
+        glGetDoublev (GL_MODELVIEW_MATRIX, aModelMatrix);
+        glGetDoublev (GL_PROJECTION_MATRIX, aProjMatrix);
+
+        int aWidth, anAscent, aDescent;
+        openglDisplay->StringSize(aWChStr, aWidth, anAscent, aDescent);
+
+        GLdouble aWinX, aWinY, aWinZ;
+        gluProject ((GLdouble)X, (GLdouble)Y, 0.0, aModelMatrix,
+          aProjMatrix, aViewport, &aWinX, &aWinY, &aWinZ);
+
+        // project coordinates
+        GLdouble aCoordX[4];
+        GLdouble aCoordY[4];
+        GLdouble aCoordZ[4];
+
+        // left bottom corner
+        gluUnProject (aWinX,  aWinY + aDescent, aWinZ, aModelMatrix,
+          aProjMatrix, aViewport, &aCoordX[0], &aCoordY[0], &aCoordZ[0]);
+
+        // right bottom corner        
+        gluUnProject (aWinX + aWidth, aWinY + aDescent, aWinZ, aModelMatrix,
+          aProjMatrix, aViewport, &aCoordX[1], &aCoordY[1], &aCoordZ[1]);
+
+        // right top corner
+        gluUnProject (aWinX + aWidth, aWinY + anAscent, aWinZ, aModelMatrix,
+          aProjMatrix, aViewport, &aCoordX[2], &aCoordY[2], &aCoordZ[2]);
+
+        // left top corner
+        gluUnProject (aWinX, aWinY + anAscent, aWinZ, aModelMatrix, 
+          aProjMatrix, aViewport, &aCoordX[3], &aCoordY[3], &aCoordZ[3]);
+
+        // draw colored plane and reset the color
+        glColor3fv (TheLayerProp.AspectText.SubtitleColor ().rgb);
+        glBegin(GL_POLYGON);
+        glVertex3d(aCoordX[0], aCoordY[0], aCoordZ[0]);
+        glVertex3d(aCoordX[1], aCoordY[1], aCoordZ[1]);
+        glVertex3d(aCoordX[2], aCoordY[2], aCoordZ[2]);
+        glVertex3d(aCoordX[3], aCoordY[3], aCoordZ[3]);
+        glEnd();
+        glColor3fv (TheLayerProp.Color.rgb);
+      }
+      break;
+
+      case Aspect_TODT_DEKALE:
+      {
+        GLint aViewport[4];
+        GLdouble aModelMatrix[16], aProjMatrix[16];
+        glGetIntegerv (GL_VIEWPORT, aViewport);
+        glGetDoublev (GL_MODELVIEW_MATRIX, aModelMatrix);
+        glGetDoublev (GL_PROJECTION_MATRIX, aProjMatrix);
+
+        GLdouble aWinX, aWinY, aWinZ;
+        gluProject ((GLdouble)X, (GLdouble)Y, 0.0, aModelMatrix,
+          aProjMatrix, aViewport, &aWinX, &aWinY, &aWinZ);
+
+        GLdouble aProjX, aProjY, aProjZ;
+
+        gluUnProject (aWinX + 1, aWinY + 1, aWinZ, aModelMatrix,
+          aProjMatrix, aViewport, &aProjX, &aProjY, &aProjZ);
+
+        // draw a decal
+        glColor3fv (TheLayerProp.AspectText.SubtitleColor ().rgb);
+        openglDisplay->RenderText (aWChStr, 1, (float)aProjX, (float)aProjY,
+          (float)aProjZ, &TheLayerProp.AspectText, &TheLayerProp.TextParam);
+
+        gluUnProject (aWinX, aWinY, aWinZ, aModelMatrix, aProjMatrix,
+          aViewport, &aProjX, &aProjY, &aProjZ);
+
+        gluUnProject (aWinX - 1, aWinY - 1, aWinZ, aModelMatrix, aProjMatrix, 
+          aViewport, &aProjX, &aProjY, &aProjZ);
+
+        openglDisplay->RenderText(aWChStr, 1, (float)aProjX, (float)aProjY,
+          (float)aProjZ, &TheLayerProp.AspectText, &TheLayerProp.TextParam);
+
+        gluUnProject (aWinX - 1, aWinY + 1, aWinZ, aModelMatrix, aProjMatrix, 
+          aViewport, &aProjX, &aProjY, &aProjZ);
+
+        openglDisplay->RenderText(aWChStr, 1, (float)aProjX, (float)aProjY,
+          (float)aProjZ, &TheLayerProp.AspectText, &TheLayerProp.TextParam);
+
+        gluUnProject (aWinX + 1, aWinY - 1, aWinZ, aModelMatrix, aProjMatrix,
+          aViewport, &aProjX, &aProjY, &aProjZ);
+
+        openglDisplay->RenderText(aWChStr, 1, (float)aProjX, (float)aProjY,
+          (float)aProjZ, &TheLayerProp.AspectText, &TheLayerProp.TextParam);
+        glColor3fv (TheLayerProp.Color.rgb);
+      }
+      break;
+    }
   }
 
-  openglDisplay->RenderText(s1, 1, (float)X, (float)Y, 0.F, &TheLayerProp.AspectText, &TheLayerProp.TextParam);
+  openglDisplay->RenderText(aWChStr, 1, (float)X, (float)Y, 0.F,
+    &TheLayerProp.AspectText, &TheLayerProp.TextParam);
+
+  if (aDispType == Aspect_TODT_BLEND)
+    glDisable(GL_COLOR_LOGIC_OP);
 
   //szv: delete temporary wide string
   if (sizeof(Techar) != sizeof(wchar_t))
-    delete[] s1;
+    delete[] aWChStr;
 }
 
 void OpenGl_GraphicDriver::TextSize (const Standard_CString AText, const Standard_ShortReal AHeight, Standard_ShortReal& AWidth, Standard_ShortReal& AnAscent, Standard_ShortReal& ADescent) const
@@ -303,7 +438,7 @@ void OpenGl_GraphicDriver::TextSize (const Standard_CString AText, const Standar
   {
     TheLayerProp.TextParam.Height = (int )height;
     TheLayerProp.FontCurrent = openglDisplay->FindFont(TheLayerProp.AspectText.Font(), TheLayerProp.AspectText.FontAspect(), (int )height);
-       TheLayerProp.FontChanged = Standard_False;
+    TheLayerProp.FontChanged = Standard_False;
   }
 
   TCollection_ExtendedString estr(AText);