550 lines
16 KiB
HTML
550 lines
16 KiB
HTML
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
|||
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>RoboFab UFO</title>
|
|||
|
<link href="../default.css" type="text/css" rel="stylesheet" />
|
|||
|
</head><body>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<script type="text/javascript" src="http://www.google-analytics.com/urchin.js"></script>
|
|||
|
<script type="text/javascript">
|
|||
|
_uacct = "UA-2044310-2";
|
|||
|
urchinTracker();
|
|||
|
</script>
|
|||
|
|
|||
|
<div id="modellogo">
|
|||
|
<img src="../img/drawmodel_header.jpg" width="595" height="112" />
|
|||
|
</div>
|
|||
|
<div class="leftcontent">
|
|||
|
<h1 class="crb-seealso">
|
|||
|
RoboFab
|
|||
|
</h1>
|
|||
|
<p class="menu">
|
|||
|
<a href="../index.html">
|
|||
|
Home
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="../download/index.html">
|
|||
|
Download v1.1.1
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="../intro.html">
|
|||
|
Intro
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="../install.html">
|
|||
|
Install Notes
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="../history.html">
|
|||
|
History
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="../executive.html">
|
|||
|
Summary
|
|||
|
</a>
|
|||
|
</p>
|
|||
|
|
|||
|
<p class="menu">
|
|||
|
<a href="../howto/index.html">
|
|||
|
How to's
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="../talks/index.html">
|
|||
|
Step by step
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="../tools/dialogs.html">
|
|||
|
Fab Dialogs
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="../objects/index.html">
|
|||
|
Object reference
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="../objects/model.html">
|
|||
|
Object map
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="../tools/index.html">
|
|||
|
Tools
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="index.html">
|
|||
|
UFO Overview
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="specification.html">
|
|||
|
UFO Spec
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="../limitations.html">
|
|||
|
Fab Limitations
|
|||
|
</a>
|
|||
|
|
|||
|
<a href="../links/index.html">
|
|||
|
Links
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="../credits.html">
|
|||
|
Credits
|
|||
|
</a>
|
|||
|
</p>
|
|||
|
|
|||
|
<h1 class="crb-seealso">
|
|||
|
Support RoboFab
|
|||
|
</h1>
|
|||
|
|
|||
|
|
|||
|
<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
|
|||
|
<input type="hidden" name="cmd" value="_s-xclick">
|
|||
|
<input type="image" src="https://www.paypal.com/en_US/i/btn/x-click-but21.gif" border="0" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
|
|||
|
<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">
|
|||
|
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----END PKCS7-----
|
|||
|
">
|
|||
|
</form>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<h2 class="crb-seealso">
|
|||
|
Up
|
|||
|
</h2>
|
|||
|
|
|||
|
<p class="menu">
|
|||
|
<p class="bonbon_uplink"><a href="index.html">Back to UFO</a></p>
|
|||
|
</p>
|
|||
|
|
|||
|
<h2 class="crb-seealso">
|
|||
|
See also
|
|||
|
</h2>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<p class="menu">
|
|||
|
|
|||
|
</p>
|
|||
|
</div>
|
|||
|
|
|||
|
<div class="footer">
|
|||
|
<a href="../feedback.html">
|
|||
|
Feedback
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
<a href="../map.html">
|
|||
|
Sitemap
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
Please also refer to the
|
|||
|
<a href="../download/license.html">
|
|||
|
Legal
|
|||
|
</a>
|
|||
|
<br />
|
|||
|
Copyright 2003-2006 RoboFab
|
|||
|
<br />
|
|||
|
version 1.1.1
|
|||
|
</div>
|
|||
|
|
|||
|
<div class="google">
|
|||
|
|
|||
|
|
|||
|
<h2>RoboFab Mailinglist</h2>
|
|||
|
<p>
|
|||
|
Join the RoboFab users community at Google groups.
|
|||
|
</p>
|
|||
|
|
|||
|
|
|||
|
<img src="http://groups.google.com/groups/img/3nb/groups_bar.gif" alt="Google Groups" height="26" width="132" />
|
|||
|
|
|||
|
<p>
|
|||
|
<form action="http://groups.google.com/group/robofab/boxsubscribe">
|
|||
|
Email: <input type="text" name="../email" />
|
|||
|
<input type="submit" name="../sub" value="Subscribe" />
|
|||
|
</form>
|
|||
|
</p>
|
|||
|
<p>
|
|||
|
<a href="http://groups.google.com/group/robofab">Visit this group</a>
|
|||
|
</p>
|
|||
|
|
|||
|
|
|||
|
<h2>RoboFab Sponsors</h2>
|
|||
|
|
|||
|
<script type="text/javascript">
|
|||
|
|
|||
|
|
|||
|
google_ad_client = "pub-3703953449723704";
|
|||
|
google_ad_width = 120;
|
|||
|
google_ad_height = 600;
|
|||
|
google_ad_format = "120x600_as";
|
|||
|
google_ad_type = "text_image";
|
|||
|
google_ad_channel ="";
|
|||
|
google_color_border = "336699";
|
|||
|
google_color_bg = "FFFFFF";
|
|||
|
google_color_link = "0000FF";
|
|||
|
google_color_url = "008000";
|
|||
|
google_color_text = "000000";
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
</script>
|
|||
|
|
|||
|
|
|||
|
<script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
</div>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<div class="content">
|
|||
|
|
|||
|
|
|||
|
<h1>Glyph Interchange Format</h1>
|
|||
|
<h2>Introduction</h2>
|
|||
|
|
|||
|
|
|||
|
<p>The Glyph Interchange Format (or <span class="caps">GLIF</span>) is a simple and clear <span class="caps">XML</span> representation of a single glyph. It is a major part of the RoboFab project, and it is the foundation of the <a href="specification.html">Unified Font Object</a>. <span class="caps">GLIF</span> files typically have a ”.glif” extension.</p>
|
|||
|
|
|||
|
<p>Here is an example:</p>
|
|||
|
|
|||
|
<code><pre>
|
|||
|
<?xml version=“1.0” encoding=“UTF-8”?>
|
|||
|
<glyph name=“period” format=“1”>
|
|||
|
<advance width=“268”/>
|
|||
|
<unicode hex=“002E”/>
|
|||
|
<outline>
|
|||
|
<contour>
|
|||
|
<point x=“237” y=“152”/>
|
|||
|
<point x=“193” y=“187”/>
|
|||
|
<point x=“134” y=“187” type=“curve” smooth=“yes”/>
|
|||
|
<point x=“74” y=“187”/>
|
|||
|
<point x=“30” y=“150”/>
|
|||
|
<point x=“30” y=“88” type=“curve” smooth=“yes”/>
|
|||
|
<point x=“30” y=“23”/>
|
|||
|
<point x=“74” y=”-10”/>
|
|||
|
<point x=“134” y=”-10” type=“curve” smooth=“yes”/>
|
|||
|
<point x=“193” y=”-10”/>
|
|||
|
<point x=“237” y=“25”/>
|
|||
|
<point x=“237” y=“88” type=“curve” smooth=“yes”/>
|
|||
|
</contour>
|
|||
|
</outline>
|
|||
|
<lib>
|
|||
|
<dict>
|
|||
|
<key>com.letterror.somestuff</key>
|
|||
|
<string>arbitrary custom data!</string>
|
|||
|
</dict>
|
|||
|
</lib>
|
|||
|
</glyph>
|
|||
|
</xml>
|
|||
|
</pre>
|
|||
|
</code>
|
|||
|
|
|||
|
<h1><em>glyph</em></h1>
|
|||
|
|
|||
|
<p>glyph is the top level element.</p>
|
|||
|
|
|||
|
<code><pre><glyph name="aGlyphName" format="1" >...<glyph></pre></code>
|
|||
|
|
|||
|
|
|||
|
<table>
|
|||
|
<tr>
|
|||
|
<th>attributes</th>
|
|||
|
<th>description</th>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>name</td>
|
|||
|
<td>the name of the glyph</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td></td>
|
|||
|
<td>The “name” attribute is currently fairly useless. The contents.plist file maps glyph names to file names, and one of the reasons to do this is to avoid having to parse all files just to get at a list of available glyph names. So. When reading .glif files, the “name” attribute is probably best ignored, since manual editing may have caused a mismatch with the glyph name as stored in contents.plist, as well as with the file name, which is an algorithmic transformation of the glyph name. Yet the “name” attribute will become crucial once we implement our plan to allow multiple glyphs in one .glif file, which is slated for version 2 of the Glyph Interchange Format.</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>format</td>
|
|||
|
<td>The format version, currently “1”.</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<th>elements</th>
|
|||
|
<th>description</th>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>advance</td>
|
|||
|
<td>May occur at most once.</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>unicode</td>
|
|||
|
<td>May occur any number of times.</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>outline</td>
|
|||
|
<td>May occur at most once.</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>lib</td>
|
|||
|
<td>May occur at most once.</td>
|
|||
|
</tr>
|
|||
|
</table>
|
|||
|
|
|||
|
<h1><em>advance</em></h1>
|
|||
|
|
|||
|
<p>The advance element stores horizontal and vertical metrics. This element has no child elements.</p>
|
|||
|
|
|||
|
<code><pre>
|
|||
|
<advance width="268">
|
|||
|
<advance height="1000">
|
|||
|
</pre></code>
|
|||
|
|
|||
|
<table>
|
|||
|
<tr>
|
|||
|
<th>attribute</th>
|
|||
|
<th>description</th>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>width</td>
|
|||
|
<td>An integer or a float; The advance width.</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>height</td>
|
|||
|
<td>An integer or a float; The vertical advance (not yet implemented by us).</td>
|
|||
|
</tr>
|
|||
|
</table>
|
|||
|
|
|||
|
<h1><em>unicode</em></h1>
|
|||
|
|
|||
|
<p>The unicode element stores the Unicode code point for the glyph. This element has no child elements. The first occurance of this element defines the primary unicode value for this glyph.</p>
|
|||
|
|
|||
|
<code><pre><unicode hex="002E"/></pre></code>
|
|||
|
|
|||
|
<table>
|
|||
|
<tr>
|
|||
|
<th>attribute</th>
|
|||
|
<th>description</th>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>hex</td>
|
|||
|
<td>A unicode code point as a hexadecimal number.</td>
|
|||
|
</tr>
|
|||
|
</table>
|
|||
|
|
|||
|
<h1><em>outline</em></h1>
|
|||
|
|
|||
|
<p>Outline description. The outline element can contain a number of component or contour elements. This element has no attributes.</p>
|
|||
|
|
|||
|
<code><pre><outline>...</outline></pre></code>
|
|||
|
|
|||
|
<table>
|
|||
|
<tr>
|
|||
|
<th>elements</th>
|
|||
|
<th>description</th>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>component</td>
|
|||
|
<td>May occur any number of times.</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>contour</td>
|
|||
|
<td>May occur any number of times.</td>
|
|||
|
</tr>
|
|||
|
</table>
|
|||
|
|
|||
|
<h1><em>component</em></h1>
|
|||
|
|
|||
|
<p>The component element inserts another glyph as part of the outline. xScale, xyScale, yxScale, yScale, xOffset, yOffset taken together inthat order form an Affine transformation matrix, to be used to transform the base glyph. The default matrix is [1 0 0 1 0 0], the identity transformation.
|
|||
|
|
|||
|
This element has no child elements.
|
|||
|
</p>
|
|||
|
|
|||
|
<code><pre>
|
|||
|
<component base="a"/>
|
|||
|
<component base="acute" vOffset="20"/>
|
|||
|
</pre></code>
|
|||
|
|
|||
|
<table>
|
|||
|
<tr>
|
|||
|
<th>attributes</th>
|
|||
|
<th>description</th>
|
|||
|
<th>default value</th>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>base</td>
|
|||
|
<td>name of the base glyph</td>
|
|||
|
<td></td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>xScale</td>
|
|||
|
<td>int or float</td>
|
|||
|
<td>1</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>xyScale</td>
|
|||
|
<td>int or float</td>
|
|||
|
<td>0</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>yxScale</td>
|
|||
|
<td>int or float</td>
|
|||
|
<td>0</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>yScale</td>
|
|||
|
<td>int or float</td>
|
|||
|
<td>1</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>xOffset</td>
|
|||
|
<td>int or float</td>
|
|||
|
<td>0</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>yOffset</td>
|
|||
|
<td>int or float</td>
|
|||
|
<td>0</td>
|
|||
|
</tr>
|
|||
|
</table>
|
|||
|
|
|||
|
<h1><em>contour</em></h1>
|
|||
|
|
|||
|
<p>Contour description. This element can contain any number of point elements,
|
|||
|
|
|||
|
</p>
|
|||
|
|
|||
|
<code><pre>
|
|||
|
<contour base="a"/>...<contour>
|
|||
|
</pre></code>
|
|||
|
|
|||
|
<table>
|
|||
|
<tr>
|
|||
|
<th>element</th>
|
|||
|
<th>description</th>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>point</td>
|
|||
|
<td>May occur any number of times.</td>
|
|||
|
</tr>
|
|||
|
</table>
|
|||
|
|
|||
|
<h1><em>point</em></h1>
|
|||
|
|
|||
|
<p>An attributed coordinate pair. This element has no child elements. (See also SegmentsVersusPoints and PointPen, for discussions about how outlines work here.
|
|||
|
|
|||
|
</p>
|
|||
|
|
|||
|
<code><pre>
|
|||
|
<point x=“134” y=“187” type=“curve” smooth=“yes”/>
|
|||
|
</pre></code>
|
|||
|
|
|||
|
<table>
|
|||
|
<tr>
|
|||
|
<th>atributes</th>
|
|||
|
<th>description</th>
|
|||
|
<th>default value</th>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>x</td>
|
|||
|
<td>int or float, The ‘x’ coordinate.</td>
|
|||
|
<td></td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>y</td>
|
|||
|
<td>int or float, The ‘y’ coordinate.</td>
|
|||
|
<td></td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>type</td>
|
|||
|
<td>“move”</td>
|
|||
|
<td></td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td></td>
|
|||
|
<td>“line”</td>
|
|||
|
<td></td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td></td>
|
|||
|
<td>“curve”</td>
|
|||
|
<td></td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td></td>
|
|||
|
<td>“qcurve”</td>
|
|||
|
<td></td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td></td>
|
|||
|
<td>“offcurve” The point and/or segment type, see below.</td>
|
|||
|
<td>“offcurve”</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>smooth</td>
|
|||
|
<td>“yes”</td>
|
|||
|
<td>“no”</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td></td>
|
|||
|
<td>“no”</td>
|
|||
|
<td></td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td></td>
|
|||
|
<td>The “smooth” attribute can only be given when “type” indicates the point is on-curve. When set to “yes”, it signifies that a smooth curvature should be maintained at this point, either as a “curve point” or a “tangent point” in Fontographer terms.</td>
|
|||
|
<td></td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td>name</td>
|
|||
|
<td>arbitrary name or label for this point. This attribute may contain an arbitrary string, to be used to label points. A point “name” does not have to be unique within a contour, nor within an outline.</td>
|
|||
|
<td></td>
|
|||
|
</tr>
|
|||
|
</table>
|
|||
|
|
|||
|
<p>We have defined a basic set of possible values for the type attribute, with specific semantics (GLIF outlines have an <span class="caps">API</span> counterpart in the PointPen protocol, they’re designed to be very symmetrical with each other), yet different values may be used for alternative outline descriptions. The basic set is defined as follows:</p>
|
|||
|
|
|||
|
<table>
|
|||
|
<tr>
|
|||
|
<td><strong>move</strong></td>
|
|||
|
<td>A point of this type <span class="caps">MUST</span> be the first in a <strong>contour</strong>. The reverse is not true: a <strong>contour</strong> does not neccesarily start with a “move” point. When a <strong>contour</strong> <span class="caps">DOES</span> start with a “move” point, it signifies the beginning of an <span class="caps">OPEN</span> contour. A <span class="caps">CLOSED</span> contour does <span class="caps">NOT</span> start with a “move” and is defined as a cyclic list of points, with no predominant start point. There is always a “next point” and a “previous point”. For this purpose the list of points can be seen as endless in both directions. The actual list of points can be rotated arbitrarily (by removing the first N points and appending them at the end) while still describing the same outline. The PointPen page discusses some of the issues involved when turning a list of points into segments.</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td><strong>line</strong></td>
|
|||
|
<td>Draw a straight line from the previous point to this point. The previous point may be a “move”, a “line”, a “curve” or a “qcurve”, but not an “offcurve”.</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td><strong>offcurve</strong></td>
|
|||
|
<td>This point is part of a curve segment, that goes up to the next point that is either a “curve” or a “qcurve”.</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td><strong>curve</strong></td>
|
|||
|
<td>Draw a cubic bezier curve from the last non-“offcurve” point to this point. If the number of “offcurve” points is zero, a straight line is drawn. If it is one, a quadratic curve is drawn. If it is two, a regular cubic bezier is drawn. If it is larger than 2, a series of cubic bezier segments are drawn, as defined by the SuperBezier algorithm.</td>
|
|||
|
</tr>
|
|||
|
<tr>
|
|||
|
<td><strong>qcurve</strong></td>
|
|||
|
<td>Similar to curve, but uses quadratic curves, using the TrueType “implied on-curve points” principle.</td>
|
|||
|
</tr>
|
|||
|
</table>
|
|||
|
|
|||
|
<h1><em>lib</em></h1>
|
|||
|
|
|||
|
<code><pre>
|
|||
|
<lib>
|
|||
|
<dict>
|
|||
|
<key>com.letterror.somestuff</key>
|
|||
|
<string>arbitrary custom data!</string>
|
|||
|
</dict>
|
|||
|
</lib>
|
|||
|
</pre></code>
|
|||
|
|
|||
|
<p>
|
|||
|
Custom data storage, a.k.a. GlyphLib. No attributes, contents/child elements follow the "Property List":ufo/plist.html format. This element may occur at most once. *lib* has exactly one child, which must be *dict*. To avoid naming conflicts, keys must use ReverseDomainName-prefixed keys at the top level of this dictionary, for example "com.letterror.ourspecialdata".
|
|||
|
</p>
|
|||
|
|
|||
|
|
|||
|
</div>
|
|||
|
</body></html>
|