什么是可安装的OpenType字体的窗口要求?

利基编程的问题:我正在开发一个OpenType字体,通过字节制作(而不是使用像Fontlab或FontForge这样的devise工具),现在有一个自定义的OpenType-CFF字体来实现Basic Latin unicode块的一个子集实现.notdef和代字号)。

CFF块通过tx -3validation( http://www.adobe.com/devnet/opentype/afdko.html ),字体作为一个整体通过TTX ( https:// github)进行往返取消/重新编译。 com / behdad / fonttools )和Microsoft的“Font Validator”( http://www.microsoft.com/typography/FontValidator.mspx )不报告字体中的任何错误。 作为一个自定义的webfont加载它(既支持otf的浏览器中的普通otf,也包括在不包含浏览器的WOFF中)正确设置实现的字形。

但是,即使所有这些明显的正确性,窗口字体预览器报告,它不是一个有效的字体文件,窗口不会让我安装它。 我已经看到了什么样的窗口需要安装字体的信息的高低,但互联网似乎充满了如何使用字体作为用户,而不是作为开发人员需要满足什么要求。

我不太清楚包含这个问题的代码的最好方法是什么,因为它不是很传统的编程。 生成器代码是在JavaScript中,但该代码工作得很好,并为所有意图和目的(保存一个)生成适当的字体。

如果您知道如何使用hex编辑器,那么以下是字体的hexstring:

 4F 54 54 4F 00 09 00 80 00 03 00 10 43 46 46 20 03 00 B4 92 00 00 02 A4 00 00 00 B3 4F 53 2F 32 30 F6 24 D4 00 00 01 00 00 00 00 60 63 6D 61 70 00 0D 00 B7 00 00 02 50 00 00 00 32 68 65 61 64 61 E4 43 91 00 00 00 9C 00 00 00 36 68 68 65 61 06 96 01 52 00 00 00 D4 00 00 00 24 68 6D 74 78 02 A8 00 00 00 00 03 58 00 00 00 08 6D 61 78 70 00 02 50 00 00 00 00 F8 00 00 00 06 6E 61 6D 65 C6 CC FF EC 00 00 01 60 00 00 00 F0 70 6F 73 74 00 03 00 01 00 00 02 84 00 00 00 20 00 01 00 00 00 01 00 00 1A EA FF 64 5F 0F 3C F5 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 FF EC 02 BC 02 A8 00 00 00 08 00 02 00 00 00 00 00 00 00 01 00 00 03 EC FE A8 00 00 02 A8 00 00 00 00 02 A8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 00 00 50 00 00 02 00 00 00 03 00 00 01 90 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 20 3D 29 20 00 40 00 7E 00 7E 02 A8 FF EC 01 44 03 EC 01 58 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 7E 00 00 00 00 00 08 00 66 00 01 00 20 00 00 00 01 00 0B 00 00 00 01 00 20 00 00 00 02 00 07 00 21 00 01 00 20 00 00 00 04 00 11 00 36 00 01 00 20 00 00 00 05 00 0B 00 69 00 03 00 01 04 09 00 01 00 16 00 0B 00 03 00 01 04 09 00 02 00 0E 00 28 00 03 00 01 04 09 00 04 00 22 00 47 00 03 00 01 04 09 00 05 00 16 00 74 43 75 73 74 6F 6D 20 46 6F 6E 74 00 43 00 75 00 73 00 74 00 6F 00 6D 00 20 00 46 00 6F 00 6E 00 74 52 65 67 75 6C 61 72 00 52 00 65 00 67 00 75 00 6C 00 61 00 72 43 75 73 74 6F 6D 20 47 6C 79 70 68 20 46 6F 6E 74 00 43 00 75 00 73 00 74 00 6F 00 6D 00 20 00 47 00 6C 00 79 00 70 00 68 00 20 00 46 00 6F 00 6E 00 74 56 65 72 73 69 6F 6E 20 31 2E 30 00 56 00 65 00 72 00 73 00 69 00 6F 00 6E 00 20 00 31 00 2E 00 30 00 00 00 01 00 03 00 01 00 00 00 0C 00 04 00 26 00 00 00 04 00 04 00 01 00 00 00 7E FF FF 00 00 00 7E FF FF FF 83 00 01 00 00 00 00 00 00 00 00 00 01 00 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 04 01 00 01 01 01 0B 63 75 73 74 6F 6D 66 6F 6E 74 00 01 01 01 23 F8 1B 00 F8 1C 02 F8 1D 03 F8 19 04 8C 0D 9F 77 F9 50 F9 3C 05 F7 05 0F F7 08 10 F7 0B 11 9B F7 37 12 00 04 01 01 0C 1D 28 2E 56 65 72 73 69 6F 6E 20 31 2E 30 43 75 73 74 6F 6D 20 47 6C 79 70 68 20 46 6F 6E 74 43 75 73 74 6F 6D 20 46 6F 6E 74 63 75 73 74 6F 6D 00 00 00 01 8A 00 01 01 00 02 01 01 02 27 0E 9F 77 15 8B F9 50 05 F9 3C 8B 05 8B FD 50 05 FD 3C 8B 05 F7 2A F7 2A 15 8B F8 24 05 F8 10 8B 05 8B FC 24 05 0E 8B 8B 06 8B 8B 08 95 0A 95 0B F9 50 14 F9 50 14 00 00 00 00 00 02 A8 00 00 

(自定义字体可以做得很小=)

但是,如果需要实际的文件和/或TTX输出,可以在https://github.com/Pomax/CFF-glyphlet-fonts/tree/gh-pages/binariesfind它们,包括TTX xml(直接链接为此: https : //raw2.github.com/Pomax/CFF-glyphlet-fonts/gh-pages/binaries/customfont.ttx ),这是一个自包含的问题的利益是:

 <?xml version="1.0" encoding="utf-8"?> <ttFont sfntVersion="OTTO" ttLibVersion="2.4"> <GlyphOrder> <!-- The 'id' attribute is only for humans; it is ignored when parsed. --> <GlyphID id="0" name=".notdef"/> <GlyphID id="1" name="custom"/> </GlyphOrder> <head> <!-- Most of this table will be recalculated by the compiler --> <tableVersion value="1.0"/> <fontRevision value="1.0"/> <checkSumAdjustment value="0x1aeaff64"/> <magicNumber value="0x5f0f3cf5"/> <flags value="00000000 00000000"/> <unitsPerEm value="1024"/> <created value="Thu Jan 01 00:00:00 1970"/> <modified value="Thu Jan 01 00:00:00 1970"/> <xMin value="20"/> <yMin value="-20"/> <xMax value="700"/> <yMax value="680"/> <macStyle value="00000000 00000000"/> <lowestRecPPEM value="8"/> <fontDirectionHint value="2"/> <indexToLocFormat value="0"/> <glyphDataFormat value="0"/> </head> <hhea> <tableVersion value="1.0"/> <ascent value="1004"/> <descent value="-344"/> <lineGap value="0"/> <advanceWidthMax value="680"/> <minLeftSideBearing value="0"/> <minRightSideBearing value="0"/> <xMaxExtent value="680"/> <caretSlopeRise value="0"/> <caretSlopeRun value="0"/> <caretOffset value="0"/> <reserved0 value="0"/> <reserved1 value="0"/> <reserved2 value="0"/> <reserved3 value="0"/> <metricDataFormat value="0"/> <numberOfHMetrics value="2"/> </hhea> <maxp> <tableVersion value="0x5000"/> <numGlyphs value="2"/> </maxp> <OS_2> <version value="3"/> <xAvgCharWidth value="0"/> <usWeightClass value="400"/> <usWidthClass value="1"/> <fsType value="00000000 00000000"/> <ySubscriptXSize value="0"/> <ySubscriptYSize value="0"/> <ySubscriptXOffset value="0"/> <ySubscriptYOffset value="0"/> <ySuperscriptXSize value="0"/> <ySuperscriptYSize value="0"/> <ySuperscriptXOffset value="0"/> <ySuperscriptYOffset value="0"/> <yStrikeoutSize value="0"/> <yStrikeoutPosition value="0"/> <sFamilyClass value="0"/> <panose> <bFamilyType value="0"/> <bSerifStyle value="0"/> <bWeight value="0"/> <bProportion value="0"/> <bContrast value="0"/> <bStrokeVariation value="0"/> <bArmStyle value="0"/> <bLetterForm value="0"/> <bMidline value="0"/> <bXHeight value="0"/> </panose> <ulUnicodeRange1 value="00000000 00000000 00000000 00000001"/> <ulUnicodeRange2 value="00000000 00000000 00000000 00000000"/> <ulUnicodeRange3 value="00000000 00000000 00000000 00000000"/> <ulUnicodeRange4 value="00000000 00000000 00000000 00000000"/> <achVendID value=" =) "/> <fsSelection value="00000000 01000000"/> <fsFirstCharIndex value="126"/> <fsLastCharIndex value="126"/> <sTypoAscender value="680"/> <sTypoDescender value="-20"/> <sTypoLineGap value="324"/> <usWinAscent value="1004"/> <usWinDescent value="344"/> <ulCodePageRange1 value="00000000 00000000 00000000 00000001"/> <ulCodePageRange2 value="00000000 00000000 00000000 00000000"/> <sxHeight value="0"/> <sCapHeight value="0"/> <usDefaultChar value="0"/> <usBreakChar value="126"/> <usMaxContex value="0"/> </OS_2> <name> <namerecord nameID="1" platformID="1" platEncID="32" langID="0x0"> Custom Font </namerecord> <namerecord nameID="2" platformID="1" platEncID="32" langID="0x0"> Regular </namerecord> <namerecord nameID="4" platformID="1" platEncID="32" langID="0x0"> Custom Glyph Font </namerecord> <namerecord nameID="5" platformID="1" platEncID="32" langID="0x0"> Version 1.0 </namerecord> <namerecord nameID="1" platformID="3" platEncID="1" langID="0x409"> Custom Font </namerecord> <namerecord nameID="2" platformID="3" platEncID="1" langID="0x409"> Regular </namerecord> <namerecord nameID="4" platformID="3" platEncID="1" langID="0x409"> Custom Glyph Font </namerecord> <namerecord nameID="5" platformID="3" platEncID="1" langID="0x409"> Version 1.0 </namerecord> </name> <cmap> <tableVersion version="0"/> <cmap_format_4 platformID="3" platEncID="1" language="0"> <map code="0x7e" name="custom"/><!-- TILDE --> </cmap_format_4> </cmap> <post> <formatType value="3.0"/> <italicAngle value="0.0"/> <underlinePosition value="0"/> <underlineThickness value="0"/> <isFixedPitch value="1"/> <minMemType42 value="0"/> <maxMemType42 value="0"/> <minMemType1 value="0"/> <maxMemType1 value="0"/> </post> <CFF> <CFFFont name="customfont"> <version value="Version 1.0"/> <FullName value="Custom Glyph Font"/> <FamilyName value="Custom Font"/> <Weight value="Roman"/> <isFixedPitch value="0"/> <ItalicAngle value="0"/> <UnderlineThickness value="50"/> <PaintType value="0"/> <CharstringType value="2"/> <FontMatrix value="0.001 0 0 0.001 0 0"/> <UniqueID value="1"/> <FontBBox value="20 -20 700 680"/> <StrokeWidth value="0"/> <!-- charset is dumped separately as the 'GlyphOrder' element --> <Encoding> <map code="0x1" name="custom"/> </Encoding> <Private> <BlueValues value="0 0"/> <FamilyBlues value="0 0"/> <BlueScale value="0.039625"/> <BlueShift value="7"/> <BlueFuzz value="1"/> <StdHW value="10"/> <StdVW value="10"/> <ForceBold value="0"/> <LanguageGroup value="0"/> <ExpansionFactor value="0.06"/> <initialRandomSeed value="0"/> <defaultWidthX value="700"/> <nominalWidthX value="0"/> </Private> <CharStrings> <CharString name=".notdef"> endchar </CharString> <CharString name="custom"> 20 -20 rmoveto 0 700 rlineto 680 0 rlineto 0 -700 rlineto -680 0 rlineto 150 150 rmoveto 0 400 rlineto 380 0 rlineto 0 -400 rlineto endchar </CharString> </CharStrings> </CFFFont> <GlobalSubrs> <!-- The 'index' attribute is only for humans; it is ignored when parsed. --> </GlobalSubrs> </CFF> <hmtx> <mtx name=".notdef" width="0" lsb="0"/> <mtx name="custom" width="680" lsb="0"/> </hmtx> </ttFont> 

如果有任何额外的工具可以用来确定字体是否“完成”足以安装,或者如果有人知道文档解释了字体在可以安装之前需要满足哪些标准,则该信息是非常欢迎。 当然,如果有人碰巧知道我的字体代码还是丢失了(不pipe是字节码还是TTX XML),或者他们看到了奇怪的字母,我也对你的评论/回答感兴趣。

正如有人在Typophile论坛上指出的那样,就Windows而言,“名称”表是不完整的。 虽然Microsoft Font Validator不会标记任何问题,但字体必须列出以下名称表条目以使其可以安装:

 1: the regular font name 2: the font subfamily ("Regular", etc) 3: any (seriously, ANY) string to act as a unique font identifier 6: the postscript font name (a subset of ascii. the real, 7 bit version) 

我定义的字体是使用NameIDs 1,2,4和5; 而实际上需要4和5来进行“验证”,所以它们对于预览/安装来说是完全不相关的,而3和6则是至关重要的。 谁知道(认真的,谁知道…如果你这样做,我想聊聊天,或者在twitter上或者其他什么东西来挑选你的大脑=)

(注意4和5仍然需要在OSX上安装字体)

2017年编辑:微软的字体验证器是在2015年开源的,而且由于MS(由于法律原因)无法合并在重要的社区贡献中,社区维护的分支被建立起来了,而且正在保持与在https://github.com/HinTak/Font-Validator上的OpenType规&#x8303; – 如果字体验证器是你的工具集的一部分,你绝对要开始使用这个分支。

首先,我不知道AFDKO以外的其他要求。

我已经安装了DTL OTMaster Light ,并报告createdmodified值超出范围(customfont.otf)。 他们住在Windows所需的桌子上。

 [NOTE] Open log for OTM Light 1.000 on za feb 15 20:20:16 2014. [NOTE] Extern to intern conversion of 'maxp' table successfully done. [NOTE] Extern to intern conversion of 'CFF ' table successfully done. [NOTE] Extern to intern conversion of 'hhea' table successfully done. [NOTE] Extern to intern conversion of 'hmtx' table successfully done. [NOTE] Extern to intern conversion of 'cmap' table successfully done. [NOTE] Extern to intern conversion of 'OS2' table successfully done. [NOTE] Extern to intern conversion of 'head' table successfully done. [NOTE] Extern to intern conversion of 'name' table successfully done. [NOTE] Extern to intern conversion of 'post' table successfully done. [ERROR] Node "/OTF/head/Struct/created" value 0 out of range (2082844800 - 4294967294). [ERROR] Node "/OTF/head/Struct/modified" value 0 out of range (2082844800 - 4294967294).