0023418: Crash on the object displaying when running DRAW on remote station. OpenGL...
[occt.git] / src / OpenGl / OpenGl_TextureBox.cxx
index cc96690..3d8b77d 100755 (executable)
@@ -63,7 +63,7 @@
 *   17-12-97: FMN ; Probleme sur Optimisation sur MyBindTextureEXT()
 *        Le test sur la texture courante doit tenir compte du contexte.
 *   22-07-98: FGU ; Ajout fonctions TransferTexture_To_Data() et TransferData_To_Texture()
-*        
+*
 */
 
 #include <stdio.h>
 #include <OpenGl_GlCore11.hxx>
 #include <OpenGl_Display.hxx>
 #include <OpenGl_TextureBox.hxx>
-#include <OpenGl_ImageBox.hxx>
-#include <OpenGl_Memory.hxx>
-#include <OpenGl_ResourceCleaner.hxx>
 #include <OpenGl_ResourceTexture.hxx>
+#include <OpenGl_Context.hxx>
 
 #include <GL/glu.h> // gluBuild2DMipmaps()
 
-#define GROW_TEXTURES 8
-#define GROW_TEXTURES_DATA 8
-#define GROW_CONTEXT 8
+#include <NCollection_Vector.hxx>
 
 typedef enum {TEXDATA_NONE, TEXDATA_1D, TEXDATA_2D, TEXDATA_2DMM} texDataStatus;
 typedef enum {TEX_NONE, TEX_ALLOCATED} texStatus;
 
-typedef GLfloat SizeType[4]; 
+typedef GLfloat SizeType[4];
 
 typedef int TextureDataID;
 #define TEXTUREDATA_ERROR -1
@@ -101,18 +97,19 @@ struct texData
   GLint type;
   int share_count;
   DEFINE_STANDARD_ALLOC
-};  
+};
 
+struct contextData
+{
+  GLuint number;
+  GLDRAWABLE drawable;
+  GLCONTEXT context;
+};
 
 struct texDraw
 {
   TextureDataID data;
-  GLuint *number;
-  GLDRAWABLE *drawable;
-  GLCONTEXT *context;
-  char *use_bind_texture;
-  int context_count;
-  int context_size;  
+  NCollection_Vector<contextData> contextdata;
   texStatus status;
 
   GLint Gen;
@@ -134,13 +131,9 @@ struct texDraw
 * Variables statiques
 */
 
-static texDraw *textab = NULL;
-static int textures_count = 0;
-static int textures_size = 0;
+static NCollection_Vector<texDraw> textab;
 
-static texData *texdata = NULL;
-static int textures_data_count = 0;
-static int textures_data_size = 0;
+static NCollection_Vector<texData> texdata;
 
 static TextureDataID current_texture_data = TEXTUREDATA_ERROR;
 static TextureID current_texture = TEXTUREBOX_ERROR;
@@ -161,11 +154,13 @@ static GLenum status2type[] = { GL_NONE, GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTUR
 */
 static TextureDataID FindTextureData(char *FileName)
 {
-  int i;
-
-  for (i=0; i<textures_data_size; i++)
-    if ( texdata[i].status!=TEXDATA_NONE && strcmp(FileName, texdata[i].imageFileName)==0 )
+  for (int i = 0; i < texdata.Length(); i++)
+  {
+    if ( texdata(i).status != TEXDATA_NONE && strcmp(FileName, texdata(i).imageFileName) == 0 )
+    {
       return i;
+    }
+  }
 
   return TEXTUREDATA_ERROR;
 }
@@ -176,35 +171,17 @@ static TextureDataID FindTextureData(char *FileName)
 */
 static TextureDataID FindFreeTextureData(void)
 {
-  int i;
-
-  /* ya encore de la place ? */
-  if (textures_data_count == textures_data_size)
+  for (int i = 0; i < texdata.Length(); i++)
   {
-    textures_data_size += GROW_TEXTURES_DATA;
-#if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)
-    texdata = (texData*)realloc(texdata, textures_data_size*sizeof(texData));
-#else
-    texdata = cmn_resizemem<texData>(texdata, textures_data_size);
-#endif
-    if (texdata == NULL) return TEXTUREDATA_ERROR;
-
-    for (i=textures_data_count; i<textures_data_size; i++)
-      texdata[i].status = TEXDATA_NONE;
-
-    /* on a deja assez perdu de temps comme ca => retourne un ID rapidement... */
-    return textures_data_count++;
-  }
-
-  /* recherche d'un ID libre */
-  for (i=0; i<textures_data_size; i++)
-    if (texdata[i].status == TEXDATA_NONE)
+    if (texdata(i).status == TEXDATA_NONE)
     {
-      textures_data_count = Max (textures_data_count, i + 1);
       return i;
     }
+  }
 
-    return TEXTUREDATA_ERROR;
+  texData aTexData;
+  texdata.Append(aTexData);
+  return texdata.Length() - 1;
 }
 
 /*----------------------------------------------------------------------*/
@@ -213,34 +190,17 @@ static TextureDataID FindFreeTextureData(void)
 */
 static TextureID FindFreeTexture(void)
 {
-  int i;
-
-  /* ya encore de la place ? */
-  if (textures_count == textures_size)
+  for (int i = 0; i < textab.Length(); i++)
   {
-    textures_size += GROW_TEXTURES;
-#if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)
-    textab = (texDraw*)realloc(textab, textures_size*sizeof(texDraw));
-#else
-    textab = cmn_resizemem<texDraw>(textab, textures_size);
-#endif
-    if (textab == NULL) return TEXTUREBOX_ERROR;
-
-    for (i=textures_count; i<textures_size; i++)
-      textab[i].status = TEX_NONE;
-
-    /* on a deja assez perdu de temps comme ca => retourne un ID rapidement... */
-    return textures_count++;
-  }
-
-  for (i=0; i<textures_size; i++)
-    if (textab[i].status == TEX_NONE)
+    if (textab(i).status == TEX_NONE)
     {
-      textures_count = Max (textures_count, i + 1);
       return i;
     }
+  }
 
-    return TEXTUREBOX_ERROR;
+  texDraw aTexDraw;
+  textab.Append(aTexDraw);
+  return textab.Length() - 1;
 }
 
 /*----------------------------------------------------------------------*/
