FreeType 调试

原创 2013年12月01日 21:07:29

不良习惯害死人啊!


下面代码对吗?

unsigned char maskData = glyphData.pGlyphData[j * glyphData.pitch + k >> 3];


随手写的,却坑了自己2小时。反复看了好几次文档,也没搞明白哪错了。

正确写法:

unsigned char maskData = glyphData.pGlyphData[j * glyphData.pitch + (k >> 3)];  // + 比 >> 优先级高


附上自己封装的FreeType给大家参考:

#include <ft2build.h> 
#include FT_FREETYPE_H 
#include <windows.h>
#include <tchar.h>

typedef struct stGFX2D_Font_Impl {
GFX2D_UB8    width;
GFX2D_UB8    height;
GFX2D_UB8    weight;
GFX2D_ENUM   face;
GFX2D_ENUM   charSet;
FT_Face      pFTFace; 
PFONTCALL    fontcall;
PCHARSETOPS  charsetops;
} GFX2D_Font_Impl, *GFX2D_Font_Impl_Handle;


static FT_Library   s_pFTLib;
const char fontpath[] = "c:\\WINDOWS\\fonts\\msmincho.ttc";


GFX2D_STAT FontLib_FreeType_Init ()
{
GFX2D_STAT rtn = GFX2D_SUCCESS;
FT_Init_FreeType(&s_pFTLib);
return rtn;
}


GFX2D_STAT FontLib_FreeType_Exit ()
{
GFX2D_STAT rtn = GFX2D_SUCCESS;
FT_Done_FreeType(s_pFTLib);
s_pFTLib = NULL;
return rtn;
}


GFX2D_STAT FontLib_FreeType_Font_Create(
GFX2D_FONT_INFO* info,
GFX2D_Font_Handle *gf
)
{
GFX2D_STAT rtn = GFX2D_SUCCESS;
GFX2D_Font_Impl_Handle pf = (GFX2D_Font_Impl_Handle)MALLOC(sizeof(GFX2D_Font_Impl));
memset(pf, 0, sizeof(GFX2D_Font_Impl));
pf->face        = info->face;
pf->height      = info->height;
pf->charSet     = info->charSet;
pf->weight      = info->weight;
pf->width       = info->width;


FT_New_Face(s_pFTLib, "C:\\WINDOWS\\Fonts\\times.ttf", 0, &(pf->pFTFace));
FT_Select_Charmap(pf->pFTFace,FT_ENCODING_UNICODE);
FT_Set_Pixel_Sizes(pf->pFTFace, info->width, info->height);


*gf = pf;
return rtn;
}


GFX2D_STAT FontLib_FreeType_Font_Destroy(
GFX2D_Font_Handle gf
)
{
GFX2D_STAT rtn = GFX2D_SUCCESS;
GFX2D_Font_Impl_Handle pf = (GFX2D_Font_Impl_Handle)gf;
FT_Done_Face(pf->pFTFace);
FREE(pf);
return rtn;
}

typedef struct stGFX2D_Font_GlypData {
char *pGlyphData;
int pitch;
int width;
int height;
int left;
int top;
int advanceX;
} GFX2D_Font_GlypData;


GFX2D_STAT FontLib_FreeType_Font_GetGlpy(
GFX2D_Font_Handle gf,
void* str,
GFX2D_Font_GlypData *pGlyphData
)
{
GFX2D_STAT rtn = GFX2D_SUCCESS;
GFX2D_Font_Impl_Handle pf = (GFX2D_Font_Impl_Handle)gf;
FT_Face      pFTFace = pf->pFTFace;
int bError;
TCHAR newChar = *(TCHAR*)str;


bError = FT_Load_Char( pFTFace, newChar, FT_LOAD_MONOCHROME);
assert(bError == 0);
bError = FT_Render_Glyph( pFTFace->glyph, FT_RENDER_MODE_MONO);
assert(bError == 0);
pGlyphData->pGlyphData = pFTFace->glyph->bitmap.buffer;
pGlyphData->pitch = pFTFace->glyph->bitmap.pitch;
pGlyphData->width = pFTFace->glyph->bitmap.width;
pGlyphData->height = pFTFace->glyph->bitmap.rows;
pGlyphData->advanceX = pFTFace->glyph->advance.x/64;
pGlyphData->left = pFTFace->glyph->bitmap_left;
pGlyphData->top = pFTFace->glyph->bitmap_top;
return rtn;
}


描画函数:(HBitmap 32位)

