<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.fortes.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <title type="html">Fortes</title>
  <subtitle type="html">&lt;a href="/about"&gt;Filipe Fortes&lt;/a&gt; is an interaction designer and computer programmer. (&lt;a href="/contact"&gt;contact&lt;/a&gt;)</subtitle>
  <id>http://www.fortes.com/feed</id>
  <link rel="alternate" type="text/html" hreflang="en" href="http://www.fortes.com/" />
  
  <rights>Copyright (c)
    2010
    Filipe Fortes
  </rights>
  <generator uri="http://www.fortes.com/projects/mashpress/" version="0.1">
    mashpress 0.1
  </generator>
  <author>
    <name>Filipe Fortes</name>
    <uri>http://www.fortes.com/</uri>
  </author>
  
  <updated>2010-08-15T17:32:27Z</updated>
    
    
      <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.fortes.com/fortes" /><feedburner:info uri="fortes" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
    <title>Introducing Treesaver</title>
    <link rel="alternate" type="text/html" href="http://feeds.fortes.com/~r/fortes/~3/n8GJrHXP5Ms/introducing-treesaver" />
    <id>tag:www.fortes.com,2010-08-11:ag1mb3J0ZXNkb3RibG9ncgsLEgRJdGVtGPEuDA</id>
    <updated>2010-08-15T17:32:27Z</updated>
    <published>2010-08-11T13:52:22Z</published>
    <content type="html">
        &lt;p&gt;&lt;a href="http://www.nytimes.com/2010/08/11/business/media/11nomad.html" title="NYTimes Story"&gt;The word is out&lt;/a&gt; about my latest venture: &lt;a href="http://treesaver.net/"&gt;Treesaver&lt;/a&gt;. &lt;a href="http://readnomad.com/"&gt;Nomad Editions&lt;/a&gt; is our first customer to make a public announcement, you can see their &lt;a href="http://www.youtube.com/watch?v=zEZ_ARKNTHE"&gt;promotional video&lt;/a&gt; below:&lt;/p&gt;