@@ -252,8 +212,8 @@ static int FindTextureContext(TextureID ID)
   int i;
 
   GLCONTEXT cur = GET_GL_CONTEXT();
-  for (i=0; i<textab[ID].context_count; i++)
-    if (textab[ID].context[i] == cur)
+  for (i=0; i<textab(ID).contextdata.Length(); i++)
+    if (textab(ID).contextdata(i).context == cur)
       return i;
 
   return TEXTUREBOX_ERROR;
@@ -267,26 +227,26 @@ static void LoadTexture(TextureID ID)
 {
   TextureDataID data;
 
-  data = textab[ID].data;
-  switch (texdata[data].status)
+  data = textab(ID).data;
+  switch (texdata(data).status)
   {
   case TEXDATA_1D:
-    glTexImage1D(GL_TEXTURE_1D, 0, 4, 
-      texdata[data].imageWidth, 0,
-      GL_RGBA, GL_UNSIGNED_BYTE, texdata[data].image);
+    glTexImage1D(GL_TEXTURE_1D, 0, 4,
+      texdata(data).imageWidth, 0,
+      GL_RGBA, GL_UNSIGNED_BYTE, texdata(data).image);
     break;
 
   case TEXDATA_2D:
     glTexImage2D(GL_TEXTURE_2D, 0, 4,
-      texdata[data].imageWidth, texdata[data].imageHeight, 0,
-      GL_RGBA, GL_UNSIGNED_BYTE, texdata[data].image);
+      texdata(data).imageWidth, texdata(data).imageHeight, 0,
+      GL_RGBA, GL_UNSIGNED_BYTE, texdata(data).image);
     break;
 
   case TEXDATA_2DMM:
     gluBuild2DMipmaps(GL_TEXTURE_2D, 4,
-      texdata[data].imageWidth, 
-      texdata[data].imageHeight,
-      GL_RGBA, GL_UNSIGNED_BYTE, texdata[data].image);
+      texdata(data).imageWidth,
+      texdata(data).imageHeight,
+      GL_RGBA, GL_UNSIGNED_BYTE, texdata(data).image);
     break;
   default:
     break;
@@ -304,7 +264,7 @@ static void SetTextureParam(TextureID ID)
   TextureDataID data;
 
 
-  data = textab[ID].data;
+  data = textab(ID).data;
   glGetIntegerv(GL_MATRIX_MODE, &cur_matrix);
 
   /*
@@ -312,32 +272,32 @@ static void SetTextureParam(TextureID ID)
   */
   glMatrixMode(GL_TEXTURE);
   glLoadIdentity();
-  /* if (textab[ID].Gen != GL_SPHERE_MAP)
+  /* if (textab(ID).Gen != GL_SPHERE_MAP)
   {*/
-  glScalef(textab[ID].scalex, textab[ID].scaley, 1.0);
-  glTranslatef(-textab[ID].transx, -textab[ID].transy, 0.0);
-  glRotatef(-textab[ID].angle, 0.0, 0.0, 1.0);
+  glScalef(textab(ID).scalex, textab(ID).scaley, 1.0);
+  glTranslatef(-textab(ID).transx, -textab(ID).transy, 0.0);
+  glRotatef(-textab(ID).angle, 0.0, 0.0, 1.0);
   /*}*/
 
 
   /*
   * GENERATION AUTOMATIQUE DE TEXTURE
   */
