尝试将 FreeType 与 CImg 一起使用
Trying to use FreeType with CImg
我使用一些使用 FreeType2 的代码:
void drawText( FT_Face &face, cimg_library::CImg < unsigned char > &image, const int &heightText, const std::wstring &text, const int &leftTopX, const int &leftTopY, int &width, int &height, unsigned char fontColor[] = NULL, const int separeteGlyphWidth = 1 ) {
width = 0;
height = 0;
FT_Set_Pixel_Sizes( face, 0, heightText );
FT_GlyphSlot glyphSlot = face->glyph;
int shiftX = leftTopX;
int shiftY = 0;
for( int numberSymbol = 0; numberSymbol < text.length(); ++numberSymbol ){
shiftY = leftTopY;
bool isSpace = false;
FT_ULong symbol = text[ numberSymbol ]; //FT_ULong symbol = text.at(numberSymbol);
if (symbol == ' ') {
symbol = 'a';
isSpace = true;
}
if( FT_Load_Char( face, symbol, FT_LOAD_RENDER ) ) throw "Error, glyph not load!! \n";
shiftY = heightText - glyphSlot->bitmap.rows;
if ( shiftY < 0 ) shiftY = 0;
std::cout << "char: " << (char) text.at( numberSymbol ) << " \tshiftY = " << shiftY << "\t rows = " << glyphSlot->bitmap.rows << "\t extra = " << ( glyphSlot->advance.y >> 6 ) << "\n";
if ( !isSpace ) drawGlyph( glyphSlot, image, shiftX, shiftY, fontColor );
shiftX += glyphSlot->bitmap.width + separeteGlyphWidth;
if( height < shiftY + glyphSlot->bitmap.rows ) height = shiftY + glyphSlot->bitmap.rows;
width = shiftX;
}
}
std::string str = "Let me speak from my heart!";
std::wstring wStr( str.begin(), str.end() );
int width, height;
drawText( face, myCImg, 50, wStr, 50, 50, width, height );
但它没有按预期工作。输出图像是这样的:
符号有一些奇怪的行为:"y"、"f"、"p"。怎么放低?
看来我应该用 glyphSlot->metrics.vertAdvance 做点什么,但我不知道如何正确使用它。
快速浏览一下 online reference,如果需要像素坐标,似乎用于 Y 偏移的值应该基于 bitmap_top
。
所以我建议更改行
shiftY = heightText - glyphSlot->bitmap.rows;
到
shiftY = heightText - glyphSlot->bitmap_top;
这似乎也可以通过查看以下列方式使用这些值的 basic tutorial 来确认:
/* now, draw to our target surface */
my_draw_bitmap( &slot->bitmap,
pen_x + slot->bitmap_left,
pen_y - slot->bitmap_top );
/* increment pen position */
pen_x += slot->advance.x >> 6;
我使用一些使用 FreeType2 的代码:
void drawText( FT_Face &face, cimg_library::CImg < unsigned char > &image, const int &heightText, const std::wstring &text, const int &leftTopX, const int &leftTopY, int &width, int &height, unsigned char fontColor[] = NULL, const int separeteGlyphWidth = 1 ) {
width = 0;
height = 0;
FT_Set_Pixel_Sizes( face, 0, heightText );
FT_GlyphSlot glyphSlot = face->glyph;
int shiftX = leftTopX;
int shiftY = 0;
for( int numberSymbol = 0; numberSymbol < text.length(); ++numberSymbol ){
shiftY = leftTopY;
bool isSpace = false;
FT_ULong symbol = text[ numberSymbol ]; //FT_ULong symbol = text.at(numberSymbol);
if (symbol == ' ') {
symbol = 'a';
isSpace = true;
}
if( FT_Load_Char( face, symbol, FT_LOAD_RENDER ) ) throw "Error, glyph not load!! \n";
shiftY = heightText - glyphSlot->bitmap.rows;
if ( shiftY < 0 ) shiftY = 0;
std::cout << "char: " << (char) text.at( numberSymbol ) << " \tshiftY = " << shiftY << "\t rows = " << glyphSlot->bitmap.rows << "\t extra = " << ( glyphSlot->advance.y >> 6 ) << "\n";
if ( !isSpace ) drawGlyph( glyphSlot, image, shiftX, shiftY, fontColor );
shiftX += glyphSlot->bitmap.width + separeteGlyphWidth;
if( height < shiftY + glyphSlot->bitmap.rows ) height = shiftY + glyphSlot->bitmap.rows;
width = shiftX;
}
}
std::string str = "Let me speak from my heart!";
std::wstring wStr( str.begin(), str.end() );
int width, height;
drawText( face, myCImg, 50, wStr, 50, 50, width, height );
但它没有按预期工作。输出图像是这样的:
符号有一些奇怪的行为:"y"、"f"、"p"。怎么放低?
看来我应该用 glyphSlot->metrics.vertAdvance 做点什么,但我不知道如何正确使用它。
快速浏览一下 online reference,如果需要像素坐标,似乎用于 Y 偏移的值应该基于 bitmap_top
。
所以我建议更改行
shiftY = heightText - glyphSlot->bitmap.rows;
到
shiftY = heightText - glyphSlot->bitmap_top;
这似乎也可以通过查看以下列方式使用这些值的 basic tutorial 来确认:
/* now, draw to our target surface */
my_draw_bitmap( &slot->bitmap,
pen_x + slot->bitmap_left,
pen_y - slot->bitmap_top );
/* increment pen position */
pen_x += slot->advance.x >> 6;