&lt;p&gt;&lt;object width="499" height="306"&gt;&lt;param name="movie" value="http://www.youtube.com/v/zEZ_ARKNTHE&amp;amp;hl=en_US&amp;amp;fs=1?rel=0&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/zEZ_ARKNTHE&amp;amp;hl=en_US&amp;amp;fs=1?rel=0&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="499" height="306"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;The response and interest so far has been fantastic, and it's great to finally be able to talk about what I've been working on for the past several months.&lt;/p&gt;
&lt;p&gt;We've been getting a ton of questions, and I thought I'd take some time to answer the most common ones.&lt;/p&gt;
&lt;h3 id="what-is-treesaver"&gt;What is Treesaver?&lt;/h3&gt;
&lt;p&gt;It's a way to make column and page-based layouts using HTML, CSS, and JavaScript. Text and image layout is tailored to fit whatever screen the user is using, in order to create a attractive, usable experience. Here's a video demonstrating how Treesaver adapts to a changing window size:&lt;/p&gt;
&lt;p&gt;&lt;object width="500" height="306"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Pt2iJZGqMpw&amp;amp;hl=en_US&amp;amp;fs=1?rel=0&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Pt2iJZGqMpw&amp;amp;hl=en_US&amp;amp;fs=1?rel=0&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="306"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;h3 id="why-use-html"&gt;Why use HTML?&lt;/h3&gt;
&lt;p&gt;There are many reasons to use HTML, but the most important ones in our opinion are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Lingua Franca of the Internet&lt;/strong&gt;: HTML is supported by an incredible variety of devices, from expensive desktop computers to cheap mobile phones.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Linking &amp;amp; Search Engines:&lt;/strong&gt; Articles within Treesaver websites have their own URL which can be linked to or spidered by search engines. Users searching in Google can be taken directly into the rich Treesaver experience.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Bookmarking &amp;amp; Social Media:&lt;/strong&gt; Because Treesaver can run in the browser, users can bookmark and directly link to articles when sharing with friends. Friends and Family can immediately view shared content in a rich experience without having to go to an app store to download a viewer.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Leverage existing content:&lt;/strong&gt; Treesaver articles are simply-structured HTML files, meaning little to no conversion is required for existing text content. Existing web assets like video and Flash can continue to be embedded (assuming the browser/device supports Flash, of course).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Ecosystem:&lt;/strong&gt; Because Treesaver is built upon standard technologies, it can leverage the wide variety of tools available in the web ecosystem: Google Analytics, embedded YouTube videos, slideshow widgets, etc.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Embedding:&lt;/strong&gt; You can embed a Treesaver article within other webpages, as you would a YouTube video. Embedded articles continue to be formatted by Treesaver, meaning branding and advertising are preserved, even if the article has been embedded on another site.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="what-are-treesavers-browserdevice-requirements"&gt;What are Treesaver's Browser/Device Requirements?&lt;/h3&gt;
&lt;p&gt;The column and page-based layout works on most modern browsers, specifically:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Internet Explorer 7 and above&lt;/li&gt;
&lt;li&gt;Firefox 2.0 and above&lt;/li&gt;
&lt;li&gt;Safari 3 and above (including iPhone, iPad, and many smart phones)&lt;/li&gt;
&lt;li&gt;Chrome 3 and above&lt;/li&gt;
&lt;li&gt;Opera 10 and above&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because Treesaver content is just HTML, it degrades gracefully onto legacy devices. Users with IE6 or older phones will still be able to read any article that uses Treesaver, although it will have a simpler, primarily text layout.&lt;/p&gt;
&lt;h3 id="can-treesaver-content-be-distributed-via-the-app-store"&gt;Can Treesaver content be distributed via the App Store?&lt;/h3&gt;
&lt;p&gt;Yes. We will provide the ability to package Treesaver content as an application that can be downloaded and sold through the App Store.&lt;/p&gt;
&lt;h3 id="when-can-i-use-treesaver"&gt;When can I use Treesaver?&lt;/h3&gt;
&lt;p&gt;We're not giving public access to Treesaver right now, although we will be doing a limited beta test in the coming weeks. &lt;a href="http://eepurl.com/MZPD"&gt;Subscribe to the Treesaver mailing list&lt;/a&gt; to be notified when beta invites are ready to be sent out.&lt;/p&gt;
&lt;h3 id="im-interested-in-using-treesaver-for-my-publication-how-do-i-get-in-touch"&gt;I'm interested in using Treesaver for my publication, how do I get in touch?&lt;/h3&gt;
&lt;p&gt;Contact us via the &lt;a href="http://treesaver.net"&gt;Treesaver website&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="will-treesaver-be-open-source"&gt;Will Treesaver be Open Source?&lt;/h3&gt;
&lt;p&gt;Yes. I'll be releasing the client libraries Treesaver under an open source license later this year (it's not quite ready yet, I have to remove all the dirty words first).&lt;/p&gt;
&lt;h3 id="got-any-screenshots"&gt;Got any Screenshots?&lt;/h3&gt;
&lt;p&gt;Sure, here are a few from a Nomad Editions sample issue:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Treesaver in Chrome on the Mac" src="http://farm5.static.flickr.com/4141/4882328386_7309d0d0b0.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Treesaver in Firefox on Ubuntu" src="http://farm5.static.flickr.com/4141/4882328670_c7361e73c5.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Treesaver in IE" src="http://farm5.static.flickr.com/4120/4882329740_f1b1357b10.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Treesaver on the iPad" src="http://farm5.static.flickr.com/4075/4882330222_a4cb625499.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Treesaver on the iPhone" src="http://farm5.static.flickr.com/4076/4881721767_48802067ca.jpg" /&gt;&lt;/p&gt;
&lt;h2 id="more-questions"&gt;More Questions?&lt;/h2&gt;
&lt;p&gt;Ask &lt;a href="http://twitter.com/trsvr"&gt;@trsvr&lt;/a&gt; or &lt;a href="http://twitter.com/fortes"&gt;@fortes&lt;/a&gt; on Twitter.&lt;/p&gt;
    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/CovANml5RNPYBGqM3bXumcAmi_c/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CovANml5RNPYBGqM3bXumcAmi_c/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/CovANml5RNPYBGqM3bXumcAmi_c/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/CovANml5RNPYBGqM3bXumcAmi_c/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.fortes.com/~ff/fortes?a=n8GJrHXP5Ms:4r8TwP92FKc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=n8GJrHXP5Ms:4r8TwP92FKc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.fortes.com/~ff/fortes?a=n8GJrHXP5Ms:4r8TwP92FKc:xS8MUs9gyKI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=n8GJrHXP5Ms:4r8TwP92FKc:xS8MUs9gyKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/fortes/~4/n8GJrHXP5Ms" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.fortes.com/2010/introducing-treesaver</feedburner:origLink></entry>

    
      <entry>
    <title>Treesaver Sneak Peek</title>
    <link rel="alternate" type="text/html" href="http://feeds.fortes.com/~r/fortes/~3/0UxP1mCMqhc/treesaver-sneak-peek" />
    <id>tag:www.fortes.com,2010-08-07:ag1mb3J0ZXNkb3RibG9ncgsLEgRJdGVtGIknDA</id>
    <updated>2010-08-07T00:55:32Z</updated>
    <published>2010-08-07T00:53:15Z</published>
    <content type="html">
        &lt;p&gt;&lt;object width="500" height="306"&gt;&lt;param name="movie" value="http://www.youtube.com/v/Pt2iJZGqMpw&amp;amp;hl=en_US&amp;amp;fs=1?rel=0&amp;amp;hd=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/Pt2iJZGqMpw&amp;amp;hl=en_US&amp;amp;fs=1?rel=0&amp;amp;hd=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="500" height="306"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.youtube.com/watch?v=Pt2iJZGqMpw"&gt;Treesaver sneak peek video&lt;/a&gt;&lt;/p&gt;
    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/8bl6qs4RuvqxKrD5pYlhSznNrrA/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8bl6qs4RuvqxKrD5pYlhSznNrrA/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/8bl6qs4RuvqxKrD5pYlhSznNrrA/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/8bl6qs4RuvqxKrD5pYlhSznNrrA/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.fortes.com/~ff/fortes?a=0UxP1mCMqhc:K7vsBeKjKOs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=0UxP1mCMqhc:K7vsBeKjKOs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.fortes.com/~ff/fortes?a=0UxP1mCMqhc:K7vsBeKjKOs:xS8MUs9gyKI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=0UxP1mCMqhc:K7vsBeKjKOs:xS8MUs9gyKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/fortes/~4/0UxP1mCMqhc" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.fortes.com/2010/treesaver-sneak-peek</feedburner:origLink></entry>

    
      <entry>
    <title>Coming Soon</title>
    <link rel="alternate" type="text/html" href="http://feeds.fortes.com/~r/fortes/~3/_dsMAsT6Mzk/coming-soon" />
    <id>tag:www.fortes.com,2010-07-27:ag1mb3J0ZXNkb3RibG9ncgsLEgRJdGVtGKEfDA</id>
    <updated>2010-07-27T17:16:03Z</updated>
    <published>2010-07-27T17:14:49Z</published>
    <content type="html">
        &lt;p&gt;&lt;a href="http://treesaver.net"&gt;&lt;img alt="Treesaver" src="http://treesaver.net/treesaver.png" title="Very soon?" /&gt;&lt;/a&gt;&lt;/p&gt;
    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/J1MY9CukOOKAoLbpBdBgXhoy5_o/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/J1MY9CukOOKAoLbpBdBgXhoy5_o/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/J1MY9CukOOKAoLbpBdBgXhoy5_o/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/J1MY9CukOOKAoLbpBdBgXhoy5_o/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.fortes.com/~ff/fortes?a=_dsMAsT6Mzk:KLuSo5YdaGY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=_dsMAsT6Mzk:KLuSo5YdaGY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.fortes.com/~ff/fortes?a=_dsMAsT6Mzk:KLuSo5YdaGY:xS8MUs9gyKI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=_dsMAsT6Mzk:KLuSo5YdaGY:xS8MUs9gyKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/fortes/~4/_dsMAsT6Mzk" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.fortes.com/2010/coming-soon</feedburner:origLink></entry>

    
      <entry>
    <title>Soft Hyphenator</title>
    <link rel="alternate" type="text/html" href="http://feeds.fortes.com/~r/fortes/~3/w4KWrZPR1Tc/soft-hyphenator" />
    <id>tag:www.fortes.com,2010-02-14:ag1mb3J0ZXNkb3RibG9ncgsLEgRJdGVtGNcPDA</id>
    <updated>2010-02-14T21:45:59Z</updated>
    <published>2010-02-14T21:13:15Z</published>
    <content type="html">
        &lt;p class="img flickr"&gt;&lt;a href="http://www.softhyphen.com/"&gt;&lt;img src="http://farm5.static.flickr.com/4067/4356749517_ffccabbf9d.jpg" width="500" height="83" alt="Soft Hyphenator" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm happy to announce &lt;a href="http://www.softhyphen.com/"&gt;Soft Hyphenator&lt;/a&gt; , a simple utility I wrote this weekend that adds &lt;a href="http://en.wikipedia.org/wiki/Hyphen#Hyphens_in_computing"&gt;soft hyphens&lt;/a&gt; into HTML content.&lt;/p&gt;
