<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="wordpress/2.0.5" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>KevLinDev Blog</title>
	<link>http://www.kevlindev.com/blog</link>
	<description>A Blog by Kevin Lindsey</description>
	<pubDate>Wed, 02 Jun 2010 19:05:08 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.0.5</generator>
	<language>en</language>
			<item>
		<title>JS PNG on GitHub</title>
		<link>http://www.kevlindev.com/blog/?p=75</link>
		<comments>http://www.kevlindev.com/blog/?p=75#comments</comments>
		<pubDate>Wed, 30 Sep 2009 14:36:17 +0000</pubDate>
		<dc:creator>Thelonious</dc:creator>
		
		<category>SVG</category>

		<category>JavaScript</category>

		<guid isPermaLink="false">http://www.kevlindev.com/blog/?p=75</guid>
		<description><![CDATA[In a continuing effort to make KevLinDev code more accessible, I&#8217;ve moved the JS PNG project to GitHub: JS-PNG. Quite honestly, I don&#8217;t recall why I even wrote this code. Most likely, it was just a curiosity to see if it could be done.
I was contacted by Paul Kienzle (sorry, no link), who is using [...]]]></description>
			<content:encoded><![CDATA[<p>In a continuing effort to make KevLinDev code more accessible, I&#8217;ve moved the JS PNG project to GitHub: <a href="http://github.com/thelonious/JS-PNG">JS-PNG</a>. Quite honestly, I don&#8217;t recall why I even wrote this code. Most likely, it was just a curiosity to see if it could be done.</p>
<p>I was contacted by Paul Kienzle (sorry, no link), who is using this code for client-side rendering when other options (like canvas) are not available to him. He has made a number of optimizations which I hope he will be able to get up on GitHub, either in &#8220;master&#8221; or in a fork.</p>
<p>To give you an idea of Paul&#8217;s speed improvements, he&#8217;s seen original speeds of 1.8s for a 400&#215;400 plot drop down to 0.25s. Amazing! However, it turns out that the actual decoding step performed by some browsers becomes the bottleneck. I would not have expected that.
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevlindev.com/blog/?feed=rss2&amp;p=75</wfw:commentRss>
		</item>
		<item>
		<title>JSDrawing on GitHub</title>
		<link>http://www.kevlindev.com/blog/?p=74</link>
		<comments>http://www.kevlindev.com/blog/?p=74#comments</comments>
		<pubDate>Tue, 29 Sep 2009 15:15:00 +0000</pubDate>
		<dc:creator>Thelonious</dc:creator>
		
		<category>SVG</category>

		<category>JavaScript</category>

		<guid isPermaLink="false">http://www.kevlindev.com/blog/?p=74</guid>
		<description><![CDATA[Earlier in the month, I moved the JSDrawing code to GitHub and I failed to mention that here. That project was really more of an experiment, or an excuse for an experiment, so I could test the Aptana JS Editor in the early days of its development.
This project uses my SVG path parser to fire [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier in the month, I moved the JSDrawing code to GitHub and I failed to mention that here. That project was really more of an experiment, or an excuse for an experiment, so I could test the Aptana JS Editor in the early days of its development.</p>
<p>This project uses my SVG path parser to fire events on a renderer as the path data is being parsed. The renderer uses the highest-order curves supported by a given target to plot whatever is being asked of it. For example, if a render target supports only moveto and lineto drawing primitives, the renderer will tesselate beziers thus adding support for those curves where they didn&#8217;t originally exist. It&#8217;s pretty rough, but I was able to render to DIVs, Flash, inline SVG, and VML, in some cases using pre-exising libraries for the actual renderering.</p>
<p>I had all sorts of plans for the code, but, alas, time isn&#8217;t alway cooperative. One area I thought would be interesting in which to experiment would be to convert the stroke of a path to a path itself. In this sense, JSDrawing could be used as an effects pipeline, allowing for ideas like stroking a stroke, in the spirit of Vector Effects..and the end result could be in turn SVG itself. Anyway, JSDrawing might prove to be interesting to some folks out there. You can find that bits at <a href="http://github.com/aptana/jsdrawing">JSDrawing</a> on GitHub.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevlindev.com/blog/?feed=rss2&amp;p=74</wfw:commentRss>
		</item>
		<item>
		<title>DigiMemo 692 to SVG Conversion Utility on GitHub</title>
		<link>http://www.kevlindev.com/blog/?p=73</link>
		<comments>http://www.kevlindev.com/blog/?p=73#comments</comments>
		<pubDate>Sun, 27 Sep 2009 20:48:36 +0000</pubDate>
		<dc:creator>Thelonious</dc:creator>
		
		<category>SVG</category>

		<category>JavaScript</category>

		<guid isPermaLink="false">http://www.kevlindev.com/blog/?p=73</guid>
		<description><![CDATA[Hi Folks,
Long time, no blog. I guess that&#8217;s the nature of tech interests and all that. However, I&#8217;ve been delightfully surprised to continue to receive emails over the years from people that have found bits and pieces of the site useful&#8230;even after begin dormant for almost 6 years!
In an effort to increase visibility of some [...]]]></description>
			<content:encoded><![CDATA[<p>Hi Folks,</p>
<p>Long time, no blog. I guess that&#8217;s the nature of tech interests and all that. However, I&#8217;ve been delightfully surprised to continue to receive emails over the years from people that have found bits and pieces of the site useful&#8230;even after begin dormant for almost 6 years!</p>
<p>In an effort to increase visibility of some of the more interesting code on KevLinDev and to make it easier for others to fork, branch, commit, etc., I plan to move bits and pieces to GitHub as time permits. And what better way to set priorities on what to move first than by basing my list on the gentle proddings of the emails I receive?</p>
<p>The first item to move to GitHub is my DigiMemo 692 DHW file format conversion utility which was discussed in <a href="http://www.kevlindev.com/blog/?p=58">Christmas Fun</a>. This was one of those hey-wouldn&#8217;t-this-be-neat ideas where a few hours later I ended up with a utility to take my horrible handwriting and drawings and then convert them to SVG. Well, it&#8217;s years later and now that code has been reborn on GitHub and lives at the following URL:</p>
<p><a href="http://github.com/thelonious/DM2SVG">DM2SVG</a></p>
<p>The script is quite simple and could easily be converted to other languages. One thing I always wanted to add was animation showing the drawings as they were digitized over time. So, for those of you in this very much of a niche use-case, enjoy!</p>
<p>P.S. Thanks go to David Yonge-Mallo for reminding me of this project. He has a <a href="http://stargrads.net/blogs/davinci/2009/09/converting-digimemo-files-to-jarnal-format/">nice blog post</a> up that uses a variant of my code to generate Jarnal files.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevlindev.com/blog/?feed=rss2&amp;p=73</wfw:commentRss>
		</item>
		<item>
		<title>Objects and SetTimeout</title>
		<link>http://www.kevlindev.com/blog/?p=72</link>
		<comments>http://www.kevlindev.com/blog/?p=72#comments</comments>
		<pubDate>Mon, 26 Feb 2007 01:30:47 +0000</pubDate>
		<dc:creator>Thelonious</dc:creator>
		
		<category>JavaScript</category>

		<guid isPermaLink="false">http://www.kevlindev.com/blog/?p=72</guid>
		<description><![CDATA[I got an interesting question from Chris Coggins regarding the use of objects and setTimeout. Oftentimes, we want state associated with each invocation of the timeout handler. The challenge comes from the fact that when our setTimeout code fires, it runs as if it were defined in the global scope. This means we only have [...]]]></description>
			<content:encoded><![CDATA[<p>I got an interesting question from <a title="Christopher Coggin's Site" href="http://www.christophercoggins.com">Chris Coggins</a> regarding the use of objects and setTimeout. Oftentimes, we want state associated with each invocation of the timeout handler. The challenge comes from the fact that when our setTimeout code fires, it runs as if it were defined in the global scope. This means we only have access to what&#8217;s available in that scope: global properties.</p>
<p>Ideally, setTimeout could fire a function as if it were a method. That would make &#8220;this&#8221; inside the function&#8217;s body refer to the particular instance firing the function. That in turn would give us something to which we could attach state for each setTimeout invocation. Unfortunately, that&#8217;s not an option with today&#8217;s implementation of setTimeout, so we need a workaround.</p>
<p>In the past, I would enqueue the object containing my state, call setTimeout, and then dequeue the object in the timer handler. This gets a bit ugly since you have to maintain arrays (still somewhat globally) and it&#8217;s fairly easy to imagine a situation where two setTimeouts can interfere with one another if they share the same array. We get around these issues via a JavaScript closure.</p>
<p>The first important point is that setTimeout implementations allow the first parameter to be a function reference as opposed to a string. The second important point is that we can make a closure by creating a function literal. The closure allows our function literal to access variables that were in its scope when it was defined. To make this a bit clearer, let&#8217;s create a Person object that counts down at a regular interval.</p>
<blockquote><p>function Person(name, count) {<br />    this.name = name;<br />    this.count = count;<br />}</p>
<p>Person.prototype.countDown = function() {<br />    var self = this;<br />    var process = function() {<br />        println(self.name + &#8220;: &#8221; + self.count);</p>
<p>        self.count&#8211;;</p>
<p>        if (self.count > 0) {<br />            self.countDown();<br />        }<br />    }</p>
<p>    setTimeout(process, 500);<br />}</p>
</blockquote>
<p>When the &#8220;process&#8221; function is called via setTimeout() &#8220;this&#8221; would refer to global instead of our Person instance. We create a &#8220;self&#8221; local variable as a sibling to the function literal. This makes &#8220;self&#8221; visible to the function literal&#8217;s body regardless of where it actually executes. This is one of the beauties of closures. We have effectively glued the active Person instance to the &#8220;process&#8221; function, so when it fires, it can access that instance.</p>
<p>To make sure we really have multiple contexts, we can test with something like the following:</p>
<blockquote><p>function init() {<br />    var john = new Person(&#8221;John&#8221;, 3);</p>
<p>    john.countDown();</p>
<p>    // delay the other counter<br />    setTimeout(init2, 250);<br />}</p>
<p>function init2() {<br />    var sarah = new Person(&#8221;Sarah&#8221;, 5);</p>
<p>    sarah.countDown();<br />}</p>
</blockquote>
<p>You can see a sample at:</p>
<p><a title="Count Down Sample" href="http://www.kevlindev.com/tutorials/javascript/inheritance/count-down.htm">/tutorials/javascript/inheritance/count-down.htm</a></p>
<p>Enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevlindev.com/blog/?feed=rss2&amp;p=72</wfw:commentRss>
		</item>
		<item>
		<title>Faster SVG Game of Life</title>
		<link>http://www.kevlindev.com/blog/?p=71</link>
		<comments>http://www.kevlindev.com/blog/?p=71#comments</comments>
		<pubDate>Sun, 03 Sep 2006 23:46:05 +0000</pubDate>
		<dc:creator>Thelonious</dc:creator>
		
		<category>SVG</category>

		<category>JavaScript</category>

		<guid isPermaLink="false">http://www.kevlindev.com/blog/?p=71</guid>
		<description><![CDATA[I recently had the honor of having an image of my black and white Game of Life published in Architectural Design&#8217;s &#8220;Programming Cultures: Art and Architecture in the Age of Software.&#8221; Honestly, I&#8217;m not quite sure why I&#8217;m in there, but I was flattered nonetheless. I found the content quite interesting and I recommend that [...]]]></description>
			<content:encoded><![CDATA[<p>I recently had the honor of having an image of my black and white Game of Life published in Architectural Design&#8217;s &#8220;Programming Cultures: Art and Architecture in the Age of Software.&#8221; Honestly, I&#8217;m not quite sure why I&#8217;m in there, but I was flattered nonetheless. I found the content quite interesting and I recommend that issue to you if you&#8217;re inspired by the possibilities of computer-generated architecture.</p>
<p>Liz and I moved back to Texas last week, so I had three days to ponder everything you can imagine as we drove through the Southwest in separate vehicles. (As an aside, it is amazingly beautiful from roughly Yuma to El Paso right now due to all the rain they&#8217;ve been getting. It&#8217;s a nice roadtrip this time of year.) Of course, I got to thinking about the Game of Life and an interesting article I read years ago about a very fast hardware approach to image convolutions. I&#8217;ve never been particularly happy with the speed of my SVG Life implementation, but, as is typical for many developers, I never really had the time to explore how to speed things up&#8230;until today. The good news is that with a minor tweak of my Bitmap object and an adaptation of the hardware technique, my implementation is about ten times faster. Even better, Opera and Firefox run about twice as fast as IE 6.</p>
<blockquote><p><a href="http://www.kevlindev.com/alife/life/life_2_0_bw.svg">http://www.kevlindev.com/alife/life/life_2_0_bw.svg</a></p>
</blockquote>
<p>And here&#8217;s the old version for reference:</p>
<blockquote><p> <a href="http://www.kevlindev.com/alife/life/life_bw.svg">http://www.kevlindev.com/alife/life/life_bw.svg</a></p>
</blockquote>
<p>The code is still in a little bit of a rough state right now, but I&#8217;m happy with the results. I&#8217;m pretty sure I could squeeze out a bit more speed, but I guess that will have to wait for another weekend&#8230;and hopefully before the next roadtrip.</p>
<p>Enjoy!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevlindev.com/blog/?feed=rss2&amp;p=71</wfw:commentRss>
		</item>
		<item>
		<title>Aptana IDE - Milestone 4</title>
		<link>http://www.kevlindev.com/blog/?p=70</link>
		<comments>http://www.kevlindev.com/blog/?p=70#comments</comments>
		<pubDate>Sun, 13 Aug 2006 16:09:51 +0000</pubDate>
		<dc:creator>Thelonious</dc:creator>
		
		<category>JavaScript</category>

		<guid isPermaLink="false">http://www.kevlindev.com/blog/?p=70</guid>
		<description><![CDATA[We just released milestone 4 of the Aptana IDE last week. This was mostly a bug fix release. (We&#8217;re going to try odd number releases for new features and even number releases for bug fixes and optimizations). However, we did squeeze in a few new features: snippets and improved XHTML support.
If you write HTML, CSS, [...]]]></description>
			<content:encoded><![CDATA[<p>We just released <a title="Aptana Milestone 4 Announcement" href="http://www.aptana.com/forums/viewtopic.php?t=236" target="_blank">milestone 4</a> of the Aptana IDE last week. This was mostly a bug fix release. (We&#8217;re going to try odd number releases for new features and even number releases for bug fixes and optimizations). However, we did squeeze in a few new features: snippets and improved XHTML support.</p>
<p>If you write HTML, CSS, and JavaScript then you should give <a title="Aptana" href="http://www.aptana.com/" target="_blank">Aptana</a> a try. You can see the IDE in action with a number of <a title="Aptana TV" href="http://www.aptana.tv/" target="_blank">screencasts</a> we&#8217;ve put up on Aptana.tv. Oh, and this is all open source and free.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevlindev.com/blog/?feed=rss2&amp;p=70</wfw:commentRss>
		</item>
		<item>
		<title>JavaScript Speed Test</title>
		<link>http://www.kevlindev.com/blog/?p=69</link>
		<comments>http://www.kevlindev.com/blog/?p=69#comments</comments>
		<pubDate>Sat, 22 Jul 2006 00:31:53 +0000</pubDate>
		<dc:creator>Thelonious</dc:creator>
		
		<category>JavaScript</category>

		<guid isPermaLink="false">http://www.kevlindev.com/blog/?p=69</guid>
		<description><![CDATA[Here&#8217;s an interesting page for testing the speed of various operations in JavaScript:
    http://www.jorendorff.com/articles/javascript/speed-test.html
]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s an interesting page for testing the speed of various operations in JavaScript:</p>
<p>    <a href="http://www.jorendorff.com/articles/javascript/speed-test.html">http://www.jorendorff.com/articles/javascript/speed-test.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevlindev.com/blog/?feed=rss2&amp;p=69</wfw:commentRss>
		</item>
		<item>
		<title>Yahoo! adds &#8220;extend&#8221; to YUI 0.11</title>
		<link>http://www.kevlindev.com/blog/?p=68</link>
		<comments>http://www.kevlindev.com/blog/?p=68#comments</comments>
		<pubDate>Sat, 15 Jul 2006 15:30:51 +0000</pubDate>
		<dc:creator>Thelonious</dc:creator>
		
		<category>JavaScript</category>

		<guid isPermaLink="false">http://www.kevlindev.com/blog/?p=68</guid>
		<description><![CDATA[Peter Michaux recently informed me that Yahoo!&#8217;s latest release of their UI library, YUI 0.11, now includes a variant of the extend method discussed on this site. Peter writes:
&#8220;Yahoo! just announced YUI 0.11 (their JavaScript library) and after I applied a little pressure they decided to use a variation of your extend function as one [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Peter's Blog" href="http://peter.michaux.ca/" target="_blank">Peter Michaux</a> recently informed me that Yahoo!&#8217;s latest release of their UI library, <a title="YUI 0.11" href="http://sourceforge.net/projects/yui/" target="_blank">YUI 0.11</a>, now includes a variant of the extend method <a title="JavaScript Inheritance" href="http://www.kevlindev.com/tutorials/javascript/inheritance/index.htm" target="_blank">discussed on this site</a>. Peter writes:</p>
<p>&#8220;<font size="2">Yahoo! just announced YUI 0.11 (their JavaScript library) and after I applied a little pressure they decided to use a variation of your extend function as one of their three most fundamental methods in the library.&#8221;</font></p>
<p><font size="2">Peter has a <a title="Class-Based Inheritance in JavaScript" href="http://peter.michaux.ca/articles/2006/06/02/class-based-inheritance-in-javascript" target="_blank">nice post</a> comparing code written with &#8220;extend&#8221; in JS versus ports written in Java and Ruby. A <a title="Good news!" href="http://peter.michaux.ca/articles/2006/06/02/class-based-inheritance-in-javascript#comments" target="_blank">comment</a> at the bottom of that page announces the latest YUI release and includes some useful links related to the project.</font></p>
<p><font size="2">Thanks for the heads-up Peter!</font>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevlindev.com/blog/?feed=rss2&amp;p=68</wfw:commentRss>
		</item>
		<item>
		<title>Sets in JavaScript</title>
		<link>http://www.kevlindev.com/blog/?p=67</link>
		<comments>http://www.kevlindev.com/blog/?p=67#comments</comments>
		<pubDate>Sun, 09 Jul 2006 16:46:50 +0000</pubDate>
		<dc:creator>Thelonious</dc:creator>
		
		<category>JavaScript</category>

		<guid isPermaLink="false">http://www.kevlindev.com/blog/?p=67</guid>
		<description><![CDATA[I had a discussion recently on ways of finding the intersection of two lists of strings in JavaScript. That reminded me of a technique I&#8217;ve used many times in Perl for various set operations. It translates well to JavaScript, so I thought it might be worth sharing with others.
The idea is simple: for each set, [...]]]></description>
			<content:encoded><![CDATA[<p>I had a discussion recently on ways of finding the intersection of two lists of strings in JavaScript. That reminded me of a technique I&#8217;ve used many times in Perl for various set operations. It translates well to JavaScript, so I thought it might be worth sharing with others.</p>
<p>The idea is simple: for each set, add a unique tag to a hash for each item in that set. Then, walk the key/value pairs of the hash and perform a comparison on each value. The comparison determines the set operation you wish to perform.</p>
<p>We start with this first function that iterates over all elements in an &#8220;items&#8221; array (we&#8217;re assuming these values are strings for this sample). Each element value serves as a property name in the &#8220;tags&#8221; object. We simply append the value of &#8220;tag&#8221; to that property&#8217;s value.</p>
<blockquote><p>function setTag(tags, items, tag) {<br />
    for (var i = 0; i < items.length; i++) {<br />
        var item = items[i];<br />
        if (tags.hasOwnProperty(item)) {<br />
            tags[item] += tag;<br />
        } else {<br />
            tags[item] = tag;<br />
        }<br />
    }<br />
}</p></blockquote>
<p>The next function is useful for many things; however, for this example, we use it to return all property names of an object whose values meet some specified criteria. We pass in a function to test each property value to determine if we want that property name in our result or not. This allows us to define all of our set operations very concisely and flexibly.
</p></blockquote>
<blockquote><p>function filter(tags, matchFunction) {<br />
    var result = [];</p>
<p>    for (var p in tags) {<br />
        if (matchFunction(tags[p])) {<br />
            result.push(p);<br />
        }<br />
    }</p>
<p>    return result;<br />
}</p></blockquote>
<p>That&#8217;s all we need to perform our set operations. So, let&#8217;s see what the intersection operation looks like.</p>
<blockquote><p>function intersect(setA, setB) {<br />
    var tags = {};</p>
<p>    setTag(tags, setA, &#8220;A&#8221;);<br />
    setTag(tags, setB, &#8220;B&#8221;);</p>
<p>    return filter(<br />
        tags,<br />
        function(value) {<br />
            return value == &#8220;AB&#8221;<br />
        }<br />
    );<br />
}</p></blockquote>
<p>We create an empty object to hold our tags for each set. We tag all items from set A with the letter &#8220;A&#8221; and likewise we tag set B items with the letter &#8220;B&#8221;. Finally, we return all property names from &#8220;tags&#8221; whose values equal &#8220;AB&#8221;. Only names that appear in both &#8220;A&#8221; and &#8220;B&#8221; will match this criteria which gives us an intersection.</p>
<p>A slightly more expanded set of operations (along with the code above) can be seen at <a href="http://www.kevlindev.com/utilities/sets/sets.svg">http://www.kevlindev.com/utilities/sets/sets.svg</a>. That file also includes some operations on 3 sets which may give insight into how this approach can be expanded beyond 2 sets.</p>
<p>It&#8217;s surprising how useful these rather simple functions can be. It all comes down to how you define the matchFunction used in the &#8220;filter&#8221; function.
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevlindev.com/blog/?feed=rss2&amp;p=67</wfw:commentRss>
		</item>
		<item>
		<title>Firefox SVG Support</title>
		<link>http://www.kevlindev.com/blog/?p=66</link>
		<comments>http://www.kevlindev.com/blog/?p=66#comments</comments>
		<pubDate>Sat, 01 Jul 2006 19:13:44 +0000</pubDate>
		<dc:creator>Thelonious</dc:creator>
		
		<category>Announcements</category>

		<category>SVG</category>

		<guid isPermaLink="false">http://www.kevlindev.com/blog/?p=66</guid>
		<description><![CDATA[I made a quick pass through many of the SVG files on my site this morning. Last week I focused on Opera 9 as the target SVG user agent. Today, I focused on Firefox 1.5. I did get a nice jump start from last weeks fixes, but so far, I&#8217;d say Opera is more pleasant to work [...]]]></description>
			<content:encoded><![CDATA[<p>I made a quick pass through many of the SVG files on my site this morning. Last week I focused on Opera 9 as the target SVG user agent. Today, I focused on Firefox 1.5. I did get a nice jump start from last weeks fixes, but so far, I&#8217;d say Opera is more pleasant to work with than Firefox.</p>
<p>A number of my samples use SMIL and, unfortunately, there appears to be no SMIL support in Firefox. I could resort to script to emulate SMIL; however, the irony is that I created many of those examples to explicitly avoid the use of script.</p>
<p>Another problem was with the use of em values in the dy attribute of &lt;text&gt; and &lt;tspan&gt; elements. Ems are useful in that they allow me to define leading independently of font size. Without them, I have to hard code the font-size. This is a bit annoying in cases where I want on-the-fly font-size changes (maybe for accessibility reasons, for example). I have to resort to DOM magic to update the attributes to match the new size and heaven forbid if I was using values like 1.25em.</p>
<p>I ran into an issue where large rectangles stopped firing mousemove events. ASV had a nice &#8220;feature&#8221; that let you define ridiculously large rectangles to get mouse events outside the browser&#8217;s window. I adopted this practice in a number of places, but Firefox didn&#8217;t like the values I was using. Fortunately, I was able to reduce the rectangle size and I started getting events again.</p>
<p>I haven&#8217;t done any performance comparisons, but it feels like ASV is fastest of the three in many cases. Firefox comes in second and Opera is the slowest. However, a few fairly CPU-intensive samples were noticably faster in Firefox which was good to see.</p>
<p>It&#8217;s really encouraging to see SVG expanding into new spaces. Lets just hope this support will continue to grow and to improve in these browsers and not go the way of ASV.
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kevlindev.com/blog/?feed=rss2&amp;p=66</wfw:commentRss>
		</item>
	</channel>
</rss>
