LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: xufan106

利用第三方源在Ubuntu下实现粗体

[复制链接]
发表于 2005-10-4 20:06:52 | 显示全部楼层
debian中已经有freetype 2.1.10
回复 支持 反对

使用道具 举报

发表于 2005-10-4 21:14:52 | 显示全部楼层
Post by fundawang
你快拉倒吧。freetype的版本那么低,你build cairo有什么用。


看我的截图

中文粗体的 FireFox

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2005-10-4 23:08:21 | 显示全部楼层
Post by jhuangjiahua
在 breezy 里装上新的 Cairo  就可以了
不过 Debian/Ubuntu 里的 Cairo 由于 OOo2 的 bug 的关系 , 被迫取消了 Cairo 的粗体

我们可以自己 rebuild  Debian 的 cairo
在 debian/patches/ 里去掉 02-no-ft-glyphslot-embolden.patch再打包就可以了


这下面是我 rebuild 的 cairo 的 deb 包
http://www.linuxsky.net/down/ftproot/incoming/f33k4/deb/cairo/
装上 libcairo2_1.0.0-3_i386.deb 就可以了

( 我只是打开粗体选项 , 没有加斜体补丁 , 斜体补丁可以在 cairo 的 ml 上找到 )


hua, 你的 libfreetype6 版本是多少?
如果你有时间,
1 等breezy正是发布后,把加入粗体和斜体补丁的cairo打包吧。
2 利用 mdv2006 的 poppler 的cjk 补丁,打个poppler的包,这样evince就可以正常显示没有内嵌字体的中文pdf了。
回复 支持 反对

使用道具 举报

发表于 2005-10-4 23:12:06 | 显示全部楼层
Post by xufan106
嗯嗯,,,,我是在 http://archive.ubuntulinux.jp/ubuntu-ja/breezy-ja/
找了几个包装上才实现的

请谈谈具体实现的方法
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-4 23:56:36 | 显示全部楼层
jhuangjiahua  
的 libfreetype6 应该是FreeType 2.1.10的
http://www.linuxsir.cn/bbs/showthread.php?t=218182

就是升级cairo和freetype实现粗体的,不过kde的字体有斜向上的现象。要想没有kde字体斜向上的现象就要手工重新编译升级freetype和libXft了

下载freetype:

http://prdownloads.sourceforge.n ... type-2.1.10.tar.bz2
解开源代码后

  1. $cd freetype-2.1.10
复制代码


打上下面的patch:


来自 http://www.linuxsir.cn/bbs/showt ... mp;page=1&pp=15
bold.patch
  1. --- freetype-2.1.10.orig/include/freetype/config/ftoption.h        2005-05-30 03:53:43.000000000 +0800
  2. +++ freetype-2.1.10/include/freetype/config/ftoption.h        2005-05-30 07:40:03.000000000 +0800
  3. @@ -436,7 +436,7 @@ FT_BEGIN_HEADER
  4.    /*   Do not #undef this macro here, since the build system might         */
  5.    /*   define it for certain configurations only.                          */
  6.    /*                                                                       */
  7. -/* #define TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
  8. +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER


  9.    /*************************************************************************/
复制代码

  1. $patch -pl < ./bold.patch
复制代码