&lt;p&gt;Today's web browsers don't provide hyphenation, which makes justified text prone to &lt;a href="http://www.fonts.com/AboutFonts/Articles/fyti/JustifiedType.htm"&gt;rivers of white space&lt;/a&gt;. However, browsers do support the soft-hyphen: the &lt;code&gt;&amp;amp;shy;&lt;/code&gt; HTML entity. Soft hyphens tell the browser where it can break a word, if necessary. &lt;/p&gt;
&lt;p&gt;Adding these hyphens manually is quite tedious. The Soft Hyphenator takes HTML and adds the soft hyphens automatically.&lt;/p&gt;
&lt;p&gt;The site is written in Python and deployed on &lt;a href="http://code.google.com/appengine/"&gt;Google AppEngine&lt;/a&gt;. It uses the &lt;a href="http://www.crummy.com/software/BeautifulSoup/"&gt;BeautifulSoup&lt;/a&gt; and &lt;a href="http://code.google.com/p/python-hyphenator/"&gt;python-hyphenator&lt;/a&gt; libraries, along with &lt;a href="http://wiki.services.openoffice.org/wiki/Dictionaries"&gt;OpenOffice's hyphenation dictionaries&lt;/a&gt;. For the nerdy &amp;amp; curious, I've made the &lt;a href="http://github.com/fortes/softhyphen"&gt;source code&lt;/a&gt; public.&lt;/p&gt;
&lt;p&gt;I'm still quite new to Python and Google AppEngine, but I'm pretty happy with both so far. The entire site took less than 24 hours to write, and &lt;a href="http://www.osnews.com/story/19266/WTFs_m"&gt;WTF/minute&lt;/a&gt; rate was pretty good.&lt;/p&gt;
    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/DqaT-CwO7XlmVvdxJfB400VOfa0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DqaT-CwO7XlmVvdxJfB400VOfa0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/DqaT-CwO7XlmVvdxJfB400VOfa0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/DqaT-CwO7XlmVvdxJfB400VOfa0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.fortes.com/~ff/fortes?a=w4KWrZPR1Tc:1JpTt5ZFGGM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=w4KWrZPR1Tc:1JpTt5ZFGGM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.fortes.com/~ff/fortes?a=w4KWrZPR1Tc:1JpTt5ZFGGM:xS8MUs9gyKI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=w4KWrZPR1Tc:1JpTt5ZFGGM:xS8MUs9gyKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/fortes/~4/w4KWrZPR1Tc" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.fortes.com/2010/soft-hyphenator</feedburner:origLink></entry>

    
      <entry>
    <title>jMetronome: Using jQuery to keep typographic rhythm</title>
    <link rel="alternate" type="text/html" href="http://feeds.fortes.com/~r/fortes/~3/AbNlscjhV58/jmetronome-using-jquery-to-keep-typographic-rhythm" />
    <id>tag:www.fortes.com,2008-08-05:ag1mb3J0ZXNkb3RibG9ncgoLEgRJdGVtGFIM</id>
    <updated>2010-02-12T15:36:28Z</updated>
    <published>2008-08-05T23:00:09Z</published>
    <content type="html">
        &lt;p class="img flickr"&gt;&lt;a href="http://flickr.com/photos/fortes/2668895986/"&gt;&lt;img src="http://farm4.static.flickr.com/3086/2668895986_425b3df608.jpg?v=0" alt="Michael Arenella &amp;amp; his Dreamland Orchestra" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A couple of years ago, Richard Rutter wrote &lt;a href="http://24ways.org/2006/compose-to-a-vertical-rhythm"&gt;Compose to a Vertical Rhythm&lt;/a&gt;, which described how web developers could use CSS to maintain proper vertical typographic rhythm when designing pages. The technique is fairly straightforward, requiring some basic math to ensure consistent margins and leading across all page elements.&lt;/p&gt;
&lt;p&gt;One issue that many people face with this technique, is that vertical rhythm can easily be thrown off by non-text elements, such as images. To illustrate, here's a &lt;a href="http://static.fortes.com/projects/jquery/rhythm-example-pre.html"&gt;sample page&lt;/a&gt; which contains text, images, a code block showing a horizontal scrollbar, and even a video. Notice how the text no longer lines up perfectly within the vertical grid lines after the first image. This is because the image is 240 pixels tall, which is not a multiple of 18, the line height used throughout the document.&lt;/p&gt;
&lt;p&gt;One solution to this issue is to make sure your images always have a height that is a multiple of the line height being used by your document. Unfortunately, this is usually not practical for production sites.&lt;/p&gt;
&lt;p&gt;Here's some jQuery code that you can use in order to make sure your document keeps its rhythm:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;lineHeight&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;body&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;line-height&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;balanceHeight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;outerHeight&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;h&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;lineHeight&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;delta&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="cm"&gt;/* For images and objects, we want to align the bottom w/ the baseline, so we&lt;/span&gt;
&lt;span class="cm"&gt;         * pad the top of the element. For other elements (text elements that have a&lt;/span&gt;
&lt;span class="cm"&gt;         * scrollbar), we pad the bottom, to keep the text within on the same baseline */&lt;/span&gt;
        &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;paddingDirection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;is&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;img&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;is&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;object&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt;
                                              &lt;span class="s1"&gt;&amp;#39;padding-top&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;padding-bottom&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="cm"&gt;/* Adjust padding, because margin can get collapsed and cause uneven spacing */&lt;/span&gt;
          &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;currentPadding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paddingDirection&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
          &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;el&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;paddingDirection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;currentPadding&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;lineHeight&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;delta&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="cm"&gt;/* Depending on your content, you may want to modify which elements you want to adjust,&lt;/span&gt;
&lt;span class="cm"&gt;   * by modifying the selector used below. By default, we grab all img, pre, and object&lt;/span&gt;
&lt;span class="cm"&gt;   * elements. */&lt;/span&gt;
  &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;img, pre, object&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="cm"&gt;/* Only works if we&amp;#39;re manipulating block objects */&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;display&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;inline&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;css&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;display&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;block&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;

      &lt;span class="cm"&gt;/* Images need to load before you get their height */&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;is&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;img&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt; &lt;span class="nx"&gt;balanceHeight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="nx"&gt;balanceHeight&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The code is fairly straightforward. Briefly, what it does is add padding to the top or bottom of an element in order to ensure its total height is a multiple of the document's overall line height. Here's the same &lt;a href="http://static.fortes.com/projects/jquery/rhythm-example-post.html"&gt;sample page&lt;/a&gt; as before, but this time using the script above.&lt;/p&gt;
&lt;h3&gt;Usage&lt;/h3&gt;

&lt;p&gt;You can use this script as-is, but you may want to change the selector used in the following line:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;img, pre, object&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The reason is that this selector is probably too broad for your page. You most likely do not want to adjust every single image on your page, just the ones within your main content block. On my page, I adjust any &lt;code class="html"&gt;pre&lt;/code&gt; elements, because I've set them to overflow with scrollbars, which can alter the height of the code block and mess up vertical spacing just like an image.&lt;/p&gt;
&lt;h3&gt;Known Issues&lt;/h3&gt;

