<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://incrementalmagic.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fincrementalmagic.spaces.live.com%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Incremental Magic</title><description>Home to "Graphite", Hans' perpetual Tablet PC graphing project</description><link>http://incrementalmagic.spaces.live.com/</link><language>en-US</language><pubDate>Sun, 16 Sep 2007 01:18:54 GMT</pubDate><lastBuildDate>Sun, 16 Sep 2007 01:18:54 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><live:identity><live:id>-3058265800159551154</live:id><live:alias>incrementalmagic</live:alias></live:identity><image><title>Incremental Magic</title><url>http://blufiles.storage.live.com/y1pmo3jAxvPj1gIW6k84ZahJGuKLQZuzqE6aXUqA81geqb6fZ-VPlyE1NTF8PMTUgCh</url><link>http://incrementalmagic.spaces.live.com/</link></image><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>The Magic: Shape "Recognition"</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!203.entry</link><description>&lt;p&gt;This is the post where I spill some of my magician's tricks. &lt;p&gt;Graphite does not use &lt;a href="http://blogs.msdn.com/gavingear/archive/2006/09/05/741536.aspx"&gt;Vista's new InkAnalysis APIs&lt;/a&gt;.  In fact, it doesn't really do true shape recognition.  The truth is almost embarassingly simple: &lt;p&gt;&lt;a href="http://tk1.storage.msn.com/x1ppUPyqopddk6xm79Ehl0RXzeY4y70oqhAKH1VIz2E2hWAnReMFct8NKuTtdrkl6BCO7ILIi09Zw_6JdgMHXHXFxP1x_rsDQdl42VwxqEFjGe9sLigO7SRBSeI8CKPItRje3R_LWj7REnadrt6ez3iew"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=228 src="http://tk1.storage.msn.com/x1ppUPyqopddk6xm79Ehl0RXzeY4y70oqhAKH1VIz2E2hWIU4q2QawcVcOixBKCY5HEQA53tjzDDUlYDz81QpverKecHbgspEwwPf_kJxjR59uFz0qSv467rcfBWhZZu4pkKy-N09QjoNxDPKvS6uhYOQ" width=240 align=left border=0&gt;&lt;/a&gt;  &lt;p&gt;public float ProbabilityStrokeIsShape(Stroke stroke)&lt;br&gt;{&lt;br&gt;    Point start = Utils.EndpointOfStroke(stroke, EndPoint.Start);&lt;br&gt;    Point end = Utils.EndpointOfStroke(stroke, EndPoint.End);&lt;br&gt;    Rectangle bounds = stroke.GetBoundingBox();  &lt;p&gt;    float diag = Utils.Distance(new Point(0, 0), new Point(bounds.Width, bounds.Height));&lt;br&gt;    float dist = Utils.Distance(start, end);  &lt;p&gt;    return (1.0f - (dist / diag));&lt;br&gt;} // (adapted from the file Utilities\ShapeRecognizer.cs)  &lt;p&gt;I'm taking a stroke, and calculating one minus the ratio of the distance between the stroke's start and end, and the length of the stroke's bounding box.  That's the core of it - the el-cheapo heuristic that motivated two years of development work in my spare time.  The key idea is that a typical shape's endpoints are near their starting points.  This is true of circles, squares, triangles, and pretty much any shape that was scrawled out in a single freehand stroke.  Contrast this with a line that connects two &amp;quot;boxes&amp;quot; - lines are drawn to connect two far-flung endpoints, so the starting points and ending points pretty much define the bounding box of the stroke.  Thus,&lt;strong&gt; if dist/diag is small, the stroke is a shape, and if dist/diag is large, it's a line.&lt;/strong&gt; &lt;p&gt;Then, there's connectors.  If you draw a stroke that ends near a box, the way I calculate whether your stroke terminates inside that box is as follows: I create a small rectangle surrounding the box, and I see if that small rectangle intersects with the bounding rect of my &amp;quot;box&amp;quot; stroke.  If there's any intersection, then the stroke might be a line that terminates inside my box/  Then, I take the bounding rect of the box and the bounding rect of the stroke, and I compute their intersection.  I then calculate the area of that intersection divided by the area of the bounding box of the stroke.  This gives me a rough idea of what percentage of the stroke's bounds overlap with my pre-existing box.   &lt;p&gt;I then do the exact same calculation on the other endpoint of the stroke. &lt;p&gt;Truthfully, though, when I'm checking if your newly drawn stroke is a connecting line, I don't actually look at the endpoints.  Instead, I look for a &amp;quot;smart&amp;quot; endpoint.  Look at the connecting line in the picture, above.  The &amp;quot;endpoint&amp;quot; of the stroke was one of the edges of the arrowhead, which is not the behavior I want.  So, I use the stroke's PolylineCusps property to get a collection of all the cusps.  I then look at each cusp, and I find the distance between each cusp and the starting point of the stroke.  I then try to find a cust that is as early in the stroke as possible, and yet is as far away from the starting point as possible.  If you look at the five blue numbers in the picture, you'll see that cusps 2, 3, 4, and 5 are the possible candidates.  3 is too close to the start, and 4 and 5 are too late in the order, so my heuristic settles on Cusp 2.  The net result is that arrowheads work the way you'd expect them to. &lt;p&gt;Think you can do better?  Why not &lt;a href="http://graphiteproject.homestead.com/download.html"&gt;download the source&lt;/a&gt; and give it a shot?&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+The+Magic%3a+Shape+%22Recognition%22&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!203.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!203.entry</guid><pubDate>Tue, 12 Sep 2006 04:54:46 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!203/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!203.entry#comment</wfw:comment><dcterms:modified>2006-09-12T04:54:46Z</dcterms:modified></item><item><title>A few notes...</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!200.entry</link><description>&lt;div&gt;I forgot to mention that Graphite will only run on Windows XP Tablet PC Edition, or on Windows Vista.  You'll need the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&amp;amp;displaylang=en"&gt;.NET Framework 2.0&lt;/a&gt; as well.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;a href="http://blog.tokash.org/"&gt;John Tokash &lt;/a&gt;says that the build that's available doesn't work properly on his Eo UMPC.  Alas, I have no UMPC to test or develop on.  UMPC devs, feel free to download the source and see what you can find!&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+A+few+notes...&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!200.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!200.entry</guid><pubDate>Tue, 12 Sep 2006 04:01:04 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!200/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!200.entry#comment</wfw:comment><dcterms:modified>2006-09-12T04:01:04Z</dcterms:modified></item><item><title>Graphite source released!</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!199.entry</link><description>&lt;p&gt;You can download Graphite's full source code at &lt;a href="http://graphiteproject.homestead.com/index.html"&gt;the new Graphite Project homepage&lt;/a&gt;, courtesy of my friend (and Graphite contributor) Gordon McNaughton.  The code is made available under a BSD-style license, so you can use it for any purpose you want, as long as you attribute the portions I wrote to me. &lt;p&gt;Non-developers can join in the fun, too.  The site also has an already-compiled copy of the Graphite executable to play with. &lt;p&gt;So what are you waiting for?  Go grab it!  And if you do anything interesting with the source, do leave a comment or drop me an email. &lt;p&gt;Meanwhile, I'm off to find a new side-project...&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+Graphite+source+released!&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!199.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!199.entry</guid><pubDate>Tue, 12 Sep 2006 03:20:06 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!199/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!199.entry#comment</wfw:comment><dcterms:modified>2006-09-12T03:47:26Z</dcterms:modified></item><item><title>Ready for release!</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!198.entry</link><description>&lt;p&gt;It's been over four months since I decided to release the source code for Graphite.  Today, I finally found the time to prepare it for release.  I removed some utility files that weren't in use any more, I commented-out the Search Dialog (which I never got around to finishing), I wrote a &amp;quot;redistribution license&amp;quot; file (basically the BSD license, with some attribution notes) and I replaced my various &amp;quot;borrowed&amp;quot; icons with el-cheapo, hand-drawn icons that I whipped up using &lt;a href="http://www.getpaint.net/"&gt;Paint.NET&lt;/a&gt;.  The Tango icons remain, thanks to their open-source license. &lt;p&gt;Behold my artistic talents. &lt;p&gt; &lt;a href="http://tk1.storage.msn.com/x1ppUPyqopddk6xm79Ehl0RXzeY4y70oqhAKH1VIz2E2hUCVKe30V2_3AFuERgjS0FlKmVFvYrjskg68EGJP4k3Cdq1KwK7EMBMCu3VettBQVcU0OM6ctZ9Qg6-XsRIbksjmTrMpexvDbQz4WR3-pfjrw"&gt;&lt;img style="border-right:0px;border-top:0px;border-left:0px;border-bottom:0px" height=240 src="http://tk1.storage.msn.com/x1ppUPyqopddk6xm79Ehl0RXzeY4y70oqhAKH1VIz2E2hWtogvjuVLIYj70Uq6uICbTIwxuLGbXoyX3GNw5_7zhsFK8oJycZai7Bm-P_3i3fDmksODgNpdRfYx5AQOl-cyzdSoE012qFbKEEBwlKxGy8g" width=203 border=0&gt;&lt;/a&gt;  &lt;p&gt;Now, all that I need to do is find a place to host the source files, and then I'll put up a link.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+Ready+for+release!&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!198.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!198.entry</guid><pubDate>Sat, 09 Sep 2006 23:38:06 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!198/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!198.entry#comment</wfw:comment><dcterms:modified>2006-09-09T23:38:06Z</dcterms:modified></item><item><title>Preparing the Graphite source for release</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!163.entry</link><description>&lt;div&gt;I've decided to publicly release the current Graphite source code, in the hopes that someone with more time on their hands might turn it into a finished product.  I'm planning to use a BSD-style license, so anyone can take the code and freely adapt it, as long as they give me (and Gordon) credit for the portions they take.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I have three things to do before I can release it:&lt;/div&gt;
&lt;div&gt;1) I want to thoroughly comment the codebase before I release it&lt;/div&gt;
&lt;div&gt;2) I need to replace all the icons and images with new images that I can distribute without violating anyones copyrights&lt;/div&gt;
&lt;div&gt;3) I need a place to to put the .zip file containing the project and source.  It's super-small (&amp;lt;200K), so this shouldn't be a big issue.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I don't have a timeline for when I'll be done with this; hopefully &amp;quot;soon&amp;quot;.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+Preparing+the+Graphite+source+for+release&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!163.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!163.entry</guid><pubDate>Sun, 07 May 2006 02:15:55 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!163/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!163.entry#comment</wfw:comment><dcterms:modified>2006-05-07T02:15:55Z</dcterms:modified></item><item><title>Inkanalysis APIs</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!159.entry</link><description>&lt;div&gt;Windows Vista introduces a new set of&lt;a href="http://msdn.microsoft.com/msdnmag/issues/06/05/AnalyzeThis/default.aspxhttp://msdn.microsoft.com/msdnmag/issues/06/05/AnalyzeThis/default.aspx"&gt; InkAnalysis APIs &lt;/a&gt;that can do shape recognition and detect box-and-line association.  Dagnabbit, I wish I'd had those two years ago when I started working on Graphite.  When Vista comes out (or at least when Beta 2 is released), I may have to rewrite Graphite from scratch to take these new tools into account.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;In the meantime, work has been keeping me *very* busy lately.  Gordon has been keeping the flame alive with a few tweaks and bugfixes, but development has basically ground to a halt.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+Inkanalysis+APIs&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!159.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!159.entry</guid><pubDate>Fri, 05 May 2006 03:57:02 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!159/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!159.entry#comment</wfw:comment><dcterms:modified>2006-05-05T03:57:02Z</dcterms:modified></item><item><title>Avalon?  Sure, why not?</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!158.entry</link><description>&lt;div&gt;
&lt;div&gt;Someone who appears to be &lt;a href="http://www.windojitsu.com/blog/"&gt;Shawn Van Ness &lt;/a&gt;left the following comment:&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;&lt;em&gt;Man, you should use a UI platform with a retained-mode graphics stack, like Avalon.  Let the MIL compositing layer will handle all that dirty-region updating for you.&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;&lt;em&gt; &lt;/em&gt;&lt;/div&gt;
&lt;div&gt;&lt;em&gt;InkCanvas even supports selection and editing of arbitrary child elements (not just ink strokes) so you might be able to save some work there too...&lt;/em&gt;&lt;/div&gt;
&lt;div&gt;&lt;em&gt;&amp;lt;/ShamelessPlug&amp;gt;&lt;/em&gt;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Shameless plug or no, Shawn, you're right on the money.  The next time I go to completely refactor Graphite, I'm going to want to port it to Avalon while I'm at it.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;From what I've read about Avalon/WPF's new Ink object model, it's a really nice, streamlined refinement over the existing Tablet PC 1.7 APIs.  I particularly like that Strokes objects stand alone, without their the tricky Ink object identity/lifetime context stuff that caused me so much trouble in 2004 when I was just getting started working on Graphite.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;And when I go to implement the PaperBox UI, with touchable controls that cause large, finger-sized tool overlays to appear and disappear, you'd better believe that I'm going to want something richer than WinForms at my disposal.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;But not right this second.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;I've played the &amp;quot;beta API game&amp;quot; with Graphite once already, when VS2005 came out.  Beta IDE, beta frameworks, beta language... it all sounded rather risky, but eventually the seductive lure of generics won be over.  I also got burned for a while when the Tablet 1.7 APIs didn't play nice with 2.0 System.Data DLL, breaking cut/copy/paste and various internal data operations that I was dependent on.  Plus, ever since &lt;a href="http://www.niallkennedy.com/blog/archives/2005/11/microsoft_mojo.html"&gt;my day job&lt;/a&gt; at Microsoft took a detour into Windows Vista, I've had more than my fill of beta environments for a little while.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;And even once I am game for it, switching platforms will require doing a lot of investigation into the Avalon/WPF libraries; hello-world projects, fishing through incomplete documentation, and whatnot.  And when the due diligence is done, I'll still have 6000 lines of existing C# code to work my way through adapting and modifying.  That sounds an awful lot like work.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Right now, the code is in a state where I can make measurable and satisfying improvements in as little time as half-an-hour.  That's an ideal state for a hobby project to be in.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Because ultimately, Graphite/PaperBox is a hobby project for me.&lt;/div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+Avalon%3f++Sure%2c+why+not%3f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!158.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!158.entry</guid><pubDate>Thu, 16 Mar 2006 07:15:10 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!158/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!158.entry#comment</wfw:comment><dcterms:modified>2006-03-16T07:15:10Z</dcterms:modified></item><item><title>It was bound to happen.</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!157.entry</link><description>&lt;div&gt;I *knew* I couldn't have been the first person to decide to use the name &amp;quot;Graphite&amp;quot; in connection with a cool drawing application.  &lt;a href="http://www.ashlar.com/sections/products/graphite/graphite.html"&gt;These guys &lt;/a&gt;appear to have a head start on me.  :-) &lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Looks like I'll be officially changing my project's name to &lt;strong&gt;Paperbox&lt;/strong&gt;.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+It+was+bound+to+happen.&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!157.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!157.entry</guid><pubDate>Thu, 16 Mar 2006 02:23:15 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!157/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!157.entry#comment</wfw:comment><dcterms:modified>2006-03-16T02:23:15Z</dcterms:modified></item><item><title>Coding my way out of a wet paper bag</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!155.entry</link><description>&lt;div&gt;&lt;font face="Geneva, Arial, Sans-serif" size=2&gt; Until about 20 minutes ago, if you were doing something interactive with the graph (drawing, resizing something, whatever), the only reason that the UI repaints is because your MVC Control was telling the View to Invalidate().&lt;span style=""&gt;  &lt;/span&gt;This meant that there were redundant Invalidate() calls all over the place.&lt;span style=""&gt;  &lt;/span&gt;I decided that it would make for a nice afternoon's project to remove these external Invalidate() calls, and instead have the Graph object itself kick up change notifications whenever its internals change.&lt;span style=""&gt;  &lt;/span&gt;The GraphPanel would listen for these notifications, and respond by calling Invalidate().&lt;/font&gt;
&lt;p&gt;&lt;font face="Geneva, Arial, Sans-serif"&gt; &lt;/font&gt;
&lt;p&gt;&lt;font face="Geneva, Arial, Sans-serif"&gt;This was all well and good until I got to the Move Selection tool.&lt;span style=""&gt;  &lt;/span&gt;This tool works by capturing new &amp;quot;packets&amp;quot; (InkCollector-speak for &amp;quot;mouse-dragged events&amp;quot;) and keeping track of the x/y delta between the first packet seen and the last packet seen.&lt;span style=""&gt;  &lt;/span&gt;It then registers itself as a &amp;quot;pre-paint handler&amp;quot; for the Graph; that is to say, the next time the Graph is asked to paint itself, the Move Selection Tool gets to so some work first.&lt;span style=""&gt;  &lt;/span&gt;It then calls Invalidate().&lt;/font&gt;
&lt;p&gt;&lt;font face="Geneva, Arial, Sans-serif"&gt; &lt;/font&gt;
&lt;p&gt;&lt;font face="Geneva, Arial, Sans-serif"&gt;Invalidate() causes a repaint event to be enqueued in the thread's message queue, if there isn't one enqueued already.&lt;span style=""&gt;  &lt;/span&gt;In between me and that message, there might be more queued NewPackets events; the tool handles them by just updating the x/y delta.&lt;span style=""&gt;  &lt;/span&gt;Notice that no real actually-change-the-internals-of-the-Graph work has been done yet.&lt;span style=""&gt;  &lt;/span&gt;The idea is that since we'll be getting spammed with Mouse Moved events, and even if we update the work &lt;/font&gt;
&lt;p&gt;&lt;font face="Geneva, Arial, Sans-serif"&gt; &lt;/font&gt;
&lt;p&gt;&lt;font face="Geneva, Arial, Sans-serif"&gt;When the Invalidate() hits, we enter the GraphPanel's paint routine, which sets up the appropriate coordinate transformations and invokes the Graph's paint routine.&lt;span style=""&gt;  &lt;/span&gt;Right then, the Move Selection Tool gets the PrePaint callback, and it uses the opportunity to actually apply the x-y deltas.&lt;span style=""&gt;  &lt;/span&gt;Then, the PrePaint callback exits, the graph paints itself into the GraphPanel, at which point the user's changes are visibly reflected.&lt;/font&gt;
&lt;p&gt;&lt;font face="Geneva, Arial, Sans-serif"&gt; &lt;/font&gt;
&lt;p&gt;&lt;font face="Geneva, Arial, Sans-serif"&gt;Except that I'm not calling Invalidate() unless and until the Graph changes.&lt;span style=""&gt;  &lt;/span&gt;So I'm never invoking the PrePaint() handler so the Graph itself doesn't change.&lt;span style=""&gt;  &lt;/span&gt;Since the Graph doesn't change, there's no change notification to prompt an Invalidate().&lt;/font&gt;
&lt;p&gt;&lt;font face="Geneva, Arial, Sans-serif"&gt; &lt;/font&gt;
&lt;p&gt;&lt;font face="Geneva, Arial, Sans-serif"&gt;Whoops.&lt;/font&gt;
&lt;p&gt;&lt;font face="Geneva, Arial, Sans-serif"&gt; &lt;/font&gt;
&lt;p&gt;&lt;font face="Geneva, Arial, Sans-serif"&gt;Workaround #1 involves putting the Invalidate() call back in, but that doesn't sit right somehow.&lt;/font&gt;
&lt;p&gt;&lt;font face="Geneva, Arial, Sans-serif"&gt;Workaround #2 involves revising the pre-paint handler mechanism; it'll probably turn into &amp;quot;SetDeferredChange(ChangeObject)&amp;quot;, which would kick up a change notification and then call the ChangeObject &lt;/font&gt;
&lt;p&gt;&lt;font face="Geneva, Arial, Sans-serif"&gt;Workaround #3 involves revisiting the whole threading model, which I just don’t feel up to right now.&lt;/font&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+Coding+my+way+out+of+a+wet+paper+bag&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!155.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!155.entry</guid><pubDate>Sun, 12 Mar 2006 01:11:32 GMT</pubDate><slash:comments>1</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!155/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!155.entry#comment</wfw:comment><dcterms:modified>2006-03-12T01:11:32Z</dcterms:modified></item><item><title>PaperBox Concept Sketch</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!154.entry</link><description>&lt;div&gt;I've added two new pictures to the gallery.  The first shows the current Graphite UI running in the UMPC Display Emulator.  As you can see, there isn't a lot of space to work with.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The second is a mockup of the PaperBox UX.  I'm no artist, so squint for a second and pretend that the orange and blue semicircles have bevelling and texturing that clearly demarks them as grabbable widgets.  By including panning widgets, by collapsing the Document Title area, and by putting the different tools right near your left thumb, this new UI attempts to put all of Graphite's tools in a place that's more accessible to a touch-screen user.  However, this new UI takes up much less screen real estate.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;See the 4-way switch on the left side?  I plan to put that to work for zoom control.  Your left thumb will be near it all the time, so you can quickly zoom in on a box (for editing its internals) and then quickly zoom back out to see the whole document (for adding new boxes and redoing their layouts.)&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+PaperBox+Concept+Sketch&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!154.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!154.entry</guid><pubDate>Sat, 11 Mar 2006 04:16:01 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!154/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!154.entry#comment</wfw:comment><dcterms:modified>2006-03-11T04:16:01Z</dcterms:modified></item><item><title>Why Graphite won't be satisfying on an Origami UMPC</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!151.entry</link><description>&lt;div&gt; 
&lt;p&gt;&lt;a href="http://blog.tokash.org/"&gt;John Tokash&lt;/a&gt; wants to run Graphite on an &lt;a href="http://origamiproject.com/default.aspx"&gt;Origami &lt;/a&gt;UMPC.&lt;span style=""&gt;&lt;font face=Verdana&gt;  &lt;/font&gt;&lt;/span&gt;John, you're welcome to try, but I don't think you'll be satisfied with the experience.
&lt;p&gt; 
&lt;p&gt;First of all, touchscreen and EMR styli are very different beasts.&lt;font face=Verdana&gt;&lt;span style=""&gt;  &lt;/span&gt;Graphite's UI is optimized for use with a pen with a barrel button and an eraser on the flip-side.&lt;span style=""&gt;  &lt;/span&gt;This gives you inking, erasing, selection (right-click to lasso), selection-movement, selection-resizing, deletion (via gestures); all without having to move your pen away from the content.&lt;span style=""&gt;  &lt;/span&gt;&lt;/font&gt;Graphite's toolbar, for those few occasions when you need it, is tucked away on the right side of the screen, occluded by a typical right-handed user's hand when the focus is on the content.
&lt;p&gt; 
&lt;p&gt;On a touchscreen, you have only one flavor of click at your immediate disposal.&lt;font face=Verdana&gt;&lt;span style=""&gt;  &lt;/span&gt;No eraser, no right-click, and no hover.&lt;span style=""&gt;  &lt;/span&gt;This means that any selection, manipulation, or anything else that's not drawing, requires a trip to the toolbar or some other piece of auxiliary UI.&lt;span style=""&gt;  &lt;/span&gt;Here, Graphite's UI causes more problems.&lt;span style=""&gt;  &lt;/span&gt;&lt;/font&gt;Putting the toolbar in an occluded region of the screen is fine when you rarely need to access it, but if you need it frequently, your hand has to constantly leave the screen so you can see - and thus effectively target - the toolbar.
&lt;p&gt; 
&lt;p&gt;Also, the combined window titlebar and Document Title Field in Graphite are 100 pixels high, which isn't a big deal when you have 1024 pixels of vertical screen real estate (as on my Thinkpad), but that same 100 pixels suddenly seems an exorbitant price to pay when you only have 480 pixels to work with.&lt;font face=Verdana&gt;&lt;span style=""&gt;  &lt;/span&gt;(And the Windows Taskbar eats another 30 pixels.)&lt;span style=""&gt;  &lt;/span&gt;&lt;/font&gt;Because there's so much less space in between, it will be difficult to put a substantive amount of boxes and lines on the screen while still leaving room for interesting details inside the box.
&lt;p&gt; 
&lt;p&gt;Put it all together, and you'll find yourself frustrated.&lt;span style=""&gt;&lt;font face=Verdana&gt;  &lt;/font&gt;&lt;/span&gt;Once the novelty wears off, you'll probably go back to just doing one-off sketches in Windows Journal or OneNote.
&lt;p&gt; 
&lt;p&gt;Fortunately, I have a solution in mind.
&lt;p&gt; 
&lt;p&gt;My working name for it is Paperbox.
&lt;p&gt; 
&lt;p&gt;(More to come this weekend...)&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+Why+Graphite+won't+be+satisfying+on+an+Origami+UMPC&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!151.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!151.entry</guid><pubDate>Fri, 10 Mar 2006 08:44:50 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!151/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!151.entry#comment</wfw:comment><dcterms:modified>2006-03-10T08:44:50Z</dcterms:modified></item><item><title /><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!142.entry</link><description>&lt;div&gt;&amp;quot;because ink rendering can be surprisingly - even dismayingly - slow.&amp;quot;&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Expecially when you're forcing two repaints of the visible document for every stroke that's drawn.  (That would be once on pen-up, and then again when the background thread reports that it's done classifying that stroke and incorporating it into the data model.)&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Excuse me while I make a one line code change.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;...&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Okay, I'm back.  And that definitely improved matters; it takes a lot more stuff on the page before the performance-cliff shows up.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Now, on to the substance of my gripe.  Jarrett &amp;amp; Su's book &lt;em&gt;Building Tablet PC Applications &lt;/em&gt;says that the Tablet PC Team benchmarked a 1.4GHz P4 reference system as being able to render 600 typical strokes per second.  That's not a whole heck of a lot, when you consider that &amp;quot;hello world&amp;quot; is ten strokes in my handwriting.  From that, let's assume that 600 strokes is approximately 120 short words.  Then, consider that a second is an achingly long time in the context of an interactive pen-based application.  Since most painting occurs in the main message loop, that's a long time when your app is unresponsive to further input.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;And while some may quibble that a P4 is cycle-by-cycle slower than the Pentium M processors in most modern Tablet PCs, I'll note that when running on batteries, my sprightly 1.5GHz Thinkpad likes to slow to 500MHz, or even to a a 1997-esque 300MHz.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Sure, there are tricks you can do.  Right now, I'm changing the ThreadedGraph class so that if it's falling behind on drawing, it doesn't commission an invalidate until it finishes catching up.  Since drawing is expensive, it's worth trying to do it as little as possible.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!142.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!142.entry</guid><pubDate>Wed, 08 Mar 2006 04:31:23 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!142/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!142.entry#comment</wfw:comment><dcterms:modified>2006-03-08T04:31:23Z</dcterms:modified></item><item><title>Origami?</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!138.entry</link><description>&lt;div&gt;John Tokash was my manager at my first coding gig.  He's got &lt;a href="http://blog.tokash.org/2006/03/07/origami-report-monday-late-night-march-5th-2006/"&gt;a great set of thoughts&lt;/a&gt; on device form-factors and on the current rumors and fragments about the impending MS Thing codenamed &amp;quot;Origami&amp;quot;.  I wish I knew more about it.  Of course, since I work for Microsoft, if I *did* know something about it, I wouldn't be able to say anything until the official announcements.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Still, this much is clear:  I want one.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Also:  If it will run Graphite, I really really want one.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Chances are, the Origami device will be a fairly low-power device with a (physically) small battery.  Right now, Graphite sucks CPU - and thus batterly life - like a ravenous beast.  I need to find ways to make my recognition algorithms less expensive, even if it means being less accurate; I also need to find ways to reduce the amount of time I spend repainting the graph, because ink rendering can be surprisingly - even dismayingly - slow.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+Origami%3f&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!138.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!138.entry</guid><pubDate>Wed, 08 Mar 2006 03:30:46 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!138/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!138.entry#comment</wfw:comment><dcterms:modified>2006-03-08T03:32:13Z</dcterms:modified></item><item><title>February 4th Update</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!137.entry</link><description>&lt;div&gt;Three hours' hacking yielded two new screenshots in the gallery.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;- When you select a group of elements, you can now resize them by grabbing on the ugly orange grab handles.&lt;/div&gt;
&lt;div&gt;- There's now a floating search dialog with an InkEdit control; type or write in your search text, and it will find the next element that matches your search.  Keep tapping &amp;quot;Find&amp;quot; to cycle through all the different candidates that were found.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;The code for both of these was pretty hacked-on, but still - two features in three hours?  I'm very pleased with the results of my last significant cleanup pass on the code.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Of course, I'm only working on these features because I'm discouraged about the amount of work it will take to get Visio export working.  I'll have to really richly understand Visio's object model and worldview before I'll be ablt to grok its XML schema.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+February+4th+Update&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!137.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!137.entry</guid><pubDate>Sun, 05 Feb 2006 01:27:36 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!137/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!137.entry#comment</wfw:comment><dcterms:modified>2006-02-05T01:27:36Z</dcterms:modified></item><item><title>January Update</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!127.entry</link><description>&lt;div&gt;Nothing but rain outside.  It's a good time of year to stay indoors and hack on things.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Recent changes:&lt;/div&gt;
&lt;div&gt;- Copy/paste between Graphite instances and other applications&lt;/div&gt;
&lt;div&gt;- Recognition is offloaded onto one or more worker threads, which helps keep ink input smooth and responsive, even when you're running on battery and your processor throttles itself back to 500MHz&lt;/div&gt;
&lt;div&gt;- Commented and cleaned up much of the code&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Like I said, a good time of year for hacking.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+January+Update&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!127.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!127.entry</guid><pubDate>Wed, 25 Jan 2006 04:58:34 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!127/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!127.entry#comment</wfw:comment><dcterms:modified>2006-01-25T04:58:34Z</dcterms:modified></item><item><title>Happy Thanksgiving</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!123.entry</link><description>&lt;div&gt;About a third of the work that I do for Graphite happens in airports and on airplanes.  Tedious waits, no internet connectivity, cramped spaces, and poor lighting?    Bah!  Five hour battery life (I *heart* Thinkpad), bright screen, and the full MSDN documentation.&lt;/div&gt;
&lt;div&gt; &lt;/div&gt;
&lt;div&gt;Latest changes:&lt;/div&gt;
&lt;div&gt;- Proper cursors for the current tool/action&lt;/div&gt;
&lt;div&gt;- Drop shadows have been removed because they take a long time to draw, replaced by simple outlines.  Drawing speed is my #1 performance issue; no amount of clever threading will mask the fact that complicated diagrams will take upwards of 500ms to draw.  I met a fellow on the Avalon On Tablets team at a training class last week, and grilled him about the issue, and he remarked that it was much faster to draw an entire Strokes collection at once than it was to draw each Stroke individually, and anecdotal evidence would seem to support that.  With that in mind, my next thing to try will be to take the strokes from all my elements and put them into one uber-collection, and draw the uber-collection all at once.&lt;/div&gt;
&lt;div&gt;- In the meantime: Elements that are outside the window's viewable area are not drawn.  Such a simple thing, with dramatic performance improvements when dealing with sprawling, multi-screen documents.&lt;/div&gt;
&lt;div&gt;- There are now two different mechanisms for deforming Connectors - one uses polar coordinates to rotate and scale, while the other independently scales the x- and y-axis.  The decision about which to use is made on a connector-by-connector basis, according to some appalingly crude heuristics that try to guess which of the two will produce better results.  The result?  Connector deformation is incrementally more magical.  Which is the point of the whole exercise.&lt;/div&gt;
&lt;div&gt;- Code quality remains high; changes are nicely compartmentalized, performance is improving bit by bit, regressions are few and far between.  All told, the the project is up to 5593 lines.  About 500 of those are autogenerated *.cs.designer files, and another ~500 are helper routines from &lt;a href="http://www.amazon.com/gp/product/0735617236/104-0025538-3030339?v=glance&amp;amp;n=283155&amp;amp;n=507846&amp;amp;s=books&amp;amp;v=glance"&gt;Jarrett &amp;amp; Su&lt;/a&gt;.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+Happy+Thanksgiving&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!123.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!123.entry</guid><pubDate>Fri, 25 Nov 2005 00:15:30 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!123/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!123.entry#comment</wfw:comment><dcterms:modified>2005-11-25T00:18:06Z</dcterms:modified></item><item><title>Some initial stuff</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!121.entry</link><description>&lt;div&gt;- Added a small gallery of screenshots from various points in the development process&lt;/div&gt;
&lt;div&gt;- Populated the current list of work items&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+Some+initial+stuff&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!121.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!121.entry</guid><pubDate>Mon, 14 Nov 2005 07:51:56 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!121/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!121.entry#comment</wfw:comment><dcterms:modified>2005-11-14T07:51:56Z</dcterms:modified></item><item><title>Welcome</title><link>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!111.entry</link><description>&lt;div&gt;Welcome to Hans Andersen's official Graphite Blog.&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+Welcome&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><comments>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!111.entry#comment</comments><guid isPermaLink="true">http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!111.entry</guid><pubDate>Mon, 14 Nov 2005 07:46:10 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://incrementalmagic.spaces.live.com/blog/cns!D58EDB7548C3A14E!111/comments/feed.rss</wfw:commentRss><wfw:comment>http://incrementalmagic.spaces.live.com/Blog/cns!D58EDB7548C3A14E!111.entry#comment</wfw:comment><dcterms:modified>2005-11-14T07:46:10Z</dcterms:modified></item><item><title>Photo Album: Graphite Screenshots-In-Progress</title><link>http://incrementalmagic.spaces.live.com/photos/cns!D58EDB7548C3A14E!105/</link><description>&lt;p&gt;Graphite Screenshots-In-Progress&lt;/p&gt;&lt;div&gt;&lt;table cellspacing="0" border="0"&gt;&lt;tr height="8"&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://incrementalmagic.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;105&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;106"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;D58EDB7548C3A14E&amp;#33;106&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;#40;July 2004&amp;#41; Earliest working version&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://incrementalmagic.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;105&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;107"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;D58EDB7548C3A14E&amp;#33;107&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;#40;July 2004&amp;#41; Some progress - one tree is highlighted based in a graph traversal&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://incrementalmagic.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;105&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;108"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;D58EDB7548C3A14E&amp;#33;108&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;#40;July 2004&amp;#41; First cut at the toolbar&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://incrementalmagic.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;105&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;110"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;D58EDB7548C3A14E&amp;#33;110&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;#40;April 2005&amp;#41; Final version of the original codebase&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://incrementalmagic.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;105&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;109"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;D58EDB7548C3A14E&amp;#33;109&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;#40;November 2005&amp;#41; &amp;#34;Graphite2005&amp;#34; - complete rewrite with Smart Arrow Detection, Multiple Undo, Save, and Load.&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://incrementalmagic.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;105&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;122"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;D58EDB7548C3A14E&amp;#33;122&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Lasso-selection in action.&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://incrementalmagic.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;105&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;126"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;D58EDB7548C3A14E&amp;#33;126&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;#40;January 2006&amp;#41; Screenshot showing a high-level diagram of the new threading model&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://incrementalmagic.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;105&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;132"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;D58EDB7548C3A14E&amp;#33;132&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;#40;February 2006&amp;#41; New ugly orange grab-handles for resizing&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://incrementalmagic.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;105&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;135"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;D58EDB7548C3A14E&amp;#33;135&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;#40;February 2006&amp;#41; First rough-cut at a search feature&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;td valign="top"&gt;&lt;p&gt;&lt;a href="http://incrementalmagic.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;105&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;152"&gt;&lt;img src="http://storage.live.com&amp;#47;items&amp;#47;D58EDB7548C3A14E&amp;#33;152&amp;#58;thumbnail" border="0"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Graphite_in_UMPC_Emulator&lt;/p&gt;&lt;/td&gt;&lt;td width="15"&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;a href="http://incrementalmagic.spaces.live.com&amp;#47;photos&amp;#47;cns&amp;#33;D58EDB7548C3A14E&amp;#33;105&amp;#47;"&gt;More Photos...&lt;/a&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+Photo+Album%3a+Graphite+Screenshots-In-Progress&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><guid isPermaLink="false">cns!D58EDB7548C3A14E!105</guid><pubDate>Sat, 11 Mar 2006 04:06:31 GMT</pubDate><msn:type>photoalbum</msn:type><live:type>photoalbum</live:type><live:typelabel>Photo album</live:typelabel><cf:itemRSS>http://incrementalmagic.spaces.live.com/photos/cns!D58EDB7548C3A14E!105/feed.rss</cf:itemRSS><dcterms:modified>2006-03-11T04:06:31Z</dcterms:modified></item><item><title>Custom List: Graphite FAQ</title><link>http://incrementalmagic.spaces.live.com/Lists/cns!D58EDB7548C3A14E!143</link><description>&lt;p&gt;Graphite FAQ&lt;/p&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;What is Graphite&amp;#63;&lt;p&gt;&lt;p&gt;Graphite is the Spiffy Codename for a tablet PC application fordrawing and manipulating flowcharts and other box-and-line graphs.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Why not use Visio&amp;#63;&lt;p&gt;&lt;p&gt;Good question.  I use Visio at work all the time to create system architecture diagrams.  The trouble with Visio is that it&amp;#39;s not really designed for real-time note taking.  I wanted a fast and fluid app that I could use while in a meeting.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;So, wouldn&amp;#39;t it be cool if you could export your Graphite document to Visio for final tweaks and publication&amp;#63;&lt;p&gt;&lt;p&gt;That&amp;#39;s the plan.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Why don&amp;#39;t you update more often&amp;#63;&lt;p&gt;&lt;p&gt;Graphite is a personal hobby project&amp;#59; I have a &amp;#34;real&amp;#34; job as a software engineer.  I update Graphite &amp;#40;and this blog&amp;#41; when I have spare time.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://graphiteproject.homestead.com&amp;#47;index.html"&gt;Where can I get Graphite&amp;#63;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Head on over to the Graphite Project homepage&amp;#33;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+Custom+List%3a+Graphite+FAQ&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><guid isPermaLink="false">cns!D58EDB7548C3A14E!143</guid><pubDate>Tue, 12 Sep 2006 03:30:30 GMT</pubDate><msn:type>list</msn:type><live:type>list</live:type><live:typelabel>List</live:typelabel><cf:itemRSS>http://incrementalmagic.spaces.live.com/Lists/cns!D58EDB7548C3A14E!143/feed.rss</cf:itemRSS><dcterms:modified>2006-09-12T03:30:30Z</dcterms:modified></item><item><title>Custom List: Graphite Work Items</title><link>http://incrementalmagic.spaces.live.com/Lists/cns!D58EDB7548C3A14E!112</link><description>&lt;p&gt;Graphite Work Items&lt;/p&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Optimize painting - dirty rects, etc.&lt;p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Implement printing&lt;p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Help Files and Documentation&lt;p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&amp;#40;done&amp;#41;Re-work toolbar to make it smaller and more pen-amenable&lt;p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&amp;#40;done&amp;#41;Implement cut, copy, &amp;#38; paste of both Graphite format and raw Ink&lt;p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&amp;#40;semi-done&amp;#41;Scrounge up some nice icons&lt;p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&amp;#40;done&amp;#41;Offload input stroke parsing onto a second thread so thatthe main thread - and thus the InkCollector - remains responsive&lt;p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=-3058265800159551154&amp;page=RSS%3a+Custom+List%3a+Graphite+Work+Items&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=incrementalmagic.spaces.live.com&amp;amp;GT1=incrementalmagic"&gt;</description><guid isPermaLink="false">cns!D58EDB7548C3A14E!112</guid><pubDate>Thu, 16 Mar 2006 07:26:31 GMT</pubDate><msn:type>list</msn:type><live:type>list</live:type><live:typelabel>List</live:typelabel><cf:itemRSS>http://incrementalmagic.spaces.live.com/Lists/cns!D58EDB7548C3A14E!112/feed.rss</cf:itemRSS><dcterms:modified>2006-03-16T07:26:31Z</dcterms:modified></item></channel></rss>