资源简介

使用OpenGL+FreeType技术渲染了点阵格式的中文宋体(字体大小小于16),效果极好,可与Windows自身渲染的效果一比

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include   
#include 
#include 
#include 
#include 
#include 
#include 
//#pragma comment(lib  “lib/glut32.lib“)
//#pragma comment(lib  “lib/freetype2110.lib“)
using namespace std;

#define MAX_NO_TEXTURES 1

#define CUBE_TEXTURE 0

GLuint texture_id[MAX_NO_TEXTURES];

struct xCharTexture
{
  GLuint  m_texID;
  wchar_t m_chaID;
  int     m_Width;
  int     m_Height;

  int     m_adv_x;
  int     m_adv_y;
  int     m_delta_x;
  int     m_delta_y;
public:
  xCharTexture()
  {
    m_texID  = 0;
    m_chaID  = 0;
    m_Width  = 0;
    m_Height = 0;
  }
}g_TexID[65536];


class xFreeTypeLib
{
  FT_Library m_FT2Lib;
  FT_Face    m_FT_Face;

public:
  int   m_w;
  int   m_h;
  void load(const char* font_file  int _w  int _h);
  GLuint loadChar(wchar_t ch);
};

void xFreeTypeLib::load(const char* font_file  int _w  int _h)
{
  FT_Library library;
  if (FT_Init_FreeType( &library) ) 
    exit(0);
  m_FT2Lib = library;
  //加载一个字体取默认的Face一般为Regualer
  if (FT_New_Face( library font_file 0 &m_FT_Face )) 
    exit(0);
  //选择字符表
  FT_Select_Charmap(m_FT_Face FT_ENCODING_UNICODE);
  m_w = _w ; m_h = _h;
  m_FT_Face->num_fixed_sizes;
  //大小要乘64.这是规定。照做就可以了。
  //FT_Set_Char_Size( m_FT_Face  0  m_w << 6 96 96);
  //用来存放指定字符宽度和高度的特定数据
  FT_Set_Pixel_Sizes(m_FT_Facem_w m_h);
}

GLuint xFreeTypeLib::loadChar(wchar_t ch)
{
  if(g_TexID[ch].m_texID)
  return g_TexID[ch].m_texID;
  /* 装载字形图像到字形槽(将会抹掉先前的字形图像) */ 
  if(FT_Load_Char(m_FT_Face ch 
  FT_LOAD_DEFAULT | 
  FT_LOAD_MONOCHROME |
  FT_LOAD_TARGET_MONO)   )
  {
    return 0;
  }

 /*if(FT_Load_Glyph( m_FT_Face FT_Get_Char_Index( m_FT_Face ch ) FT_LOAD_FORCE_AUTOHINT ))
  throw std::runtime_error(“FT_Load_Glyph failed“);*/

  xCharTexture& charTex = g_TexID[ch];
 
  //得到字模
  FT_Glyph glyph;
  //把字形图像从字形槽复制到新的FT_Glyph对象glyph中。这个函数返回一个错误码并且设置glyph。 
  if(FT_Get_Glyph( m_FT_Face->glyph &glyph ))
    return 0;

  //转化成位图
  FT_Render_Glyph( m_FT_Face->glyph   FT_RENDER_MODE_MONO );//FT_RENDER_MODE_NORMAL  ); 
  FT_Glyph_To_Bitmap( &glyph FT_RENDER_MODE_MONO 0 1 );
  FT_BitmapGlyph bitmap_glyph = (FT_BitmapGlyph)glyph;

  //取道位图数据
  FT_Bitmap &bitmap=bitmap_glyph->bitmap;

  //把位图数据拷贝自己定义的数据区里.这样旧可以画到需要的东西上面了。
  int width  =  bitmap.width;
  int height =  bitmap.rows;
 
  m_FT_Face->size->metrics.y_ppem; //伸缩距离到设备空间
  m_FT_Face->glyph->metrics.horiAdvance;  //水平文本排列


  charTex.m_Width = width;
  charTex.m_Height = height;
  charTex.m_adv_x = m_FT_Face->glyph->advance.x / 64.0f;  //步进宽度
  charTex.m_adv_y = m_FT_Face->size->metrics.y_ppem; //m_FT_Face->glyph->metrics.horiBearingY / 64.0f;
  charTex.m_delta_x = (float)bitmap_glyph->left; //left:字形原点(00)到字形位图最左边象素的水平距离.它以整数象素的形式表示。 
  charTex.m_delta_y = (float)bitmap_glyph->top - height;

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

    .......      3735  2015-04-01 15:44  宋体渲染\FontRendering\FontRendering.vcxproj

    .......       942  2015-01-30 14:12  宋体渲染\FontRendering\FontRendering.vcxproj.filters

    .......       143  2015-01-30 14:12  宋体渲染\FontRendering\FontRendering.vcxproj.user

    .......     11168  2015-04-01 15:37  宋体渲染\FontRendering\main.cpp

    .......       906  2015-01-30 14:12  宋体渲染\FontRendering.sln

    .......     22016  2015-04-01 15:45  宋体渲染\FontRendering.suo

    .......    154624  2015-01-30 14:12  宋体渲染\glut.dll

    .......    154624  2015-01-30 14:12  宋体渲染\glut32.dll

    .......     18094  2015-01-30 14:12  宋体渲染\include\freetype\config\ftconfig.h

    .......     25587  2015-01-30 14:12  宋体渲染\include\freetype\config\ftheader.h

    .......      1399  2015-01-30 14:12  宋体渲染\include\freetype\config\ftmodule.h

    .......     56425  2015-01-30 14:12  宋体渲染\include\freetype\config\ftoption.h

    .......      7313  2015-01-30 14:12  宋体渲染\include\freetype\config\ftstdlib.h

    .......    254137  2015-01-30 14:12  宋体渲染\include\freetype\freetype.h

    .......      2383  2015-01-30 14:12  宋体渲染\include\freetype\ft2build.h

    .......     10646  2015-01-30 14:12  宋体渲染\include\freetype\ftadvanc.h

    .......     14651  2015-01-30 14:12  宋体渲染\include\freetype\ftautoh.h

    .......      5244  2015-01-30 14:12  宋体渲染\include\freetype\ftbbox.h

    .......      6802  2015-01-30 14:12  宋体渲染\include\freetype\ftbdf.h

    .......     14388  2015-01-30 14:12  宋体渲染\include\freetype\ftbitmap.h

    .......      4308  2015-01-30 14:12  宋体渲染\include\freetype\ftbzip2.h

    .......     57527  2015-01-30 14:12  宋体渲染\include\freetype\ftcache.h

    .......     10121  2015-01-30 14:12  宋体渲染\include\freetype\ftcffdrv.h

    .......      8514  2015-01-30 14:12  宋体渲染\include\freetype\ftchapters.h

    .......      5581  2015-01-30 14:12  宋体渲染\include\freetype\ftcid.h

    .......     12217  2015-01-30 14:12  宋体渲染\include\freetype\fterrdef.h

    .......      9292  2015-01-30 14:12  宋体渲染\include\freetype\fterrors.h

    .......      4505  2015-01-30 14:12  宋体渲染\include\freetype\ftgasp.h

    .......     38694  2015-01-30 14:12  宋体渲染\include\freetype\ftglyph.h

    .......     13408  2015-01-30 14:12  宋体渲染\include\freetype\ftgxval.h

............此处省略85个文件信息

评论

共有 条评论