&lt;p&gt;I've only found two issues with the code, and they both affect Internet Explorer:&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;&lt;code&gt;object&lt;/code&gt; tags don't get adjusted (see the Vimeo video at the bottom of the &lt;a href="http://static.fortes.com/projects/jquery/rhythm-example-pre.html"&gt;sample page&lt;/a&gt;). This might be a jQuery issue, but I haven't investigated it yet.&lt;/li&gt;
    &lt;li&gt;If you use &lt;a href="http://meyerweb.com/eric/thoughts/2006/02/08/unitless-line-heights/"&gt;unitless line heights&lt;/a&gt;, jQuery doesn't retrieve the correct line height in IE. You can either modify the code and hard code a line height, or just don't use unitless line height on the &lt;code&gt;body&lt;/code&gt; element&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let me know if you run into any other issues.&lt;/p&gt;
    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/7jO2aySTM8nkxtpRHMhwF2It5zM/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7jO2aySTM8nkxtpRHMhwF2It5zM/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/7jO2aySTM8nkxtpRHMhwF2It5zM/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/7jO2aySTM8nkxtpRHMhwF2It5zM/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.fortes.com/~ff/fortes?a=AbNlscjhV58:sZJVO9nddY4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=AbNlscjhV58:sZJVO9nddY4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.fortes.com/~ff/fortes?a=AbNlscjhV58:sZJVO9nddY4:xS8MUs9gyKI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=AbNlscjhV58:sZJVO9nddY4:xS8MUs9gyKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/fortes/~4/AbNlscjhV58" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.fortes.com/2008/jmetronome-using-jquery-to-keep-typographic-rhythm</feedburner:origLink></entry>

    
      <entry>
    <title>Introducing the Dynamic Layout Library</title>
    <link rel="alternate" type="text/html" href="http://feeds.fortes.com/~r/fortes/~3/Jbikpq1loXI/introducing-the-dynamic-layout-library" />
    <id>tag:www.fortes.com,2008-07-14:ag1mb3J0ZXNkb3RibG9ncgoLEgRJdGVtGE4M</id>
    <updated>2010-02-12T15:36:28Z</updated>
    <published>2008-07-14T14:02:08Z</published>
    <content type="html">
        &lt;p class="img flickr"&gt;&lt;a href="http://www.flickr.com/photos/fortes/2659684659/"&gt;&lt;img src="http://farm4.static.flickr.com/3272/2659684659_2b132bbc18.jpg?v=0" alt="View of Midtown Manhattan" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'm happy to introduce version 1.0 of my &lt;a href="/projects/dynamiclayout/"&gt;Dynamic Layout&lt;/a&gt; JavaScript library.&lt;/p&gt;
&lt;p&gt;Dynamic Layout is a simple library that allows you to easily adjust page layout based on the current browser width.&lt;/p&gt;
&lt;p&gt;The script works by modifying the &lt;tt&gt;class&lt;/tt&gt; property on the &lt;tt&gt;body&lt;/tt&gt; element, adding a new class name that will look something like &lt;tt&gt;bw-1000&lt;/tt&gt;, where &lt;tt&gt;1000&lt;/tt&gt; is one of the numbers in a predefined list of possible browser widths.&lt;/p&gt;
&lt;p&gt;Unless you're reading this in your RSS reader, you can see a live demo by resizing your browser window. I've also created a &lt;a href="http://static.fortes.com/projects/dynamiclayout/demos/dynamicholygrail.html"&gt;simple multi-column demo&lt;/a&gt;, which will display one, two, or three columns depending on your browser width.&lt;/p&gt;
&lt;p&gt;To download, and for details, see the &lt;a href="/projects/dynamiclayout/"&gt;Dynamic Layout&lt;/a&gt; project page.&lt;/p&gt;
    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/wWY-J25mzoZsuQLqhaH4BcFuaVI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wWY-J25mzoZsuQLqhaH4BcFuaVI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/wWY-J25mzoZsuQLqhaH4BcFuaVI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/wWY-J25mzoZsuQLqhaH4BcFuaVI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.fortes.com/~ff/fortes?a=Jbikpq1loXI:RLx8ctM0PVQ:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=Jbikpq1loXI:RLx8ctM0PVQ:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.fortes.com/~ff/fortes?a=Jbikpq1loXI:RLx8ctM0PVQ:xS8MUs9gyKI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=Jbikpq1loXI:RLx8ctM0PVQ:xS8MUs9gyKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/fortes/~4/Jbikpq1loXI" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.fortes.com/2008/introducing-the-dynamic-layout-library</feedburner:origLink></entry>

    
      <entry>
    <title>Introducing Sistr</title>
    <link rel="alternate" type="text/html" href="http://feeds.fortes.com/~r/fortes/~3/yN4izdb-viA/introducing-sistr" />
    <id>tag:www.fortes.com,2007-09-17:ag1mb3J0ZXNkb3RibG9ncgoLEgRJdGVtGEoM</id>
    <updated>2010-02-13T18:33:39Z</updated>
    <published>2007-09-17T12:00:00Z</published>
    <content type="html">
        &lt;p class="img photo flickr"&gt;&lt;a href="http://flickr.com/photos/fortes/1337717840/"&gt;&lt;img src="http://farm2.static.flickr.com/1255/1337717840_78497e0379.jpg" alt="Plane Engine over the midwest" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Over the weekend I spent some time seeing if I could replicate the functionality found in the excellent &lt;a href="http://www.mikeindustries.com/sifr"&gt;sIFR&lt;/a&gt;, using &lt;a href="http://silverlight.net/"&gt;Silverlight&lt;/a&gt; instead of Flash. The result is &lt;a href="/projects/silverlight/sistr"&gt;Sistr&lt;/a&gt;. For the impatient -- here's a &lt;a href="http://static.fortes.com/projects/silverlight/sistr/side-by-side.html"&gt;demo test page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note:&lt;/em&gt; This &lt;em&gt;definitely&lt;/em&gt; isn't ready for a production site, this is an early version for feedback purposes only. There are still plenty of bugs, trust me.&lt;/p&gt;
