|
|
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- FcDefaultSubstitute
- Name
- FcDefaultSubstitute -- Perform default substitutions in a pattern
- Synopsis
- #include <fontconfig.h>
-
- void FcDefaultSubstitute(FcPattern *pattern);
- Description
- Supplies default values for underspecified font patterns:
- *
- Patterns without a specified style or weight are set to Medium
- *
- Patterns without a specified style or slant are set to Roman
- *
- [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- if (FcPatternGet (pattern, FC_PIXEL_SIZE, 0, &v) == FcResultNoMatch)
- {
- double dpi, size, scale;
- if (FcPatternGetDouble (pattern, FC_SIZE, 0, &size) != FcResultMatch)
- {
- size = 12.0;
- (void) FcPatternDel (pattern, FC_SIZE);
- FcPatternAddDouble (pattern, FC_SIZE, size);
- }
- if (FcPatternGetDouble (pattern, FC_SCALE, 0, &scale) != FcResultMatch)
- {
- scale = 1.0;
- (void) FcPatternDel (pattern, FC_SCALE);
- FcPatternAddDouble (pattern, FC_SCALE, scale);
- }
- size *= scale;
- if (FcPatternGetDouble (pattern, FC_DPI, 0, &dpi) != FcResultMatch)
- {
- dpi = 75.0;
- (void) FcPatternDel (pattern, FC_DPI);
- FcPatternAddDouble (pattern, FC_DPI, dpi);
- }
- size *= dpi / 72.0;
- FcPatternAddDouble (pattern, FC_PIXEL_SIZE, size);
- }
复制代码- FcPatternGet
- Name
- FcPatternGet -- Return a value from a pattern
- Synopsis
- #include <fontconfig.h>
-
- FcResult FcPatternGet(FcPattern *p, const char *object, intid, FcValue *v);
- Description
- 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.
复制代码- 3.16. FcResult
- Used as a return type for functions manipulating FcPattern objects.
- FcResult Values
- Result Code Meaning
- -----------------------------------------------------------
- FcResultMatch Object exists with the specified ID
- FcResultNoMatch Object doesn't exist at all
- FcResultTypeMismatch Object exists, but the type doesn't match
- FcResultNoId Object exists, but has fewer values
- than specified
- FcResultOutOfMemory Malloc failed
复制代码- // 从 pattern 中提取 FC_PIXEL_SIZE
- if (FcPatternGet (pattern, FC_PIXEL_SIZE, 0, &v) == FcResultNoMatch)
- {
- // 如果 FC_PIXEL_SIZE 不存在,定义以下变量
- double dpi, size, scale;
-
- // 从 pattern 中提取 FC_SIZE
- if (FcPatternGetDouble (pattern, FC_SIZE, 0, &size) != FcResultMatch)
- {
- // 如果 FC_SIZE 未指定,定义默认值 12
- size = 12.0;
- // 从 pattern 中删除 FC_SIZE 旧值
- (void) FcPatternDel (pattern, FC_SIZE);
- // 赋予默认值
- FcPatternAddDouble (pattern, FC_SIZE, size);
- }
- // 从 pattern 中提取 FC_SCALE
- if (FcPatternGetDouble (pattern, FC_SCALE, 0, &scale) != FcResultMatch)
- {
- // 如果 FC_SCALE 未指定,定义默认值 1.0
- scale = 1.0;
- // 从 pattern 中删除 FC_SCALE 旧值
- (void) FcPatternDel (pattern, FC_SCALE);
- // 赋予默认值
- FcPatternAddDouble (pattern, FC_SCALE, scale);
- }
- // 按比例缩放 size
- size *= scale;
- // 从 pattern 中提取 FC_DPI
- if (FcPatternGetDouble (pattern, FC_DPI, 0, &dpi) != FcResultMatch)
- {
- // 如果 FC_DPI 为指定,定义默认值 75.0
- dpi = 75.0;
- // 从 pattern 中删除 FC_DPI 旧值
- (void) FcPatternDel (pattern, FC_DPI);
- // 赋予默认值
- FcPatternAddDouble (pattern, FC_DPI, dpi);
- }
- // 用 point size 和 pixel size 转换公式计算 pixel size
- size *= dpi / 72.0; // 这里为了少定义一个变量 pixel size,直接用 size(point size)
-
- // 给 FC_PIXEL_SIZE 赋值
- FcPatternAddDouble (pattern, FC_PIXEL_SIZE, size);
- }
复制代码
很简单对吧!在这里 dpi 起关键作用,将 point size convert to pixel size,而且 fontconfig 默认为 75 |
|