00001 #include <string> 00002 00003 #include "FTBitmapGlyph.h" 00004 00005 FTBitmapGlyph::FTBitmapGlyph( FT_GlyphSlot glyph) 00006 : FTGlyph( glyph), 00007 destWidth(0), 00008 destHeight(0), 00009 data(0) 00010 { 00011 err = FT_Render_Glyph( glyph, FT_RENDER_MODE_MONO); 00012 if( err || ft_glyph_format_bitmap != glyph->format) 00013 { 00014 return; 00015 } 00016 00017 FT_Bitmap bitmap = glyph->bitmap; 00018 00019 unsigned int srcWidth = bitmap.width; 00020 unsigned int srcHeight = bitmap.rows; 00021 unsigned int srcPitch = bitmap.pitch; 00022 00023 destWidth = srcWidth; 00024 destHeight = srcHeight; 00025 destPitch = srcPitch; 00026 00027 if( destWidth && destHeight) 00028 { 00029 data = new unsigned char[destPitch * destHeight]; 00030 unsigned char* dest = data + (( destHeight - 1) * destPitch); 00031 00032 unsigned char* src = bitmap.buffer; 00033 00034 for( unsigned int y = 0; y < srcHeight; ++y) 00035 { 00036 memcpy( dest, src, srcPitch); 00037 dest -= destPitch; 00038 src += srcPitch; 00039 } 00040 } 00041 00042 pos = FTPoint(glyph->bitmap_left, static_cast<int>(srcHeight) - glyph->bitmap_top, 0.0); 00043 } 00044 00045 00046 FTBitmapGlyph::~FTBitmapGlyph() 00047 { 00048 delete [] data; 00049 } 00050 00051 00052 const FTPoint& FTBitmapGlyph::Render( const FTPoint& pen) 00053 { 00054 glBitmap( 0, 0, 0.0f, 0.0f, pen.X() + pos.X(), pen.Y() - pos.Y(), (const GLubyte*)0 ); 00055 00056 if( data) 00057 { 00058 glPixelStorei( GL_UNPACK_ROW_LENGTH, destPitch * 8); 00059 glBitmap( destWidth, destHeight, 0.0f, 0.0, 0.0, 0.0, (const GLubyte*)data); 00060 } 00061 00062 glBitmap( 0, 0, 0.0f, 0.0f, -pos.X(), pos.Y(), (const GLubyte*)0 ); 00063 00064 return advance; 00065 }