&lt;h3 id="usage"&gt;Usage&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Download &lt;a href="http://static.fortes.com/projects/silverlight/sistr/sistr.js"&gt;&lt;tt&gt;sistr.js&lt;/tt&gt;&lt;/a&gt; and save it to your web server (or reference it directly from &lt;a href="http://static.fortes.com/projects/silverlight/sistr/sistr.js"&gt;this site&lt;/a&gt;).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a zip file with the font(s) you wish to use. Upload this to your webserver as well (Silverlight will only use fonts that are retrieved via HTTP).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Add the following into your HTML page:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;sistr.js&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In your CSS file, define a new class called &lt;code&gt;sistr-replace&lt;/code&gt; (anything that starts with "sistr-" works). Here's an example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nc"&gt;.sistr-replace&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Use the &lt;code&gt;font-family&lt;/code&gt; property to set the font name and URL to the font files, enclose them in quotes and separate with the "|" character (e.g. &lt;code&gt;font-family: "Fil's Font|filfont.zip"&lt;/code&gt;). Make sure you also specify backup fonts for users who don't have Silverlight installed, like so:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nc"&gt;.sistr-replace&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;font-family&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;FontName|fonts.zip&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Verdana&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Arial&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Sans&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set the &lt;code&gt;class&lt;/code&gt; property on some of your HTML elements to &lt;code&gt;sistr-replace&lt;/code&gt; (or whatever else you used) and re-load. For example:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span class="nt"&gt;&amp;lt;h3&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;entry-title sistr-replace&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Hello World!&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Your text should now be rendered using Silverlight.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Take a look at the &lt;a href="http://static.fortes.com/projects/silverlight/sistr/side-by-side.html"&gt;demo test page&lt;/a&gt; as well.&lt;/p&gt;
&lt;h3 id="pros-cons-vs-sifr"&gt;Pros &amp;amp; Cons vs. sIFR&lt;/h3&gt;
&lt;p&gt;Pro:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simpler setup&lt;/strong&gt;: All you need to do is include the &lt;tt&gt;sistr.js&lt;/tt&gt; file in your page and edit your CSS -- you do not need to edit any Silverlight or JavaScript code. sIFR is pretty easy too, but you need the Flash editing program in order to create a SWF file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Support for Transparent Backgrounds&lt;/strong&gt;: sIFR provides partial support, but it's not recommended within Firefox (I believe this is an issue with Flash).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Con:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Lack of Silverlight Install Base&lt;/strong&gt;: Silverlight is nowhere near as common as Flash.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No protection for Font Files&lt;/strong&gt;: In order to use a custom font with Silverlight, you have to have the font file available for download on a web server -- you cannot embed it or protect it in any way. This means you must use fonts that you either created or are liberally licensed (public domain, etc).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Immature&lt;/strong&gt;: Both Flash and sIFR are much, much more mature than Silverlight and Sistr. There are many bugs that I have not sorted out yet.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Many limitations&lt;/strong&gt;: See below&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Known Issues&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No support for line height&lt;/strong&gt;: Limitation in Silverlight&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Must use absolute units for &lt;code&gt;font-size&lt;/code&gt; in IE&lt;/strong&gt;: Due to IE's lack of a &lt;code&gt;getComputedStyle&lt;/code&gt; equivalent.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Occasional sizing issues&lt;/strong&gt;: I think this may be a Silverlight bug, but occasionally text will get cut off in the vertical direction. Not sure how to fix it yet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Font size doesn't respond to user changes&lt;/strong&gt;: Works fine if you reload though&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No support for &lt;code&gt;:hover&lt;/code&gt; state&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;No support for nested hyperlinks&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Text selection does not work&lt;/strong&gt;: Not sure how screen readers react either&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cannot support nested bold in Firefox&lt;/strong&gt;: Works in IE though&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let me know if you find others -- or want to help fix bugs!&lt;/p&gt;
    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/cygQZfqLG2OAUu46D-Hoi91IZUg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cygQZfqLG2OAUu46D-Hoi91IZUg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/cygQZfqLG2OAUu46D-Hoi91IZUg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/cygQZfqLG2OAUu46D-Hoi91IZUg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.fortes.com/~ff/fortes?a=yN4izdb-viA:KFOv6AW6mUg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=yN4izdb-viA:KFOv6AW6mUg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.fortes.com/~ff/fortes?a=yN4izdb-viA:KFOv6AW6mUg:xS8MUs9gyKI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=yN4izdb-viA:KFOv6AW6mUg:xS8MUs9gyKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/fortes/~4/yN4izdb-viA" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.fortes.com/2007/introducing-sistr</feedburner:origLink></entry>

    
      <entry>
    <title>Adobe OnAir Seattle</title>
    <link rel="alternate" type="text/html" href="http://feeds.fortes.com/~r/fortes/~3/-x0ivqTXeZE/adobe-onair-seattle" />
    <id>tag:www.fortes.com,2007-07-11:ag1mb3J0ZXNkb3RibG9ncgoLEgRJdGVtGGYM</id>
    <updated>2010-02-12T15:36:30Z</updated>
    <published>2007-07-11T12:00:00Z</published>
    <content type="html">
        &lt;p class="img photo"&gt;&lt;a href="http://static.fortes.com/2007/07/adobe-air-roadmap.jpg"&gt;&lt;img src="http://static.fortes.com/2007/07/adobe-air-roadmap-thumb.jpg" alt="Adobe AIR product roadmap" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I went to &lt;a href="http://onair.adobe.com/schedule/cities/seattle.php"&gt;Adobe's OnAir Seattle&lt;/a&gt; yesterday, which was a really interesting event that I'd recommend attending if you have the time. Unfortunately, I had to leave before the end of the day, but here's a summary of the notes I took while I was there.&lt;/p&gt;
&lt;h3&gt;The Big Picture&lt;/h3&gt;

&lt;p&gt;Adobe's goal is to let web developers can use their existing skills (&lt;abbr title="HyperText Markup Language"&gt;HTML&lt;/abbr&gt;, &lt;abbr title="Cascading StyleSheets"&gt;CSS&lt;/abbr&gt;, JavaScript, Flash, and Flex) to create desktop applications. &lt;a href="http://labs.adobe.com/technologies/air/"&gt;&lt;abbr title="Adobe Integrated Runtime"&gt;AIR&lt;/abbr&gt;&lt;/a&gt; (formerly Apollo) provides cross-platform installation and application updates, a local database, and a variety of new APIs for managing local resources (local file access, controlling window chrome, drag and drop, etc). The Adobe guys were clear that this isn't about porting existing web sites onto the desktop -- assets and web services will obviously be re-used, but the emphasis was on not needing to learn new technologies (just a few new APIs).&lt;/p&gt;
&lt;h3&gt;Interesting Tidbits / Nerdy Technical Details&lt;/h3&gt;

