File: FTTextureGlyph.cpp

package info (click to toggle)
vtk6 6.1.0%2Bdfsg2-6
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 165,164 kB
  • ctags: 226,428
  • sloc: cpp: 1,354,490; ansic: 730,748; python: 227,134; tcl: 48,285; xml: 8,290; yacc: 4,832; java: 3,827; perl: 3,108; lex: 1,809; sh: 1,437; asm: 471; makefile: 229
file content (118 lines) | stat: -rw-r--r-- 2,994 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include  "FTTextureGlyph.h"
#ifdef FTGL_DEBUG
  #include "mmgr.h"
#endif

#ifdef FTGL_USE_NAMESPACE
namespace ftgl
{
#endif

FTTextureGlyph::FTTextureGlyph( FT_Glyph glyph, int id, int xOffset, int yOffset, GLsizei width, GLsizei height)
:  FTGlyph(),
  data(0),
  destWidth(0),
  destHeight(0),
  numGreys(0),
  glTextureID(id),
  activeTextureID(0)
{
  // FIXME This function will always fail if the glyph's format isn't scalable????
  err = FT_Glyph_To_Bitmap( &glyph, ft_render_mode_normal, 0, 1);
  if( err || glyph->format != ft_glyph_format_bitmap)
  {
    return;
  }

  FT_BitmapGlyph  bitmap = ( FT_BitmapGlyph)glyph;
  FT_Bitmap*      source = &bitmap->bitmap;

  // FIXME check the pixel mode
  //ft_pixel_mode_grays
      
  int srcPitch = source->pitch;   
    destWidth = source->width;
    destHeight = source->rows;
    
    // Not sure what the standard behavior should be here?
    if( destWidth && destHeight)
    {
      data = new unsigned char[destWidth * destHeight];

      for(int y = 0; y < destHeight; ++y)
      {
        for(int x = 0; x < destWidth; ++x)
        {
        *( data + ( y * destWidth  + x)) = *( source->buffer + ( y * srcPitch) + x);
        }      
      }

    glBindTexture( GL_TEXTURE_2D, glTextureID);
    glTexSubImage2D( GL_TEXTURE_2D, 0, xOffset, yOffset, destWidth, destHeight, GL_ALPHA, GL_UNSIGNED_BYTE, data);
  }


//    0    
//    +----+
//    |    |
//    |    |
//    |    |
//    +----+
//         1
  
  // Texture co-ords
  uv[0].x = static_cast<float>(xOffset) / static_cast<float>(width);
  uv[0].y = static_cast<float>(yOffset) / static_cast<float>(height);
  uv[1].x = static_cast<float>( xOffset + destWidth) / static_cast<float>(width);
  uv[1].y = static_cast<float>( yOffset + destHeight) / static_cast<float>(height);
  
  numGreys = source->num_grays;
  advance = (float)(glyph->advance.x >> 16);
  bBox = FTBBox( glyph);

   pos.x = bitmap->left;
  pos.y = bitmap->top;
  
  if( data)
    delete [] data;
  
// discard glyph image (bitmap or not)
  // Is this the right place to do this?
  FT_Done_Glyph( glyph);
}


FTTextureGlyph::~FTTextureGlyph()
{}


float FTTextureGlyph::Render( const FT_Vector& pen,
                              const FTGLRenderContext *context)
{
  glGetIntegerv( GL_TEXTURE_2D_BINDING_EXT, &activeTextureID);
  if( activeTextureID != glTextureID)
  {
    glBindTexture( GL_TEXTURE_2D, (GLuint)glTextureID);
  }
  
  glBegin( GL_QUADS);
    glTexCoord2f( uv[0].x, uv[0].y);
    glVertex2f( (float)(pen.x + pos.x), (float)(pen.y + pos.y));

    glTexCoord2f( uv[0].x, uv[1].y);
    glVertex2f( (float)(pen.x + pos.x),  (float)(pen.y + pos.y - destHeight));

    glTexCoord2f( uv[1].x, uv[1].y);
    glVertex2f((float)(pen.x + destWidth + pos.x), (float)(pen.y + pos.y - destHeight));
    
    glTexCoord2f( uv[1].x, uv[0].y);
    glVertex2f((float)(pen.x + destWidth + pos.x), (float)(pen.y + pos.y));
  glEnd();

  return advance;

}

#ifdef FTGL_USE_NAMESPACE
} // namespace ftgl
#endif