3DGIS

研究OpenGL,GPU和GIS

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  41 随笔 :: 1 文章 :: 65 评论 :: 8 Trackbacks
 

     在 C:"WINDOWS"Fonts 文件夹下面有几个矢量字体文件,如SIMFANG.TTFSIMHEI.TTFSIMKAISIMSUN分别对应着仿宋体,黑体,楷体和宋体。希望首先提取文件当中的存储的汉字位置信息,接着完成矢量化处理后,然后采用DCOpenGL进行绘制。从表面上看,这个工作也就是想实现Windows API中间的TextOutwglUseFontOuline等函数所实现的功能。但自己编程实现汉字的矢量化,能在后续工作中获得更多的灵活性,比如将用户输入的汉字换行处理,根据用户的输入对汉字进行任意角度的倾斜,总之,主动性掌握在自己手里。完成矢量化工作后,对这些汉字的处理如同处理普通的矢量图形一样,相当方便,而再不仅仅受制于系统 API所能提供的功能。具体的步骤为:

1)     根据Unicode编码标准,存储汉字的编码表 

wchar_t Mystring[1001];                       //存储准备显示的宽字符的编码

    count = 0;

    for (i=0;i<1000;i++)

    {

        Mystring[count] = 19968 + i;         //十进制的对应着十六进制的e00

        count++;

    }

    Mystring[1000] = '"0';

上面的例子中只准备提取1000个汉字,其实可以让循环从4e00进行到9521(十六进制),代表十进制的19968和38176,分别对应着汉字:一,锠。

2)采用FreeType2代码读取*.ttf文件,得到每个汉字的轮廓信息。

while( *c)                                                                     //依次处理字符

        {

                         fonts[0]->CheckGlyph(*c);

                         ++c;

}

   

3)在上叙第2步当中,完成矢量化工作的过程中,可采用De Casteljau算法处理贝塞尔(bezier)曲线。

矢量化工作的入口:

for( short contourIndex = 0; contourIndex < ftContourCount; ++contourIndex)

    {

        FT_Vector* pointList = &outline.points[startIndex];

        char* tagList = &outline.tags[startIndex];

       

        endIndex = outline.contours[contourIndex];

        contourLength = ( endIndex - startIndex) + 1;

        FTContour* contour = new FTContour( pointList, tagList, contourLength);

       

        contourList[contourIndex] = contour;

       

        startIndex = endIndex + 1;

}

4)根据提取的位置信息,采用DC或OpenGL进行绘制。

//采用DC绘制

for( unsigned int c = 0; c < numContours; ++c)

    {

        const FTContour* contour = vectoriser.Contour(c);

        iPolylineNumbers = iPolylineNumbers + 1;

        geoAtomLine =(geoatom::CGeoAtomPolyline**)realloc(geoAtomLine,iPolylineNumbers*sizeof(geoatom::CGeoAtomPolyline*));

        geoAtomLine[iPolylineNumbers-1] = new geoatom::CGeoAtomPolyline();    //原子分配内存,由于数组从开始记数,标记总是比个数少

        for( unsigned int pointIndex = 0; pointIndex < contour->PointCount(); ++pointIndex)

        {

            FTPoint point = contour->Point(pointIndex);

            geoAtomLine[iPolylineNumbers-1]->GetPtList()->add(fXaddition+iSize*point.X()/64.0f,fYaddition+iSize*point.Y()/64.0f);

        }

        geoAtomLine[iPolylineNumbers-1]->SetClosed(true);                          //将线段形成的区域封闭起来

        geoSymPoint[iPointSymbolNum-1]->AddAtom(geoAtomLine[iPolylineNumbers-1]); //将线要素添加到这个符号中

    }

   

}

//采用OpenGL进行绘制。

for( unsigned int c = 0; c < numContours; ++c)

    {

        const FTContour* contour = vectoriser.Contour(c);

       

        glBegin( GL_LINE_LOOP);                           //首尾相连接的多边形

           for( unsigned int pointIndex = 0; pointIndex < contour->PointCount(); ++pointIndex)

            {

                FTPoint point = contour->Point(pointIndex);

        //        glVertex2f( point.X() / 64.0f, point.Y() / 64.0f);           //提取顶点信息,绘制的落脚点

               

            }

      // glEnd();

    }

输出的图形:

posted on 2008-01-10 15:49 武汉侯涛 阅读(2011) 评论(11)  编辑 收藏

评论

#1楼  2008-01-10 16:55 hoodlum1980      
good.
  回复  引用  查看    

#2楼  2008-01-10 21:55 鞠强      
mark
  回复  引用  查看    

#3楼  2008-01-10 23:49 eda [未注册用户]
强呀……
  回复  引用    

#4楼  2008-01-11 11:56 Anders Liu      
能否详细介绍一下TTF文件的格式,和相关的算法?
  回复  引用  查看    

#5楼  2008-01-11 13:53 Clark Zheng      
好文,收藏
  回复  引用  查看    

#6楼 [楼主] 2008-01-12 12:04 武汉侯涛      
TTF文件的格式微软有个说明文档,你可以下载后查看,但比较琐碎.也可直接看FreeType2的源代码学习如何搭载TTF 文件.
  回复  引用  查看    

#7楼  2008-01-12 21:53 Anders Liu      
@武汉侯涛
可否明示一下URL,或者应该使用哪些关键词去搜索?
  回复  引用  查看    

#8楼 [楼主] 2008-01-13 09:15 武汉侯涛      
TrueType Font 的说明文档可在下面找到: http://www.microsoft.com/typography/SpecificationsOverview.mspx
著名的FreeType库是在:
http://www.freetype.org/
这个库值得学习.
  回复  引用  查看    

#9楼  2008-01-13 20:57 毒龙      
以前为了在工作站上的一个英文专业制图软件中加上汉字,把UCDOS的字库解析出来,对于黑体还行,但在处理楷体时,因为一些多边形内部套着另一个多边形,无法完成内部填充,很是麻烦。等ttf字体出来后,但一直不知道内部存储格式。好文
  回复  引用  查看    

#10楼  2008-01-14 09:53 Anders Liu      
@武汉侯涛
多多多谢!
  回复  引用  查看    

TO 毒龙 现在宋体和黑体文件是没有问题的,但楷体的确还存在一些问题,有些字的线画不对,有些字就不出现.还在研究FontForge中,希望能一起多多探讨.
  回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交