EM square

看《windows程序设计》中的一些字体方面的信息,不是很明白,通过查阅得到了一些重要信息。

 

在字体排版中经常使用EM square,每一种TrueType字体都有一个EM square,而且只有TrueType的字体才有这个EM square。EM square其实就是在实际设计字体时用到的正方形,而这个正方形里面有很多个小方格。一般来说的话,一个EM square里面水平方向,垂直方向都有2048个小方格。我们实际使用的TrueType字体都是基于这个尺寸缩放的。

 

如果在程序中打印中和在屏幕中直接用GetTextExtentPoint32得到一个字符串的宽度是不一致的,因为不同的分辨率中计算结果四舍五入可能会不同,那可能会导致在打印中的换行和屏幕中的换行位置不同。为了得到绝对精确的字符长度,可以通过创建EM square字号的字体创建原本设计时大小的字体,这时候通过GetCharWidth获得的字符宽度是精确的整数,注意使用GetCharWidth得到缩放字体中字符的大小不精准的,因为字体缩放了,所以用整型保存得到的宽度必然有误差。但用原创字体的设备环境去使用GetCharWidth就可以得到精准的大小。因为字体高度是2048个像素,所以2048个方格没有被缩放,所以得到的宽度是精准的整数。然后用这个宽度,去得到该字体被缩放后字体每个的宽度,用double值保存,用double值计算就可以得到指定字符串的精确宽度。但Windows为什么内部没实现呢?

 

还由于身边没有打印机,所以不能深入研究。暂且浅显的认识一下吧!

 

查阅资料:

Font glyphs are designed in relation to a square grid. Each small square in the grid is called a Font Unit, or FUnit for short. For most fonts the grid is ‘standardized’ at 2048 × 2048 FUnits to form the em-square. The em square shrinks or expands with changes
in font size but it’s the small squares in the em square that change size while keeping the actual
number of small squares unchanged. The real nugget of information is that both the vertical and horizontal size of the em square equate to the font size.
One em is the font size of a TrueType font irrespective of whether it’s specified in points or pixels.

The TrueType Manual doesn’t put it as explicitly as that but gives an implicit definition via an equation used for calculating font size in pixels. This equation (Eqn. 1) is in the Manual section “Converting FUnits to pixels” and I’m using it because we
can get two things from it:

  • Definition of the em
  • How font size in points, or inches, is transformed to font size in pixels. If you don’t like a lot of equations then jump to the
    short version
Equation 1

pixels = pointSize × resolution/(72 points per inch × units_per_em)

In Eqn. 1

"pixels" is font size in pixels.

"pointSize" is font size in points.

"resolution" is screen dpi.

"72 points per inch" because a point is 1/72 of an inch.

"units_per_em" is the ratio of the vertical size of a glyph in FUnits to the number of vertical FUnits in the em square. There are (usually) 2048 vertical FUnits in the em square.

Now the meaning of this doesn’t exactly leap out the page so I’ll rearrange the equation, and define the terms in the sidebar.

Equation 2
                                  font size in points           glyph size in FUnits
pixels = screen dpi ×  -------------------      × --------------------
                                  72 points per inch         2048 FUnits

The last two terms in Equation 2 say that the font size in inches is multiplied by the units_per_em ratio. The units_per_em_ratio is the ratio of the vertical size of a glyph to the vertical size of the em square. If the glyph size is the same size as the
em square, i.e. 2048 FUnits, then the units_per_em ratio is unity and the font size would be multiplied by unity. Multiplying the font size by unity just gives, of course, the font size so
the vertical size of the em square corresponds to the font size.

Let’s rearrange Equation 2, but this time with a units_per_em ratio of unity.

Equation 3
                               font size in points
font size in pixels =  -------------------     ×    screen dpi
                               72 points per inch

This tells us that we get font size in pixels by multiplying font size in inches by the screen dpi. It’s as simple as that.

I’ve shown here how font size in inches is translated into font size in pixels, but screen dpi is not specific to font inches.

Screen dpi is used to translate inches into screen pixels irrespective of whether we are dealing with font inches or just length measurements

时间: 2024-09-27 07:34:16

EM square的相关文章

算法题:UVa 11461 Square Numbers (简单数学)