打来自freetype2-2.1.10-3mdk.src.rpm
的patch:
freetype-2.1.10-cvsfixes.patch

  1. --- freetype2/include/freetype/internal/ftobjs.h        27 May 2005 06:01:28 -0000        1.90
  2. +++ freetype2/include/freetype/internal/ftobjs.h        20 Jun 2005 09:04:49 -0000        1.91
  3. @@ -452,6 +452,13 @@ FT_BEGIN_HEADER
  4.   /* */

  5.   /*
  6. +  * grid-fit slot->metrics
  7. +  */
  8. +  FT_BASE( void )
  9. +  ft_glyphslot_grid_fit_metrics( FT_GlyphSlot  slot );
  10. +
  11. +
  12. + /*
  13.    * Free the bitmap of a given glyphslot when needed
  14.    * (i.e., only when it was allocated with ft_glyphslot_alloc_bitmap).
  15.    */
  16. Index: src/base/ftobjs.c
  17. ===================================================================
  18. RCS file: /cvsroot/freetype/freetype2/src/base/ftobjs.c,v
  19. retrieving revision 1.215
  20. retrieving revision 1.217
  21. diff -u -p -r1.215 -r1.217
  22. --- freetype2/src/base/ftobjs.c        6 Jun 2005 07:01:47 -0000        1.215
  23. +++ freetype2/src/base/ftobjs.c        23 Jun 2005 20:31:48 -0000        1.217
  24. @@ -251,6 +251,29 @@


  25.    FT_BASE_DEF( void )
  26. +  ft_glyphslot_grid_fit_metrics( FT_GlyphSlot  slot )
  27. +  {
  28. +    FT_Pos  tmp;
  29. +
  30. +
  31. +    tmp = FT_PIX_CEIL( slot->metrics.horiBearingX + slot->metrics.width );
  32. +    slot->metrics.horiBearingX = FT_PIX_FLOOR( slot->metrics.horiBearingX );
  33. +    slot->metrics.width        = tmp - slot->metrics.horiBearingX;
  34. +
  35. +    tmp = FT_PIX_FLOOR( slot->metrics.horiBearingY - slot->metrics.height );
  36. +    slot->metrics.horiBearingY = FT_PIX_CEIL( slot->metrics.horiBearingY );
  37. +    slot->metrics.height       = slot->metrics.horiBearingY - tmp;
  38. +
  39. +    slot->metrics.horiAdvance  = FT_PIX_ROUND( slot->metrics.horiAdvance );
  40. +
  41. +    slot->metrics.vertBearingX = FT_PIX_FLOOR( slot->metrics.vertBearingX );
  42. +    /* note that vertBearingY should be floor'ed */
  43. +    slot->metrics.vertBearingY = FT_PIX_FLOOR( slot->metrics.vertBearingY );
  44. +    slot->metrics.vertAdvance  = FT_PIX_ROUND( slot->metrics.vertAdvance );
  45. +  }
  46. +
  47. +
  48. +  FT_BASE_DEF( void )
  49.    ft_glyphslot_set_bitmap( FT_GlyphSlot  slot,
  50.                             FT_Byte*      buffer )
  51.    {
  52. Index: src/base/ftoutln.c
  53. ===================================================================
  54. RCS file: /cvsroot/freetype/freetype2/src/base/ftoutln.c,v
  55. retrieving revision 1.62
  56. retrieving revision 1.63
  57. diff -u -p -r1.62 -r1.63
  58. --- freetype2/src/base/ftoutln.c        25 May 2005 05:51:01 -0000        1.62
  59. +++ freetype2/src/base/ftoutln.c        16 Jun 2005 19:07:08 -0000        1.63
  60. @@ -683,6 +683,7 @@
  61.      if ( !outline )
  62.        return FT_Err_Invalid_Argument;

  63. +    strength /= 2;
  64.      if ( strength == 0 )
  65.        return FT_Err_Ok;

  66. Index: src/base/ftsynth.c
  67. ===================================================================
  68. RCS file: /cvsroot/freetype/freetype2/src/base/ftsynth.c,v
  69. retrieving revision 1.27
  70. retrieving revision 1.30
  71. diff -u -p -r1.27 -r1.30
  72. --- freetype2/src/base/ftsynth.c        30 May 2005 07:54:20 -0000        1.27
  73. +++ freetype2/src/base/ftsynth.c        23 Jun 2005 20:31:48 -0000        1.30
  74. @@ -81,13 +81,16 @@

  75.      /* some reasonable strength */
  76.      xstr = FT_MulFix( face->units_per_EM,
  77. -                      face->size->metrics.y_scale ) / 42;
  78. +                      face->size->metrics.y_scale ) / 24;
  79.      ystr = xstr;

  80.      if ( slot->format == FT_GLYPH_FORMAT_OUTLINE )
  81.      {
  82.        error = FT_Outline_Embolden( &slot->outline, xstr );
  83. -      xstr = xstr * 4;  /* according to the documentation */
  84. +
  85. +      /* this is more than enough for most glyphs;                         */
  86. +      /* if you need accurate values, you have to call FT_Outline_Get_CBox */
  87. +      xstr = xstr * 2;
  88.        ystr = xstr;
  89.      }
  90.      else if ( slot->format == FT_GLYPH_FORMAT_BITMAP )
  91. @@ -122,8 +125,8 @@
  92.      /* modify the metrics accordingly */
  93.      if ( !error )
  94.      {
  95. +      /* assume the layout is horizontal */
  96.        slot->advance.x += xstr;
  97. -      slot->advance.y += ystr;

  98.        slot->metrics.width        += xstr;
  99.        slot->metrics.height       += ystr;
  100. Index: src/cff/cffgload.c
  101. ===================================================================
  102. RCS file: /cvsroot/freetype/freetype2/src/cff/cffgload.c,v
  103. retrieving revision 1.66
  104. retrieving revision 1.67
  105. diff -u -p -r1.66 -r1.67
  106. --- freetype2/src/cff/cffgload.c        18 Apr 2005 07:13:07 -0000        1.66
  107. +++ freetype2/src/cff/cffgload.c        20 Jun 2005 09:04:50 -0000        1.67
  108. @@ -2510,11 +2510,8 @@
  109.          glyph->root.linearHoriAdvance           = decoder.glyph_width;
  110.          glyph->root.internal->glyph_transformed = 0;

  111. -        /* make up vertical metrics */
  112. -        metrics->vertBearingX = 0;
  113. -        metrics->vertBearingY = 0;
  114. +        /* make up vertical ones */
  115.          metrics->vertAdvance  = 0;
  116. -
  117.          glyph->root.linearVertAdvance = 0;

  118.          glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
  119. @@ -2559,42 +2556,26 @@
  120.                vec->y = FT_MulFix( vec->y, y_scale );
  121.              }

  122. -          FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
  123. -
  124.            /* Then scale the metrics */
  125.            metrics->horiAdvance  = FT_MulFix( metrics->horiAdvance,  x_scale );
  126.            metrics->vertAdvance  = FT_MulFix( metrics->vertAdvance,  y_scale );
  127. -
  128. -          metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale );
  129. -          metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale );
  130. -
  131. -          if ( hinting )
  132. -          {
  133. -            metrics->horiAdvance  = FT_PIX_ROUND( metrics->horiAdvance );
  134. -            metrics->vertAdvance  = FT_PIX_ROUND( metrics->vertAdvance );
  135. -
  136. -            metrics->vertBearingX = FT_PIX_ROUND( metrics->vertBearingX );
  137. -            metrics->vertBearingY = FT_PIX_ROUND( metrics->vertBearingY );
  138. -          }
  139.          }

  140.          /* compute the other metrics */
  141.          FT_Outline_Get_CBox( &glyph->root.outline, &cbox );

  142. -        /* grid fit the bounding box if necessary */
  143. -        if ( hinting )
  144. -        {
  145. -          cbox.xMin &= -64;
  146. -          cbox.yMin &= -64;
  147. -          cbox.xMax  = ( cbox.xMax + 63 ) & -64;
  148. -          cbox.yMax  = ( cbox.yMax + 63 ) & -64;
  149. -        }
  150. -
  151.          metrics->width  = cbox.xMax - cbox.xMin;
  152.          metrics->height = cbox.yMax - cbox.yMin;

  153.          metrics->horiBearingX = cbox.xMin;
  154.          metrics->horiBearingY = cbox.yMax;
  155. +
  156. +        /* make up vertical ones */
  157. +        metrics->vertBearingX = 0;
  158. +        metrics->vertBearingY = 0;
  159. +
  160. +        if ( hinting )
  161. +          ft_glyphslot_grid_fit_metrics( &glyph->root );
  162.        }
  163.      }

  164. Index: src/cid/cidgload.c
  165. ===================================================================
  166. RCS file: /cvsroot/freetype/freetype2/src/cid/cidgload.c,v
  167. retrieving revision 1.70
  168. retrieving revision 1.72
  169. diff -u -p -r1.70 -r1.72
  170. --- freetype2/src/cid/cidgload.c        6 May 2004 11:48:35 -0000        1.70
  171. +++ freetype2/src/cid/cidgload.c        23 Jun 2005 20:31:48 -0000        1.72
  172. @@ -358,12 +358,10 @@
  173.          cidglyph->linearHoriAdvance           = decoder.builder.advance.x;
  174.          cidglyph->internal->glyph_transformed = 0;

  175. -        /* make up vertical metrics */
  176. -        metrics->vertBearingX = 0;
  177. -        metrics->vertBearingY = 0;
  178. +        /* make up vertical ones */
  179.          metrics->vertAdvance  = 0;
  180. -
  181.          cidglyph->linearVertAdvance = 0;
  182. +
  183.          cidglyph->format            = FT_GLYPH_FORMAT_OUTLINE;

  184.          if ( size && cidsize->metrics.y_ppem < 24 )
  185. @@ -403,42 +401,26 @@
  186.                vec->y = FT_MulFix( vec->y, y_scale );
  187.              }

  188. -          FT_Outline_Get_CBox( &cidglyph->outline, &cbox );
  189. -
  190.            /* Then scale the metrics */
  191.            metrics->horiAdvance  = FT_MulFix( metrics->horiAdvance,  x_scale );
  192.            metrics->vertAdvance  = FT_MulFix( metrics->vertAdvance,  y_scale );
  193. -
  194. -          metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale );
  195. -          metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale );
  196. -
  197. -          if ( hinting )
  198. -          {
  199. -            metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance );
  200. -            metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance );
  201. -
  202. -            metrics->vertBearingX = FT_PIX_ROUND( metrics->vertBearingX );
  203. -            metrics->vertBearingY = FT_PIX_ROUND( metrics->vertBearingY );
  204. -          }
  205.          }

  206.          /* compute the other metrics */
  207.          FT_Outline_Get_CBox( &cidglyph->outline, &cbox );

  208. -        /* grid fit the bounding box if necessary */
  209. -        if ( hinting )
  210. -        {
  211. -          cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
  212. -          cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
  213. -          cbox.xMax = FT_PIX_CEIL( cbox.xMax );
  214. -          cbox.yMax = FT_PIX_CEIL( cbox.yMax );
  215. -        }
  216. -
  217.          metrics->width  = cbox.xMax - cbox.xMin;
  218.          metrics->height = cbox.yMax - cbox.yMin;

  219.          metrics->horiBearingX = cbox.xMin;
  220.          metrics->horiBearingY = cbox.yMax;
  221. +
  222. +        /* make up vertical ones */
  223. +        metrics->vertBearingX = 0;
  224. +        metrics->vertBearingY = 0;
  225. +
  226. +        if ( hinting )
  227. +          ft_glyphslot_grid_fit_metrics( cidglyph );
  228.        }
  229.      }

  230. Index: src/sfnt/ttsbit.c
  231. ===================================================================
  232. RCS file: /cvsroot/freetype/freetype2/src/sfnt/ttsbit.c,v
  233. retrieving revision 1.63
  234. retrieving revision 1.64
  235. diff -u -p -r1.63 -r1.64
  236. --- freetype2/src/sfnt/ttsbit.c        1 Mar 2005 02:13:50 -0000        1.63
  237. +++ freetype2/src/sfnt/ttsbit.c        16 Jun 2005 19:07:08 -0000        1.64
  238. @@ -1501,7 +1501,7 @@
  239.        /* some heuristic values */

  240.        metrics->vertBearingX = (FT_Char)(-metrics->width / 2 );
  241. -      metrics->vertBearingY = (FT_Char)( advance / 10 );
  242. +      metrics->vertBearingY = (FT_Char)( ( advance - metrics->height ) / 2 );
  243.        metrics->vertAdvance  = (FT_Char)( advance * 12 / 10 );
  244.      }

  245. Index: src/truetype/ttdriver.c
  246. ===================================================================
  247. RCS file: /cvsroot/freetype/freetype2/src/truetype/ttdriver.c,v
  248. retrieving revision 1.78
  249. retrieving revision 1.79
  250. diff -u -p -r1.78 -r1.79
  251. --- freetype2/src/truetype/ttdriver.c        1 Mar 2005 02:13:50 -0000        1.78
  252. +++ freetype2/src/truetype/ttdriver.c        26 Jul 2005 08:14:03 -0000        1.79
  253. @@ -167,40 +167,33 @@
  254.                    FT_UInt     horz_resolution,
  255.                    FT_UInt     vert_resolution )
  256.    {
  257. -    TT_Size           size     = (TT_Size)ttsize;
  258. -    FT_Size_Metrics*  metrics  = &size->root.metrics;
  259. -    FT_Size_Metrics*  metrics2 = &size->metrics;
  260. -    TT_Face           face     = (TT_Face)size->root.face;
  261. -    FT_Long           dim_x, dim_y;
  262. +    TT_Size           size    = (TT_Size)ttsize;
  263. +    FT_Size_Metrics*  metrics = &size->metrics;
  264. +    TT_Face           face    = (TT_Face)size->root.face;


  265. -    *metrics2 = *metrics;
  266. +    /* copy the result from base layer */
  267. +    *metrics = size->root.metrics;

  268.      /* This bit flag, when set, indicates that the pixel size must be */
  269. -    /* truncated to an integer.  Nearly all TrueType fonts have this  */
  270. -    /* bit set, as hinting won't work really well otherwise.          */
  271. +    /* rounded to integer.  Nearly all TrueType fonts have this  bit  */
  272. +    /* set, as hinting won't work really well otherwise.              */
  273.      /*                                                                */
  274.      if ( ( face->header.Flags & 8 ) != 0 )
  275.      {
  276. -     /* we need to use rounding in the following computations. Otherwise,
  277. -      * the resulting hinted outlines will be very slightly distorted
  278. -      */
  279. -      dim_x = ( ( char_width  * horz_resolution + (36+32*72) ) / 72 ) & ~63;
  280. -      dim_y = ( ( char_height * vert_resolution + (36+32*72) ) / 72 ) & ~63;
  281. -    }
  282. -    else
  283. -    {
  284. -      dim_x = ( ( char_width  * horz_resolution + 36 ) / 72 );
  285. -      dim_y = ( ( char_height * vert_resolution + 36 ) / 72 );
  286. -    }
  287. +      FT_Long  dim_x, dim_y;

  288. -    /* we only modify "metrics2", not "metrics", so these changes have */
  289. -    /* no effect on the result of the auto-hinter when it is used      */
  290. -    /*                                                                 */
  291. -    metrics2->x_ppem  = (FT_UShort)( dim_x >> 6 );
  292. -    metrics2->y_ppem  = (FT_UShort)( dim_y >> 6 );
  293. -    metrics2->x_scale = FT_DivFix( dim_x, face->root.units_per_EM );
  294. -    metrics2->y_scale = FT_DivFix( dim_y, face->root.units_per_EM );
  295. +      dim_x = ( char_width  * horz_resolution + 36 ) / 72;
  296. +      dim_y = ( char_height * vert_resolution + 36 ) / 72;
  297. +
  298. +      dim_x = FT_PIX_ROUND(dim_x);
  299. +      dim_y = FT_PIX_ROUND(dim_y);
  300. +
  301. +      metrics->x_ppem  = (FT_UShort)( dim_x >> 6 );
  302. +      metrics->y_ppem  = (FT_UShort)( dim_y >> 6 );
  303. +      metrics->x_scale = FT_DivFix( dim_x, face->root.units_per_EM );
  304. +      metrics->y_scale = FT_DivFix( dim_y, face->root.units_per_EM );
  305. +    }

  306.      size->ttmetrics.valid = FALSE;
  307. #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
  308. Index: src/truetype/ttgload.c
  309. ===================================================================
  310. RCS file: /cvsroot/freetype/freetype2/src/truetype/ttgload.c,v
  311. retrieving revision 1.138
  312. retrieving revision 1.143
  313. diff -u -p -r1.138 -r1.143
  314. --- freetype2/src/truetype/ttgload.c        6 Apr 2005 14:48:55 -0000        1.138
  315. +++ freetype2/src/truetype/ttgload.c        13 Jul 2005 06:58:13 -0000        1.143
  316. @@ -1707,15 +1707,6 @@
  317.        FT_Outline_Translate( &glyph->outline, -loader->pp1.x, 0 );

  318.        FT_Outline_Get_CBox( &glyph->outline, &bbox );
  319. -
  320. -      if ( IS_HINTED( loader->load_flags ) )
  321. -      {
  322. -        /* grid-fit the bounding box */
  323. -        bbox.xMin = FT_PIX_FLOOR( bbox.xMin );
  324. -        bbox.yMin = FT_PIX_FLOOR( bbox.yMin );
  325. -        bbox.xMax = FT_PIX_CEIL( bbox.xMax );
  326. -        bbox.yMax = FT_PIX_CEIL( bbox.yMax );
  327. -      }
  328.      }
  329.      else
  330.        bbox = loader->bbox;
  331. @@ -1744,10 +1735,6 @@
  332.      glyph->metrics.horiBearingY = bbox.yMax;
  333.      glyph->metrics.horiAdvance  = loader->pp2.x - loader->pp1.x;

  334. -    /* don't forget to hint the advance when we need to */
  335. -    if ( IS_HINTED( loader->load_flags ) )
  336. -      glyph->metrics.horiAdvance = FT_PIX_ROUND( glyph->metrics.horiAdvance );
  337. -
  338.      /* Now take care of vertical metrics.  In the case where there is    */
  339.      /* no vertical information within the font (relatively common), make */
  340.      /* up some metrics by `hand'...                                      */
  341. @@ -1765,41 +1752,45 @@
  342.        if ( face->vertical_info &&
  343.             face->vertical.number_Of_VMetrics > 0 )
  344.        {
  345. -        advance_height = (FT_UShort)( loader->pp4.y - loader->pp3.y );
  346. -        top_bearing    = (FT_Short)( loader->pp3.y - bbox.yMax );
  347. +        top_bearing = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax,
  348. +                                           y_scale );
  349. +
  350. +        if ( loader->pp3.y <= loader->pp4.y )
  351. +          advance_height = 0;
  352. +        else
  353. +          advance_height = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y,
  354. +                                                 y_scale );
  355.        }
  356.        else
  357.        {
  358. -        /* Make up the distances from the horizontal header.   */
  359. +        FT_Short  max_height, height;
  360. +
  361. +
  362. +        /* XXX Compute top side bearing and advance height in  */
  363. +        /*     Get_VMetrics instead of here.                   */

  364.          /* NOTE: The OS/2 values are the only `portable' ones, */
  365.          /*       which is why we use them, if there is an OS/2 */
  366.          /*       table in the font.  Otherwise, we use the     */
  367.          /*       values defined in the horizontal header.      */
  368. -        /*                                                     */
  369. -        /* NOTE2: The sTypoDescender is negative, which is why */
  370. -        /*        we compute the baseline-to-baseline distance */
  371. -        /*        here with:                                   */
  372. -        /*             ascender - descender + linegap          */
  373. -        /*                                                     */
  374. -        /* NOTE3: This is different from what MS's rasterizer  */
  375. -        /*        appears to do when getting default values    */
  376. -        /*        for the vertical phantom points.  We leave   */
  377. -        /*        the old code untouched, but relying on       */
  378. -        /*        phantom points alone might be reasonable     */
  379. -        /*        (i.e., removing the `if' above).             */
  380. +
  381. +        height = (FT_Short)FT_DivFix( bbox.yMax - bbox.yMin, y_scale );
  382.          if ( face->os2.version != 0xFFFFU )
  383.          {
  384. -          top_bearing    = (FT_Short)( face->os2.sTypoLineGap / 2 );
  385. -          advance_height = (FT_UShort)( face->os2.sTypoAscender -
  386. -                                        face->os2.sTypoDescender +
  387. -                                        face->os2.sTypoLineGap );
  388. +          /* sTypoDescender is negative */
  389. +          max_height     = (FT_Short)(face->os2.sTypoAscender -
  390. +                                      face->os2.sTypoDescender);
  391. +
  392. +          top_bearing    = (FT_Short)( ( max_height - height ) / 2 );
  393. +          advance_height = (FT_UShort)( max_height + face->os2.sTypoLineGap );
  394.          }
  395.          else
  396.          {
  397. -          top_bearing    = (FT_Short)( face->horizontal.Line_Gap / 2 );
  398. -          advance_height = (FT_UShort)( face->horizontal.Ascender  +
  399. -                                        face->horizontal.Descender +
  400. +          max_height = (FT_Short)(face->horizontal.Ascender +
  401. +                                  face->horizontal.Descender);
  402. +
  403. +          top_bearing    = (FT_Short)( ( max_height - height ) / 2 );
  404. +          advance_height = (FT_UShort)( max_height +
  405.                                          face->horizontal.Line_Gap );
  406.          }
  407.        }
  408. @@ -1817,7 +1808,7 @@

  409.          metrics.bearing_x = 0;
  410.          metrics.bearing_y = top_bearing;
  411. -        metrics.advance = advance_height;
  412. +        metrics.advance   = advance_height;
  413.          error =
  414.            face->root.internal->incremental_interface->funcs->get_glyph_metrics(
  415.              face->root.internal->incremental_interface->object,
  416. @@ -1834,20 +1825,15 @@

  417. #endif /* FT_CONFIG_OPTION_INCREMENTAL */

  418. -      /* We must adjust the top_bearing value from the bounding box given */
  419. -      /* in the glyph header to the bounding box calculated with          */
  420. -      /* FT_Get_Outline_CBox().                                           */
  421. -
  422.        /* scale the metrics */
  423.        if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) )
  424.        {
  425. -        top     = FT_MulFix( top_bearing + loader->bbox.yMax, y_scale )
  426. -                    - bbox.yMax;
  427. +        top     = FT_MulFix( top_bearing, y_scale );
  428.          advance = FT_MulFix( advance_height, y_scale );
  429.        }
  430.        else
  431.        {
  432. -        top     = top_bearing + loader->bbox.yMax - bbox.yMax;
  433. +        top     = top_bearing;
  434.          advance = advance_height;
  435.        }

  436. @@ -1860,14 +1846,6 @@
  437.        /*                                                               */
  438.        left = ( bbox.xMin - bbox.xMax ) / 2;

  439. -      /* grid-fit them if necessary */
  440. -      if ( IS_HINTED( loader->load_flags ) )
  441. -      {
  442. -        left    = FT_PIX_FLOOR( left );
  443. -        top     = FT_PIX_CEIL( top );
  444. -        advance = FT_PIX_ROUND( advance );
  445. -      }
  446. -
  447.        glyph->metrics.vertBearingX = left;
  448.        glyph->metrics.vertBearingY = top;
  449.        glyph->metrics.vertAdvance  = advance;
  450. @@ -1889,6 +1867,9 @@
  451.      /* set glyph dimensions */
  452.      glyph->metrics.width  = bbox.xMax - bbox.xMin;
  453.      glyph->metrics.height = bbox.yMax - bbox.yMin;
  454. +
  455. +    if ( IS_HINTED( loader->load_flags ) )
  456. +      ft_glyphslot_grid_fit_metrics( glyph );

  457.      return 0;
  458.    }
  459. Index: src/truetype/ttobjs.c
  460. ===================================================================
  461. RCS file: /cvsroot/freetype/freetype2/src/truetype/ttobjs.c,v
  462. retrieving revision 1.90
  463. retrieving revision 1.91
  464. diff -u -p -r1.90 -r1.91
  465. --- freetype2/src/truetype/ttobjs.c        1 Mar 2005 02:13:50 -0000        1.90
  466. +++ freetype2/src/truetype/ttobjs.c        31 Jul 2005 11:41:54 -0000        1.91
  467. @@ -121,19 +121,21 @@
  468.      FT_Error  error;


  469. -    if ( maxPoints > 0 )
  470. -      maxPoints += 2;
  471. -
  472.      FT_MEM_ZERO( zone, sizeof ( *zone ) );
  473.      zone->memory = memory;

  474. -    if ( FT_NEW_ARRAY( zone->org,      maxPoints * 2 ) ||
  475. -         FT_NEW_ARRAY( zone->cur,      maxPoints * 2 ) ||
  476. -         FT_NEW_ARRAY( zone->tags,     maxPoints     ) ||
  477. -         FT_NEW_ARRAY( zone->contours, maxContours   ) )
  478. +    if ( FT_NEW_ARRAY( zone->org,      maxPoints   ) ||
  479. +         FT_NEW_ARRAY( zone->cur,      maxPoints   ) ||
  480. +         FT_NEW_ARRAY( zone->tags,     maxPoints   ) ||
  481. +         FT_NEW_ARRAY( zone->contours, maxContours ) )
  482.      {
  483.        tt_glyphzone_done( zone );
  484.      }
  485. +    else
  486. +    {
  487. +      zone->max_points = maxPoints;
  488. +      zone->max_contours = maxContours;
  489. +    }

  490.      return error;
  491.    }
  492. @@ -318,6 +320,162 @@
  493.    /*                                                                       */
  494.    /*************************************************************************/

  495. +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
  496. +  /*************************************************************************/
  497. +  /*                                                                       */
  498. +  /* <Function>                                                            */
  499. +  /*    tt_size_run_fpgm                                                   */
  500. +  /*                                                                       */
  501. +  /* <Description>                                                         */
  502. +  /*    Run the font program                                               */
  503. +  /*                                                                       */
  504. +  /* <Input>                                                               */
  505. +  /*    size :: A handle to the size object.                               */
  506. +  /*                                                                       */
  507. +  /* <Return>                                                              */
  508. +  /*    FreeType error code.  0 means success.                             */
  509. +  /*                                                                       */
  510. +  FT_LOCAL_DEF( FT_Error )
  511. +  tt_size_run_fpgm( TT_Size  size )
  512. +  {
  513. +    TT_Face         face = (TT_Face)size->root.face;
  514. +    TT_ExecContext  exec;
  515. +    FT_Error        error;
  516. +
  517. +
  518. +    /* debugging instances have their own context */
  519. +    if ( size->debug )
  520. +      exec = size->context;
  521. +    else
  522. +      exec = TT_New_Context( face );
  523. +
  524. +    if ( !exec )
  525. +      return TT_Err_Could_Not_Find_Context;
  526. +
  527. +    TT_Load_Context( exec, face, size );
  528. +
  529. +    exec->callTop   = 0;
  530. +    exec->top       = 0;
  531. +
  532. +    exec->period    = 64;
  533. +    exec->phase     = 0;
  534. +    exec->threshold = 0;
  535. +
  536. +    exec->instruction_trap = FALSE;
  537. +    exec->F_dot_P = 0x10000L;
  538. +
  539. +    {
  540. +      FT_Size_Metrics*  metrics    = &exec->metrics;
  541. +      TT_Size_Metrics*  tt_metrics = &exec->tt_metrics;
  542. +
  543. +
  544. +      metrics->x_ppem   = 0;
  545. +      metrics->y_ppem   = 0;
  546. +      metrics->x_scale  = 0;
  547. +      metrics->y_scale  = 0;
  548. +
  549. +      tt_metrics->ppem  = 0;
  550. +      tt_metrics->scale = 0;
  551. +      tt_metrics->ratio = 0x10000L;
  552. +    }
  553. +
  554. +    /* allow font program execution */
  555. +    TT_Set_CodeRange( exec,
  556. +                      tt_coderange_font,
  557. +                      face->font_program,
  558. +                      face->font_program_size );
  559. +
  560. +    /* disable CVT and glyph programs coderange */
  561. +    TT_Clear_CodeRange( exec, tt_coderange_cvt );
  562. +    TT_Clear_CodeRange( exec, tt_coderange_glyph );
  563. +
  564. +    if ( face->font_program_size > 0 )
  565. +    {
  566. +      error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 );
  567. +
  568. +      if ( !error )
  569. +        error = face->interpreter( exec );
  570. +    }
  571. +    else
  572. +      error = TT_Err_Ok;
  573. +
  574. +    if ( !error )
  575. +      TT_Save_Context( exec, size );
  576. +
  577. +    if ( !size->debug )
  578. +      TT_Done_Context( exec );
  579. +
  580. +    return error;
  581. +  }
  582. +
  583. +
  584. +  /*************************************************************************/
  585. +  /*                                                                       */
  586. +  /* <Function>                                                            */
  587. +  /*    tt_size_run_prep                                                   */
  588. +  /*                                                                       */
  589. +  /* <Description>                                                         */
  590. +  /*    Run the control value program                                      */
  591. +  /*                                                                       */
  592. +  /* <Input>                                                               */
  593. +  /*    size :: A handle to the size object.                               */
  594. +  /*                                                                       */
  595. +  /* <Return>                                                              */
  596. +  /*    FreeType error code.  0 means success.                             */
  597. +  /*                                                                       */
  598. +  FT_LOCAL_DEF( FT_Error )
  599. +  tt_size_run_prep( TT_Size  size )
  600. +  {
  601. +    TT_Face         face = (TT_Face)size->root.face;
  602. +    TT_ExecContext  exec;
  603. +    FT_Error        error;
  604. +
  605. +
  606. +    /* debugging instances have their own context */
  607. +    if ( size->debug )
  608. +      exec = size->context;
  609. +    else
  610. +      exec = TT_New_Context( face );
  611. +
  612. +    if ( !exec )
  613. +      return TT_Err_Could_Not_Find_Context;
  614. +
  615. +    TT_Load_Context( exec, face, size );
  616. +
  617. +    exec->callTop = 0;
  618. +    exec->top     = 0;
  619. +
  620. +    exec->instruction_trap = FALSE;
  621. +
  622. +    TT_Set_CodeRange( exec,
  623. +                      tt_coderange_cvt,
  624. +                      face->cvt_program,
  625. +                      face->cvt_program_size );
  626. +
  627. +    TT_Clear_CodeRange( exec, tt_coderange_glyph );
  628. +
  629. +    if ( face->cvt_program_size > 0 )
  630. +    {
  631. +      error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );
  632. +
  633. +      if ( !error && !size->debug )
  634. +        error = face->interpreter( exec );
  635. +    }
  636. +    else
  637. +      error = TT_Err_Ok;
  638. +
  639. +    /* save as default graphics state */
  640. +    size->GS = exec->GS;
  641. +
  642. +    TT_Save_Context( exec, size );
  643. +
  644. +    if ( !size->debug )
  645. +      TT_Done_Context( exec );
  646. +
  647. +    return error;
  648. +  }
  649. +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
  650. +

  651.    /*************************************************************************/
  652.    /*                                                                       */
  653. @@ -338,15 +496,11 @@
  654.    {
  655.      TT_Size   size  = (TT_Size)ttsize;
  656.      FT_Error  error = TT_Err_Ok;
  657. -
  658. -
  659. #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
  660. -
  661.      TT_Face    face   = (TT_Face)size->root.face;
  662.      FT_Memory  memory = face->root.memory;
  663.      FT_Int     i;

  664. -    TT_ExecContext  exec;
  665.      FT_UShort       n_twilight;
  666.      TT_MaxProfile*  maxp = &face->max_profile;

  667. @@ -387,17 +541,30 @@
  668.           FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) ||
  669.           FT_NEW_ARRAY( size->cvt,              size->cvt_size             ) ||
  670.           FT_NEW_ARRAY( size->storage,          size->storage_size         ) )
  671. +    {
  672. +      tt_size_done( ttsize );

  673. -      goto Fail_Memory;
  674. +      return error;
  675. +    }

  676.      /* reserve twilight zone */
  677.      n_twilight = maxp->maxTwilightPoints;
  678. +
  679. +    /* there are 4 phantom points (do we need this?) */
  680. +    n_twilight += 4;
  681. +
  682.      error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight );
  683.      if ( error )
  684. -      goto Fail_Memory;
  685. +    {
  686. +      tt_size_done( ttsize );
  687. +
  688. +      return error;
  689. +    }

  690.      size->twilight.n_points = n_twilight;

  691. +    size->GS = tt_default_graphics_state;
  692. +
  693.      /* set `face->interpreter' according to the debug hook present */
  694.      {
  695.        FT_Library  library = face->root.driver->root.library;
  696. @@ -409,95 +576,17 @@
  697.          face->interpreter = (TT_Interpreter)TT_RunIns;
  698.      }

  699. -    /* Fine, now execute the font program! */
  700. -    exec = size->context;
  701. -    /* size objects used during debugging have their own context */
  702. -    if ( !size->debug )
  703. -      exec = TT_New_Context( face );
  704. -
  705. -    if ( !exec )
  706. -    {
  707. -      error = TT_Err_Could_Not_Find_Context;
  708. -      goto Fail_Memory;
  709. -    }
  710. -
  711. -    size->GS = tt_default_graphics_state;
  712. -    TT_Load_Context( exec, face, size );
  713. -
  714. -    exec->callTop   = 0;
  715. -    exec->top       = 0;
  716. -
  717. -    exec->period    = 64;
  718. -    exec->phase     = 0;
  719. -    exec->threshold = 0;
  720. -
  721. -    {
  722. -      FT_Size_Metrics*  metrics    = &exec->metrics;
  723. -      TT_Size_Metrics*  tt_metrics = &exec->tt_metrics;
  724. -
  725. -
  726. -      metrics->x_ppem   = 0;
  727. -      metrics->y_ppem   = 0;
  728. -      metrics->x_scale  = 0;
  729. -      metrics->y_scale  = 0;
  730. -
  731. -      tt_metrics->ppem  = 0;
  732. -      tt_metrics->scale = 0;
  733. -      tt_metrics->ratio = 0x10000L;
  734. -    }
  735. +    /* Fine, now run the font program! */
  736. +    error = tt_size_run_fpgm( size );

  737. -    exec->instruction_trap = FALSE;
  738. -
  739. -    exec->cvtSize = size->cvt_size;
  740. -    exec->cvt     = size->cvt;
  741. -
  742. -    exec->F_dot_P = 0x10000L;
  743. -
  744. -    /* allow font program execution */
  745. -    TT_Set_CodeRange( exec,
  746. -                      tt_coderange_font,
  747. -                      face->font_program,
  748. -                      face->font_program_size );
  749. -
  750. -    /* disable CVT and glyph programs coderange */
  751. -    TT_Clear_CodeRange( exec, tt_coderange_cvt );
  752. -    TT_Clear_CodeRange( exec, tt_coderange_glyph );
  753. -
  754. -    if ( face->font_program_size > 0 )
  755. -    {
  756. -      error = TT_Goto_CodeRange( exec, tt_coderange_font, 0 );
  757. -      if ( !error )
  758. -        error = face->interpreter( exec );
  759. -
  760. -      if ( error )
  761. -        goto Fail_Exec;
  762. -    }
  763. -    else
  764. -      error = TT_Err_Ok;
  765. -
  766. -    TT_Save_Context( exec, size );
  767. -
  768. -    if ( !size->debug )
  769. -      TT_Done_Context( exec );
  770. +    if ( error )
  771. +      tt_size_done( ttsize );

  772. #endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */

  773.      size->ttmetrics.valid = FALSE;
  774. -    return error;
  775. -
  776. -#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
  777. -
  778. -  Fail_Exec:
  779. -    if ( !size->debug )
  780. -      TT_Done_Context( exec );
  781. -
  782. -  Fail_Memory:

  783. -    tt_size_done( ttsize );
  784.      return error;
  785. -
  786. -#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */
  787. -
  788.    }


  789. @@ -516,9 +605,7 @@
  790.    tt_size_done( FT_Size  ttsize )           /* TT_Size */
  791.    {
  792.      TT_Size    size = (TT_Size)ttsize;
  793. -
  794. #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
  795. -
  796.      FT_Memory  memory = size->root.face->memory;


  797. @@ -625,10 +712,8 @@
  798. #endif

  799. #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
  800. -
  801.      {
  802. -      TT_ExecContext  exec;
  803. -      FT_UInt         i, j;
  804. +      FT_UInt  i;


  805.        /* Scale the cvt values to the new ppem.          */
  806. @@ -637,12 +722,12 @@
  807.          size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale );

  808.        /* All twilight points are originally zero */
  809. -      for ( j = 0; j < (FT_UInt)size->twilight.n_points; j++ )
  810. +      for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ )
  811.        {
  812. -        size->twilight.org[j].x = 0;
  813. -        size->twilight.org[j].y = 0;
  814. -        size->twilight.cur[j].x = 0;
  815. -        size->twilight.cur[j].y = 0;
  816. +        size->twilight.org[i].x = 0;
  817. +        size->twilight.org[i].y = 0;
  818. +        size->twilight.cur[i].x = 0;
  819. +        size->twilight.cur[i].y = 0;
  820.        }

  821.        /* clear storage area */
  822. @@ -651,53 +736,8 @@

  823.        size->GS = tt_default_graphics_state;

  824. -      /* get execution context and run prep program */
  825. -      if ( size->debug )
  826. -        exec = size->context;
  827. -      else
  828. -        exec = TT_New_Context( face );
  829. -      /* debugging instances have their own context */
  830. -
  831. -      if ( !exec )
  832. -        return TT_Err_Could_Not_Find_Context;
  833. -
  834. -      TT_Load_Context( exec, face, size );
  835. -
  836. -      TT_Set_CodeRange( exec,
  837. -                        tt_coderange_cvt,
  838. -                        face->cvt_program,
  839. -                        face->cvt_program_size );
  840. -
  841. -      TT_Clear_CodeRange( exec, tt_coderange_glyph );
  842. -
  843. -      exec->instruction_trap = FALSE;
  844. -
  845. -      exec->top     = 0;
  846. -      exec->callTop = 0;
  847. -
  848. -      if ( face->cvt_program_size > 0 )
  849. -      {
  850. -        error = TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 );
  851. -        if ( error )
  852. -          goto End;
  853. -
  854. -        if ( !size->debug )
  855. -          error = face->interpreter( exec );
  856. -      }
  857. -      else
  858. -        error = TT_Err_Ok;
  859. -
  860. -      size->GS = exec->GS;
  861. -      /* save default graphics state */
  862. -
  863. -    End:
  864. -      TT_Save_Context( exec, size );
  865. -
  866. -      if ( !size->debug )
  867. -        TT_Done_Context( exec );
  868. -      /* debugging instances keep their context */
  869. +      error = tt_size_run_prep( size );
  870.      }
  871. -
  872. #endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */

  873.      if ( !error )
  874. Index: src/truetype/ttobjs.h
  875. ===================================================================
  876. RCS file: /cvsroot/freetype/freetype2/src/truetype/ttobjs.h,v
  877. retrieving revision 1.36
  878. retrieving revision 1.38
  879. diff -u -p -r1.36 -r1.38
  880. --- freetype2/src/truetype/ttobjs.h        4 May 2004 16:53:45 -0000        1.36
  881. +++ freetype2/src/truetype/ttobjs.h        31 Jul 2005 11:41:54 -0000        1.38
  882. @@ -316,7 +316,10 @@ FT_BEGIN_HEADER
  883.    {
  884.      FT_SizeRec         root;

  885. -    FT_Size_Metrics    metrics; /* slightly different from the root metrics */
  886. +    /* we have our own copy of metrics so that we can modify */
  887. +    /* it without affecting auto-hinting (when used)         */
  888. +    FT_Size_Metrics    metrics;
  889. +
  890.      TT_Size_Metrics    ttmetrics;

  891. #ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS
  892. @@ -413,6 +416,14 @@ FT_BEGIN_HEADER

  893.    FT_LOCAL( void )
  894.    tt_size_done( FT_Size  ttsize );          /* TT_Size */
  895. +
  896. +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
  897. +  FT_LOCAL( FT_Error )
  898. +  tt_size_run_fpgm( TT_Size  size );
  899. +
  900. +  FT_LOCAL( FT_Error )
  901. +  tt_size_run_prep( TT_Size  size );
  902. +#endif /* TT_CONFIG_OPTION_BYTECODE_INTERPRETER */

  903.    FT_LOCAL( FT_Error )
  904.    tt_size_reset( TT_Size  size );
  905. Index: src/type1/t1gload.c
  906. ===================================================================
  907. RCS file: /cvsroot/freetype/freetype2/src/type1/t1gload.c,v
  908. retrieving revision 1.85
  909. retrieving revision 1.87
  910. diff -u -p -r1.85 -r1.87
  911. --- freetype2/src/type1/t1gload.c        13 May 2004 12:59:59 -0000        1.85
  912. +++ freetype2/src/type1/t1gload.c        23 Jun 2005 20:31:48 -0000        1.87
  913. @@ -315,11 +315,7 @@
  914.          glyph->root.linearHoriAdvance           = decoder.builder.advance.x;
  915.          glyph->root.internal->glyph_transformed = 0;

  916. -        /* make up vertical metrics */
  917. -        metrics->vertBearingX = 0;
  918. -        metrics->vertBearingY = 0;
  919. -        metrics->vertAdvance  = 0;
  920. -
  921. +        metrics->vertAdvance          = 0;
  922.          glyph->root.linearVertAdvance = 0;

  923.          glyph->root.format = FT_GLYPH_FORMAT_OUTLINE;
  924. @@ -363,42 +359,26 @@
  925.                vec->y = FT_MulFix( vec->y, y_scale );
  926.              }

  927. -          FT_Outline_Get_CBox( &glyph->root.outline, &cbox );
  928. -
  929.            /* Then scale the metrics */
  930.            metrics->horiAdvance  = FT_MulFix( metrics->horiAdvance,  x_scale );
  931.            metrics->vertAdvance  = FT_MulFix( metrics->vertAdvance,  y_scale );
  932. -
  933. -          metrics->vertBearingX = FT_MulFix( metrics->vertBearingX, x_scale );
  934. -          metrics->vertBearingY = FT_MulFix( metrics->vertBearingY, y_scale );
  935. -
  936. -          if ( hinting )
  937. -          {
  938. -            metrics->horiAdvance = FT_PIX_ROUND( metrics->horiAdvance );
  939. -            metrics->vertAdvance = FT_PIX_ROUND( metrics->vertAdvance );
  940. -
  941. -            metrics->vertBearingX = FT_PIX_ROUND( metrics->vertBearingX );
  942. -            metrics->vertBearingY = FT_PIX_ROUND( metrics->vertBearingY );
  943. -          }
  944.          }

  945.          /* compute the other metrics */
  946.          FT_Outline_Get_CBox( &glyph->root.outline, &cbox );

  947. -        /* grid fit the bounding box if necessary */
  948. -        if ( hinting )
  949. -        {
  950. -          cbox.xMin = FT_PIX_FLOOR( cbox.xMin );
  951. -          cbox.yMin = FT_PIX_FLOOR( cbox.yMin );
  952. -          cbox.xMax = FT_PIX_CEIL( cbox.xMax );
  953. -          cbox.yMax = FT_PIX_CEIL( cbox.yMax );
  954. -        }
  955. -
  956.          metrics->width  = cbox.xMax - cbox.xMin;
  957.          metrics->height = cbox.yMax - cbox.yMin;

  958.          metrics->horiBearingX = cbox.xMin;
  959.          metrics->horiBearingY = cbox.yMax;
  960. +
  961. +        /* make up vertical ones */
  962. +        metrics->vertBearingX = 0;
  963. +        metrics->vertBearingY = 0;
  964. +
  965. +        if ( hinting )
  966. +          ft_glyphslot_grid_fit_metrics( &glyph->root );
  967.        }

  968.        /* Set control data to the glyph charstrings.  Note that this is */