-  switch (textab[ID].Gen)
+  switch (textab(ID).Gen)
   {
   case GL_OBJECT_LINEAR:
     glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
-    glTexGenfv(GL_S, GL_OBJECT_PLANE, textab[ID].Plane1);
-    if (texdata[data].status != TEXDATA_1D)
+    glTexGenfv(GL_S, GL_OBJECT_PLANE, textab(ID).Plane1);
+    if (texdata(data).status != TEXDATA_1D)
     {
       glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
-      glTexGenfv(GL_T, GL_OBJECT_PLANE, textab[ID].Plane2);
+      glTexGenfv(GL_T, GL_OBJECT_PLANE, textab(ID).Plane2);
     }
     break;
 
   case GL_SPHERE_MAP:
     glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
-    if (texdata[data].status != TEXDATA_1D)
+    if (texdata(data).status != TEXDATA_1D)
       glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
     break;
 
@@ -347,12 +307,12 @@ static void SetTextureParam(TextureID ID)
     glLoadIdentity();
 
     glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
-    glTexGenfv(GL_S, GL_EYE_PLANE, textab[ID].Plane1);
+    glTexGenfv(GL_S, GL_EYE_PLANE, textab(ID).Plane1);
 
-    if (texdata[data].status != TEXDATA_1D)
+    if (texdata(data).status != TEXDATA_1D)
     {
       glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_EYE_LINEAR);
-      glTexGenfv(GL_T, GL_EYE_PLANE, textab[ID].Plane2);
+      glTexGenfv(GL_T, GL_EYE_PLANE, textab(ID).Plane2);
     }
 
     glPopMatrix();
@@ -363,22 +323,22 @@ static void SetTextureParam(TextureID ID)
   /*
   * RENDU DE LA TEXTURE AVEC LES LUMIERES
   */
-  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, textab[ID].Light);
+  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, textab(ID).Light);
 
 
   /*
   * LISSAGE DE LA TEXTURE
   */
-  switch (texdata[data].status)
+  switch (texdata(data).status)
   {
   case TEXDATA_1D:
   case TEXDATA_2D:
-    glTexParameteri(texdata[data].type, GL_TEXTURE_MAG_FILTER, textab[ID].Render);
-    glTexParameteri(texdata[data].type, GL_TEXTURE_MIN_FILTER, textab[ID].Render);
+    glTexParameteri(texdata(data).type, GL_TEXTURE_MAG_FILTER, textab(ID).Render);
+    glTexParameteri(texdata(data).type, GL_TEXTURE_MIN_FILTER, textab(ID).Render);
     break;
 
   case TEXDATA_2DMM:
-    if (textab[ID].Render == GL_NEAREST)
+    if (textab(ID).Render == GL_NEAREST)
     {
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
@@ -388,7 +348,7 @@ static void SetTextureParam(TextureID ID)
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
       glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
     }
-    break;  
+    break;
   default:
     break;
   }
@@ -397,16 +357,16 @@ static void SetTextureParam(TextureID ID)
   /*
   * WRAP DE LA TEXTURE
   */
-  switch (texdata[data].status)
+  switch (texdata(data).status)
   {
   case TEXDATA_1D:
-    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, textab[ID].Wrap);
+    glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, textab(ID).Wrap);
     break;
 
   case TEXDATA_2D:
   case TEXDATA_2DMM:
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, textab[ID].Wrap);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, textab[ID].Wrap);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, textab(ID).Wrap);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, textab(ID).Wrap);
     break;
   default:
     break;
@@ -421,16 +381,15 @@ static void SetTextureParam(TextureID ID)
 */
 static void MyGenTextureEXT (TextureID ID)
 {
-  int Context = textab[ID].context_count;
-  TextureDataID data = textab[ID].data;
-
-  textab[ID].context[Context]  = GET_GL_CONTEXT();
-  textab[ID].drawable[Context] = GET_GLDEV_CONTEXT();
-  textab[ID].use_bind_texture[Context] = (char )GL_TRUE;
-  glGenTextures (1, &textab[ID].number[Context]);
-  glBindTexture (texdata[data].type, textab[ID].number[Context]);
+  TextureDataID data = textab(ID).data;
+  contextData aContextData;
+
+  aContextData.context = GET_GL_CONTEXT();
+  aContextData.drawable = GET_GLDEV_CONTEXT();
+  glGenTextures (1, &aContextData.number);
+  textab(ID).contextdata.Append(aContextData);
+  glBindTexture (texdata(data).type, aContextData.number);
   LoadTexture (ID);
-  textab[ID].context_count++;
 }
 
 /*----------------------------------------------------------------------*/
@@ -439,18 +398,18 @@ static void MyGenTextureEXT (TextureID ID)
 */
 static void MyBindTextureEXT (TextureID ID, int Context)
 {
-  TextureDataID data = textab[ID].data;
-  if (texdata[data].status == TEXDATA_NONE)
+  TextureDataID data = textab(ID).data;
+  if (texdata(data).status == TEXDATA_NONE)
     return;
 
-  GLenum aParamName = texdata[data].status == TEXDATA_1D ? 
-       GL_TEXTURE_BINDING_1D : GL_TEXTURE_BINDING_2D;
+  GLenum aParamName = texdata(data).status == TEXDATA_1D ?
+  GL_TEXTURE_BINDING_1D : GL_TEXTURE_BINDING_2D;
 
   GLint aCurrTex = -1;
   glGetIntegerv (aParamName, &aCurrTex);
-  if (textab[ID].number[Context] != aCurrTex)
+  if (textab(ID).contextdata(Context).number != aCurrTex)
   {
-    glBindTexture (texdata[data].type, textab[ID].number[Context]);
+    glBindTexture (texdata(data).type, textab(ID).contextdata(Context).number);
   }
 }
 
