PageRenderTime 61ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 1ms

/htdocs/gposgsub.html

https://bitbucket.org/sortsmill/sortsmill-tools
HTML | 1789 lines | 1319 code | 467 blank | 3 comment | 0 complexity | d03705ac1e038ce583a27e753ea02586 MD5 | raw file
Possible License(s): GPL-3.0, LGPL-2.0

Large files files are truncated, but you can click here to view the full file

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <head>
  5. <meta name="generator" content=
  6. "HTML Tidy for Linux (vers 25 March 2009), see www.w3.org" />
  7. <!-- Created with AOLpress/2.0 -->
  8. <!-- AP: Created on: 29-Dec-2002 -->
  9. <!-- AP: Last modified: 20-Mar-2008 -->
  10. <title>Advanced Typography tables</title>
  11. <link rel="icon" href="fftype16.png" />
  12. <link rel="stylesheet" type="text/css" href="FontForge.css" />
  13. <style type="text/css">
  14. /*<![CDATA[*/
  15. h4.c4 {color: red}
  16. p.c3 {text-align: center}
  17. p.c2 {text-align: left}
  18. h1.c1 {text-align: center}
  19. /*]]>*/
  20. </style>
  21. </head>
  22. <body>
  23. <div id="in">
  24. <h1 class="c1">Advanced Typography Tables</h1>
  25. <p>These differ between OpenType (originally called TrueType
  26. Open) and Apple (GX or Apple Advanced Typography). My support
  27. for both OpenType and Apple is incomplete.</p>
  28. <ul>
  29. <li><a href="#opentype">The <b><code>GPOS</code></b>,
  30. <b><code>GSUB</code></b> and <b><code>GDEF</code></b>
  31. opentype tables</a></li>
  32. <li><a href="#AAT">Apple Advanced Typography</a></li>
  33. <li><a href="#Conversion">What features can be converted
  34. between OpenType and AAT?</a></li>
  35. <li><a href="TrueOpenTables.html">other true type and open
  36. type tables</a></li>
  37. <li><a href="#Unsupported">What is unsupported</a></li>
  38. <li><a href="non-standard.html">FontForge's non-standard
  39. extensions</a></li>
  40. </ul>
  41. <h2>The <b><code>GPOS,</code></b> <b><code>GSUB,</code></b>
  42. <b><code>GDEF</code></b> and <code>BASE</code> <a name=
  43. "opentype" id="opentype">opentype</a> tables</h2>
  44. <p>The first two tables are used for positioning and
  45. substituting glyphs. The GPOS table can control things like:
  46. kerning, accent positioning, cursive joining, etc. The GSUB
  47. table can control things like: ligatures, arabic forms,
  48. vertical rotation, conversion to small caps, indic glyph
  49. rearrangement, etc. GDEF contains some rather esoteric glyph
  50. information, ligature carets, etc. BASE contains information on
  51. baseline placement and line heights.</p>
  52. <p>This page assumes basic familiarity with the abilities of
  53. the tables, for more information on them read, study and
  54. inwardly digest the opentype docs on:</p>
  55. <ul>
  56. <li><a href=
  57. "http://partners.adobe.com/public/developer/opentype/index_table_formats.html">
  58. The header for both GPOS and GSUB</a></li>
  59. <li><a href=
  60. "http://partners.adobe.com/public/developer/opentype/index_table_formats2.html">
  61. The GPOS table</a>, for positioning glyphs</li>
  62. <li><a href=
  63. "http://partners.adobe.com/public/developer/opentype/index_table_formats1.html">
  64. The GSUB table</a>, for substituting glyphs</li>
  65. <li><a href=
  66. "http://partners.adobe.com/public/developer/opentype/index_table_formats5.html">
  67. The GDEF table</a>, for classifying glyphs and for providing
  68. a ligature caret table</li>
  69. <li><a href=
  70. "http://partners.adobe.com/public/developer/opentype/index_base.html">
  71. The BASE table</a>, for baseline placement</li>
  72. <li><a href=
  73. "http://partners.adobe.com/public/developer/opentype/index_tag3.html">
  74. The list of feature tags supported by opentype</a></li>
  75. <li><a href=
  76. "http://partners.adobe.com/public/developer/opentype/index_tag1.html">
  77. The list of script tags supported by opentype</a></li>
  78. <li><a href=
  79. "http://partners.adobe.com/public/developer/opentype/index_tag2.html">
  80. The list of language tags supported by opentype</a></li>
  81. <li><a href=
  82. "http://partners.adobe.com/public/developer/opentype/index_tag4.html">
  83. The list of baseline tags supported by opentype</a></li>
  84. </ul>
  85. <p>The basic idea of the GPOS and GSUB tables is that each
  86. script (or language within a script) has a set of "features"
  87. that are available to it. A feature in turn is associated with
  88. a lookup which contains data for the feature. An example of a
  89. script is 'latn' for latin, 'arab' for arabic, 'hani' for
  90. chinese ideographs. Two examples of features are 'kern' which
  91. provides kerning information between pairs of glyphs and 'init'
  92. which will transform one set of glyphs to another when those
  93. glyphs are at the beginning of a word.</p>
  94. <p>FontForge <a href="gposgsub.html#Unsupported">does not
  95. support</a> the full range of possibilities inherent in these
  96. tables.</p>
  97. <h3>The <b><code><a name="GPOS" id="GPOS">GPOS</a></code></b>
  98. table</h3>
  99. <p>FontForge will read the following sub tables of the GPOS
  100. table:</p>
  101. <table border="1">
  102. <tr>
  103. <th></th>
  104. <th>name</th>
  105. <th>Reading support</th>
  106. <th>Writing support</th>
  107. </tr>
  108. <tr>
  109. <td>1</td>
  110. <td>single adjustment</td>
  111. <td>This sub-table allows the font designer to change the
  112. metrics of a specific glyph. The feature tag will provide a
  113. context in which the change should occur. For instance the
  114. 'tnum' (tabular numbers) feature could change a
  115. proportionally spaced digit by adjusting its advance width
  116. to be some set value and then centering the digit (by
  117. adjusting the left side bearing) within the new width.</td>
  118. <td>These can be created with the <a href=
  119. "charinfo.html">Element-&gt;Char Info</a>-&gt;Position
  120. command.</td>
  121. </tr>
  122. <tr>
  123. <td>2</td>
  124. <td>pair adjustment</td>
  125. <td>This sub-table allows the font designer to change the
  126. metrics of a specific pair of glyph. The most common use of
  127. this is for kerning where the advance width of the first
  128. glyph is altered depending on which glyph follows it. But
  129. the table is more general than that and could support mark
  130. (accent, vowel) positioning over a base glyph (though that
  131. is more efficiently done with the mark to base
  132. subtable).</td>
  133. <td>'kern' feature s may be created from the <a href=
  134. "metricsview.html">Metrics View</a>. 'vkrn' with <a href=
  135. "metricsmenu.html#VKernFromHKern">Metrics-&gt;VKern From
  136. HKern</a>.</td>
  137. </tr>
  138. <tr>
  139. <td>3</td>
  140. <td>cursive attachment</td>
  141. <td>This sub-table allows the font designer to force
  142. adjacent glyphs to join at specific points. It can be used
  143. to generate the slanted script style needed for Urdu.</td>
  144. <td>Only the 'curs' feature is supported for this
  145. sub-table. These may be created with the <a href=
  146. "pointmenu.html#AddAnchor">Points-&gt;Add Anchor</a>
  147. command</td>
  148. </tr>
  149. <tr>
  150. <td>4</td>
  151. <td>mark to base</td>
  152. <td>This sub-table allows the font designer to specify how
  153. mark glyphs (accents, vowel signs, etc.) are positioned
  154. over base glyphs. Every glyph can have an attachment point
  155. and the mark's attachment point will be placed on the
  156. base's attachment point so the two join properly. See my
  157. <a href="overview.html#Anchors">example</a> in the
  158. overview.</td>
  159. <td>These may be created with the <a href=
  160. "pointmenu.html#AddAnchor">Points-&gt;Add Anchor</a>
  161. command</td>
  162. </tr>
  163. <tr>
  164. <td>5</td>
  165. <td>mark to ligature</td>
  166. <td>This sub-table is very similar to the previous one
  167. except that the base glyph is a ligature and may have
  168. several different points at which the same type of accent
  169. may be placed.</td>
  170. <td>These may be created with the <a href=
  171. "pointmenu.html#AddAnchor">Points-&gt;Add Anchor</a>
  172. command</td>
  173. </tr>
  174. <tr>
  175. <td>6</td>
  176. <td>mark to mark</td>
  177. <td>This sub-table is very similar to the previous two
  178. except that the base glyph is itself a mark. This may be
  179. used when a glyph has two accents each of which would
  180. normally be placed at the same attachment point on a base
  181. glyph. The second accent will be place relative to the
  182. first accent rather than to the base glyph.</td>
  183. <td>These may be created with the <a href=
  184. "pointmenu.html#AddAnchor">Points-&gt;Add Anchor</a>
  185. command</td>
  186. </tr>
  187. <tr>
  188. <td>7</td>
  189. <td>contextual positioning</td>
  190. <td>This sub-table allows the font designer to control the
  191. positioning of glyphs when they occur within a specific
  192. string (or class of strings). For instance this table could
  193. say "when you see a digit followed by the string "th" then
  194. raise the "th" into a superscript position"</td>
  195. <td>These may be created with the <a href=
  196. "lookups.html#contextual-subs">Element-&gt;Font
  197. Info-&gt;Contextual</a> command</td>
  198. </tr>
  199. <tr>
  200. <td>8</td>
  201. <td>chaining contextual positioning</td>
  202. <td>This is a slightly more complex version of the above,
  203. it doesn't really add new capabilities, but it does provide
  204. a more logical approach to the issue.</td>
  205. <td>These may be created with the <a href=
  206. "lookups.html#contextual-subs">Element-&gt;Font
  207. Info-&gt;Contextual</a> command</td>
  208. </tr>
  209. <tr>
  210. <td>9</td>
  211. <td>extension positioning</td>
  212. <td>This is used to allow for a GPOS table which is bigger
  213. than 64k. Its use should be quite invisible to the font
  214. designer</td>
  215. <td>FontForge uses this sub-table when needed.</td>
  216. </tr>
  217. <tr>
  218. <td>10+</td>
  219. <td>reserved for future use</td>
  220. <td></td>
  221. <td>FontForge does not support these sub-tables yet.<br />
  222. (nor does anyone)</td>
  223. </tr>
  224. </table>
  225. <p>FontForge also has built into it knowledge on how to provide
  226. default values for some features that use these tables. See
  227. <a href="elementmenu.html#DefaultATT">Element-&gt;Typo.
  228. Features-&gt;Default ATT</a> command for that.</p>
  229. <p>FontForge will retain the order of features in the GPOS
  230. table and when a font is generated the order should be the same
  231. as it was before.</p>
  232. <h3>The <b><code><a name="GSUB" id="GSUB">GSUB</a></code></b>
  233. table</h3>
  234. <p>FontForge will read the following sub tables of the GSUB
  235. table:</p>
  236. <table border="1">
  237. <tr>
  238. <th></th>
  239. <th>name</th>
  240. <th>Reading support</th>
  241. <th>Writing support</th>
  242. </tr>
  243. <tr>
  244. <td>1</td>
  245. <td>single substitution</td>
  246. <td>This sub-table allows the font designer to change from
  247. one glyph to another, with a context provided by the
  248. feature tag. For example many scripts have letters which
  249. have a different form at the end of a word than they do
  250. within (this is true of every letter in arabic, several in
  251. hebrew, lower case sigma in greek, and the long-s/short-s
  252. pair in renaissance latin). So the 'fina' feature would map
  253. the normal form into the final form, and the word
  254. processing program would do a lookup at the end of each
  255. word to see if a transformation was needed.</td>
  256. <td>These can be created with the <a href=
  257. "charinfo.html">Element-&gt;Char Info</a>-&gt;Substitution
  258. command.</td>
  259. </tr>
  260. <tr>
  261. <td>2</td>
  262. <td>multiple substitution</td>
  263. <td>This sub-table allows the font designer to replace one
  264. glyph by a series of others. This is generally used for
  265. rather technical layout issues.</td>
  266. <td>These can be created with the <a href=
  267. "charinfo.html">Element-&gt;Char Info</a>-&gt;Multiple
  268. Substitution command.</td>
  269. </tr>
  270. <tr>
  271. <td>3</td>
  272. <td>alternate substitution</td>
  273. <td>This sub-table allows the font designer to have a
  274. series of "alternates" for each glyph. One common example
  275. would be an italic font which had several swash variants
  276. for each capital letter. The word processing program would
  277. allow the user to choose which variant was appropriate</td>
  278. <td>These can be created with the <a href=
  279. "charinfo.html">Element-&gt;Char Info</a>-&gt;Alternate
  280. Substitution command.</td>
  281. </tr>
  282. <tr>
  283. <td>4</td>
  284. <td>ligature substitution</td>
  285. <td>This sub-table allows the font designer to replace a
  286. string of glyphs with another glyph. A common example is a
  287. ligature where the string <img src="f+i.png" width="24"
  288. height="25" align="middle" /> is replaced by the <img src=
  289. "fi.png" width="20" height="25" align="middle" />
  290. ligature.</td>
  291. <td>These can be created with the <a href=
  292. "charinfo.html">Element-&gt;Char Info</a>-&gt;Ligature
  293. command.</td>
  294. </tr>
  295. <tr>
  296. <td>5</td>
  297. <td>contextual substitution</td>
  298. <td>This subtable allows for a string of glyphs to replace
  299. another string of glyphs (or class of strings of
  300. glyphs)</td>
  301. <td>These may be created with the <a href=
  302. "lookups.html#contextual-subs">Element-&gt;Font
  303. Info-&gt;Contextual</a> command</td>
  304. </tr>
  305. <tr>
  306. <td>6</td>
  307. <td>chaining contextual substitution</td>
  308. <td>This is a slightly more complex version of the above,
  309. it doesn't really add new capabilities, but it does provide
  310. a more logical approach to the issue.</td>
  311. <td>These may be created with the <a href=
  312. "lookups.html#contextual-subs">Element-&gt;Font
  313. Info-&gt;Contextual</a> command</td>
  314. </tr>
  315. <tr>
  316. <td>7</td>
  317. <td>extension positioning</td>
  318. <td>This is used to allow for a GSUB table which is bigger
  319. than 64k. Its use should be quite invisible to the font
  320. designer</td>
  321. <td>FontForge uses this sub-table when needed.</td>
  322. </tr>
  323. <tr>
  324. <td>8</td>
  325. <td>reverse chaining contextual single substitution</td>
  326. <td>This allows glyph substitutions to happen in reverse
  327. order, and it a variant of the chaining contextual
  328. subtable.</td>
  329. <td>These may be created with the <a href=
  330. "lookups.html#contextual-subs">Element-&gt;Font
  331. Info-&gt;Contextual</a> command</td>
  332. </tr>
  333. <tr>
  334. <td>9+</td>
  335. <td>reserved for future use</td>
  336. <td></td>
  337. <td>FontForge does not support these sub-tables yet.<br />
  338. (nor does anyone)</td>
  339. </tr>
  340. </table>
  341. <p>FontForge also has built into it knowledge on how to provide
  342. default values for some features that use these tables. See the
  343. [Populate] button of the various <a href="lookups.html">lookup
  344. subtable</a> dialogs.</p>
  345. <p>FontForge can produce some of these tables, but the text
  346. layout/word processing program used has to look up the tables
  347. and do the actual work of rearranging the glyphs.</p>
  348. <p>FontForge will retain the order of features in the GSUB
  349. table, and the user may adjust it with the <a href=
  350. "lookups.html#Order">Element-&gt;Font Info</a> command.</p>
  351. <h3>The <b><code><a name="GDEF" id="GDEF">GDEF</a></code></b>
  352. table</h3>
  353. <p>FontForge will read ligature carets out of a GDEF table.</p>
  354. <p>It will generate a GDEF table containing a glyph class
  355. definition sub-table (if needed) or a ligature caret sub-table
  356. (if needed).</p>
  357. <h2><a name="AAT" id="AAT">Apple</a> Advanced Typography</h2>
  358. <p>As above I do not go deeply into the abilities of these
  359. tables, for more information see Apple's docs:</p>
  360. <ul>
  361. <li><a href=
  362. "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6bsln.html">
  363. The 'bsln' (baseline) table</a></li>
  364. <li><a href=
  365. "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6kern.html">
  366. The 'kern' table</a></li>
  367. <li><a href=
  368. "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6lcar.html">
  369. The 'lcar' (ligature caret) table</a></li>
  370. <li>
  371. <a href=
  372. "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6morx.html">
  373. The 'morx' (extended glyph metamorphosis) table</a>
  374. <ul>
  375. <li><a href=
  376. "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6mort.html">
  377. The 'mort' (older version of 'morx') table</a></li>
  378. <li><a href=
  379. "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6feat.html">
  380. The 'feat' (feature) table</a></li>
  381. <li><a href=
  382. "http://developer.apple.com/fonts/Registry/index.html">Apple's
  383. Font Feature registry</a></li>
  384. <li><a href=
  385. "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6Tables.html">
  386. Description of the subtables of the 'mort'/'morx'
  387. tables</a></li>
  388. </ul>
  389. </li>
  390. <li><a href=
  391. "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6opbd.html">
  392. The 'opbd' (optical bounds) table</a></li>
  393. <li><a href=
  394. "http://developer.apple.com/fonts/TTRefMan/RM06/Chap6prop.html">
  395. The 'prop' (glyph properties) table</a></li>
  396. </ul>
  397. <p>FontForge will currently read and produce (if Apple mode is
  398. set in font generation) the following tables:</p>
  399. <table border="1" cellpadding="2">
  400. <caption>
  401. Apple tables corresponding vaguely to BASE
  402. </caption>
  403. <tr>
  404. <th>tag</th>
  405. <th>name</th>
  406. <th>Reading support</th>
  407. <th>Writing support</th>
  408. </tr>
  409. <tr>
  410. <td><code>'bsln'</code></td>
  411. <td>baseline table</td>
  412. <td>FontForge will read baseline data (except for Apple's
  413. ideographic centered baseline, for which there is no
  414. OpenType equivalent)</td>
  415. <td>FontForge will produce this table if the user has
  416. specified baseline data which apple supports</td>
  417. </tr>
  418. </table>
  419. <table border="1" cellpadding="2">
  420. <caption>
  421. Apple tables corresponding vaguely to <a href=
  422. "#GDEF">GDEF</a>
  423. </caption>
  424. <tr>
  425. <th>tag</th>
  426. <th>name</th>
  427. <th>Reading support</th>
  428. <th>Writing support</th>
  429. </tr>
  430. <tr>
  431. <td><code>'lcar'</code></td>
  432. <td>ligature caret table</td>
  433. <td>FontForge will read ligature carets</td>
  434. <td>FontForge will produce this table if the user has
  435. specified ligature carets</td>
  436. </tr>
  437. <tr>
  438. <td><code>'prop'</code></td>
  439. <td>glyph properties table</td>
  440. <td>FontForge will read this table to figure out which
  441. glyphs are hebrew and arabic, and which have 'r2la'
  442. substitutions.</td>
  443. <td>FontForge will generate this table if the font contains
  444. some right to left glyphs.</td>
  445. </tr>
  446. </table>
  447. <table border="1" cellpadding="2">
  448. <caption>
  449. Apple tables corresponding vaguely to <a href=
  450. "#GPOS">GPOS</a>
  451. </caption>
  452. <tr>
  453. <th>tag</th>
  454. <th>name</th>
  455. <th>Reading support</th>
  456. <th>Writing support</th>
  457. </tr>
  458. <tr>
  459. <td><code>'kern'</code></td>
  460. <td>kerning table</td>
  461. <td>FontForge will read horizontal/vertical kerning pairs
  462. and classes. FontForge can read contextual kerning
  463. information too into a state machine.</td>
  464. <td>FontForge will produce this if the font contains
  465. kerning data -- kerning pairs, kerning by classes, and
  466. kerning by state machine.</td>
  467. </tr>
  468. <tr>
  469. <td><code>'opbd'</code></td>
  470. <td>Optical bounds table</td>
  471. <td>FontForge will read optical bounds</td>
  472. <td>FontForge will produce this table if the user has
  473. specified right and left bounds as simple positions ('lfbd'
  474. and 'rtbd').</td>
  475. </tr>
  476. </table>
  477. <p>FontForge has support for the <code>'mort'</code> and
  478. <code>'<a name="morx" id="morx">morx</a>'</code> tables (Glyph
  479. metamorphosis and extended glyph metamorphosis tables). These
  480. correspond vaguely to the <a href="#GSUB">GSUB</a> table. Note:
  481. Any feature type/setting combinations which correspond directly
  482. to an open type feature will be converted to the opentype tag
  483. when read in. It will be converted back to a feature/setting
  484. when an apple font is generated (use <a href=
  485. "prefs.html#Mac">File-&gt;Preferences</a> to extend FontForge's
  486. mapping from feature type/setting to opentype tags).</p>
  487. <table border="1" cellpadding="2">
  488. <caption>
  489. Sub tables of <code>'mort'</code> or <code>'morx'</code>
  490. </caption>
  491. <tr>
  492. <th></th>
  493. <th>name</th>
  494. <th>Reading support</th>
  495. <th>Writing support</th>
  496. </tr>
  497. <tr>
  498. <td>0</td>
  499. <td>Indic style rearrangement</td>
  500. <td>FontForge can read these and stores them as state
  501. machines (which can be edited with <a href=
  502. "lookups.html#sm-subs">Font Info</a>)</td>
  503. <td>Any indic state machines will be output in the
  504. generated font.</td>
  505. </tr>
  506. <tr>
  507. <td>1</td>
  508. <td>contextual glyph substitution</td>
  509. <td>FontForge can read these and stores them as state
  510. machines (which can be edited with <a href=
  511. "lookups.html#sm-subs">Font Info</a>)</td>
  512. <td>
  513. If the font contains any state machines they will be
  514. output here. If there are no state machines then the
  515. following conversions of opentype features will be done:
  516. <ul>
  517. <li>FontForge will generate a <a name=
  518. "cursive-connection" id="cursive-connection">cursive
  519. connection</a> feature using this subtable type if the
  520. font contains 'init', 'medi', 'fina' or 'isol' simple
  521. substitutions.</li>
  522. <li>In <a href="gposgsub.html#sometimes">some cases</a>
  523. FontForge is able to convert an OpenType
  524. Contextual/Chaining substitution table into an Apple
  525. contextual glyph substitution table.</li>
  526. </ul>
  527. </td>
  528. </tr>
  529. <tr>
  530. <td>2</td>
  531. <td>ligature substitution</td>
  532. <td>FontForge can read the unconditional information from
  533. these and stores them as opentype ligatures (which can be
  534. edited with <a href="lookups.html">Font Info</a> or
  535. <a href="charinfo.html#lookups">Char Info</a>).</td>
  536. <td>If there are any ligatures with an apple
  537. feature/setting (or which have an opentype tag which can be
  538. converted to an apple feature/setting) then this table will
  539. be output.</td>
  540. </tr>
  541. <tr>
  542. <td>4</td>
  543. <td>non-contextual glyph substitution</td>
  544. <td>FontForge can read these and stores them as opentype
  545. simple substitutions (which can be edited with <a href=
  546. "lookups.html">Font Info</a> or <a href=
  547. "charinfo.html#lookups">Char Info</a>)</td>
  548. <td>If there are any substitutions with an apple
  549. feature/setting (or which have an opentype tag which can be
  550. converted to an apple feature/setting) then this table will
  551. be output.</td>
  552. </tr>
  553. <tr>
  554. <td>5</td>
  555. <td>contextual glyph insertion</td>
  556. <td>FontForge can read these and stores them as state
  557. machines (which can be edited with <a href=
  558. "lookups.html#sm-subs">Font Info</a>)</td>
  559. <td>Any glyph insertion state machines will be output in
  560. the generated font.</td>
  561. </tr>
  562. </table>
  563. <h3>What features can be <a name="Conversion" id=
  564. "Conversion">interconverted</a> between OpenType and AAT?</h3>
  565. <p>Some features have almost the same meaning in OpenType and
  566. AAT (although they are expressed quite differently), others are
  567. similar enough that they can sometimes be converted, and others
  568. have essentially no common ground.</p>
  569. <table border="1" cellpadding="2">
  570. <tr>
  571. <th>OT Table</th>
  572. <th>AAT Table</th>
  573. <th>
  574. <p class="c2">Description</p>
  575. </th>
  576. </tr>
  577. <tr>
  578. <td valign="top">
  579. <p class="c3">GDEF</p>
  580. </td>
  581. <td valign="top">
  582. <p class="c3">lcar</p>
  583. </td>
  584. <td>The ligature caret information in both 'GDEF' and
  585. 'lcar' is essentially identical and FontForge has no
  586. trouble reading both and converting from one to the
  587. other.</td>
  588. </tr>
  589. <tr>
  590. <td valign="top">
  591. <p class="c3">BASE</p>
  592. </td>
  593. <td valign="top">
  594. <p class="c3">bsln</p>
  595. </td>
  596. <td>There is slightly different baseline data in the two
  597. formats. 'bsln' does not provide extent information. 'bsln'
  598. provides a baseline for every glyph, while 'BASE' provides
  599. a baseline for every script -- one hopes all glyphs in a
  600. script will have the same baseline, but it isn't
  601. guaranteed. Finally 'bsln' and 'BASE' provide a slightly
  602. different set of baseline tags, and FontForge only supports
  603. the OpenType ones. In particular Apple's ideographic
  604. centered baseline will be lost.</td>
  605. </tr>
  606. <tr>
  607. <td>
  608. <p class="c3">GPOS</p>
  609. </td>
  610. <td>
  611. <p class="c3">kern</p>
  612. </td>
  613. <td>
  614. In most cases kerning information can be converted from
  615. one format to another. Both provide support for vertical
  616. kerning and right to left kerning. Both provide support
  617. for kerning by glyph pair and kerning by classes.
  618. <p>OpenType allows kerning commands to be supplied via a
  619. contextual chaining feature, Apple allows them to be
  620. controled by a state machine. FontForge supports both,
  621. but does not interconvert.</p>
  622. </td>
  623. </tr>
  624. <tr>
  625. <td>
  626. <p class="c3">GPOS</p>
  627. </td>
  628. <td>
  629. <p class="c3">opbd</p>
  630. </td>
  631. <td>The GPOS features 'lfbd' and 'rtbd' provide the
  632. information needed to generate an Apple opbd table. If
  633. FontForge reads a font with an opbd table it will generate
  634. appropriate 'lfbd' and 'rtbd' features. If FontForge
  635. generates a font in apple mode that has these features it
  636. will create an opbd table. Similarly when FontForge reads
  637. an opbd table it will create 'lfbd' and 'rtbd'
  638. features.</td>
  639. </tr>
  640. <tr>
  641. <td>
  642. <p class="c3">GPOS</p>
  643. </td>
  644. <td>
  645. <hr />
  646. </td>
  647. <td>I am not aware of any way to convert other GPOS
  648. features to AAT.</td>
  649. </tr>
  650. <tr>
  651. <td>
  652. <p class="c3">GSUB</p>
  653. </td>
  654. <td>
  655. <p class="c3">morx</p>
  656. </td>
  657. <td rowspan="2">The 'mort' and 'morx' tables have the same
  658. capabilities ('mort' tables are an old format and Apple
  659. currently encourages that 'morx' tables be used instead).
  660. FontForge can read either one, but only generates 'morx'
  661. tables. Interconversion depends on specific feature types
  662. and the sub-table formats, see below</td>
  663. </tr>
  664. <tr>
  665. <td>
  666. <p class="c3">GSUB</p>
  667. </td>
  668. <td>
  669. <p class="c3">mort</p>
  670. </td>
  671. </tr>
  672. </table>
  673. <h4>An analysis of GSUB and morx sub-tables and feature
  674. tags</h4>
  675. <p>OpenType uses a four character feature tag (like 'liga')
  676. while Apple uses two numbers to represent a feature setting
  677. (&lt;1,2&gt;). For FontForge to be able to inter-convert an
  678. OpenType feature into an Apple feature there must first be a
  679. correspondence between the two naming conventions. Sometimes
  680. there is an easy direct conversion (above 'liga' and
  681. &lt;1,2&gt; both represent "Common Ligatures") but far more
  682. often there is none. See <a href=
  683. "gposgsub.html#OT-Mac-features">below</a> for a list of the
  684. tags and feature settings that FontForge considers similar
  685. enough to interconvert.</p>
  686. <p>GSUB tables have 7 sub-table formats, while morx tables have
  687. 5.</p>
  688. <table border="1" cellpadding="2">
  689. <tr>
  690. <th>GSUB<br />
  691. sub-<br />
  692. table</th>
  693. <th>morx<br />
  694. sub-<br />
  695. table</th>
  696. <th>
  697. <p class="c2">Description</p>
  698. </th>
  699. </tr>
  700. <tr>
  701. <td valign="top">
  702. <p class="c3">Single</p>
  703. </td>
  704. <td valign="top">
  705. <p class="c3">Non-<br />
  706. Contextual<br />
  707. Glyph</p>
  708. </td>
  709. <td>These two sub-tables have almost exactly the same
  710. capabilities. Each allows one glyph to be substituted for
  711. another. The morx sub-table also allows a glyph to be
  712. deleted, while the GSUB sub-table does not.</td>
  713. </tr>
  714. <tr>
  715. <td valign="top">
  716. <p class="c3">Multiple</p>
  717. </td>
  718. <td></td>
  719. <td>
  720. This GSUB subtable allows a single glyph to be replaced
  721. by multiple glyphs. It has some similarities to Apple's
  722. Glyph Insertion sub-table except:
  723. <ul>
  724. <li>the 'morx' sub-table always leaves the current
  725. glyph in the glyph stream, while this sub-table need
  726. not</li>
  727. <li>the 'morx' sub-table is contextual while this
  728. sub-table is never. (But if this sub-table is wrapped
  729. inside a Context or Chaining Context subtable the
  730. result can be contextual).</li>
  731. </ul>
  732. </td>
  733. </tr>
  734. <tr>
  735. <td></td>
  736. <td valign="top">
  737. <p class="c3">Glyph<br />
  738. Insertion</p>
  739. </td>
  740. <td>This morx subtable allows a string of glyphs to be
  741. inserted before or after the current glyph (the current
  742. glyph always remains). This sub-table is contextual (ie.
  743. the insertion can be restricted to certain contexts). It
  744. bears some similarities to the GSUB Multiple subtable
  745. above.</td>
  746. </tr>
  747. <tr>
  748. <td valign="top">Alternate</td>
  749. <td></td>
  750. <td>This GSUB subtable allows a single glyph to be replaced
  751. by any one of several alternatives (presumably with help
  752. from a word processor's UI). An example of this would be a
  753. character which had several swash variants. There is
  754. nothing like this in the 'morx' table.</td>
  755. </tr>
  756. <tr>
  757. <td valign="top">
  758. <p class="c3">Ligature</p>
  759. </td>
  760. <td valign="top">
  761. <p class="c3">Ligature</p>
  762. </td>
  763. <td>
  764. Both formats have ligature sub-tables. The 'GSUB' version
  765. is unconditional (the ligature is always applied --
  766. though a ligature substitution could be embedded in an
  767. OpenType contextual substitution to make it condtional).
  768. The 'morx' version can be contextual (though in fonts I
  769. have examined it is usually uncontextual). FontForge only
  770. supports unconditional ligatures.
  771. <p>FontForge can read all the unconditional ligatures
  772. from a 'morx' sub-table. FontForge loses all contextual
  773. ligatures.</p>
  774. <p>In OpenType, contextual ligatures can be built by
  775. wrapping a ligature sub-table inside a Context or
  776. Chaining Context subtable.</p>
  777. </td>
  778. </tr>
  779. <tr>
  780. <td></td>
  781. <td valign="top">
  782. <p class="c3">Contextual<br />
  783. Glyph</p>
  784. </td>
  785. <td>This morx subtable allows single glyph substitutions to
  786. be applied within certain contexts. At first glance it
  787. seems that this could be converted into an opentype Context
  788. subtable, <a href="gposgsub.html#sometimes">but this is
  789. rarely the case</a>.</td>
  790. </tr>
  791. <tr>
  792. <td>
  793. <p class="c3">Context</p>
  794. </td>
  795. <td></td>
  796. <td rowspan="2" valign="top">These GSUB subtables allow any
  797. collection of other substitutions to be applied
  798. contextually. At first glance one might think that these
  799. (with appropriate nested substitutions) might be converted
  800. to 'morx' contextual glyph substitutions, contextual
  801. ligatures, or even glyph insertion. <a href=
  802. "gposgsub.html#sometimes">Unfortunately this is rarely the
  803. case</a>.</td>
  804. </tr>
  805. <tr>
  806. <td>
  807. <p class="c3">Chaining<br />
  808. Context</p>
  809. </td>
  810. <td></td>
  811. </tr>
  812. <tr valign="top">
  813. <td>
  814. <p class="c3">Reverse<br />
  815. Chaining<br />
  816. Context</p>
  817. </td>
  818. <td></td>
  819. <td>This GSUB subtable is applied backwards to the stream
  820. of glyphs, it allows a single glyph substitution per
  821. contextual match. There is nothing like it in 'morx'.</td>
  822. </tr>
  823. <tr valign="top">
  824. <td></td>
  825. <td>
  826. <p class="c3">Indic<br />
  827. Rearrange-<br />
  828. ment</p>
  829. </td>
  830. <td>This 'morx' subtable allows for several glyphs to
  831. interchange their positions in the glyph stream. There is
  832. nothing like it in GSUB (or GPOS for that matter).</td>
  833. </tr>
  834. </table>
  835. <h4>Why do contextual glyph substitutions only <a name=
  836. "sometimes" id="sometimes">sometimes</a> get generated in
  837. AAT?</h4>
  838. <p>Sadly OpenType and AAT provide disjoint capabilities when it
  839. comes to contextual matching. AAT is more capable in some
  840. areas, OpenType more capable in others. FontForge is able to
  841. convert an OpenType contextual substitution into an AAT one if
  842. FontForge can detect that the OpenType substitution does not
  843. use capabilities beyond those of AAT. Currently this means:</p>
  844. <ul>
  845. <li>There is an apple feature which matches the otf tag</li>
  846. <li>And one of the following is true:
  847. <ol>
  848. <li>Either
  849. <ul>
  850. <li>The sub-table is in coverage format</li>
  851. <li>The sub-table contains either exactly one nested
  852. single glyph replacement substitution, or<br />
  853. it contains exactly two single glyph replacements and
  854. one of them refers to the last glyph matched (and the
  855. other does not)</li>
  856. </ul>
  857. </li>
  858. <li>or
  859. <ul>
  860. <li>The sub-table is in either glyph or class
  861. format</li>
  862. <li>If in class format then either the backtrack and
  863. lookahead classes must be the same as the main class,
  864. or they must not be used.</li>
  865. <li>If a rule has a substitution at a given glyph
  866. position, then all rules which match the current rule
  867. up to that glyph position must also have a
  868. substitution at that position.</li>
  869. <li>A rule with exactly one substitution is
  870. acceptable<br />
  871. A rule with one substitution in the middle and one
  872. substitution on the last glyph is acceptable.<br />
  873. A rule may contain more substitutions only if there
  874. is another rule which matches it exactly up to the
  875. internal substitution.<br />
  876. So the following rule set is valid:
  877. <table border="1" cellpadding="2">
  878. <tr>
  879. <th>Rule</th>
  880. <td>a</td>
  881. <td>b</td>
  882. <td>c</td>
  883. <td>d</td>
  884. <td>e</td>
  885. <td>f</td>
  886. </tr>
  887. <tr>
  888. <th>Rule</th>
  889. <td>a</td>
  890. <td>b</td>
  891. <td>c</td>
  892. <td>d</td>
  893. <td></td>
  894. <td></td>
  895. </tr>
  896. <tr>
  897. <th>Rule</th>
  898. <td>a</td>
  899. <td>b</td>
  900. <td></td>
  901. <td></td>
  902. <td></td>
  903. <td></td>
  904. </tr>
  905. <tr>
  906. <th>Substitutions</th>
  907. <td>A</td>
  908. <td>B</td>
  909. <td>C</td>
  910. <td>D</td>
  911. <td>E</td>
  912. <td>F</td>
  913. </tr>
  914. </table>
  915. <p>So the third rule will match an "ab" and convert
  916. them to "AB" (and this is valid because we have one
  917. internal and one final substitution and that's ok),
  918. then if that "ab" is followed by "cd" then rule 2
  919. kicks in and will replace the "cd" with "CD" (again
  920. this has one internal and one final substitution,
  921. which is ok), and if that is followed by "ef" then
  922. they will be converted to "EF".</p>
  923. <p>The following is not valid:</p>
  924. <table border="1" cellpadding="2">
  925. <tr>
  926. <th>Substitution</th>
  927. <td></td>
  928. <td>B</td>
  929. <td></td>
  930. </tr>
  931. <tr>
  932. <th>Rule</th>
  933. <td>a</td>
  934. <td>b</td>
  935. <td>c</td>
  936. </tr>
  937. <tr>
  938. <td colspan="4">
  939. <hr />
  940. </td>
  941. </tr>
  942. <tr>
  943. <th>Rule</th>
  944. <td>a</td>
  945. <td>b</td>
  946. <td></td>
  947. </tr>
  948. <tr>
  949. <th>Substitution</th>
  950. <td>A</td>
  951. <td></td>
  952. <td></td>
  953. </tr>
  954. </table>
  955. <p>The two rules have substitutions at different
  956. places and that can't be expressed in an Apple
  957. state machine given that they have the same
  958. glyphs.</p>
  959. </li>
  960. </ul>
  961. </li>
  962. </ol>
  963. </li>
  964. </ul>
  965. <p>FontForge does not even try to convert an AAT contextual
  966. glyph substitution sub-table, too few of these can be expressed
  967. in OpenType to make it worth while.</p>
  968. <p>NOTE: It would be possible to convert more lookups to state
  969. machines if FontForge were willing to:</p>
  970. <ol>
  971. <li>Use several state machines to represent complicated
  972. lookups</li>
  973. <li>Add additional glyphs to the font to be used as temporary
  974. state flags.</li>
  975. </ol>
  976. <p>FontForge will do neither of these.</p>
  977. <h4 class="c4">BUG</h4>
  978. <p>There is a subtle bug involved in converting a chaining
  979. contextual substitution into an Apple contextual glyph
  980. substitution. AAT does not have the concept of a backtrack
  981. list, this means that substitutions may occur in a different
  982. order.</p>
  983. <h4>Why can't all contextual/chaining tables be <a name=
  984. "not-converted" id="not-converted">converted</a>?</h4>
  985. <p>Well, obviously there are some thing that just aren't
  986. present. The concept of contextual positioning is missing from
  987. AAT, while Indic rearrangement is missing from OpenType. So
  988. let's concentrate on contextual substitutions, which both
  989. appear to support. The argument that follows is based on the
  990. capabilities of contextual matching, it applies equally to
  991. contextual ligatures, glyph insertion, glyph substitution and
  992. kerning, the examples given are only of glyph substitution
  993. because it is easier to represent (and because FontForge is
  994. only willing to convert contextual glyph substitutions) But
  995. even here, there is a very basic mismatch in concepts between
  996. the way OpenType and Apple specify contextual substitutions.
  997. Consider the following contextual substitution in a glyph list
  998. format:</p>
  999. <table border="1" cellpadding="2">
  1000. <tr>
  1001. <th>Initial Sequence</th>
  1002. <td>a</td>
  1003. <td>b</td>
  1004. <td>c</td>
  1005. <td>d</td>
  1006. </tr>
  1007. <tr>
  1008. <th>
  1009. <p class="c2">Replace With</p>
  1010. </th>
  1011. <td>&nbsp;</td>
  1012. <td>B</td>
  1013. <td>C</td>
  1014. <td>&nbsp;</td>
  1015. </tr>
  1016. </table>
  1017. <p>Now in OpenType this means if you find the sequence "abcd"
  1018. then replace the "b" with "B" and the "c" with "C". But this
  1019. can't be expressed in an Apple state machine. In OpenType the
  1020. match is done first, and then the substitutions occur. In a
  1021. state machine the substitutions have to be done (almost)
  1022. concurrently with the match and so must happen whether the
  1023. final "d" is present or not. (Note I'm using a glyph sequence
  1024. because it is easier to display in an example. The same problem
  1025. applies if the substitution is expressed by classes or by
  1026. coverage tables)</p>
  1027. <p>Consider the following table with two glyph strings</p>
  1028. <table border="1" cellpadding="2">
  1029. <tr>
  1030. <th>Initial Sequence</th>
  1031. <td>a</td>
  1032. <td>
  1033. <p class="c3">b</p>
  1034. </td>
  1035. <td>
  1036. <p class="c3">c</p>
  1037. </td>
  1038. <td>d</td>
  1039. </tr>
  1040. <tr>
  1041. <th>
  1042. <p class="c2">Replace With</p>
  1043. </th>
  1044. <td>&nbsp;</td>
  1045. <td>
  1046. <p class="c3">B</p>
  1047. </td>
  1048. <td></td>
  1049. <td>&nbsp;</td>
  1050. </tr>
  1051. <tr>
  1052. <th>Initial Sequence</th>
  1053. <td>a</td>
  1054. <td>
  1055. <p class="c3">b</p>
  1056. </td>
  1057. <td>
  1058. <p class="c3">c</p>
  1059. </td>
  1060. <td>e&nbsp;</td>
  1061. </tr>
  1062. <tr>
  1063. <th>
  1064. <p class="c2">Replace With</p>
  1065. </th>
  1066. <td>&nbsp;</td>
  1067. <td></td>
  1068. <td>
  1069. <p class="c3">&nbsp;C</p>
  1070. </td>
  1071. <td>&nbsp;</td>
  1072. </tr>
  1073. </table>
  1074. <p>So replace the "b" if the final "d" is present, otherwise
  1075. replace the "c". Again this cannot be expressed in Apple's
  1076. state machines.</p>
  1077. <p>Finally consider</p>
  1078. <table border="1" cellpadding="2">
  1079. <tr>
  1080. <th>Initial Sequence</th>
  1081. <td>
  1082. <p class="c3">a</p>
  1083. </td>
  1084. <td>
  1085. <p class="c3">b</p>
  1086. </td>
  1087. <td>
  1088. <p class="c3">c</p>
  1089. </td>
  1090. <td>d</td>
  1091. </tr>
  1092. <tr>
  1093. <th>
  1094. <p class="c2">Replace With</p>
  1095. </th>
  1096. <td>&nbsp;</td>
  1097. <td>
  1098. <p class="c3"></p>
  1099. </td>
  1100. <td>C</td>
  1101. <td>&nbsp;</td>
  1102. </tr>
  1103. <tr>
  1104. <th>Initial Sequence</th>
  1105. <td>
  1106. <p class="c3">b</p>
  1107. </td>
  1108. <td>
  1109. <p class="c3">c</p>
  1110. </td>
  1111. <td>
  1112. <p class="c3">e</p>
  1113. </td>
  1114. <td></td>
  1115. </tr>
  1116. <tr>
  1117. <th>
  1118. <p class="c2">Replace With</p>
  1119. </th>
  1120. <td>
  1121. <p class="c3">B&nbsp;</p>
  1122. </td>
  1123. <td></td>
  1124. <td>
  1125. <p class="c3">&nbsp;</p>
  1126. </td>
  1127. <td>&nbsp;</td>
  1128. </tr>
  1129. </table>
  1130. <p>If this substitution is given the sequence "abce" it cannot
  1131. work in AAT. When it reads the "a" it will start down the
  1132. "abcd" branch, the match will not fail until it looks for the
  1133. "d" and finds "e" instead. At that point it is too late to
  1134. switch to the "bce" substitution (which does match) because the
  1135. "b" glyph will not have been marked as a substitution
  1136. location.</p>
  1137. <hr />
  1138. On the other hand, Apple's state machines can express things
  1139. that OpenType tables cannot (again I'm restricting myself to
  1140. contextual glyph substitutions). Consider the case of a swash
  1141. glyph at the beginning (or end) of a word. Let us say that a
  1142. word begins when a letter appears at the start of input or
  1143. following a whitespace character. But OpenType has no way of
  1144. expressing "start of input" (or end of input) in a
  1145. contextual/chaining context, whereas Apple's state machines do.
  1146. <p>Since Apple's glyph substitutions can delete glyphs a
  1147. contextual glyph substitution table can create two character
  1148. ligatures (one glyph is converted to the ligature and the other
  1149. is deleted), while OpenType tables must use a ligature
  1150. substitution to do this.</p>
  1151. <p>Finally an AAT state machine can match a general regular
  1152. expression, while OpenType tables can only match fixed length
  1153. strings. Suppose you were typesetting mathematics and wanted a
  1154. substitution which would convert an arbitrary digit string
  1155. following a variable into a subscript (so x23 should become
  1156. x<small><sub>23</sub></small>). It is easy to write a state
  1157. machine which will keep substituting as long as it gets more
  1158. digits, but you'd need an infinite number of OpenType rules to
  1159. have the same expressive power.</p>
  1160. <p>These examples probably seem fairly contrived, and (except
  1161. for the swash one) they are. But they illustrate the point that
  1162. the two formats have very different expressive capabilities and
  1163. it is NOT possible to write a converter which will take any
  1164. input in one format and produce an equivalent output in the
  1165. other.</p>
  1166. <h3>Apple and OpenType features</h3>
  1167. <table border="1" cellpadding="2">
  1168. <caption>
  1169. Correspondences between Apple and OpenType <a name=
  1170. "OT-Mac-features" id="OT-Mac-features">features</a><br />
  1171. (that I support)
  1172. </caption>
  1173. <tr>
  1174. <th>Apple Feature Setting</th>
  1175. <th>OpenType Feature Name</th>
  1176. <th>OpenType Tag</th>
  1177. </tr>
  1178. <tr>
  1179. <td>Required Ligatures</td>
  1180. <td>Required Ligatures</td>
  1181. <td>rlig</td>
  1182. </tr>
  1183. <tr>
  1184. <td>Common Ligatures</td>
  1185. <td>Standard Ligatures</td>
  1186. <td>liga</td>
  1187. </tr>
  1188. <tr>
  1189. <td>Rare Ligatures</td>
  1190. <td>Discretionary</td>
  1191. <td>dlig</td>
  1192. </tr>
  1193. <tr>
  1194. <td>Fractions</td>
  1195. <td>Fractions</td>
  1196. <td>frac</td>
  1197. </tr>
  1198. <tr>
  1199. <td colspan="3">
  1200. <hr />
  1201. </td>
  1202. </tr>
  1203. <tr>
  1204. <td>Contextual Alternatives</td>
  1205. <td>Cursive connection</td>
  1206. <td>calt</td>
  1207. </tr>
  1208. <tr>
  1209. <td colspan="3">
  1210. <hr />
  1211. </td>
  1212. </tr>
  1213. <tr>
  1214. <td>Vertical Forms</td>
  1215. <td>Vertical Rotation 2</td>
  1216. <td>vrt2</td>
  1217. </tr>
  1218. <tr>
  1219. <td>Monospace numbers</td>
  1220. <td>Tabular numbers</td>
  1221. <td>tnum</td>
  1222. </tr>
  1223. <tr>
  1224. <td>Superscript</td>
  1225. <td>Superscript</td>
  1226. <td>sups</td>
  1227. </tr>
  1228. <tr>
  1229. <td>Subscript</td>
  1230. <td>Subscript</td>
  1231. <td>subs</td>
  1232. </tr>
  1233. <tr>
  1234. <td>Proportional Text</td>
  1235. <td>Proportional Widths</td>
  1236. <td>pwid</td>
  1237. </tr>
  1238. <tr>
  1239. <td>Half-width Text</td>
  1240. <td>Half Width</td>
  1241. <td>hwid</td>
  1242. </tr>
  1243. <tr>
  1244. <td>Full-width Text</td>
  1245. <td>Full Width</td>
  1246. <td>fwid</td>
  1247. </tr>
  1248. <tr>
  1249. <td>Traditional Characters</td>
  1250. <td>Traditional</td>
  1251. <td>trad</td>
  1252. </tr>
  1253. <tr>
  1254. <td>Simplified Characters</td>
  1255. <td>Simplified</td>
  1256. <td>smpl</td>
  1257. </tr>
  1258. <tr>
  1259. <td>JIS 1978 Characters</td>
  1260. <td>JIS 1978 Characters</td>
  1261. <td>jp78</td>
  1262. </tr>
  1263. <tr>
  1264. <td>JIS 1983 Characters</td>
  1265. <td>JIS 1983 Characters</td>
  1266. <td>jp83</td>
  1267. </tr>
  1268. <tr>
  1269. <td>JIS 1990 Characters</td>
  1270. <td>JIS 1990 Characters</td>
  1271. <td>jp90</td>
  1272. </tr>
  1273. </table>
  1274. <p>FontForge will retain the order of features in the morx
  1275. table, and the user may adjust it with the <a href=
  1276. "fontinfo.html#Lookups">Element-&gt;Font Info</a> command.
  1277. (this is the same list as that used for GSUB table. GSUB
  1278. features that don't correspond to mac features will be
  1279. ignored).</p>
  1280. <h2>What is <a name="Unsupported" id=
  1281. "Unsupported">Unsupported</a>?</h2>
  1282. <p>FontForge does not (yet) support all the advanced
  1283. typographic features available in either opentype or apple
  1284. advanced typography.</p>
  1285. <h3>OpenType</h3>
  1286. <ul>
  1287. <li>FontForge does not provide an attachment list subtable
  1288. nor a MarkAttachClassDef subtable of the GDEF table.</li>
  1289. <li>FontForge does not support the VORG and JUST tables</li>
  1290. </ul>
  1291. <p><a href="TrueOpenTables.html">See here for a complete list
  1292. of supported tables</a>.</p>
  1293. <h3>Apple Advanced Typography</h3>
  1294. <ul>
  1295. <li>FontForge will never generate a 'mort' table. It can read
  1296. 'mort' tables, but it will only produce 'morx' tables.</li>
  1297. <li>FontForge is unable to parse contextual ligatures. It can
  1298. find ligatures which start from state 0, but it will not find
  1299. ligatures which start from other states (that is, which are
  1300. contextual)</li>
  1301. <li>FontForge does not support the following Apple specific
  1302. tables
  1303. <ul>
  1304. <li>acnt (accent attachment)</li>
  1305. <li>bsln (baseline)</li

Large files files are truncated, but you can click here to view the full file