LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2690|回复: 3

fontconfig 中 pixel size 的计算过程

[复制链接]
发表于 2006-8-5 17:10:10 | 显示全部楼层 |阅读模式
fontconfig 中 pixel size 的计算过程

Fontconfig Developers Reference, Version 2.3.0
$ mkdir -p /usr/src/fontconfig && cd /usr/src/fontconfig
$ apt-get source fontconfig
$ grep 'dpi' ./ -R

file:///usr/src/fontconfig/fontconfig-2.3.2/doc/fontconfig-devel/r724.html
  1. FcDefaultSubstitute
  2. Name
  3. FcDefaultSubstitute -- Perform default substitutions in a pattern
  4. Synopsis
  5. #include <fontconfig.h>
  6.        
  7. void FcDefaultSubstitute(FcPattern *pattern);
  8. Description
  9. Supplies default values for underspecified font patterns:
  10.     *
  11.       Patterns without a specified style or weight are set to Medium
  12.     *
  13.       Patterns without a specified style or slant are set to Roman
  14.     *
  15.       [color=red]Patterns without a specified pixel size are given one computed from any specified point size (default 12), dpi (default 75) and scale (default 1).[/color]
复制代码

FcDefaultSubstitude 对某个模式执行默认替换,如果该模式未指定 pixel size,那么就从任何指定的 point size,dpi,scale 计算出该值,如果上述值同样没给出,默认 point size = 12, dpi = 75, scale = 1。

来看看具体是如何实现的:
$ vi ./fontconfig-2.3.2/src/fcdefault.c
  1.     if (FcPatternGet (pattern, FC_PIXEL_SIZE, 0, &v) == FcResultNoMatch)
  2.     {
  3.         double        dpi, size, scale;
  4.         if (FcPatternGetDouble (pattern, FC_SIZE, 0, &size) != FcResultMatch)
  5.         {
  6.             size = 12.0;
  7.             (void) FcPatternDel (pattern, FC_SIZE);
  8.             FcPatternAddDouble (pattern, FC_SIZE, size);
  9.         }
  10.         if (FcPatternGetDouble (pattern, FC_SCALE, 0, &scale) != FcResultMatch)
  11.         {
  12.             scale = 1.0;
  13.             (void) FcPatternDel (pattern, FC_SCALE);
  14.             FcPatternAddDouble (pattern, FC_SCALE, scale);
  15.         }
  16.         size *= scale;
  17.         if (FcPatternGetDouble (pattern, FC_DPI, 0, &dpi) != FcResultMatch)
  18.         {
  19.             dpi = 75.0;
  20.             (void) FcPatternDel (pattern, FC_DPI);
  21.             FcPatternAddDouble (pattern, FC_DPI, dpi);
  22.         }
  23.         size *= dpi / 72.0;
  24.         FcPatternAddDouble (pattern, FC_PIXEL_SIZE, size);
  25.     }
复制代码
  1. FcPatternGet
  2. Name
  3. FcPatternGet -- Return a value from a pattern
  4. Synopsis
  5. #include <fontconfig.h>
  6.        
  7. FcResult FcPatternGet(FcPattern *p, const char *object, intid, FcValue *v);
  8. Description
  9. Returns in v the id'th value associated with the property object. The value returned is not a copy, but rather refers to the data stored within the pattern directly. Applications must not free this value.
复制代码
  1. 3.16. FcResult
  2. Used as a return type for functions manipulating FcPattern objects.
  3.       FcResult Values
  4.         Result Code             Meaning
  5.         -----------------------------------------------------------
  6.         FcResultMatch           Object exists with the specified ID
  7.         FcResultNoMatch         Object doesn't exist at all
  8.         FcResultTypeMismatch    Object exists, but the type doesn't match
  9.         FcResultNoId            Object exists, but has fewer values
  10.                                 than specified
  11.         FcResultOutOfMemory     Malloc failed
复制代码
  1.     // 从 pattern 中提取 FC_PIXEL_SIZE
  2.     if (FcPatternGet (pattern, FC_PIXEL_SIZE, 0, &v) == FcResultNoMatch)
  3.     {   
  4.         // 如果 FC_PIXEL_SIZE 不存在,定义以下变量
  5.         double        dpi, size, scale;
  6.        
  7.         // 从 pattern 中提取 FC_SIZE
  8.         if (FcPatternGetDouble (pattern, FC_SIZE, 0, &size) != FcResultMatch)
  9.         {   
  10.             // 如果 FC_SIZE 未指定,定义默认值 12
  11.             size = 12.0;
  12.             // 从 pattern 中删除 FC_SIZE 旧值
  13.             (void) FcPatternDel (pattern, FC_SIZE);
  14.             // 赋予默认值
  15.             FcPatternAddDouble (pattern, FC_SIZE, size);
  16.         }
  17.         // 从 pattern 中提取 FC_SCALE
  18.         if (FcPatternGetDouble (pattern, FC_SCALE, 0, &scale) != FcResultMatch)
  19.         {
  20.             // 如果 FC_SCALE 未指定,定义默认值 1.0
  21.             scale = 1.0;
  22.             // 从 pattern 中删除 FC_SCALE 旧值
  23.             (void) FcPatternDel (pattern, FC_SCALE);
  24.             // 赋予默认值
  25.             FcPatternAddDouble (pattern, FC_SCALE, scale);
  26.         }
  27.         // 按比例缩放 size
  28.         size *= scale;
  29.         // 从 pattern 中提取 FC_DPI
  30.         if (FcPatternGetDouble (pattern, FC_DPI, 0, &dpi) != FcResultMatch)
  31.         {
  32.             // 如果 FC_DPI 为指定,定义默认值 75.0
  33.             dpi = 75.0;
  34.             // 从 pattern 中删除 FC_DPI 旧值
  35.             (void) FcPatternDel (pattern, FC_DPI);
  36.             // 赋予默认值
  37.             FcPatternAddDouble (pattern, FC_DPI, dpi);
  38.         }
  39.         // 用 point size 和 pixel size 转换公式计算 pixel size
  40.         size *= dpi / 72.0; // 这里为了少定义一个变量 pixel size,直接用 size(point size)
  41.        
  42.         // 给 FC_PIXEL_SIZE 赋值
  43.         FcPatternAddDouble (pattern, FC_PIXEL_SIZE, size);
  44.     }
复制代码
  

很简单对吧!在这里 dpi 起关键作用,将 point size convert to pixel size,而且 fontconfig 默认为 75
发表于 2006-8-5 17:17:48 | 显示全部楼层
你好!
请问你对window manage的编程是否熟悉?

谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-8-5 19:15:40 | 显示全部楼层
抱歉,我对编程不怎么懂,只是有兴趣时,找点看看。以后要努力多练练。
回复 支持 反对

使用道具 举报

发表于 2006-8-8 00:30:25 | 显示全部楼层
一般显示器都有点距的参数吧?拿1英寸除一下就应该是屏幕的最佳dpi了吧。
回复 支持 反对

使用道具 举报

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

本版积分规则

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