<?xml version="1.0" encoding="UTF-8"?>
<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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>toxicsoftware.com &#187; Source Code</title>
	<atom:link href="http://toxicsoftware.com/tag/source-code/feed/" rel="self" type="application/rss+xml" />
	<link>http://toxicsoftware.com</link>
	<description>RANDOMIZE USR 0</description>
	<lastBuildDate>Thu, 17 Dec 2009 15:12:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>AcornImage</title>
		<link>http://toxicsoftware.com/acornimage/</link>
		<comments>http://toxicsoftware.com/acornimage/#comments</comments>
		<pubDate>Tue, 19 Feb 2008 15:05:58 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[Acorn]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Flying Meat]]></category>
		<category><![CDATA[gus mueller has a posse]]></category>
		<category><![CDATA[Source Code]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/acornimage/</guid>
		<description><![CDATA[It was just your typical InterfaceBuilder 3 window&#8230;



with your vanilla NSImageView&#8230;



referring to an image file within an Xcode project&#8230;



Holy Cow! An Acorn file? Does that mean I can use Acorn files directly in Interface Builder 3? Does that mean you&#8217;ve written an NSCustomImageRep that understands the Acorn file format? Does that mean I can use [...]]]></description>
			<content:encoded><![CDATA[<p>It was just your typical InterfaceBuilder 3 window&#8230;</p>

<p><a href="/uploads/acornimageib3.png&quot;"><img src="/uploads/acornimageib3.thumbnail.png" alt="AcornImageIB3.png" /></a></p>

<p>with your vanilla NSImageView&#8230;</p>

<p><a href="/uploads/acornimageview.png"><img src="/uploads/acornimageview.thumbnail.png" alt="AcornImageView.png" /></a></p>

<p>referring to an image file within an Xcode project&#8230;</p>

<p><a href="/uploads/acorninxcode.png"><img src="/uploads/acorninxcode.thumbnail.png" alt="AcornInXcode.png" /></a></p>

<p><a href="http://www.hospitalgowns.com/Buy_Bouffant_Pages/A0822b.htm">Holy Cow!</a> An <a href="http://www.flyingmeat.com/acorn/">Acorn</a> file? Does that mean I can use Acorn files directly in Interface Builder 3? Does that mean you&#8217;ve written an NSCustomImageRep that understands the Acorn file format? Does that mean I can use Acorn files directly in my Cocoa projects? And that means I no longer have to keep exporting these bloody files as pngs so I can use them in Cocoa, right? Will this give rixstep some ammunition to go apeshit insane about?</p>

<p>Yes! Yes!! Yes!!! Yes!!!! Yes!!!!! Almost certainly.</p>

<p>Not only does Gus Mueller generously provide details about the <a href="http://flyingmeat.com/wikka/AcornFileFormat">Acorn file format</a>, he has even released the source code to his Acorn Quicklook plugin. This gives me everything I need to convince NSImage to load Acorn files.</p>

<p>You might well be asking yourself why. I was getting annoyed with having to constantly keep exporting original Acorn images as pngs or TIFFs so I could use them in Xcode. I&#8217;m prototyping a new application that uses a lot of custom UI elements. These elements are made up of one or more pngs, some of which needed a lot of tweaking and attention to detail to get right. Acorn is perfect for UI work (although it needs more than 2000% zoom! <em>cough</em>) but having to export as png (or another format that Cocoa understands natively) and manage two sets of images (original Acorn, exported png) was turning into a pain.</p>

<p>I&#8217;ve taken Gus&#8217; QuickLook code and wrapped a small <a href="http://developer.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSCustomImageRep_Class/Reference/Reference.html">NSCustomImageRep</a> around it. Very small. I&#8217;ve repackaged it up as a Framework so you can refer to it from an Interface Builder 3 plugin. This gives you the ability to do this:</p>

<pre><code>[NSImage imageNamed:@"IAmAnAcornFile"];
</code></pre>

<p>You should be able to use Acorn files anywhere an NSImage is used. Just embed your Acorn files in your XCode project resources and refer to them by name in your NIBs or in code.</p>

<p>I&#8217;ve put the code on my public googlecode.com subversion <a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20080219_785/Projects/Acorn/AcornImageFramework">repository</a>.</p>

<p>I&#8217;m currently on the fence about whether it is a good idea or not to ship your application with Acorn images. It certainly makes sense to me to use them during the interface design stage of application development. Once the user interface churn settles down I should be able to finalize the images and convert them to pngs or whatever (keeping the originals of course).</p>

<p>A best of both worlds solution might be to make a little command line tool that can convert Acorn files:</p>

<pre><code>#!/usr/bin/python
from AcornImage import *
# Everything else is an exercise for the reader.
</code></pre>

<p>And then automatically convert from Acorn to whatever during the Xcode build process. I might investigate this technique at a later date. But for now &#8211; have at it.</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/acornimage/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>R.I.P Toxic Progress Indicator</title>
		<link>http://toxicsoftware.com/rip_toxic_progress_indicator/</link>
		<comments>http://toxicsoftware.com/rip_toxic_progress_indicator/#comments</comments>
		<pubDate>Tue, 30 Oct 2007 13:17:26 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[toxic progress indicator]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/rip_toxic_progress_indicator/</guid>
		<description><![CDATA[Thanks to Matt Gemmell for pointing out that Apple has finally provided a pie chart style NSProgressIndicator for the circular/determinate modes. This style is new to Leopard. This means my Toxic Progress Indicator class can be retired, at least for 10.5+ only applications. Leopard has really helped to retire a lot of my code (for [...]]]></description>
			<content:encoded><![CDATA[<p>Thanks to <a href="http://mattgemmell.com/2007/10/28/get-rid-of-your-code-with-leopard">Matt Gemmell</a> for pointing out that Apple has finally provided a pie chart style NSProgressIndicator for the circular/determinate modes. This style is new to Leopard. This means my <a href="http://toxicsoftware.com/toxic_progress_indicator/">Toxic Progress Indicator</a> class can be retired, at least for 10.5+ only applications. Leopard has really helped to retire a lot of my code (for example my QuickTime Sequence Grabber code can probably be retired too) and I expect this trend to continue.</p>

<p>Toxic Progress Indicator should still be used on apps that need to run on 10.4, but I wont be supporting the class any more (not that it is really needed any support&#8230;)</p>

<div style="text-align:center;"><img src="http://toxicsoftware.com/wordpress//uploads/cocoapiechart.png" alt="CocoaPieChart.png" border="0" width="429" height="407" /></div>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/rip_toxic_progress_indicator/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>SpaceNavigator controlled Lego Mindstorms NXT</title>
		<link>http://toxicsoftware.com/spacenavigatornxt/</link>
		<comments>http://toxicsoftware.com/spacenavigatornxt/#comments</comments>
		<pubDate>Thu, 27 Sep 2007 02:50:04 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Lego]]></category>
		<category><![CDATA[Links]]></category>
		<category><![CDATA[Mindstorms]]></category>
		<category><![CDATA[NXT]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[SpaceNavigator]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/spacenavigatornxt/</guid>
		<description><![CDATA[It&#8217;s my second year of coaching a First Lego League team. The experience has been fantastic, I&#8217;m teaching 4th and 5th grade children about robots and computers, and teaching them to build and program their own robots. This year the kids are going to be learning how to use the new Lego Mindstorms NXT robot; [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s my second year of coaching a <a href="http://www.firstlegoleague.org/">First Lego League</a> team. The experience has been fantastic, I&#8217;m teaching 4th and 5th grade children about robots and computers, and teaching them to build and program their own robots. This year the kids are going to be learning how to use the new <a href="http://www.amazon.com/gp/product/B000E4FDAE?ie=UTF8&amp;tag=toxicsoftware-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B000E4FDAE">Lego Mindstorms NXT</a> robot; therefore I happen to have an NXT robot in the house. One of the cool features of the NXT is that it can communicate to a Mac (or even another NXT robot) via Bluetooth. So I thought it might be fun to take the <a href="http://www.amazon.com/gp/product/B000LB41BM?ie=UTF8&amp;tag=toxicsoftware-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B000LB41BM">3Dconnexion SpaceNavigator</a> controller device I used in my <a href="/the-intersection-of-cool-and-awesome">previous blog post</a> and use it to control an NXT Robot. Here is the result:</p>

<p><a href="http://s3.amazonaws.com/uploads.toxicsoftware.com/SpaceNavigatorNXT.mp4"><img src="http://toxicsoftware.com/wordpress/uploads/spacenavigatornxtpreview.png" alt="SpaceNavigatorNXTPreview.png" border="0" width="320" height="248" /></a></p>

<p>Although the SpaceNavigator support six degrees of freedom, I&#8217;m only using two (Y axis for forwards/reverse and RZ for turning), that leaves plenty of room for expansion (perhaps hooking up a third motor to another controller axis).</p>

<p>Although the video doesn&#8217;t show it too well, the SpaceNavigator does allow for very fine grained control over the robot (as long as the robot has fresh batteries!). The controller is extremely sensitive and with practice the robot can be controlled quite delicately.</p>

<p>Currently only one axis is dominant at a time (that&#8217;s actually a preference in the SpaceController System Preferences screen) but it is be possible to control robot steering and speed/direction at the same time. I&#8217;ll be trying that out soon.</p>

<p>There doesn&#8217;t seem to be much in the way of Mac OS X APIs for controlling NXT via Bluetooth, so I&#8217;m putting my code onto my <a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_743/Projects/NXTTest/">public subversion server</a> and releasing it (like everything else in my public repository) under the <a href="http://en.wikipedia.org/wiki/Bsd_license">BSD License</a>. The code is Leopard only (although all I&#8217;m using are some <a href="http://developer.apple.com/leopard/overview/tools.html">Objective-C 2.0</a> features, such as properties and the new for loop). The code uses Cocoa bindings/KVC and has a rather simple interface:</p>

<pre><code>robot = [[[CNXTRobot alloc] init] autorelease];
((CNXTMotor *)[robot.ports objectForKey:@"B"]).power = (int)(theMotor1 * 100.0);
((CNXTMotor *)[robot.ports objectForKey:@"C"]).power = (int)(theMotor2 * 100.0);
</code></pre>

<p>The sample NXT project relies on my <a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_743/Frameworks/ToxicWarped/">ToxicWarped</a> framework. ToxicWarped was originally created for my <a href="/">Geode</a> project and is designed to help write simple but flexible Object Oriented protocol stacks.</p>

<p>The NXT code is barely a day old, so it is very rough and ready but I&#8217;ll be tinkering with the NXT and SpaceNavigator code over the next few weeks (in my spare time) but if anyone has a use for the code and would like to contribute back that would be fantastic.</p>

<p>Update: Couldn&#8217;t stand awful <a href="http://www.youtube.com/watch?v=H4zct49Dv6Y">Youtube</a> image quality any longer. Videos are now on amazon s3.</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/spacenavigatornxt/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
<enclosure url="http://s3.amazonaws.com/uploads.toxicsoftware.com/SpaceNavigatorNXT.mp4" length="2233920" type="audio/mp4" />
<enclosure url="http://s3.amazonaws.com/uploads.toxicsoftware.com/SpaceNavigatorNXT/SpaceNavigatorNXT.mov" length="296" type="video/quicktime" />
		</item>
		<item>
		<title>The Intersection of Cool and Awesome</title>
		<link>http://toxicsoftware.com/the-intersection-of-cool-and-awesome/</link>
		<comments>http://toxicsoftware.com/the-intersection-of-cool-and-awesome/#comments</comments>
		<pubDate>Tue, 25 Sep 2007 17:37:24 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[3Dconnexion]]></category>
		<category><![CDATA[Acorn]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Flying Meat]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[SpaceNavigator]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/the-intersection-of-cool-and-awesome/</guid>
		<description><![CDATA[3Dconnexion (a division of Logitech) produces the coolest named device ever: The 3Dconnexion SpaceNavigator
. This is a 3D input device with 6 degrees of freedom, meaning you can move and rotate it through the X, Y and Z planes. I bought it originally on a whim (hey only 50 bucks!) for use with Google Sketchup [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.3dconnexion.com/">3Dconnexion</a> (a division of <a href="http://logitech.com/">Logitech</a>) produces the coolest named device ever: The <a href="http://www.amazon.com/gp/product/B000LB41BM?ie=UTF8&amp;tag=toxicsoftware-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B000LB41BM">3Dconnexion SpaceNavigator</a>
. This is a 3D input device with <a href="http://en.wikipedia.org/wiki/6_Degrees_Of_Freedom">6 degrees of freedom</a>, meaning you can move and rotate it through the X, Y and Z planes. I bought it originally on a whim (hey only 50 bucks!) for use with <a href="http://sketchup.google.com/">Google Sketchup</a> and <a href="http://earth.google.com/">Google Earth</a>. It took about twenty minutes to get competent with the device and I was soon whizzing around Manhattan inside Google Earth. The device is designed to use in your off hand with a mouse in your primary hand. This gives you a fantastic level of control in 3D applications.</p>

<p><img src="http://toxicsoftware.com/wordpress/uploads/3dx-spacenavigator.jpg" alt="3dx_spacenavigator.jpg" border="0" width="207" height="208" /></p>

<p>The software that comes with the SpaceNavigator is functional, but like a lot of hardware related software is rough around the edges. You can provide customised settings for specific applications or use global settings. You can set up macros to fire when either of the SpaceNavigator&#8217;s two buttons are pressed. Understandibly the SpaceNavigator will not appear to applications as a standard input device, so 3Dconnexion provide an <a href="http://www.3dconnexion.com/docs/3DxMacWareSDK.dmg">API</a> to allow 3rd party developers to use the device. This opens up a host of opportunities for 3rd party developers. The Space Navigator could be used in third-party applications as a jog wheel, kind of like the <a href="http://www.griffintechnology.com/products/powermate/">Griffin Powermate</a> and also as a 2D scroll wheel at the same time.</p>

<p>This leads me onto <a href="http://flyingmeat.com/acorn/">Acorn</a>, Acorn is <a href="http://gusmueller.com/">Gus Mueller&#8217;s</a> newest application. It is an awesome 2D image editor, with a healthy list of features. I consider it to be a &#8220;Photoshop for the rest of us&#8221;, and has quickly become my image editor of choice. Like Gus&#8217; <a href="http://www.flyingmeat.com/voodoopad/">VoodooPad</a>, Acorn also supports a <a href="http://flyingmeat.com/acorn/plugin.shtml">plug-in architecture</a>. This allow developers to extend the applications in ways Gus wouldn&#8217;t have dreamt of (although considering Gus wrote FlyGesture I&#8217;m sure he has some pretty funky dreams). I&#8217;ve created a plug-in for Acorn that uses the SpaceNavigator API to zoom and scroll around the image you&#8217;re editing. Rotating the SpaceNavigator causes the image to rotate (using the CoreImage affine transformation filter). This just touches the surface of the cool things you can do with the SpaceNavigator and an application that supports plug-ins.</p>

<p>Now for the money shots, two movies of the plug-in in action:</p>

<p><a href="http://s3.amazonaws.com/uploads.toxicsoftware.com/SpaceNavigatorAcorn.mp4"><img src="http://toxicsoftware.com/wordpress//uploads/spacenabvigatoracornpreview.png" alt="SpaceNabvigatorAcornPreview.png" border="0" width="293" height="248" /></a></p>

<p><a href="http://s3.amazonaws.com/uploads.toxicsoftware.com/SpaceNavigatorAcorn2.mp4"><img src="http://toxicsoftware.com/wordpress//uploads/spacenabvigatoracorn2preview.png" alt="SpaceNabvigatorAcorn2Preview.png" border="0" width="277" height="248" /></a></p>

<p>Source code for the plug-in is on my Google public repository <a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_743/Projects/Acorn/AcornSpaceNavigator/">link</a>, I&#8217;ve also written a Cocoa wrapper for the 3Dconnextion API (required by the Acorn plug-in): <a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_743/Projects/SpaceControllerTest/">link</a>. My Cocoa wrapper provides a much simpler interface to the device, and also provides more functionality (such as emulating a scroll wheel). I&#8217;ll be working on the wrapper more in the future.</p>

<p>All this code is a work in progress and you will probably need to massage the Xcode project to get it to compile. You&#8217;ll also need the 3Dconnexion API (and of course a SpaceController).</p>

<p>And hey look &#8211; I&#8217;m blogging again!</p>

<hr />

<p>Update: I got daringfireballed, so I&#8217;ve moved the movies onto youtube &#8211; quality sucks, but now the server seems responsive again. Links to source code fixed.</p>

<hr />

<p>Update: Movies now on Amazon S3. Youtube quality sucks so much. (videos still on Youtube <a href="http://www.youtube.com/watch?v=mad0UJOlo9Y">here</a> and <a href="http://www.youtube.com/watch?v=SQKb4qM3D5U">here</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/the-intersection-of-cool-and-awesome/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
<enclosure url="http://toxicsoftware.com/wordpress/uploads/SpaceNavigatorAcorn.mp4" length="2489441" type="video/mp4" />
<enclosure url="http://toxicsoftware.com/wordpress/uploads/SpaceNavigatorAcorn2.mp4" length="870846" type="video/mp4" />
<enclosure url="http://s3.amazonaws.com/uploads.toxicsoftware.com/SpaceNavigatorAcorn.mp4" length="2489441" type="audio/mp4" />
<enclosure url="http://s3.amazonaws.com/uploads.toxicsoftware.com/SpaceNavigatorAcorn2.mp4" length="870846" type="audio/mp4" />
		</item>
		<item>
		<title>Subversion Moved</title>
		<link>http://toxicsoftware.com/subversion-moved/</link>
		<comments>http://toxicsoftware.com/subversion-moved/#comments</comments>
		<pubDate>Sat, 04 Aug 2007 15:27:08 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[subversion]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/subversion-moved/</guid>
		<description><![CDATA[I&#8217;ve had a lot of emails asking where the subversion repository has gone.

The simple answer is I&#8217;ve stopped hosting my public subversion repository on DreamHost and have now created a Google Project for it. The project URL is:

http://code.google.com/p/toxic-public/

And the subversion root is here:

http://toxic-public.googlecode.com//

Google will be a lot more reliable than DreamHost ever will be. I [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve had a lot of emails asking where the subversion repository has gone.</p>

<p>The simple answer is I&#8217;ve stopped hosting my public subversion repository on DreamHost and have now created a Google Project for it. The project URL is:</p>

<p><a href="http://code.google.com/p/toxic-public/">http://code.google.com/p/toxic-public/</a></p>

<p>And the subversion root is here:</p>

<p><a href="http://toxic-public.googlecode.com//">http://toxic-public.googlecode.com//</a></p>

<p>Google will be a lot more reliable than DreamHost ever will be. I also get bug tracking and easy user maintenance.</p>

<p>I&#8217;ll update the broken links when I get a chance.</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/subversion-moved/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8216;Discrete&#8217; NSLevelIndicatorCell too slow</title>
		<link>http://toxicsoftware.com/discrete-nslevelindicatorcell-too-slow/</link>
		<comments>http://toxicsoftware.com/discrete-nslevelindicatorcell-too-slow/#comments</comments>
		<pubDate>Sat, 24 Jun 2006 16:30:44 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[NSLevelIndicatorCell]]></category>
		<category><![CDATA[Shark]]></category>
		<category><![CDATA[Source Code]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/discrete-nslevelindicatorcell-too-slow/</guid>
		<description><![CDATA[I recently needed to embed the &#8216;Discrete&#8217; variant of the NSLevelIndicatorCell into an NSTableView. The discrete cell looks like this:

 Unfortunately adding the cell caused drawing of the table&#8217;s window to slow to crawl. The spinning beachball of death would often appear when I was merely resizing the window. After some quick experimented I narrowed [...]]]></description>
			<content:encoded><![CDATA[<p>I recently needed to embed the &#8216;Discrete&#8217; variant of the <a href="http://www.devworld.apple.com/documentation/Cocoa/Reference/ApplicationKit/Classes/NSLevelIndicatorCell_Class/Reference/Reference.html">NSLevelIndicatorCell</a> into an NSTableView. The discrete cell looks like this:</p>

<p><img src="http://toxicsoftware.com/wordpress//uploads//Discrete.png" alt="Discrete.png" /> Unfortunately adding the cell caused drawing of the table&#8217;s window to slow to crawl. The spinning beachball of death would often appear when I was merely resizing the window. After some quick experimented I narrowed it down to something within the &#8216;Discrete&#8217; variant of the NSLevelIndicatorCell, the other variants had no such performance problems.</p>

<p>It didn&#8217;t take an expert in <a href="http://developer.apple.com/tools/sharkoptimize.html">Shark</a> to realise what was going on:</p>

<p><img src="http://toxicsoftware.com/wordpress//uploads//Shark.png" alt="" /> It looked like NSLevelIndicatorCell was perform an expensive gaussian blur per cell, possibly even for each discrete block within each cell. For a single NSLevelIndicatorCell that shouldn&#8217;t be a real problem, but for a whole table column full of them it could create major performance problems.</p>

<p>Some quick google searches showed that people had complained about poor NSLevelIndicatorCell performance before but failed to find a solution.</p>

<p>Switching to another variant of NSLevelIndicatorCell wasn&#8217;t an option, the &#8216;Discrete&#8217; variant was just too sexy. So the obvious solution was to create a subclass of NSLevelIndicatorCell that posed as the real thing, but cached the drawing code of its parent class into NSImages. So I present to the the world the imaginatively titled <a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Misc/CachingLevelIndicator/">CCachingLevelIndicatorCell</a>.</p>

<p>CCachingLevelIndicatorCell is designed to pose as NSLevelIndicatorCell but shouldn&#8217;t require any other configuration. The class will only cache images for the &#8216;Discrete&#8217; variant and will use a dictionary of NSImage objects to cache the drawing (one image per discrete value the cell can display). If any other attribute of the cell is changed the class will discard the cache and attempt to recache the drawing at the next opportunity.</p>

<p>Just so you can compare the differences in speed I&#8217;ve created two stand-alone test applications so you can compare the speed without CCachingLevelIndicatorCell and with it posing as NSLevelIndicatorCell. The binaries are checked into my <a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Misc/CachingLevelIndicator//Output/">public subversion</a>.</p>

<p>Radar bug: <a href="rdar://problem/4601201">rdar://problem/4601201</a></p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/discrete-nslevelindicatorcell-too-slow/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>ToxicMedia &amp; SequenceGrabber Stable</title>
		<link>http://toxicsoftware.com/toxicmedia_sequencegrabber_stable/</link>
		<comments>http://toxicsoftware.com/toxicmedia_sequencegrabber_stable/#comments</comments>
		<pubDate>Mon, 14 Nov 2005 04:32:34 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[toxicmedia]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[I&#8217;ve moved all the SequenceGrabber utility code into its own framework: ToxicMedia.framework, the code is available from trunk/Frameworks/ToxicMedia. All my projects that use CoreImage, CoreVideo or QTKit now depend on this framework. Now I don&#8217;t need to update 4 or 5 projects every time something changes.

I&#8217;ve also branched all the test projects and the framework. [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve moved all the SequenceGrabber utility code into its own framework: ToxicMedia.framework, the code is available from <a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Frameworks/ToxicMedia/">trunk/Frameworks/ToxicMedia</a>. All my projects that use CoreImage, CoreVideo or QTKit now depend on this framework. Now I don&#8217;t need to update 4 or 5 projects every time something changes.</p>

<p>I&#8217;ve also branched all the test projects and the framework. You can find the branch here: <a href="http://toxic-public.googlecode.com//branches/SequenceGrabber%20Stable/">branches/SequenceGrabber Stable</a>. This branch is intended to be relatively stable, I&#8217;ll make sure the code can always build and run. If you don&#8217;t feel like dealing with the churn in the trunk then this branch is for you.</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/toxicmedia_sequencegrabber_stable/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>More SequenceGrabber Updates</title>
		<link>http://toxicsoftware.com/more_sequencegrabber_updates/</link>
		<comments>http://toxicsoftware.com/more_sequencegrabber_updates/#comments</comments>
		<pubDate>Fri, 21 Oct 2005 01:11:14 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[CoreImage]]></category>
		<category><![CDATA[corevideo]]></category>
		<category><![CDATA[isight]]></category>
		<category><![CDATA[quicktime]]></category>
		<category><![CDATA[sequence grabber]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[toxicmedia]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/blog/more_sequencegrabber_updates/</guid>
		<description><![CDATA[Spurred on by interest in my Sequence Grabber source code I&#8217;ve added a whole slew of new functionality to it tonight (for various reasons this code is a lot of fun to work on). The most important change is CCoreImageView now supports Cocoa bindings and has an Interface Builder palette. This means you can easily [...]]]></description>
			<content:encoded><![CDATA[<p>Spurred on by interest in my <a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Frameworks/ToxicMedia/Samples/SequenceGrabber">Sequence Grabber</a> source code I&#8217;ve added a whole slew of new functionality to it tonight (for various reasons this code is a lot of fun to work on). The most important change is <a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Frameworks/ToxicMedia/Framework/Source/CCoreImageView.h">CCoreImageView</a> now supports Cocoa bindings and has an Interface Builder palette. This means you can easily create a view in Interface Builder and bind it to your controller/model objects without writing a line of code! <a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Frameworks/ToxicMedia/Framework/Source/SequenceGrabber/CSequenceGrabberView.h">CSequenceGrabberView</a> isn&#8217;t in the palette yet but will be soon, when it is you&#8217;ll be able add iSight support to your Cocoa application without writing any code.
I&#8217;ve spent some time simplifying and improving the sequence grabber <a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Frameworks/ToxicMedia/Framework/Source/SequenceGrabber/CSequenceGrabberVideoChannel.h">video channel</a> classes. The code is now much easier to understand and modify (a lot of this code is based on some pretty badly written Apple sample code and needed a lot of tidying up before it is readable).</p>

<p>The easiest way to use the sequence grabber is just to add a CSequenceGrabberView to your project. The view supports start and stop actions so you can wire your user interface directly to the view. You can also access the underlying CSequenceGrabber object directly if needed. There are plenty of hooks in the code to add your custom functionality &#8211; <a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Frameworks/ToxicMedia/Framework/Source/SequenceGrabber/CSequenceGrabber.h">CSequenceGrabber</a> (and its children video and sound channel objects) sends many useful NSNotifications. I&#8217;m also going to make the code use Cocoa bindings as much as possible. That way you can use bindings and/or notifications as your need dictates.</p>

<p>I&#8217;ve improved the &#8220;<a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Frameworks/ToxicMedia/Samples/SequenceGrabber/QuadView">QuadView</a>&#8221; sample code to take advantage of Cocoa bindings support in CCoreImageView. One thing I&#8217;ve noticed is that the core image filtering just isn&#8217;t very fast. After two or three live video streams running through Core Image filters the frame rate drops rather dramatically. I will look into this further and hope to make big improvements if my code is actually the bottleneck. Or maybe it is time to just order that Quad G5 now that they&#8217;re available (one 2.5GHz core per video stream sounds like a great idea!).</p>

<p>If you are having trouble building the code &#8211; remember all projects require Xcode 2.1 (or newer, I am using Xcode 2.2 for development). Also you <em>will</em> need subversion to check out a full copy of the code.</p>

<p>Finally I&#8217;ve been really encouraged by the interest that my Sequence Grabber code has generated. I&#8217;m getting a few emails a week from people using it in their projects. I love hearing about the uses people are putting the code to and encourage anyone using it to append a comment to this blog posting.</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/more_sequencegrabber_updates/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sequence Grabber Updated</title>
		<link>http://toxicsoftware.com/sequence_grabber_updated/</link>
		<comments>http://toxicsoftware.com/sequence_grabber_updated/#comments</comments>
		<pubDate>Thu, 13 Oct 2005 16:23:46 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[CoreImage]]></category>
		<category><![CDATA[corevideo]]></category>
		<category><![CDATA[isight]]></category>
		<category><![CDATA[quicktime]]></category>
		<category><![CDATA[sequence grabber]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[toxicmedia]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/blog/sequence_grabber_updated/</guid>
		<description><![CDATA[My sequence grabber code (previously mentioned here) has been updated. It should be a lot easier to get up and running now &#8211; I&#8217;ve added a &#8220;CSequenceGrabberView&#8221; NSView subclasss that you just need to drag and drop into your nib&#8217;s NSWindow. I&#8217;ve also improved the error handling so that the lack of a plugged in [...]]]></description>
			<content:encoded><![CDATA[<p>My sequence grabber code (previously mentioned <a href="/blog/sequence_grabber_code_now_with_coregoodness/">here</a>) has been updated. It should be a lot easier to get up and running now &#8211; I&#8217;ve added a &#8220;<a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Frameworks/ToxicMedia/Framework/Source/SequenceGrabber/CSequenceGrabberView.h">CSequenceGrabberView</a>&#8221; NSView subclasss that you just need to drag and drop into your nib&#8217;s NSWindow. I&#8217;ve also improved the error handling so that the lack of a plugged in iSight camera won&#8217;t cause a crash.</p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/sequence_grabber_updated/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sequence Grabber code now has Motion Detection</title>
		<link>http://toxicsoftware.com/sequence_grabber_code_now_has_motion_detection/</link>
		<comments>http://toxicsoftware.com/sequence_grabber_code_now_has_motion_detection/#comments</comments>
		<pubDate>Thu, 18 Aug 2005 14:29:59 +0000</pubDate>
		<dc:creator>schwa</dc:creator>
				<category><![CDATA[Default]]></category>
		<category><![CDATA[CoreImage]]></category>
		<category><![CDATA[corevideo]]></category>
		<category><![CDATA[isight]]></category>
		<category><![CDATA[quicktime]]></category>
		<category><![CDATA[sequence grabber]]></category>
		<category><![CDATA[Source Code]]></category>
		<category><![CDATA[toxicmedia]]></category>

		<guid isPermaLink="false">http://toxicsoftware.com/blog/sequence_grabber_code_now_has_motion_detection/</guid>
		<description><![CDATA[I&#8217;ve added basic motion detection capabilities to Cocoa Sequence Grabber code now.

This is what happens when your cat wakes you up too darn early after peeing under the computer desk.

Sample movie (MP4/QuickTime 7 required, 64KB file): MotionDetection.mp4

No those aren&#8217;t mpeg encoding artefacts, those are my attempts to highlight the motion in the movie.

Source code: http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Frameworks/ToxicMedia/Samples/SequenceGrabber [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve added basic motion detection capabilities to <a href="/blog/sequence_grabber_code_now_with_coregoodness/">Cocoa Sequence Grabber</a> code now.</p>

<p>This is what happens when your cat wakes you up too darn early after peeing under the computer desk.</p>

<p>Sample movie (MP4/QuickTime 7 required, 64KB file): <a href="/uploads/MotionDetection.mp4">MotionDetection.mp4</a></p>

<p>No those aren&#8217;t mpeg encoding artefacts, those are my attempts to highlight the motion in the movie.</p>

<p>Source code: <a href="http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Frameworks/ToxicMedia/Samples/SequenceGrabber">http://toxic-public.googlecode.com/svn/tags/BlogTag_20070927_729/Frameworks/ToxicMedia/Samples/SequenceGrabber</a> (see MotionDetector subdirectory)</p>

<p>Have fun.</p>

<p><img src="/uploads/MotionDetector.jpg" border="0" alt="image" name="image" width="641" height="504" /></p>
]]></content:encoded>
			<wfw:commentRss>http://toxicsoftware.com/sequence_grabber_code_now_has_motion_detection/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