复制代码

  1. $patch -pl < ./freetype-2.1.10-cvsfixes.patch
复制代码



freetype-2.1.10-xorgfix.patch

  1. --- freetype-2.1.10/src/sfnt/sfdriver.c.xorgfix        2005-08-03 19:10:58.867654076 +0200
  2. +++ freetype-2.1.10/src/sfnt/sfdriver.c        2005-08-03 19:11:43.083188865 +0200
  3. @@ -367,8 +367,13 @@
  4.      /* see `ttsbit.h' and `sfnt.h' */
  5.      tt_face_set_sbit_strike,
  6.      tt_face_load_sbit_strikes,
  7. +#ifdef FT_OPTIMIZE_MEMORY
  8.      0 /* tt_find_sbit_image */,
  9.      0 /* tt_load_sbit_metrics */,
  10. +#else
  11. +    tt_find_sbit_image,
  12. +    tt_load_sbit_metrics,
  13. +#endif
  14.      tt_face_load_sbit_image,
  15.      tt_face_free_sbit_strikes,
复制代码


  1. $patch -pl < ./freetype-2.1.10-cvsfixes.patch
复制代码

  1. $./configure --prefix=/usr
  2. $make
  3. $sudo make install
复制代码


下载 libXft
http://xlibs.freedesktop.org/release/?C=N;O=D