11461 - Square Numbers Time limit: 1.000 seconds http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Itemid=8&category=467&page=show_problem&problem=24 56 A square number is an integer number whose square root is also an integer.

使用em创建Media Queries模板代码片段

文章简介:使用em单位创建CSS3的Media Queries. 本站有关于CSS3的Media Queries的相关教程有不少,说直一点,就是使用Media Queries来制作Responsiv Desgin.现在国外流行的一种设计叫Responsive Design(国内称为响应式设计),其中这种布局关键之处就是不能少了Media Queries的配合,早在<CSS3 Media Queries模板>一文中就给大家介绍了常用的模板,但有很多评论和论坛中说使用px为单位写响应式布局,会造成

CSS网页制作教程:CSS文字单位PX、EM、PT

文章简介:但是12px汉字例外,就是由以上方法得到的12px(1.2em)大小的汉字在IE中并不等于直接用12px定义的字体大小,而是稍大一点.这个问题 Jorux已经解决,只需在body选择器中把62.5%换成63%就能正常显示了.原因可能是IE处理汉字时,对于浮点的取值精确度有限.不知道有没有 其 这里引用的是Jorux的"95%的中国网站需要重写CSS"的文章, 题目有点吓人,但是确实是现在国内网页制作方面的一些缺陷.我一直也搞不清楚px与em之间的关系和特点,看过以后确实收获很

利用em标签实现导航菜单倒三角的提示效果

html+CSS实例效果(5):em实现倒三角的提示效果,仅供新手参考学习 [Ctrl+A 全部选择 提示:你可先修改部分代码,再按运行]

网页字体font-size的控制 em与px的终极PK!

控制|网页 这里引用的是Jorux的"95%的中国网站需要重写CSS"的文章,题目有点吓人,但是确实是现在国内网页制作方面的一些缺陷.我一直也搞不清楚px与em之间的关系和特点,看过以后后确实收获很大.平时都是用px来定义字体,所以无法用浏览器字体放大的功能,而国外大多数网站都可以在IE下使用.因为 1. IE无法调整那些使用px作为单位的字体大小: 2. 国外的大部分网站能够调整的原因在于其使用了em作为字体单位: 3. Firefox能够调整px和em,但是96%以上的中国网民使用

用IE登录Linux服务器上的em出现的乱码的解决

linux服务器|解决 用IE登录Linux服务器上的em出现的乱码的解决 作者: Fenng 问题描述 在Linux(Unix)环境下成功安装了Oracle 10g,从windows下用IE浏览器登录 10g 的em, 按钮是"口口"这样的方框. 解决办法 其实严格的说来,这是Java的问题.JDK Swing采用TrueType 字体作为按钮的显示字体,如果你的JDK 找不到中文字体用来显示,你看到的一些按钮就变成小方块的样子. 一般情况下, 我们只需要修改相应的 font.pro

针对Oracle10g EM乱码之快速解决方法

一直没怎么用10g的EM工具,今天打开来看看,发现也有相传已久的乱码问题.网上也流传着N种解决方案,仔细看一下,其实这个问题很好解决. 如果安装时,我们系统环境变量设置的是中文环境,那么就不会有这个问题.这个问题根本原因在于安装时,JDK/JRE字符集的自动选择. 在 $ORACLE_HOME/jdk/jre/lib 和 $ORACLE_HOME/jre/1.4.2/lib/ 目录下都有多种字符集字体配置文件: [oracle@danaly ~]$ cd $ORACLE_HOME/jdk/jre

emca创建EM时的DBSNMP用户与SYSMAN用户的问题

手工建库完成后,数据库中默认只有以下账户(ORACLE 11.2.0.4):手工建库步骤参考:http://blog.csdn.net/q947817003/article/details/16337611 SQL> show user USER is "SYSTEM" SQL> select username,account_status from dba_users; USERNAME                       ACCOUNT_STATUS -----

Geeks 面试题之Maximum size square sub-matrix with all 1s

Maximum size square sub-matrix with all 1s Given a binary matrix, find out the maximum size square sub-matrix with all 1s. For example, consider the below binary matrix. 0 1 1 0 1 1 1 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 1 0 0 0 0 0 The maximum square s