@@ -463,118 +422,14 @@ static int InstallTextureInContext(TextureID ID)
 #ifdef PRINT
   printf("InstallTextureInContext::installation de la texture dans le context\n");
 #endif
-
-
-  /* ya encore de la place dans le tableau de context ? */
-  if (textab[ID].context_count == textab[ID].context_size)
-  {
-#ifdef PRINT
-    printf("InstallTextureInContext::allocation dans le context\n");
-#endif
-    textab[ID].context_size += GROW_CONTEXT;
-#if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)
-    textab[ID].number =
-      (GLuint*)realloc(textab[ID].number, textab[ID].context_size*sizeof(GLuint));
-    textab[ID].context =
-      (GLCONTEXT*)realloc(textab[ID].context, textab[ID].context_size*sizeof(GLCONTEXT));
-    textab[ID].drawable =
-      (GLDRAWABLE*)realloc(textab[ID].drawable, textab[ID].context_size*sizeof(GLDRAWABLE));
-    textab[ID].use_bind_texture =
-      (char*)realloc(textab[ID].use_bind_texture, textab[ID].context_size);
-#else
-    textab[ID].number =
-      cmn_resizemem<GLuint>(textab[ID].number, textab[ID].context_size);
-    textab[ID].context =
-      cmn_resizemem<GLCONTEXT>(textab[ID].context, textab[ID].context_size);
-    textab[ID].drawable =
-      cmn_resizemem<GLDRAWABLE>(textab[ID].drawable, textab[ID].context_size);
-    textab[ID].use_bind_texture =
-      cmn_resizemem<char>(textab[ID].use_bind_texture, textab[ID].context_size);
-#endif
-    if ( (textab[ID].number == NULL) ||
-      (textab[ID].context == NULL) ||
-      (textab[ID].drawable == NULL) ||
-      (textab[ID].use_bind_texture == NULL) )
-    {
-      /* erreur => libere tout */
-      free(textab[ID].number);
-      free(textab[ID].context);
-      free(textab[ID].drawable);
-      free(textab[ID].use_bind_texture);
-      textab[ID].context_size = 0;
-
-      return TEXTUREBOX_ERROR;
-    }
-  }
-
   MyGenTextureEXT(ID);
   SetTextureParam(ID);
 #ifdef PRINT
   printf("InstallTextureInContext::context ok\n");
 #endif
   return 0;
-}  
-
-/*----------------------------------------------------------------------*/
-static TextureID GetTexture(char *FileName, texDataStatus status)
-{
-  TextureDataID i;
-  TextureID j;
-  int dummy;
-
-  /* essait de trouver la texture */
-  i = FindTextureData(FileName);
-  if (i == TEXTUREDATA_ERROR)
-  {
-#ifdef PRINT
-    printf("GetTexture::la texture %s n'existe pas => chargement\n", FileName);
-#endif
-    /* creation d'une texture */
-    i = FindFreeTextureData();
-    if (i == TEXTUREDATA_ERROR) return TEXTUREBOX_ERROR;
-
-    texdata[i].share_count = 0;
-    strcpy(texdata[i].imageFileName, FileName);
-    texdata[i].image = (GLubyte *)read_texture(FileName, 
-      &texdata[i].imageWidth,
-      &texdata[i].imageHeight,
-      &dummy);
-    if (texdata[i].image == NULL) return TEXTUREBOX_ERROR;
-
-    texdata[i].status = status;            
-    texdata[i].type = status2type[status];
-  }
-
-  j = FindFreeTexture();
-  if (j != TEXTUREBOX_ERROR)
-  {
-#ifdef PRINT
-    printf("GetTexture::installation texture pour obj %d\n", j);
-#endif
-    textab[j].context_count = 0;
-    textab[j].context_size = 0;
-    textab[j].number = NULL;
-    textab[j].drawable = NULL;
-    textab[j].context = NULL;
-    textab[j].use_bind_texture = NULL;
-    textab[j].data = i;
-    textab[j].status = TEX_ALLOCATED;
-    texdata[i].share_count++;
-
-    SetTextureDefaultParams(j);
-
-#ifdef PRINT
-    printf("GetTexture::texture %s(%d)    texture %d   count=%d\n", texdata[i].imageFileName, i, j, texdata[i].share_count);
-#endif
-  }
-  else
-    if (texdata[i].share_count != 0)
-      free(texdata[i].image);  
-
-  return j;
 }
 