&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Installation: &lt;/strong&gt;Applications are installed via a single &lt;tt&gt;.air&lt;/tt&gt; file. Installed applications can be removed just like normal applications (i.e. via Add/Remove Programs on Windows, or by throwing the application in the trash on the Mac). An &lt;a href="http://www.andrewwooldridge.com/blog/2007/06/air-express-install-example.html"&gt;express install&lt;/a&gt; (which can bootstrap the AIR runtime) and detection is also possible via Flash.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Application Updates: &lt;/strong&gt;AIR will provide support for automatic application update checking and upgrading.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;HTML Rendering: &lt;/strong&gt;Adobe chose the WebKit HTML engine (used by Safari and Konqueror) specifically because of it's size and speed. Someone asked if they were considering moving to Firefox at some point, and they were clear that Firefox just couldn't meet their size requirements for mobile.This cements WebKit's position as the number three browser family (sorry Opera).&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;PDF Support: &lt;/strong&gt;Requires Adobe Reader 8.1 -- unlike HTML and Flash support, the Adobe Reader must be installed separately (I'm not sure what happens if it's not installed).&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;HTML / Flash Integration:&lt;/strong&gt; It looks like Adobe's done a good job integrating the two -- you can make script calls between the two, and there don't appear to be any visual differences between the technologies. I'm not sure about PDF though, I'll need to look into that.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Script Engine: &lt;/strong&gt;They're using the &lt;a href="http://www.mozilla.org/projects/tamarin/"&gt;Tamarin JavaScript engine&lt;/a&gt;, which is far faster than what's in browsers today. They showed a demo of &lt;a href="http://preview.getbuzzword.com/"&gt;BuzzWord&lt;/a&gt;, a word-processing program built on Flash, which implements their own line layout and pagination APIs that run pretty fast thanks to the JS engine. The Mozilla team plans to use Tamarin in Firefox version 4.0.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;SQLite: &lt;/strong&gt;This must be fairly new, because none of the talks or demos I saw were using the local database. Adobe did mention that they're working with Google to make sure they're API-compatible with &lt;a href="http://gears.google.com/"&gt;Google Gears&lt;/a&gt;, which also uses SQLite.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Native Windows:&lt;/strong&gt; Can create native windows, or go chrome-less windows with transparency that give full-freedom (at the potential cost of consistency with other applications on that OS).&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Plugin Support: &lt;/strong&gt;Currently only Flash and PDF can be embedded within HTML. Adobe says they're open to feedback as far as other plugins (QuickTime was requested by a member of the audience).&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;SDK and Tools&lt;/strong&gt;: Adobe already has mature tools with the Flash authoring environment, Flex builder, and Dreamweaver. They making sure to adding support for creating AIR packages (which are ZIP files) in their existing products, lowering the learning curve for developers. Command-line tools for packaging AIR files are provided as well.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Adoption Rates:&lt;/strong&gt; Adobe made sure to mention how quickly new versions of Flash get adopted by users -- they get 85% penetration within 9 months, which is quite impressive. Obviously, it's unclear if AIR could get this&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Linux Support: &lt;/strong&gt;Planned in late 2008. Adobe says they've been waiting for the latest version of Flash for Linux before they port AIR.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Random Notes: &lt;/strong&gt;Built-in support for associating file types at install time, don't need admin rights to install AIR or AIR applications, events for regaining network connection, file dialogs, drag and drop support, use PNGs instead of dealing with .ico files, and Creative Commons licensing for the books.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;MS vs. Adobe: My Take&lt;/h3&gt;

&lt;p&gt;This is the right strategic move for Adobe. They've managed to attack the biggest weaknesses of their chief competition, &lt;a href="http://wpf.netfx3.com/"&gt;Microsoft's &lt;abbr title="Windows Presentation Foundation"&gt;WPF&lt;/abbr&gt;&lt;/a&gt;, by being cross-platform and leveraging existing technologies already used by web developers. Using existing technologies also means there are many mature tools for both designers and developers coding in HTML/Flash, which is not the case with WPF. Adobe made a good choice not trying to boil the ocean with a lot of new technology.&lt;/p&gt;
&lt;p&gt;Granted, WPF's target market is a bit different than AIR's (there are a large number of WinForms developers already using .NET technologies), but for web developers the learning curve and lack of cross-platform support made WPF a non-starter (notice how much &lt;a href="http://www.techcrunch.com/tag/silverlight/"&gt;more interest&lt;/a&gt; Silverlight has recieved in the community). Obviously, there are still many areas where WPF is superior (3D and document layout, to name two), but I think AIR's advantages more than make up for these drawbacks (from a web developer's point of view).&lt;/p&gt;
&lt;p&gt;Although still in it's infancy, Silverlight will likely become the real competitor to AIR. Although it's feature-poor in comparison to Flash, Microsoft's clearly devoting a lot of resources to catching up quickly (notice the &lt;a href="http://silverlight.net/GetStarted/"&gt;simultaneous release of 1.0 beta and 1.1 alpha&lt;/a&gt; -- which surely required &lt;em&gt;a lot&lt;/em&gt; of testing resources). Silverlight plays nicely with HTML and JavaScript, provides good language support (including trendy languages like Ruby and Python), and has a very fast script runtime as well. It already &lt;a href="http://msdn2.microsoft.com/en-us/library/bb412397.aspx"&gt;lets you go into full-screen&lt;/a&gt;, I don't think adding more windowing APIs wouldn't be a stretch. I fully expect Microsoft to move in this direction.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Obvious Disclaimer:&lt;/em&gt; I do not work for Microsoft (although I used to). I don't have any inside information. Don't take blog posts too seriously, especially ones typed hurriedly on &lt;a href="http://seattletimes.nwsource.com/html/localnews/2003783900_weather11m.html"&gt;a hot day&lt;/a&gt;.&lt;/p&gt;
    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JZ-W6z7ANXLtV3YALA1ktkzQo5U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JZ-W6z7ANXLtV3YALA1ktkzQo5U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JZ-W6z7ANXLtV3YALA1ktkzQo5U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JZ-W6z7ANXLtV3YALA1ktkzQo5U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.fortes.com/~ff/fortes?a=-x0ivqTXeZE:g6JDdhMVQDU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=-x0ivqTXeZE:g6JDdhMVQDU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.fortes.com/~ff/fortes?a=-x0ivqTXeZE:g6JDdhMVQDU:xS8MUs9gyKI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=-x0ivqTXeZE:g6JDdhMVQDU:xS8MUs9gyKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/fortes/~4/-x0ivqTXeZE" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.fortes.com/2007/adobe-onair-seattle</feedburner:origLink></entry>

    
      <entry>
    <title>Top Level Categories Plugin 1.0</title>
    <link rel="alternate" type="text/html" href="http://feeds.fortes.com/~r/fortes/~3/ieXTmfoDheY/top-level-categories-plugin-10" />
    <id>tag:www.fortes.com,2007-06-20:ag1mb3J0ZXNkb3RibG9ncgoLEgRJdGVtGGQM</id>
    <updated>2010-02-12T15:36:30Z</updated>
    <published>2007-06-20T12:00:00Z</published>
    <content type="html">
        &lt;p&gt;There's a new version of the &lt;a href="/projects/wordpress/top-level-cats/"&gt;Top Level Categories plugin&lt;/a&gt;. The changes aren't huge, but they do fix all known issues, including:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Will now work correctly with the &lt;code&gt;/%category%/%postname%&lt;/code&gt; and &lt;code&gt;%postname%&lt;/code&gt; permalink structures (this was the top request).&lt;/li&gt;
    &lt;li&gt;No longer need to manually update the permalink structure on install or uninstall.&lt;/li&gt;
    &lt;li&gt;Fixed incompatibility with some installations of the &lt;a href="http://getk2.com/"&gt;K2 theme&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the &lt;a href="/2007/02/top-level-categories-plugin-01/"&gt;previous version&lt;/a&gt; works well for you, then there is no need to upgrade.&lt;/p&gt;
