glteximage.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:9k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: glteximage.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:51:02  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: glteximage.cpp,v 1000.1 2004/06/01 20:51:02 gouriano Exp $
  10.  * ===========================================================================
  11.  *
  12.  *                            PUBLIC DOMAIN NOTICE
  13.  *               National Center for Biotechnology Information
  14.  *
  15.  *  This software/database is a "United States Government Work" under the
  16.  *  terms of the United States Copyright Act.  It was written as part of
  17.  *  the author's official duties as a United States Government employee and
  18.  *  thus cannot be copyrighted.  This software/database is freely available
  19.  *  to the public for use. The National Library of Medicine and the U.S.
  20.  *  Government have not placed any restriction on its use or reproduction.
  21.  *
  22.  *  Although all reasonable efforts have been taken to ensure the accuracy
  23.  *  and reliability of the software and data, the NLM and the U.S.
  24.  *  Government do not and cannot warrant the performance or results that
  25.  *  may be obtained by using this software or data. The NLM and the U.S.
  26.  *  Government disclaim all warranties, express or implied, including
  27.  *  warranties of performance, merchantability or fitness for any particular
  28.  *  purpose.
  29.  *
  30.  *  Please cite the author in any work or product based on this material.
  31.  *
  32.  * ===========================================================================
  33.  *
  34.  * Authors:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/opengl/glteximage.hpp>
  41. #include <gui/opengl/glexception.hpp>
  42. #include <util/image/image_io.hpp>
  43. #include <gui/opengl.h>
  44. BEGIN_NCBI_SCOPE
  45. //
  46. // static flag: can we use texture objects?
  47. // 0 = no   1 = yes   2 = haven't tested yet
  48. CTexImage::ETexSupport CTexImage::sm_TexObjFlag = CTexImage::eNotChecked;
  49. // default ctor
  50. CTexImage::CTexImage()
  51.     : m_TexId(0),
  52.       m_WrapS(GL_CLAMP),
  53.       m_WrapT(GL_CLAMP),
  54.       m_FilterMin(GL_LINEAR),
  55.       m_FilterMag(GL_LINEAR),
  56.       m_TexEnv(GL_MODULATE)
  57. {
  58. }
  59. //
  60. // ctor: create an empty image
  61. CTexImage::CTexImage(size_t w, size_t h, size_t depth)
  62.     : m_TexId(0),
  63.       m_WrapS(GL_CLAMP),
  64.       m_WrapT(GL_CLAMP),
  65.       m_FilterMin(GL_LINEAR),
  66.       m_FilterMag(GL_LINEAR),
  67.       m_TexEnv(GL_MODULATE)
  68. {
  69.     Init(w, h, depth);
  70. }
  71. //
  72. // ctor: create an image around an existing image
  73. CTexImage::CTexImage(CImage* image)
  74.     : m_TexId(0),
  75.       m_WrapS(GL_CLAMP),
  76.       m_WrapT(GL_CLAMP),
  77.       m_FilterMin(GL_LINEAR),
  78.       m_FilterMag(GL_LINEAR),
  79.       m_TexEnv(GL_MODULATE)
  80. {
  81.     Swallow(image);
  82. }
  83. //
  84. // get an image from a file
  85. CTexImage::CTexImage(const string& filename)
  86.     : m_TexId(0),
  87.       m_WrapS(GL_CLAMP),
  88.       m_WrapT(GL_CLAMP),
  89.       m_FilterMin(GL_LINEAR),
  90.       m_FilterMag(GL_LINEAR),
  91.       m_TexEnv(GL_MODULATE)
  92. {
  93.     m_Image.Reset(CImageIO::ReadImage(filename));
  94.     if ( !m_Image ) {
  95.         string msg("CTexImage(): cannot read image from file ");
  96.         msg += filename;
  97.         NCBI_THROW(COpenGLException, eTextureError, msg);
  98.     }
  99.     m_FileName = filename;
  100. }
  101. //
  102. // initialize an empty image
  103. //
  104. void CTexImage::Init(size_t w, size_t h, size_t d)
  105. {
  106.     Clear();
  107.     // initialize our image
  108.     m_Image.Reset(new CImage(w, h, d));
  109. }
  110. //
  111. // x_InitTexObj()
  112. // test whether the system supports texture objects
  113. //
  114. void CTexImage::x_InitTexObj(void)
  115. {
  116.     // test whether the system supports texture objects
  117.     // the requirements are:
  118.     //  - extensions advertize GL_EXT_texture_object
  119.     //    -- or --
  120.     //  - version >= 1.1
  121.     switch (sm_TexObjFlag) {
  122.     case eNotChecked:
  123.         {{
  124.              char *extens = (char *)glGetString (GL_EXTENSIONS);
  125.              char *version = (char *)glGetString (GL_VERSION);
  126.              if (extens  &&  version) {
  127.                  if (strstr (extens, "GL_EXT_texture_object") ||
  128.                      strncmp (version, "1.1", 3) == 0) {
  129.                      sm_TexObjFlag = eTexObj;
  130.                      _TRACE("texture support = texture object");
  131.                  } else {
  132.                      sm_TexObjFlag = eTexDisplayList;
  133.                      _TRACE("texture support = display list");
  134.                  }
  135.              } else {
  136.                  _TRACE("texture support = not determinable");
  137.              }
  138.          }}
  139.         break;
  140.     default:
  141.         break;
  142.     }
  143. }
  144. //
  145. // clear the current image
  146. //
  147. void CTexImage::Clear(void)
  148. {
  149.     Unload();
  150.     m_Image.Reset();
  151.     m_FileName.erase();
  152. }
  153. //
  154. // "swallow" an image
  155. //
  156. void CTexImage::Swallow(CImage *image)
  157. {
  158.     // clear the current image
  159.     Clear();
  160.     // assign the wrapped image
  161.     m_Image.Reset(image);
  162.     // load the texture
  163.     Load();
  164. }
  165. //
  166. // bind the image as a texture
  167. //
  168. void CTexImage::MakeCurrent(void)
  169. {
  170.     if (sm_TexObjFlag == eNotChecked) {
  171.         x_InitTexObj();
  172.         if (sm_TexObjFlag == eNotChecked) {
  173.             LOG_POST(Error << "CTexImage::MakeCurrent(): "
  174.                      "Failed to determine texture support");
  175.             return;
  176.         }
  177.     }
  178.     if ( !m_TexId ) {
  179.         Load();
  180.     }
  181.     // Texture environment is not saved in the texture object, so we set it
  182.     // here
  183.     glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, m_TexEnv);
  184.     switch (sm_TexObjFlag) {
  185.     case eTexObj:
  186.         glBindTexture(GL_TEXTURE_2D, m_TexId);
  187.         break;
  188.     case eTexDisplayList:
  189.         glCallList(m_TexId);
  190.         break;
  191.     }
  192. }
  193. //
  194. // create a representation of the texture for rendering
  195. // this is either a display list or a texture object
  196. //
  197. void CTexImage::Load(void)
  198. {
  199.     _TRACE("CTexImage::Load()");
  200.     // unload the current texture
  201.     Unload();
  202.     // safety first!
  203.     if ( !m_Image ) {
  204.         _TRACE("  no image to load!");
  205.         return;
  206.     }
  207.     // make sure we know what to do with textures
  208.     x_InitTexObj();
  209.     switch (sm_TexObjFlag) {
  210.     case eNotChecked:
  211.         NCBI_THROW(COpenGLException, eTextureError,
  212.                    "Texturing not supported");
  213.     case eTexObj:
  214.         glGenTextures(1, &m_TexId);
  215.         glBindTexture(GL_TEXTURE_2D, m_TexId);
  216.         _TRACE("created texture object = " << m_TexId);
  217.         break;
  218.     case eTexDisplayList:
  219.         {{
  220.              GLint val;
  221.              glGetIntegerv(GL_MAX_TEXTURE_SIZE, &val);
  222.              if ( m_Image->GetWidth() > (size_t)val) {
  223.                  NCBI_THROW(COpenGLException, eTextureError,
  224.                             "Texture is too large");
  225.              }
  226.          }}
  227.         // all tests passed, allocate a display list
  228.         m_TexId = glGenLists(1);
  229.         glNewList(m_TexId, GL_COMPILE_AND_EXECUTE);
  230.         _TRACE("created texture display list = " << m_TexId);
  231.         break;
  232.     }
  233.     // set texture params
  234.     glPixelStorei  (GL_UNPACK_ALIGNMENT, 1);
  235.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, m_WrapS);
  236.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, m_WrapT);
  237.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, m_FilterMag);
  238.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, m_FilterMin);
  239.     // call glTexImage2D
  240.     switch (m_Image->GetDepth()) {
  241.     case 3:
  242.         gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB,
  243.                           m_Image->GetWidth(), m_Image->GetHeight(),
  244.                           GL_RGB, GL_UNSIGNED_BYTE,
  245.                           m_Image->GetData());
  246.         break;
  247.     case 4:
  248.         gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA,
  249.                           m_Image->GetWidth(), m_Image->GetHeight(),
  250.                           GL_RGBA, GL_UNSIGNED_BYTE,
  251.                           m_Image->GetData());
  252.         break;
  253.     default:
  254.         LOG_POST(Error << "CTexImage::Load(): unhandled image depth");
  255.         break;
  256.     }
  257.     // don't forget to end our display list
  258.     if (sm_TexObjFlag == 0) {
  259.         glEndList();
  260.     }
  261. }
  262. //
  263. // unload the image as a texture
  264. void CTexImage::Unload (void)
  265. {
  266.     // check to see if we can use texture objects
  267.     x_InitTexObj();
  268.     switch (sm_TexObjFlag) {
  269.     case eNotChecked:
  270.         break;
  271.     case eTexObj:
  272.         if (glIsTexture (m_TexId)) {
  273.             glDeleteTextures (1, &m_TexId);
  274.         }
  275.         break;
  276.     case eTexDisplayList:
  277.         if (glIsList (m_TexId)) {
  278.             glDeleteLists (m_TexId, 1);
  279.         }
  280.         break;
  281.     }
  282.     m_TexId = 0;
  283. }
  284. END_NCBI_SCOPE
  285. /*
  286.  * ===========================================================================
  287.  * $Log: glteximage.cpp,v $
  288.  * Revision 1000.1  2004/06/01 20:51:02  gouriano
  289.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  290.  *
  291.  * Revision 1.5  2004/05/21 22:27:45  gorelenk
  292.  * Added PCH ncbi_pch.hpp
  293.  *
  294.  * Revision 1.4  2003/06/16 16:56:10  dicuccio
  295.  * Fix compiler error for MSVC
  296.  *
  297.  * Revision 1.3  2003/06/04 17:01:03  rsmith
  298.  * GLint not plain int more compatible.
  299.  *
  300.  * Revision 1.2  2003/06/04 00:32:44  ucko
  301.  * Change GL headers to #include <gui/opengl.h> for portability.
  302.  *
  303.  * Revision 1.1  2003/06/03 17:42:06  dicuccio
  304.  * Added texture support.  Added classes to handle OpenGL camera setup and
  305.  * viewport specification.
  306.  *
  307.  * ===========================================================================
  308.  */