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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: glfont.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:50:53  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: glfont.cpp,v 1000.1 2004/06/01 20:50:53 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.  *    CGlutFont -- GLUT based bitmap fonts
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include <gui/opengl.h>
  41. #include <gui/opengl/glfont.hpp>
  42. #include <math.h>
  43. BEGIN_NCBI_SCOPE
  44. //
  45. // text block
  46. //
  47. // size:
  48. //    1 for begin token
  49. //    1 for size
  50. //    1 for text length
  51. //    5 for position (token + 4 floats)
  52. //    5 for color (token + 4 floats)
  53. //    N for text
  54. //    1 for end token
  55. //
  56. static const size_t s_TEXTBLOCK_SIZE = 14;
  57. vector<float> CGlFeedbackFont::EncodeText(GLfloat pos[4],
  58.                                           const CGlColor& color,
  59.                                           const char* text,
  60.                                           size_t length)
  61. {
  62.     vector<float> vec;
  63.     vec.push_back(eBeginText);
  64.     const size_t size = size_t(s_TEXTBLOCK_SIZE + ceil(double(length) / 4));
  65.     vec.push_back(float(size));
  66.     vec.push_back(float(length));
  67.     vec.push_back(ePosition);
  68.     for (int i = 0; i < 4; ++i) {
  69.         vec.push_back(pos[i]);
  70.     }
  71.     vec.push_back(eColor);
  72.     const GLfloat* c = color.GetGlColor();
  73.     for (int i = 0; i < 4; ++i) {
  74.         vec.push_back(c[i]);
  75.     }
  76.     const char* textptr = text;
  77.     for (size_t i = 0; i < length; ) {
  78.         union FPackChar fpc = { 0 };
  79.         for (size_t j = 0; j < 4 && i < length; ++j, ++i, ++textptr) {
  80.             fpc.c[j] = *textptr;
  81.         }
  82.         vec.push_back(fpc.f);
  83.     }
  84.     vec.push_back(eEndText);
  85.     return vec;
  86. }
  87. vector<float> CGlFeedbackFont::EncodeText(GLfloat pos[4],
  88.                                           const CGlColor& color,
  89.                                           const string& text)
  90. {
  91.     return EncodeText(pos, color, text.data(), text.size());
  92. }
  93. void CGlFeedbackFont::DecodeText(const vector<float>& textbuf,
  94.                                  GLfloat* pos,
  95.                                  GLfloat* color,
  96.                                  string& text)
  97. {
  98.     vector<float>::const_iterator it = textbuf.begin();
  99.     if (*it != eBeginText) {
  100.         LOG_POST(Info << "expecting BEGIN_TEXT token");
  101.         return;
  102.     }
  103.     const size_t size = size_t(*++it);
  104.     const size_t textlen = size_t(*++it);
  105.     text.erase();
  106.     // reserve a little more than needed
  107.     text.reserve(textlen + 10);
  108.     if (*++it != ePosition) {
  109.         LOG_POST(Info << "expecting POSITION token");
  110.         return;
  111.     }
  112.     for (int i = 0; i < 4; ++i) {
  113.         pos[i] = *++it;
  114.     }
  115.     if (*++it != eColor) {
  116.         LOG_POST(Info << "expecting COLOR token");
  117.         return;
  118.     }
  119.     for (int i = 0; i < 4; ++i) {
  120.         color[i] = *++it;
  121.     }
  122.     vector<float>::const_iterator end = textbuf.end() - 1;
  123.     if (*end != eEndText) {
  124.         LOG_POST(Info << "expecting END_TEXT token at end of text");
  125.         return;
  126.     }
  127.     // i needs to be a signed type
  128.     for (int i = int(textlen); i > 0 && it != end; i -= 4) {
  129.         union FPackChar fpc = { *++it };
  130.         text.append((const char*) &fpc.c, i < 4 ? i : 4);
  131.     }
  132. }
  133. END_NCBI_SCOPE
  134. /*
  135.  * ===========================================================================
  136.  * $Log: glfont.cpp,v $
  137.  * Revision 1000.1  2004/06/01 20:50:53  gouriano
  138.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.13
  139.  *
  140.  * Revision 1.13  2004/05/21 22:27:45  gorelenk
  141.  * Added PCH ncbi_pch.hpp
  142.  *
  143.  * Revision 1.12  2003/09/17 16:26:13  dicuccio
  144.  * Removed CGlutFont
  145.  *
  146.  * Revision 1.11  2003/08/28 19:27:54  dicuccio
  147.  * TextOut() functions are now const
  148.  *
  149.  * Revision 1.10  2003/08/22 15:47:12  dicuccio
  150.  * Added display lists to CGlBitmapFont
  151.  *
  152.  * Revision 1.9  2003/08/18 19:23:55  dicuccio
  153.  * Changed API of IGlFont and CGlutFont - return float from TextWidth() and
  154.  * TextHeight
  155.  *
  156.  * Revision 1.8  2003/06/24 19:17:57  meric
  157.  * Fix OpenGL feedback mechanism for text - add text length, fix DecodeText()
  158.  *
  159.  * Revision 1.7  2003/05/30 13:00:36  dicuccio
  160.  * Remove compiler warnings about signed / unsigend comparisons
  161.  *
  162.  * Revision 1.6  2003/05/13 22:06:50  meric
  163.  * Replace static constants with enums
  164.  *
  165.  * Revision 1.5  2003/05/13 19:27:38  dicuccio
  166.  * Added CGlFeedbackFont; added support for font encoding for converting bitmap ->
  167.  * vector fonts (Peter Meric)
  168.  *
  169.  * Revision 1.4  2003/01/13 13:10:11  dicuccio
  170.  * Namespace clean-up.  Retired namespace gui -> converted all to namespace ncbi.
  171.  * Moved all FLUID-generated code into namespace ncbi.
  172.  *
  173.  * Revision 1.3  2002/11/14 16:24:44  dicuccio
  174.  * Changed to include standard OpenGL headers through 'gui/opengl.h'
  175.  *
  176.  * Revision 1.2  2002/11/08 13:27:45  dicuccio
  177.  * Code clean-up and reformatting.
  178.  *
  179.  * Revision 1.1  2002/11/05 20:21:47  dicuccio
  180.  * Initial revision
  181.  *
  182.  * ===========================================================================
  183.  */