-
 /*----------------------------------------------------------------------*/
 static TextureID GetTextureData(char *FileName, texDataStatus status, const GLint width, const GLint height, const void *data)
 {
@@ -592,17 +447,17 @@ static TextureID GetTextureData(char *FileName, texDataStatus status, const GLin
     i = FindFreeTextureData();
     if (i == TEXTUREDATA_ERROR) return TEXTUREBOX_ERROR;
 
-    texdata[i].share_count = 0;
-    strcpy(texdata[i].imageFileName, FileName);
-    texdata[i].image = (GLubyte *)malloc(width*height*4*sizeof(GLubyte));
-    memcpy(texdata[i].image, data, (width*height*4));
-    texdata[i].imageWidth = width;
-    texdata[i].imageHeight = height;
+    texdata(i).share_count = 0;
+    strcpy(texdata(i).imageFileName, FileName);
+    texdata(i).image = new GLubyte[width*height*4];
+    memcpy(texdata(i).image, data, (width*height*4));
+    texdata(i).imageWidth = width;
+    texdata(i).imageHeight = height;
 
-    if (texdata[i].image == NULL) return TEXTUREBOX_ERROR;
+    if (texdata(i).image == NULL) return TEXTUREBOX_ERROR;
 
-    texdata[i].status = status;            
-    texdata[i].type = status2type[status];
+    texdata(i).status = status;
+    texdata(i).type = status2type[status];
   }
 
   j = FindFreeTexture();
@@ -611,32 +466,27 @@ static TextureID GetTextureData(char *FileName, texDataStatus status, const GLin
 #ifdef PRINT
     printf("GetTextureData::installation texture pour obj %d\n", j);
 #endif
-    textab[j].context_count = 0;
-    textab[j].context_size = 0;
-    textab[j].number = NULL;
-    textab[j].drawable = NULL;
-    textab[j].context = NULL;
-    textab[j].use_bind_texture = NULL;
-    textab[j].data = i;
-    textab[j].status = TEX_ALLOCATED;
-    texdata[i].share_count++;
+    textab(j).contextdata.Clear();
+    textab(j).data = i;
+    textab(j).status = TEX_ALLOCATED;
+    texdata(i).share_count++;
 
     SetTextureDefaultParams(j);
 
 #ifdef PRINT
-    printf("GetTextureData::texture %s(%d)    texture %d   count=%d\n", texdata[i].imageFileName, i, j, texdata[i].share_count);
+    printf("GetTextureData::texture %s(%d)    texture %d   count=%d\n", texdata(i).imageFileName, i, j, texdata(i).share_count);
 #endif
   }
   else
-    if (texdata[i].share_count != 0)
-      free(texdata[i].image);  
+    if (texdata(i).share_count != 0)
+      delete [] texdata(i).image;
 
   return j;
 }
 
 /*----------------------------------------------------------------------*/
 /*
-* Fonctions publiques 
+* Fonctions publiques
 */
 
 
@@ -644,43 +494,17 @@ static TextureID GetTextureData(char *FileName, texDataStatus status, const GLin
 
 GLboolean IsTextureValid(TextureID ID)
 {
-  if ((ID<0) | (ID>=textures_count))
+  if ( (ID < 0) || (ID >= textab.Length()) )
     return GL_FALSE;
 
-  if (textab)
-    return textab[ID].status == TEX_ALLOCATED;
+  if (textab.Length() > 0)
+  {
+    return textab(ID).status == TEX_ALLOCATED;
+  }
   else
-    return GL_TRUE;
-}
-
-/*----------------------------------------------------------------------*/
-
-TextureID GetTexture1D(char *FileName)
-{
-#ifdef PRINT
-  printf("GetTexture1D::loading 1d %s   \n", FileName);
-#endif
-  return GetTexture(FileName, TEXDATA_1D);
-}
-
-/*----------------------------------------------------------------------*/
-
-TextureID GetTexture2D(char *FileName)
-{
-#ifdef PRINT
-  printf("GetTexture2D::loading 2d %s   \n", FileName);
-#endif
-  return GetTexture(FileName, TEXDATA_2D);
-}
-
-/*----------------------------------------------------------------------*/
-
-TextureID GetTexture2DMipMap(char *FileName)
-{
-#ifdef PRINT
-  printf("GetTexture2DMipMap::loading 2dmm %s   \n", FileName);
-#endif
-  return GetTexture(FileName, TEXDATA_2DMM);
+  {
+    return GL_FALSE;
+  }
 }
 
 /*----------------------------------------------------------------------*/
@@ -745,88 +569,48 @@ void SetCurrentTexture(TextureID ID)
 #ifdef PRINT
     printf("SetCurrentTexture: utilisation du bind %d\n", ID);
 #endif
-    MyBindTextureEXT(ID, context); 
+    MyBindTextureEXT(ID, context);
     SetTextureParam(ID);
   }
 
   current_texture = ID;
-  current_texture_data = textab[ID].data;
+  current_texture_data = textab(ID).data;
 }
 
 /*----------------------------------------------------------------------*/
 