&lt;h3&gt;Download&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://downloads.wordpress.org/plugin/top-level-cats.zip"&gt;Top Level Categories v1.0&lt;/a&gt; (ZIP file).&lt;/p&gt;
&lt;p&gt;Let me know if you encounter any new bugs or issues.&lt;/p&gt;
    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/lX8HmtUfdCgSxggZnvBAFDYb0xg/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lX8HmtUfdCgSxggZnvBAFDYb0xg/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/lX8HmtUfdCgSxggZnvBAFDYb0xg/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/lX8HmtUfdCgSxggZnvBAFDYb0xg/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.fortes.com/~ff/fortes?a=ieXTmfoDheY:IBq6aaI95OA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=ieXTmfoDheY:IBq6aaI95OA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.fortes.com/~ff/fortes?a=ieXTmfoDheY:IBq6aaI95OA:xS8MUs9gyKI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=ieXTmfoDheY:IBq6aaI95OA:xS8MUs9gyKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/fortes/~4/ieXTmfoDheY" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.fortes.com/2007/top-level-categories-plugin-10</feedburner:origLink></entry>

    
      <entry>
    <title>Font Rendering Across Rich Platforms</title>
    <link rel="alternate" type="text/html" href="http://feeds.fortes.com/~r/fortes/~3/71KtIaSyyd4/font-rendering-in-across-rich-platforms" />
    <id>tag:www.fortes.com,2007-05-25:ag1mb3J0ZXNkb3RibG9ncgoLEgRJdGVtGGIM</id>
    <updated>2010-02-12T15:36:30Z</updated>
    <published>2007-05-25T12:00:00Z</published>
    <content type="html">
        &lt;p&gt;Although I used to work for Microsoft on the &lt;abbr title="Windows Presentation Foundation"&gt;WPF&lt;/abbr&gt; team, I'm not tied to the platform. WPF and its alternatives (Flash, HTML, Apollo, Silverlight) each have advantages and disadvantages and choosing between them depends on your requirements. Since I'm doing a lot of work around reading experiences, I thought it was a good time to go back and re-evaluate the existing choices.&lt;/p&gt;
&lt;p&gt;In this post, we'll look at how each platform renders fonts at 9, 10, 12, and 14 points -- sizes commonly used for reading. I've used three fonts:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Verdana: The old standby, installed on many systems.&lt;/li&gt;
    &lt;li&gt;ITC Cheltenham: A serif frequently used in newspapers.&lt;/li&gt;
    &lt;li&gt;Gotham Rounded: A sans-serif that I happen to like.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For no good reason, I've placed the results in alphabetical order. First up is Flash.&lt;/p&gt;
&lt;h3&gt;Flash&lt;/h3&gt;

&lt;p&gt;Up until a few years ago, Flash used to render fonts poorly at small sizes. Most authors worked around this limitation by changing the type of anti-aliasing used when displaying fonts. Flash provides two anti-aliasing options, one for readability and the other for animation. Additionally, Flash also allows the author to disable anti-aliasing altogether, and use aliased bitmap fonts. Flash 8 introduced &lt;a href="http://www.rogerblack.com/blog/screen_fonts_from_adobes_view"&gt;a new rendering engine&lt;/a&gt; that vastly improved the quality of small-type text.&lt;/p&gt;
&lt;p&gt;At small sizes, the readability setting is (unsurprisingly) far superior to the animation setting. Here's a sample of the readability anti-aliasing for Verdana at 10 point:&lt;/p&gt;
&lt;p class="img screenshot"&gt;&lt;img src="http://static.fortes.com/2007/05/flash-verdana-10-read.png" alt="10pt Verdana in Flash readability setting" /&gt;&lt;/p&gt;

&lt;p&gt;For the same font and size, the animation setting is quite ugly:&lt;/p&gt;
&lt;p class="img screenshot"&gt;&lt;img src="http://static.fortes.com/2007/05/flash-verdana-10-anim.png" alt="10pt Verdana in Flash animation setting" /&gt;&lt;/p&gt;

&lt;p&gt;Although it creates clearly more readable results, the readability smoothing creates a strange coloring affect that can be pretty noticeable at small sizes. Here's Gotham Rounded at 9pt:&lt;/p&gt;
&lt;p class="img screenshot"&gt;&lt;img src="http://static.fortes.com/2007/05/flash-gotham-9-readability.png" alt="9pt Gotham Rounded in Flash readability setting" /&gt;&lt;/p&gt;

&lt;p&gt;On my monitor, the effect is subtle, but noticeable -- I see a bit of color around the edges of the letters.&lt;/p&gt;
&lt;h3&gt;Flex / Apollo&lt;/h3&gt;

&lt;p&gt;Apollo (through Flex) has &lt;a href="http://livedocs.adobe.com/flex/2/docs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&amp;amp;file=00000791.html"&gt;two different font rendering engines&lt;/a&gt; -- one of which seems to be shared with Flash (the documentation is a little vague here, so feel free to correct me if I'm wrong). The other rendering engine has access to installed fonts, and is &lt;a href="http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&amp;amp;file=fonts_070_04.html"&gt;recommended for small type sizes&lt;/a&gt; -- however the quality is quite bad. From my simple tests, it seems that the fonts are always aliased, producing the jaggy look seen below:&lt;/p&gt;
&lt;p class="img screenshot"&gt;&lt;img src="http://static.fortes.com/2007/05/flex-verdana-10.png" alt="10pt Verdana in Flex" /&gt;&lt;/p&gt;

&lt;p&gt;This aliased look is acceptable for some fonts, such as Verdana, that have reasonable bitmap representations at small sizes. However, for many fonts the result is unacceptable, such as this sample of Cheltenham at 10 point (from Flash set to bitmap, not Flex):&lt;/p&gt;
&lt;p class="img screenshot"&gt;&lt;img src="http://static.fortes.com/2007/05/flash-cheltenham-10-bitmap.png" alt="10pt Cheltenham, Bitmap mode in Flash" /&gt;&lt;/p&gt;

&lt;p&gt;Except for extreme cases, it looks like it's best to use the Flash font rendering system when writing an Apollo (or Flex) application. &lt;em&gt;(Once again, I'm under-educated in the Apollo and Flex realms, feel free to drop some knowledge in the comments)&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;HTML&lt;/h3&gt;

&lt;p&gt;On my machine, the Firefox and Internet Explorer 6 both rendered extremely similar results. The Firefox rendering is shown below:&lt;/p&gt;
&lt;p class="img screenshot"&gt;&lt;img src="http://static.fortes.com/2007/05/html-cheltenham-10.png" alt="10pt Cheltenham in Firefox" /&gt;&lt;/p&gt;

&lt;p&gt;The lack of subpixel positioning destroys the serif font at small sizes. You can see the effect at larger sizes as well -- here is Cheltenham at 14 point:&lt;/p&gt;
&lt;p class="img screenshot"&gt;&lt;img src="http://static.fortes.com/2007/05/html-cheltenham-14.png" alt="14pt Cheltenham in Firefox" /&gt;&lt;/p&gt;