解压libXft源代码
  1. $cd libXft-2.1.7
  2. $./configure --prefix=/usr
  3. $make
  4. $sudo make install
复制代码


下载 libcairo
http://archive.ubuntulinux.jp/ub ... ubuntu1ja1_i386.deb

  1. $sudo dpkg -i libcairo2_1.0.0-1ubuntu1ja1_i386.deb
复制代码


修改/etc/fonts/local.conf  为:(来自http://www.linuxsir.cn/bbs/showt ... mp;page=1&pp=15

  1. <?xml version="1.0"?>
  2. <!DOCTYPE fontconfig SYSTEM "fonts.dtd">
  3. <!-- conf.d/myfont.conf -->
  4. <fontconfig>
  5. <dir>/usr/share/fonts</dir>
  6. <dir>/usr/share/fonts/local</dir>
  7. <dir>/usr/local/share/fonts</dir>
  8. <dir>~/.fonts</dir>
  9. <!--加入点阵字体路径-->
  10. <dir>/usr/X11R6/lib/X11/fonts</dir>

  11. <!--  
  12. 配置粗体中文显示,要配合freetype-2.1.10,libxft-2.1.7,fontconfig-2.3.X
  13.   -->

  14.      <match target="font">
  15.          <!-- check to see if the font is just regular -->
  16.          <test name="weight" compare="less_eq">
  17.              <int>100</int>
  18.          </test>
  19.          <!-- check to see if the pattern requests bold -->
  20.          <test target="pattern" name="weight" compare="more_eq">
  21.              <int>180</int>
  22.          </test>
  23.          <!-- set the embolden flag -->
  24.          <edit name="embolden" mode="assign">
  25.              <bool>true</bool>
  26.          </edit>
  27.      </match>

  28. <!--
  29.         default settings for all fonts.
  30. -->
  31. <match target="font" >
  32. <!-- 打开字体的反锯齿即AA,大号字用AA会更美观   -->
  33.                 <edit mode="assign" name="antialias" >
  34.                         <bool>t</bool>
  35.                 </edit>
  36.                 <edit mode="assign" name="hintstyle" >
  37.                         <const>hintslight</const>
  38.                 </edit>
  39. <!-- 打开hint  -->
  40.                 <edit mode="assign" name="hint" >
  41.                         <bool>t</bool>
  42.                 </edit>
  43. <!-- 关闭autohint  -->
  44.                 <edit mode="assign" name="autohint" >
  45.                         <bool>false</bool>
  46.                 </edit>
  47. </match>


  48. <!-- 关闭 8到17号字体的AA -->
  49. <match target="font" >
  50.                 <!--
  51.                 <test compare="contains" name="lang" >
  52.                         <string>zh-cn</string>
  53.                         <string>zh-tw</string>
  54.                         <string>ja</string>
  55.                         <string>ko</string>
  56.                 </test>
  57.                 -->
  58.                 <test compare="more_eq" name="pixelsize" qual="any" >
  59.                         <double>8</double>
  60.                 </test>
  61.                 <test compare="less_eq" name="pixelsize" qual="any" >
  62.                         <double>17</double>
  63.                 </test>
  64.                 <edit mode="assign" name="antialias" >
  65.                         <bool>false</bool>
  66.                 </edit>
  67. </match>

  68. <!-- 解决英文字体间距过宽 -->
  69. <match target="font">

  70.                 <test target="pattern" name="lang" compare="contains">
  71.                         <string>zh-tw</string>
  72.                         <string>zh-cn</string>
  73.                         <string>ja</string>
  74.                         <string>ko</string>
  75.                 </test>
  76.                 <edit name="spacing">
  77.                         <const>proportional</const>
  78.                 </edit>
  79.                 <edit name="globaladvance">
  80.                 <bool>false</bool>
  81.                 </edit>
  82. </match>

  83. <!--
  84. 设定中文最小字号,使得小字的中文美观
  85. -->
  86.   <match target="font" >
  87.         <test name="family" qual="any" >
  88.                 <string>SimSun</string>
  89.                 <string>NSimSun</string>
  90.                 <string>SimHei</string>
  91.                 <string>AR PL ShanHeiSun Uni</string>
  92.                 <string>AR PL SenKai Uni</string>
  93.                 <string>AR PL New Sung</string>
  94.                 <string>FZSongTi</string>
  95.                  <string>FZMingTiB</string>
  96.                 <string>FangSong_GB2312</string>
  97.                 <string>KaiTi_GB2312</string>
  98.         </test>
  99.         <test compare="more_eq" name="pixelsize" >
  100.                 <int>8</int>
  101.         </test>
  102.         <test compare="less_eq" name="pixelsize" >
  103.                 <int>12</int>
  104.         </test>
  105.         <edit compare="eq" name="pixelsize" >
  106.                 <int>12</int>
  107.         </edit>
  108. </match>
  109. <!--
  110.   把serif ,sans,monospace的family(字体族)重新排序,适应中文用户的用字习惯
  111. -->
  112.    <alias>
  113.       <family>serif</family>
  114.       <prefer>
  115.          <family>Times New Roman</family>
  116.          <family>Nimbus Roman No9 L</family>
  117.          <family>Luxi Serif</family>
  118.          <family>Times</family>
  119.          <family>Bitstream Vera Serif</family>
  120.          <family>Simsun</family>
  121.          <family>WenQuanYi Bitmap Song</family>
  122.          <family>AR PL ShanHeiSun Uni</family>
  123.          <family>AR PL SenKai Uni</family>
  124.          <family>AR PL New Sung</family>
  125.          <family>FZSongTi</family>
  126.          <family>FZMingTiB</family>
  127.          <family>Kochi Mincho</family>
  128.          <family>AR PL SungtiL GB</family>
  129.          <family>AR PL Mingti2L Big5</family>
  130.          <family>Baekmuk Batang</family>
  131.       </prefer>
  132.    </alias>
  133.    <alias>
  134.       <family>sans-serif</family>
  135.       <prefer>
  136.          <family>Helvetica</family>
  137.          <family>Verdana</family>
  138.          <family>Arial</family>
  139.          <family>Tahoma</family>
  140.          <family>Bitstream Vera Sans</family>
  141.          <family>SimSun</family>
  142.          <family>WenQuanYi Bitmap Song</family>
  143.          <family>AR PL ShanHeiSun Uni</family>
  144.          <family>AR PL SenKai Uni</family>
  145.          <family>AR PL New Sung</family>
  146.          <family>FZSongTi</family>
  147.          <family>FZMingTiB</family>
  148.          <family>Kochi Gothic</family>
  149.          <family>AR PL KaitiM GB</family>
  150.          <family>AR PL KaitiM Big5</family>
  151.          <family>Baekmuk Dotum</family>

  152.       </prefer>
  153.    </alias>
  154.    <alias>
  155.       <family>monospace</family>
  156.       <prefer>
  157.          <family>Courier</family>
  158.          <family>Courier New</family>
  159.          <family>Andale Mono</family>
  160.          <family>Luxi Mono</family>
  161.          <family>Nimbus Mono L</family>
  162.          <family>Bitstream Vera Sans Mono</family>
  163.          <family>NSimSun</family> <!-- han (zh-cn,zh-tw) -->
  164.          <family>WenQuanYi Bitmap Song</family>
  165.          <family>AR PL ShanHeiSun Uni</family>
  166.          <family>AR PL SenKai Uni</family>
  167.          <family>AR PL New Sung</family>
  168.          <family>FZSongTi</family>
  169.          <family>FZMingTiB</family>
  170.          <family>Kochi Gothic</family>
  171.          <family>AR PL KaitiM GB</family>
  172.          <family>Baekmuk Dotum</family>
  173.       </prefer>
  174.    </alias>

  175. </fontconfig>
复制代码


如果没什么意外就可以相当好的显示粗体了。
回复 支持 反对

使用道具 举报

发表于 2005-10-5 10:48:28 | 显示全部楼层
freetype2-2.1.10-3mdk是两个月前的包,补丁已经不够了。现在最新的是2.1.10-9mdk,修复了一些内存泄漏的毛病和AA时次像素计算错误。

我当初还死命的催Mandriva里freetype的维护者,说其它Distro肯定一早就把粗体搞定了。现在看来,……
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-10-5 11:06:06 | 显示全部楼层
对于显示效果有什么不同?
回复 支持 反对

使用道具 举报

发表于 2005-10-5 11:20:14 | 显示全部楼层
Debian 的 freetype 维护者换人了...
回复 支持 反对

使用道具 举报

发表于 2005-10-5 16:26:19 | 显示全部楼层
Post by xufan106
对于显示效果有什么不同?

中文可能看不出来。据说是西欧的那些加了各种符号的字母原先上边是两个点的,却只显示一个点。
回复 支持 反对

使用道具 举报

发表于 2005-10-5 17:00:59 | 显示全部楼层
Post by fundawang
中文可能看不出来。据说是西欧的那些加了各种符号的字母原先上边是两个点的,却只显示一个点。

再仔细查查, 看到底是哪个的 bug
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表