Chinaunix首页 | 论坛 | 博客
  • 博客访问: 120786
  • 博文数量: 16
  • 博客积分: 1464
  • 博客等级: 上尉
  • 技术积分: 221
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-15 21:35
文章分类

全部博文(16)

文章存档

2011年(3)

2010年(7)

2009年(2)

2008年(1)

2006年(3)

我的朋友

分类:

2009-12-18 14:53:19

最近在项目里用到很多字体方面的东西,下面我来总结下我的理解和运用,希望能帮助大家理解
两个字体生成软件,如果有需要软件的朋友可以上网下。我也可以发给你门
1.FontCreatorProgram 2.点阵字库生成器
在嵌入式系统里面,用的比较多字体库还是点阵,就算是ttf字库,也是需要转换成位图或点阵才
能被framebuff使用的。当然字体文件不能太大,嵌入式吧应该尽量节省资源flash等,可以根据
要求自己制作字库文件,这两个软件是制作字库的时候使用。
大家都知道既然有编码就有解码。那么在程序里面就应该有相应的解析过程,然后把解析出来的
buff放到framebuff上去,这样就可以显示了。
下面我主要介绍一下:点阵和ttf程序里面用到的知识。
点阵:(对于点阵字库生成器 生成的gbk字体文件)
1.加载字库到内存;
 FILE *fp = NULL;
 char filename[32];
 memset(ptxtchsBuf,0,1500*1024);
 sprintf(filename,"fonts/gbk.DZK");
 fp = fopen(filename,"rb");
 fseek(fp, 0, SEEK_SET);
 fread(ptxtchsBuf, 1 , filesizechs, fp);  
 if(fp != NULL) 
 fclose(fp);
2.定位字库里面的字体;对于一串字符串pch
 while(*pch != '\0')
 {
  if(y>=FONT_HEIGHT||x>=FONT_WIDTH)//超出范围不显示
   return 1;
  if(*pch == ' ') goto BACK;
  if(*pch<128)
  {
   //此处不是中文,是数字大小写字母等一些特殊符号
  }
  else
  { //中文
   int i=0,j=0,k=0,qh=0,wh=0,offset=0;
   if (*(pch+1)<0x7f)
    offset=((*(pch)-0x81)*190+(*(pch+1)-0x40))*60;
   else if(*(pch+1)>=0x80)
    offset=((*(pch)-0x81)*190+(*(pch+1)-0x41))*60;
   else
    {}
   u16 *dst = (u16 *)(scrp->bufp+y*scrp->w+x);//定位framebuff的位置x y 坐标
   u8 *src = (u8 *)chsyuv+offset;
   for(i=0;i<20;i++)//一共几行
   {
    for(j=0;j<3;j++)//一行用3字节表示像素点
    {
     for(k=0;k<8;k++)//一个字节8位
     {
      if(src[i*3+j] & (0x80>>k))
      {
3.显示字体;      //上
       if(y>0&&g_show_twice)
       dst[k+j*8-scrp->w] = color;
       
       //下
       //dst[k+j*8+scrp->w]=color;
       dst[k+j*8]= color;
      }
      
     }
    }
    dst += WIDTH;
   }
   x += font_width;
   ++pch;
  }
l1:
  x += font_width;
  ++pch;
 }

ttf:解析simfang.ttf需要用到网上比较使用的freetype库(网上比较多此类文章)
1.初始化  
    FT_Error error;
    static int initialized = 0;
    if (initialized)
        return SUCCESS;
    initialized = 1;
    error = FT_Init_FreeType(&library);
    if (error) {
  
        return FAILURE;
    }
    error = FT_New_Face(library, filename, 0, &face);
 
    if (error) {
 
        return FAILURE;
    }
    error = FT_Select_Charmap(face, encoding);
    if (error) {
  
        return FAILURE;
    }
2.显示到frambuff上
 //首先要转换字符集
        c_pt = iconv_open("ucs-2","gb2312");
 if(c_pt == (iconv_t)-1){
        printf("iconv_open failed 1");
  return FAILURE;
 } 
 ret = iconv(c_pt, &text, &lenin, &pch, &lenout);
 if(ret == -1){
  printf("iconv failed 3");
 }
 
 ret = iconv_close(c_pt);
 if(ret == -1){
  printf("iconv_close failed 4");
 }
 FT_Set_Char_Size(face,
  font_height << 6,
  font_height << 6,
  100,
  100);
     pen.x = x << 6;
     pen.y = y << 6;
 for(k=0;k {
  FT_Set_Transform(face, NULL, &pen); 
  code = buf[k]*256+buf[k+1];
  index = FT_Get_Char_Index(face, code);
         error = FT_Load_Glyph(face, index, 0);
         if (error) {
             
             break;
         }
  if (face->glyph->format != FT_GLYPH_FORMAT_BITMAP) {
             error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
             if (error) {
               
                break;
             }
        }
        width = face->glyph->bitmap.width;
        height = face->glyph->bitmap.rows; 
 //到这里其实就已经得到了bitmap这样一个结构,里面就有buff
 //只要把这块区域映射到framebuff上就可以显示
    }
阅读(1995) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~