typedef struct stSurfaceInfoImpl {
unsigned int  w;
unsigned int  h;
GFX2D_COLOR_SYSTEM fmt;
int bitCount;
HDC hDC;
BITMAPINFOHEADER bitmapInfoHeader;
HBITMAP hBmp;
void* pPixelBuf;
int lpitch;
GFX2D_Font_Handle gf;
} SurfaceInfoImpl, *SurfaceHandleImpl;

{

SurfaceHandleImpl handle = (SurfaceHandleImpl)pGFX2D_t;


TCHAR *pChar = (TCHAR *)str;
int i, j, k;
GFX2D_Font_GlypData glyphData;
GFX2D_Font_Handle gf = handle->gf;
int startX, startY;


startX = pos.x;
startY = pos.y;
for (i = 0; i < lenth; i ++) {
int drawGlyphX,drawGlyphY;
FontLib_FreeType_Font_GetGlpy(gf, &(pChar[i]), &glyphData);
drawGlyphX = startX + glyphData.left;
drawGlyphY = startY;
for (j = 0; j < glyphData.height; j++)
{
unsigned char *pDrawStart = (unsigned char *)handle->pPixelBuf + drawGlyphY * handle->lpitch + drawGlyphX * 4;
for(k = 0; k < glyphData.width; k++ )
{
unsigned char maskData = glyphData.pGlyphData[j * glyphData.pitch + (k >> 3)];
int bitIndex = k % 8;

if ((maskData<< bitIndex) & 0x80) {
*pDrawStart++ = 0xFF;
*pDrawStart++ = 0xFF;
*pDrawStart++ = 0xFF;
*pDrawStart++ = 0xFF;
} else {
*pDrawStart++ = 0;
*pDrawStart++ = 0;
*pDrawStart++ = 0;
*pDrawStart++ = 0;
}
}
drawGlyphY++;
}
startX += glyphData.advanceX;
}

}

}

相关文章推荐

FreeType 学习笔记

GTK+(基于DirectFB)的字体绘制是通过pango+freetype+fontconfig三者协 作来完成的,其中,fontconfig负责字体的管理和配置,freetype负责单个字符的绘制...

freetype2.4.6在iOS上各版本的编译脚本

基调:这是一篇水文,技术含量不大,主要是留给以后的自己回顾用的。但提到的某些编译错误的解决过程有一定代表性,难保谁搜索到这篇文章不能从中找到解决自己手中问题的方法,如果不小心帮到了谁,也算无心的好事吧...

CentOS下安装 ImageMagick时 缺失 freetype的解决方法

1. 安装 ImageMagick总是提示没有按装freetype:
  • hanIyan
  • hanIyan
  • 2014年10月27日 21:56
  • 12825

MFC & Gdi+ 实现在图片上写中文 (OpenCV原生不支持写中文本到图片,当然FreeType库也可实现)

你从来不会觉得,在图片上打上中文语句会有多么困难,

freetype 使用小结

FreeType是一个完全开源的、可扩展、可定制且可移植的字体引擎,它提供TrueType字体驱动的实现统一的接口来访问多种字体格式文件, 包括点阵字、TrueType、OpenType、Typ...

mac OS X自带PHP环境,没有freetype的解决办法

最近用自己的电脑做个小东西,需要用到验证码,用的是thinkPHP框架,TP的验证码需要freetype库支持,MAC 的OS X自带APACHE和PHP,直接配置一下就可以使用,很方便,而且扩展支持...
  • sdomain
  • sdomain
  • 2016年02月16日 11:07
  • 6661

OpenCV 显示中文汉字,未使用CvxText和FreeType库

OpenCV2显示汉字,未使用CvxText和FreeType库采用windows的GDI显示系统的TrueType字体,没有封装,就两个函数,分成了h和cpp文件,可以自己编辑文件名和函数名,亦可以...

freetype 使用小结

FreeType是一个完全开源的、可扩展、可定制且可移植的字体引擎,它提供TrueType字体驱动的实现统一的接口来访问多种字体格式文件, 包括点阵字、TrueType、OpenType、Type1...

MFC编译Freetype2.3.7

从http://www.freetype.org下载源代码。 FreeType2库源码包中包含多种环境与编译器下的make文件,其中还包含vc的项目文件。 我用的是VC,所以首先找到VC环...

freetype第二部分

第二部分 管理字形 介绍      这是“FreeType2 教程”的第二部分。它将教会你如何 * 检索字形度量  * 便捷地管理字形图像  * 检索全局度量(包括字距调整)...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:FreeType 调试
举报原因:
原因补充:

(最多只允许输入30个字)