&lt;p&gt;You can see the strange letter spacing in the first line -- compare "Marketing" and "cross" to see the difference.&lt;/p&gt;
&lt;p&gt;The sans-serif fonts fared better in the browser, with Verdana doing particularly well as it was &lt;a href="http://www.will-harris.com/verdana-georgia.htm"&gt;specifically tuned for on-screen use&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Internet Explorer 7 &lt;a href="http://blogs.msdn.com/ie/archive/2006/02/03/524367.aspx"&gt;uses ClearType&lt;/a&gt; for its font rendering, and should therefore produce results that are nearly identical to WPF.&lt;/p&gt;
&lt;h3&gt;Silverlight&lt;/h3&gt;

&lt;p&gt;Silverlight is the least mature of the platforms (since Apollo leverages both Flex and Flash). The 1.1 Alpha version that I tested unfortunately does not support for the Adobe CFF font format -- meaning I was unable to test Cheltenham or Gotham Rounded. Silverlight doesn't use the ClearType algorithm used by WPF, instead it uses &lt;a href="http://silverlight.net/forums/t/454.aspx"&gt;gray scale anti-aliasing with gamma correction&lt;/a&gt;. The results are generally good, with the clear weakness being at small sizes. Here is Verdana at 9pt in Silverlight:&lt;/p&gt;
&lt;p class="img screenshot"&gt;&lt;img src="http://static.fortes.com/2007/05/silverlight-verdana-9.png" alt="9pt Verdana in Silverlight" /&gt;&lt;/p&gt;

&lt;p&gt;At this small size, Verdana looks a bit fuzzy. The effect is less noticeable at 10 point, but still there.&lt;/p&gt;
&lt;h3&gt;WPF&lt;/h3&gt;

&lt;p&gt;All text in WPF is rendered with ClearType -- developers have no way of opting out of this (actually, there is a way, but it's pretty awkward and not really well known). The quality of text at small sizes is impressive, here's Gotham Rounded at 9pt in WPF:&lt;/p&gt;
&lt;p class="img screenshot"&gt;&lt;img src="http://static.fortes.com/2007/05/wpf-gotham-9.png" alt="10pt Cheltenham, Bitmap mode in Flash" /&gt;&lt;/p&gt;

&lt;p&gt;It's slightly fuzzy and a bit gray, but overall a bit better than the &lt;a href="http://static.fortes.com/2007/05/flash-gotham-9-readability.png"&gt;flash version&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;Verdict&lt;/h3&gt;

&lt;p&gt;Overall, the results are pretty good. The only engine with poor results is the native Flex engine, but with support for Flash, there's a clear, easy to use alternative at your disposal.&lt;/p&gt;
&lt;p&gt;Although the browsers work quite well with standard web fonts (and any other specifically tuned for small sizes), they are not an acceptable choice for traditional print fonts -- especially Serif faces (Internet Explorer 7 being the exception). Considering the lack of cross-browser font-embedding, this probably isn't a problem for most.&lt;/p&gt;
&lt;p&gt;Silverlight is still a baby in this space, and it shows (there's currently no way to set line height, for example). The anti-aliasing looks pretty good at larger sizes, but is noticeably fuzzy at smaller sizes. Although it's better than what most browsers provide, it still has a way to go before catching up to Flash and WPF.&lt;/p&gt;
&lt;p&gt;The final two contenders are Flash and WPF -- and it's a close call when it comes to rendering. Here are three side-by-side samples for WPF and Flash. The first is Verdana at 9 point (all samples show Flash with readability anti-aliasing):&lt;/p&gt;
&lt;p class="img screenshot"&gt;&lt;img src="http://static.fortes.com/2007/05/wpf-flash-verdana-9.png" alt="WPF vs. Flash for Verdana 9 point" /&gt;&lt;/p&gt;

&lt;p&gt;Although the Flash version has a nicer color, the WPF wins by a hair here, for being a bit smoother and less blurry (look at the "B" in "Branding" in the Flash version, third line from the bottom). Let's move on to Gotham Rounded at 9pt:&lt;/p&gt;
&lt;p class="img screenshot"&gt;&lt;img src="http://static.fortes.com/2007/05/wpf-flash-gotham-9.png" alt="WPF vs. Flash for Gotham Rounded 9 point" /&gt;&lt;/p&gt;

&lt;p&gt;Once again, Flash has stronger lines that WPF, but it's uneven and has a bit of color fringing. Finally, let's look at Cheltenham at 12 point:&lt;/p&gt;
&lt;p class="img screenshot"&gt;&lt;img src="http://static.fortes.com/2007/05/wpf-flash-cheltenham-12.png" alt="WPF vs. Flash for Cheltenham 12 point" /&gt;&lt;/p&gt;

&lt;p&gt;This time, WPF is a bit darker than Flash. This one is really a toss-up and depends on personal preference. Flash is a bit sharper, but the WPF version is smoother and more consistent.&lt;/p&gt;
&lt;p&gt;Overall, I think WPF has the edge when it comes to font rendering, although it's quite close and could easily come down to user preference.&lt;/p&gt;
&lt;h3&gt;Next Steps&lt;/h3&gt;

&lt;p&gt;This analysis is a bit rough, there's a bunch on my to-do list here, including:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Testing FlashType in Flex and Apollo&lt;/li&gt;
    &lt;li&gt;Testing non-CFF fonts in Silverlight&lt;/li&gt;
    &lt;li&gt;IE 7, Mac OS, and Ubuntu screenshots&lt;/li&gt;
    &lt;li&gt;More fonts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also, the font rendering is just &lt;em&gt;one&lt;/em&gt; aspect of a user's reading experience. Obviously layout, performance, installation, and many other factors come in to play here. Subscribe to &lt;a href="/feed"&gt;feed&lt;/a&gt; to make sure you don't miss the next installments.&lt;/p&gt;
&lt;h3&gt;Raw Results&lt;/h3&gt;

&lt;p&gt;If you're interested, here are the screenshots from each test application, in PNG format: &lt;a href="http://static.fortes.com/2007/05/fontrendering.zip"&gt;fontrendering.zip&lt;/a&gt; (Zip, 500K)&lt;/p&gt;
    
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/IKYbd2aTkDP6cmJUlceu56BUO_8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IKYbd2aTkDP6cmJUlceu56BUO_8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/IKYbd2aTkDP6cmJUlceu56BUO_8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/IKYbd2aTkDP6cmJUlceu56BUO_8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.fortes.com/~ff/fortes?a=71KtIaSyyd4:tYM8wNjO2kg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=71KtIaSyyd4:tYM8wNjO2kg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.fortes.com/~ff/fortes?a=71KtIaSyyd4:tYM8wNjO2kg:xS8MUs9gyKI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/fortes?i=71KtIaSyyd4:tYM8wNjO2kg:xS8MUs9gyKI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/fortes/~4/71KtIaSyyd4" height="1" width="1"/&gt;</content>
<feedburner:origLink>http://www.fortes.com/2007/font-rendering-in-across-rich-platforms</feedburner:origLink></entry>

    
  
</feed>