-void FreeTexture(TextureID ID)
+void FreeTexture (const Handle(OpenGl_Context)& theContext,
+                  TextureID                     ID)
 {
-  TextureDataID data;
-  bool notResource = false; // if there old-style texture deletion
-
-  GLCONTEXT cur_context;
-  GLDRAWABLE cur_drawable;
-  int i;
-
-  if (!IsTextureValid(ID)) return;
+  if (!IsTextureValid (ID))
+  {
+    return;
+  }
 
-  data = textab[ID].data;
-  texdata[data].share_count--;
-  if (texdata[data].share_count == 0)
-  {      
-    // liberation des datas de la textures
-    free(texdata[data].image);
+  TextureDataID data = textab(ID).data;
+  texdata(data).share_count--;
+  if (texdata(data).share_count == 0)
+  {
+    // release texture data
+    delete [] texdata(data).image;
 
     // liberation de la texture dans tous les contextes
-    cur_drawable = GET_GLDEV_CONTEXT();
-    for (i = 0; i < textab[ID].context_count; ++i)
+    for (int i = 0; i < textab(ID).contextdata.Length(); ++i)
     {
-      cur_context = 0;
-      bool isResource = false; 
-
-      if (textab[ID].use_bind_texture[i])
+      Handle(OpenGl_ResourceTexture) aResource = new OpenGl_ResourceTexture (textab(ID).contextdata(i).number);
+      
+      if (!theContext.IsNull()) 
       {
-        if( !OpenGl_ResourceCleaner::GetInstance()->AddResource(textab[ID].context[i], 
-                     new OpenGl_ResourceTexture(textab[ID].number[i])) )
-        {
-          GL_MAKE_CURRENT((openglDisplay.IsNull() ? (Display* )NULL : (Display* )openglDisplay->GetDisplay()),
-            textab[ID].drawable[i],
-            textab[ID].context[i]);
-
-          // This check has been added to avoid exception, 
-          // which is raised when trying to delete textures when no rendering context is available
-          cur_context = GET_GL_CONTEXT();
-          if (cur_context)
-            glDeleteTextures (1, &textab[ID].number[i]);
-          notResource = true;
-        }
-        else
-        {
-          isResource = true;
-        }
+        theContext->DelayedRelease (aResource);
       }
-
-      if( !isResource && cur_context )
-        glFinish();
     }
 
-    if( notResource )
-      GL_MAKE_CURRENT((openglDisplay.IsNull() ? (Display* )NULL : (Display* )openglDisplay->GetDisplay()),
-                      cur_drawable, cur_context);
-
-    texdata[data].status = TEXDATA_NONE;
-    if (data + 1 == textures_data_count)
-    {
-      --textures_data_count;
-    }
+    texdata(data).status = TEXDATA_NONE;
 
-    free(textab[ID].context);
-    free(textab[ID].drawable);
-    free(textab[ID].use_bind_texture);
-    free(textab[ID].number);
+    textab(ID).contextdata.Clear();
   }
 
-  textab[ID].status = TEX_NONE;
-  if (ID + 1 == textures_count)
-  {
-    --textures_count;
-  }
+  textab(ID).status = TEX_NONE;
 
   current_texture_data = TEXTUREDATA_ERROR;
 }
@@ -837,17 +621,17 @@ void EnableTexture(void)
 {
   if (!IsTextureValid(current_texture)) return;
 
-  switch (texdata[current_texture_data].status)
+  switch (texdata(current_texture_data).status)
   {
   case TEXDATA_1D:
-    if (textab[current_texture].Gen != GL_NONE) 
+    if (textab(current_texture).Gen != GL_NONE)
       glEnable(GL_TEXTURE_GEN_S);
     glEnable(GL_TEXTURE_1D);
     break;
 
   case TEXDATA_2D:
   case TEXDATA_2DMM:
-    if (textab[current_texture].Gen != GL_NONE)
+    if (textab(current_texture).Gen != GL_NONE)
     {
       glEnable(GL_TEXTURE_GEN_S);
       glEnable(GL_TEXTURE_GEN_T);
@@ -863,22 +647,22 @@ void EnableTexture(void)
 
 void DisableTexture(void)
 {
-  if ( !IsTextureEnabled() ) 
+  if ( !IsTextureEnabled() )
     return;
-  if ( !IsTextureValid( current_texture ) ) 
+  if ( !IsTextureValid( current_texture ) )
     return;
 
-  switch (texdata[current_texture_data].status)
+  switch (texdata(current_texture_data).status)
   {
   case TEXDATA_1D:
-    if (textab[current_texture].Gen != GL_NONE) 
+    if (textab(current_texture).Gen != GL_NONE)
       glDisable(GL_TEXTURE_GEN_S);
     glDisable(GL_TEXTURE_1D);
     break;
 
   case TEXDATA_2D:
   case TEXDATA_2DMM:
-    if (textab[current_texture].Gen != GL_NONE)
+    if (textab(current_texture).Gen != GL_NONE)
     {
       glDisable(GL_TEXTURE_GEN_S);
       glDisable(GL_TEXTURE_GEN_T);
@@ -906,7 +690,7 @@ void SetTextureModulate(TextureID ID)
 {
   if (!IsTextureValid(ID)) return;
 
-  textab[ID].Light = GL_MODULATE;
+  textab(ID).Light = GL_MODULATE;
 }
 
 /*----------------------------------------------------------------------*/
@@ -915,7 +699,7 @@ void SetTextureDecal(TextureID ID)
 {
   if (!IsTextureValid(ID)) return;
 
-  textab[ID].Light = GL_DECAL;
+  textab(ID).Light = GL_DECAL;
 }
 
 /*----------------------------------------------------------------------*/
@@ -924,7 +708,7 @@ void SetTextureClamp(TextureID ID)
 {
   if (!IsTextureValid(ID)) return;
 
-  textab[ID].Wrap = GL_CLAMP;
+  textab(ID).Wrap = GL_CLAMP;
 }
 
 /*----------------------------------------------------------------------*/
@@ -933,7 +717,7 @@ void SetTextureRepeat(TextureID ID)
 {
   if (!IsTextureValid(ID)) return;
 
-  textab[ID].Wrap = GL_REPEAT;
+  textab(ID).Wrap = GL_REPEAT;
 }
 
 /*----------------------------------------------------------------------*/
@@ -943,13 +727,13 @@ void SetModeObject(TextureID ID, const GLfloat sparams[4], const GLfloat tparams
 {
   if (!IsTextureValid(ID)) return;
 
-  textab[ID].Gen = GL_OBJECT_LINEAR;
-  if (sparams != NULL) memcpy(textab[ID].Plane1, sparams, sizeof(sgenparams));
-  else                 memcpy(textab[ID].Plane1, sgenparams, sizeof(sgenparams));
+  textab(ID).Gen = GL_OBJECT_LINEAR;
+  if (sparams != NULL) memcpy(textab(ID).Plane1, sparams, sizeof(sgenparams));
+  else                 memcpy(textab(ID).Plane1, sgenparams, sizeof(sgenparams));
 
-  if (texdata[textab[ID].data].status != TEXDATA_1D) {
-    if (tparams != NULL) memcpy(textab[ID].Plane2, tparams, sizeof(tgenparams));
-    else                 memcpy(textab[ID].Plane2, tgenparams, sizeof(tgenparams));
+  if (texdata(textab(ID).data).status != TEXDATA_1D) {
+    if (tparams != NULL) memcpy(textab(ID).Plane2, tparams, sizeof(tgenparams));
+    else                 memcpy(textab(ID).Plane2, tgenparams, sizeof(tgenparams));
   }
 }
 
@@ -959,22 +743,22 @@ void SetModeSphere(TextureID ID)
 {
   if (!IsTextureValid(ID)) return;
 
-  textab[ID].Gen = GL_SPHERE_MAP;
+  textab(ID).Gen = GL_SPHERE_MAP;
 }
 
 /*----------------------------------------------------------------------*/
 
 void SetModeEye(TextureID ID, const GLfloat sparams[4], const GLfloat tparams[4])
-{  
+{
   if (!IsTextureValid(ID)) return;
 
-  textab[ID].Gen = GL_EYE_LINEAR;
-  if (sparams != NULL) memcpy(textab[ID].Plane1, sparams, sizeof(sgenparams));
-  else                 memcpy(textab[ID].Plane1, sgenparams, sizeof(sgenparams));
+  textab(ID).Gen = GL_EYE_LINEAR;
+  if (sparams != NULL) memcpy(textab(ID).Plane1, sparams, sizeof(sgenparams));
+  else                 memcpy(textab(ID).Plane1, sgenparams, sizeof(sgenparams));
 
-  if (texdata[textab[ID].data].status != TEXDATA_1D) {
-    if (tparams != NULL) memcpy(textab[ID].Plane2, tparams, sizeof(tgenparams));
-    else                 memcpy(textab[ID].Plane2, tgenparams, sizeof(tgenparams));
+  if (texdata(textab(ID).data).status != TEXDATA_1D) {
+    if (tparams != NULL) memcpy(textab(ID).Plane2, tparams, sizeof(tgenparams));
+    else                 memcpy(textab(ID).Plane2, tgenparams, sizeof(tgenparams));
   }
 }
 
@@ -984,7 +768,7 @@ void SetModeManual(TextureID ID)
 {
   if (!IsTextureValid(ID)) return;
 
-  textab[ID].Gen = GL_NONE;
+  textab(ID).Gen = GL_NONE;
 }
 
 /*----------------------------------------------------------------------*/
@@ -993,7 +777,7 @@ void SetRenderNearest(TextureID ID)
 {
   if (!IsTextureValid(ID)) return;
 
-  textab[ID].Render = GL_NEAREST;
+  textab(ID).Render = GL_NEAREST;
 }
 
 /*----------------------------------------------------------------------*/
@@ -1002,7 +786,7 @@ void SetRenderLinear(TextureID ID)
 {
   if (!IsTextureValid(ID)) return;
 
-  textab[ID].Render = GL_LINEAR;
+  textab(ID).Render = GL_LINEAR;
 }
 
 /*----------------------------------------------------------------------*/
@@ -1012,11 +796,11 @@ void SetTexturePosition(TextureID ID,
                         GLfloat transx, GLfloat transy,
                         GLfloat angle)
 {
-  textab[ID].scalex = scalex;
-  textab[ID].scaley = scaley;
-  textab[ID].transx = transx;
-  textab[ID].transy = transy;
-  textab[ID].angle = angle;
+  textab(ID).scalex = scalex;
+  textab(ID).scaley = scaley;
+  textab(ID).transx = transx;
+  textab(ID).transy = transy;
+  textab(ID).angle = angle;
 }
 
 /*----------------------------------------------------------------------*/
@@ -1030,64 +814,34 @@ void SetTextureDefaultParams(TextureID ID)
 #endif
 
 
-  textab[ID].scalex = 1.0;
-  textab[ID].scaley = 1.0;
-  textab[ID].transx = 0.0;
-  textab[ID].transy = 0.0;
-  textab[ID].angle = 0.0;
+  textab(ID).scalex = 1.0;
+  textab(ID).scaley = 1.0;
+  textab(ID).transx = 0.0;
+  textab(ID).transy = 0.0;
+  textab(ID).angle = 0.0;
 
-  textab[ID].Gen = GL_OBJECT_LINEAR;
-  textab[ID].Light = texdata[textab[ID].data].status == TEXDATA_1D ? GL_DECAL : GL_MODULATE;
-  textab[ID].Wrap = texdata[textab[ID].data].status == TEXDATA_1D ? GL_CLAMP : GL_REPEAT;
-  memcpy(textab[ID].Plane1, sgenparams, sizeof(sgenparams));
-  memcpy(textab[ID].Plane2, tgenparams, sizeof(tgenparams));
-  textab[ID].Render = texdata[textab[ID].data].status == TEXDATA_1D ? GL_NEAREST : GL_LINEAR;
+  textab(ID).Gen = GL_OBJECT_LINEAR;
+  textab(ID).Light = texdata(textab(ID).data).status == TEXDATA_1D ? GL_DECAL : GL_MODULATE;
+  textab(ID).Wrap = texdata(textab(ID).data).status == TEXDATA_1D ? GL_CLAMP : GL_REPEAT;
+  memcpy(textab(ID).Plane1, sgenparams, sizeof(sgenparams));
+  memcpy(textab(ID).Plane2, tgenparams, sizeof(tgenparams));
+  textab(ID).Render = texdata(textab(ID).data).status == TEXDATA_1D ? GL_NEAREST : GL_LINEAR;
 }
 
 /*----------------------------------------------------------------------*/
 /* Transfere de donnee des donnees internes a la structure TransferData */
 void TransferTexture_To_Data(TextureID ID, TextureData *TransfDt)
 {
-  /* affectations */    
-  strcpy(TransfDt->path, texdata[textab[ID].data].imageFileName);    
-  TransfDt->gen = textab[ID].Gen;
-  TransfDt->wrap  = textab[ID].Wrap;
-  TransfDt->render  = textab[ID].Light;
-  TransfDt->scalex  = textab[ID].scalex;
-  TransfDt->scaley  = textab[ID].scaley;
-  TransfDt->transx  = textab[ID].transx;
-  TransfDt->transy  = textab[ID].transy;
-  TransfDt->angle = textab[ID].angle;            
-  memcpy(TransfDt->plane1,  textab[ID].Plane1, sizeof(SizeType));
-  memcpy(TransfDt->plane2,  textab[ID].Plane2, sizeof(SizeType));                
-}
-
-/*----------------------------------------------------------------------*/
-/* Transfere de donnee de la structure TransferData aux donnees internes */
-void TransferData_To_Texture(TextureData *TransfDt, TextureID *newID)
-{                            
-  TextureID ID;
-
-  /* Affectations */
-  FreeTexture(*newID);     
-  ID = GetTexture2DMipMap(TransfDt->path);  
-
-  if(IsTextureValid(ID))
-  {
-    /* Affectation de l id courant */
-    *newID = ID;
-
-    /* Donnees concernant les caracteristiques de la texture */ 
-    strcpy(texdata[textab[ID].data].imageFileName, TransfDt->path);       
-    textab[ID].Gen    = TransfDt->gen;
-    textab[ID].Wrap   = TransfDt->wrap;
-    textab[ID].Light  = TransfDt->render;
-    textab[ID].scalex = TransfDt->scalex;
-    textab[ID].scaley = TransfDt->scaley; 
-    textab[ID].transx = TransfDt->transx;
-    textab[ID].transy = TransfDt->transy;
-    textab[ID].angle  = TransfDt->angle;
-    memcpy(textab[ID].Plane1,  TransfDt->plane1, sizeof(SizeType));
-    memcpy(textab[ID].Plane2,  TransfDt->plane2, sizeof(SizeType)); 
-  }               
+  /* affectations */
+  strcpy(TransfDt->path, texdata(textab(ID).data).imageFileName);
+  TransfDt->gen = textab(ID).Gen;
+  TransfDt->wrap  = textab(ID).Wrap;
+  TransfDt->render  = textab(ID).Light;
+  TransfDt->scalex  = textab(ID).scalex;
+  TransfDt->scaley  = textab(ID).scaley;
+  TransfDt->transx  = textab(ID).transx;
+  TransfDt->transy  = textab(ID).transy;
+  TransfDt->angle = textab(ID).angle;
+  memcpy(TransfDt->plane1,  textab(ID).Plane1, sizeof(SizeType));
+  memcpy(TransfDt->plane2,  textab(ID).Plane2, sizeof(SizeType));
 }