<?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>Craftymind</title>
	<atom:link href="http://www.craftymind.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.craftymind.com</link>
	<description>Hacking away at UI development</description>
	<lastBuildDate>Mon, 13 Jun 2011 16:59:14 +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>GUIMark 3 released.</title>
		<link>http://www.craftymind.com/2011/06/13/guimark-3-released/</link>
		<comments>http://www.craftymind.com/2011/06/13/guimark-3-released/#comments</comments>
		<pubDate>Mon, 13 Jun 2011 16:59:14 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Html]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/?p=399</guid>
		<description><![CDATA[GUIMark 3 has just been released and it&#8217;s aimed squarely at benchmarking mobile devices. The debate this time around concerns the relative speed differences between Flash and HTML5 on your phone or tablet. With a month and a half in the making, 4 unique tests, and over 200 results this was a big one and [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.craftymind.com/guimark3">GUIMark 3</a> has just been released and it&#8217;s aimed squarely at benchmarking mobile devices. The debate this time around concerns the relative speed differences between Flash and HTML5 on your phone or tablet. With a month and a half in the making, 4 unique tests, and over 200 results this was a big one and I hope you guys enjoy reading and dissecting the results. You can read the article <a href="http://www.craftymind.com/guimark3">here</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2011/06/13/guimark-3-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>How I would design the perfect desktop app store</title>
		<link>http://www.craftymind.com/2011/03/01/how-i-would-design-the-perfect-desktop-app-store/</link>
		<comments>http://www.craftymind.com/2011/03/01/how-i-would-design-the-perfect-desktop-app-store/#comments</comments>
		<pubDate>Tue, 01 Mar 2011 20:22:50 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/?p=225</guid>
		<description><![CDATA[Since releasing my first app to the Mac App Store I&#8217;ve been thinking about how I wish I had more options available to me as both a developer and consumer. The following is my wishlist for the perfect desktop app store, basically it takes the best parts of Steam and the best parts of the [...]]]></description>
			<content:encoded><![CDATA[<p>Since releasing my <a href="http://www.spacegremlinapp.com">first app</a> to the Mac App Store I&#8217;ve been thinking about how I wish I had more options available to me as both a developer and consumer. The following is my wishlist for the perfect desktop app store, basically it takes the best parts of Steam and the best parts of the Mac App Store and combines them.</p>
<p><strong>OS/Vendor Agnostic</strong> &#8211; The perfect app store needs to work consistently across Windows, Mac, and Linux, and the only way to establish impartiality is to make sure none of the big vendors *own* the store. That said, in order to really take off it would probably need support from some of the major cross platform vendors like Adobe.</p>
<p><strong>Platform Integration</strong> &#8211; The app store cannot be web only, it has to come with an installable store that manages your applications and lets you browse for new apps to purchase. On the flip side, web purchasing should also be enabled and publishers should be able to embed a framed version of the store in their website to make transactions more fluid.</p>
<p><strong>Buy once, run anywhere</strong> &#8211; Publishers should be able to set options on whether applications are purchased once for all platforms or require small payments for additional platforms beyond the first one. Ideally you wouldn&#8217;t have to pay more for a different platform, but enforcing that rule may discourage publishers from putting in the time to port code.</p>
<p><strong>Multi system</strong> &#8211; A single login should be usable on up to 5 systems.</p>
<p><strong>Multi user accounts</strong> &#8211; Families should be able to easily add kids to their account and purchase software for them. Companies should be able to add and remove employees from a company account and assign software to different users. No need for separate company logins, everyone can just use their personal accounts.</p>
<p><strong>Simple receipt system</strong> &#8211; Apple Mac Store pretty much nailed it on this one. Users don&#8217;t have to be logged in like Steam in order to run an app. The way it works is every application is responsible for finding and validating a digitally signed receipt when their app starts. Receipts are generated from app name, app version, and system id, and digital signed. Receipts can easily be downloaded when logging in to a new computer and easily voided when no longer valid.</p>
<p><strong>Simple update system</strong> &#8211; Apple nailed this one as well, provide simple notifications that updates are available for certain apps, and then handle the process of installing that update.</p>
<p><strong>Application upgrades</strong> &#8211; Publishers should be able to set options for users to get discounts on major upgrades if they own a previous version. Users should be able to enter serial numbers for existing applications to prove ownership of previous copies.</p>
<p><strong>Cloud Storage</strong> &#8211; Apps can use up to 50mb of cloud storage per user, paid apps can choose to use a percentage of proceeds to pay for unlimited space for their users.</p>
<p><strong>Developer Tools</strong> &#8211; Developers need strong guidance on how to package their apps and test them before going live. They should be able to download sample receipts for their app and test the installation process through the store itself before going live.</p>
<p><strong>Freedom of Language</strong> &#8211; There should be no restriction on languages or technologies (think java) that are allowable in the store. Dependencies lists can be built over time into the store to help facilitate getting users the correct packages for certain apps to run.</p>
<p>I&#8217;m sure there&#8217;s a few other things I haven&#8217;t thought of yet, what would you add?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2011/03/01/how-i-would-design-the-perfect-desktop-app-store/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Launching Space Gremlin to the Mac App store</title>
		<link>http://www.craftymind.com/2011/02/07/launching-space-gremlin-to-the-mac-app-store/</link>
		<comments>http://www.craftymind.com/2011/02/07/launching-space-gremlin-to-the-mac-app-store/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 15:04:10 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[apps]]></category>
		<category><![CDATA[mac]]></category>
		<category><![CDATA[osx]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/?p=215</guid>
		<description><![CDATA[Lately I&#8217;ve been on a kick&#8230;instead of wishing for software to work the way I want, I&#8217;m just gonna build it the way I want instead.
Today one of those ideas has come to fruition and I&#8217;m happy to announce it&#8217;s launch in the new Mac App Store. Space Gremlin is an app I wrote over [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Lately I&#8217;ve been on a kick&#8230;instead of wishing for software to work the way I want, I&#8217;m just gonna build it the way I want instead.</p>
<p style="text-align: left;">Today one of those ideas has come to fruition and I&#8217;m happy to announce it&#8217;s launch in the new Mac App Store. <a title="Space Gremlin" href="http://www.spacegremlinapp.com">Space Gremlin</a> is an app I wrote over the course of Christmas to visualize disk usage on a hard drive to help find and delete &#8220;gremlins&#8221; taking up too much space. It features a top down view of a disks folder structure and the relational sizes between other objects. It&#8217;s easy to drill in to folders or slice up the view to focus on important areas. While there are other apps out there on the Mac platform that address this concept, I&#8217;ve never found those other visualizations very usable or readable.</p>
<p style="text-align: center;"><img title="Space Gremlin Sample" src="http://www.spacegremlinapp.com/intro.png" alt="" width="578" height="433" /></p>
<p>I&#8217;m hoping other people out there find Space Gremlin as usable as I do, so I&#8217;ve added it to the new Mac App Store to handle the distribution end. Since this is the launch and I&#8217;m still new to the whole Mac App ecosystem, I&#8217;m setting a launch price of only $3.99 but it will probably settle at a higher price soon after. I&#8217;ve also decided to go exclusive to the Mac App Store to avoid setting up my own purchasing and validation system.</p>
<p>Give it a try and let me know what you think. Big thanks to all the fellow developers and designers at <a href="http://www.effectiveui.com">EffectiveUI </a>who helped me test this app. If you&#8217;re interested there is also a free demo available on the website <a href="http://www.spacegremlinapp.com">http://www.spacegremlinapp.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2011/02/07/launching-space-gremlin-to-the-mac-app-store/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mac app store hacked, how developers can better protect themselves</title>
		<link>http://www.craftymind.com/2011/01/06/mac-app-store-hacked-how-developers-can-better-protect-themselves/</link>
		<comments>http://www.craftymind.com/2011/01/06/mac-app-store-hacked-how-developers-can-better-protect-themselves/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 01:13:34 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/?p=203</guid>
		<description><![CDATA[Crude instructions have started showing up online with ways to circumvent Apples Mac App store receipt validation. By simply copying receipt and info.plist data from a free app and pasting it into a paid app, you can run apps copied from friends computers or bittorrent. I myself have a copy of a paid app (not [...]]]></description>
			<content:encoded><![CDATA[<p>Crude instructions have started showing up online with ways to circumvent Apples Mac App store receipt validation. By simply copying receipt and info.plist data from a free app and pasting it into a paid app, you can run apps copied from friends computers or bittorrent. I myself have a copy of a paid app (not angry birds, but one with stronger protection) running on my system that was purchased by a friend. This is a massive failure in the implementation of Apples receipt system.</p>
<p>So why are all of the app store developers in this position? Apples current documentation on how to validate receipts is fairly complex, but the sample code and Apple own instructions ask developers to validate against data that is entirely external to the binary itself. Worse yet, it instructs developers to validate against plain text data easily editable with any text editor.</p>
<p>If you are an app store developer and you are using apples default security logic, you need to review these validation steps in your code</p>
<ul>
<li>Verify that the receipt bundle identifier matches the value for CFBundleIdentifier in the Info.plist file. If they do not match, verification fails.</li>
<li>Verify that the version identifier string in the receipt matches the value for CFBundleShortVersionString in the Info.plist file. If they do not match, verification fails.</li>
</ul>
<p>And change them to be more in line with this</p>
<ul>
<li>Verify that the receipt bundle identifier matches the value for  CFBundleIdentifier that you <strong>hard code</strong> into your application.</li>
<li>Verify that the version identifier string in the receipt matches  the value for CFBundleShortVersionString <strong>hard coded</strong> into your application. If they  do not match, verification fails.</li>
</ul>
<p>At the end of the day, if your app is popular enough it&#8217;s going to end up on a pirated site, but for the time being, by following the instructions above, you can avoid having your app easily cracked with TextEdit. For those interested, Angry Birds only implemented 2 of Apples suggested validation steps, so the pastebin instructions will only work for Angry Birds, you need to do a little bit more for apps that handle all 5 validation steps.</p>
<p>Update, if you are using <a href="https://github.com/roddi/ValidateStoreReceipt/blob/master/validatereceipt.m">roddi&#8217;s receipt checking code</a> from github, here are the offending lines you need to change.</p>
<pre>BOOL validateReceiptAtPath(NSString * path)
{
	...
	bundleVersion = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"];
	bundleIdentifer = [[NSBundle mainBundle] bundleIdentifier];
	...
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2011/01/06/mac-app-store-hacked-how-developers-can-better-protect-themselves/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>PNG compression on iPhone/iPad</title>
		<link>http://www.craftymind.com/2010/09/01/png-compression-on-iphoneipad/</link>
		<comments>http://www.craftymind.com/2010/09/01/png-compression-on-iphoneipad/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 23:59:17 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/?p=195</guid>
		<description><![CDATA[I was having a discussion with a coworker about png compression for the iphone and wanted to resolve the issue of whether we should bundle Fireworks source assets in xcode for quick editing and recompiling, or if we should export compressed versions to use for the bundling phase. I know the iPhone does it&#8217;s own [...]]]></description>
			<content:encoded><![CDATA[<p>I was having a discussion with a coworker about png compression for the iphone and wanted to resolve the issue of whether we should bundle Fireworks source assets in xcode for quick editing and recompiling, or if we should export compressed versions to use for the bundling phase. I know the<a href="http://discussions.apple.com/thread.jspa?threadID=1751896&amp;tstart=1"> iPhone does it&#8217;s own compression and byte reordering on pngs</a>, but I wasn&#8217;t sure how much compression was done, so here&#8217;s the answer.</p>
<p>I made a relatively complex png file for testing, the source file is a 230 kb Fireworks file, which is pretty close to some of the assets we have in our projects. A quick 24bit png export from fireworks produces a 6 kb png file with no visual fidelity loss. When the project is compiled to the device, the source image is compressed by xcode down to 19 kb, while the exported version actually increases in size to 7 kb. So far this supports the theory that manual compression can be up to 3 times better then letting xcode handle it for you.</p>
<p style="text-align: center;">Original Files in Xcode Project</p>
<p style="text-align: center;"><a href="http://www.craftymind.com/wp-content/uploads/2010/09/Screen-shot-2010-09-01-at-5.49.02-PM.png"><img class="aligncenter size-medium wp-image-196" title="Screen shot 2010-09-01 at 5.49.02 PM" src="http://www.craftymind.com/wp-content/uploads/2010/09/Screen-shot-2010-09-01-at-5.49.02-PM-288x300.png" alt="" width="288" height="300" /></a></p>
<p style="text-align: center;">Files compressed for iOS device build.</p>
<p style="text-align: center;"><a href="http://www.craftymind.com/wp-content/uploads/2010/09/Screen-shot-2010-09-01-at-5.50.03-PM.png"><img class="aligncenter size-medium wp-image-197" title="Screen shot 2010-09-01 at 5.50.03 PM" src="http://www.craftymind.com/wp-content/uploads/2010/09/Screen-shot-2010-09-01-at-5.50.03-PM-300x189.png" alt="" width="300" height="189" /></a></p>
<p>Additionally it seems that I suffered no visual loss by letting xcode recompress these png files, and decompression times for both pngs on the device took roughly 20 milliseconds each.</p>
<p>Honestly I think you could read these results either way, lazy developers may choose to just use source files in xcode and suffer a 3x penalty on images compression, for those that like to control the compression exactly on their files, you&#8217;ll be better off.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2010/09/01/png-compression-on-iphoneipad/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>GUIMark 2 has been released! Compare HTML5 and Flash performance</title>
		<link>http://www.craftymind.com/2010/05/05/guimark-2-has-been-released-compare-html5-and-flash-performance/</link>
		<comments>http://www.craftymind.com/2010/05/05/guimark-2-has-been-released-compare-html5-and-flash-performance/#comments</comments>
		<pubDate>Wed, 05 May 2010 15:43:27 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Flash]]></category>
		<category><![CDATA[Html]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/?p=154</guid>
		<description><![CDATA[I am very happy to finally announce the release of GUIMark 2. After a couple weeks of building and testing, I feel I&#8217;ve finally created the best visual benchmarks I could come up with for comparing both Flash and HTML5. The results reveal a lot of interesting technical differences between the two environments. You can [...]]]></description>
			<content:encoded><![CDATA[<p>I am very happy to finally announce the release of GUIMark 2. After a couple weeks of building and testing, I feel I&#8217;ve finally created the best visual benchmarks I could come up with for comparing both Flash and HTML5. The results reveal a lot of interesting technical differences between the two environments. You can read the full details and results on the <a href="http://www.craftymind.com/guimark2/">GUIMark 2</a> project page.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2010/05/05/guimark-2-has-been-released-compare-html5-and-flash-performance/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Blowing up HTML5 video and mapping it into 3D space</title>
		<link>http://www.craftymind.com/2010/04/20/blowing-up-html5-video-and-mapping-it-into-3d-space/</link>
		<comments>http://www.craftymind.com/2010/04/20/blowing-up-html5-video-and-mapping-it-into-3d-space/#comments</comments>
		<pubDate>Tue, 20 Apr 2010 15:53:34 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Html]]></category>
		<category><![CDATA[Javascript]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/?p=64</guid>
		<description><![CDATA[I&#8217;ve been doing a bit of experimenting with the Canvas and Video tags in HTML5 lately, and found some cool features hiding in plain sight. One of those is the Canvas.drawImage() api call. Here is the description on the draft site.
3.10 Images
To draw images onto the canvas, the drawImage method can be used.
This method can [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been doing a bit of experimenting with the Canvas and Video tags in HTML5 lately, and found some cool features hiding in plain sight. One of those is the Canvas.drawImage() api call. Here is the description on the draft site.</p>
<p><a href="http://dev.w3.org/html5/canvas-api/canvas-2d-api.html#images">3.10 Images</a></p>
<pre>To draw images onto the canvas, the <dfn id="dom-context-2d-drawimage" title="dom-context-2d-drawImage"><code>drawImage</code></dfn> method can be used.
This method can be invoked with three different sets of arguments:
<ul>
<li> <code>drawImage(<var>image</var>, <var>dx</var>, <var>dy</var>)</code></li>
<li> <code>drawImage(<var>image</var>, <var>dx</var>, <var>dy</var>, <var>dw</var>, <var>dh</var>)</code></li>
<li> <code>drawImage(<var>image</var>, <var>sx</var>, <var>sy</var>, <var>sw</var>, <var>sh</var>, <var>dx</var>, <var>dy</var>, <var>dw</var>, <var>dh</var>)</code></li>
</ul>

Each of those three can take either an <code><a href="http://www.w3.org/TR/html5/text-level-semantics.html#htmlimageelement">HTMLImageElement</a></code>, an <code><a href="http://www.w3.org/TR/html5/the-canvas-element.html#htmlcanvaselement">HTMLCanvasElement</a></code>, or an <code><a href="http://dev.w3.org/html5/spec/video.html#htmlvideoelement">HTMLVideoElement</a></code> for the <var>image</var> argument.</pre>
<p>The api lets you take the contents of specific HTML elements and draw them into a canvas, and the 3rd element in that list is just begging to be abused. Copying video into a canvas element means opening up the ability to manipulate or process video frames at runtime. Two concepts instantly came to mind that seemed like fun to try and figure out, here they are below.</p>
<h2 style="text-align: center;">Blowing apart fragments of video</h2>
<p style="text-align: center;"><a title="Exploding Video" href="http://craftymind.com/factory/html5video/CanvasVideo.html"><img class="aligncenter size-full wp-image-66" title="html5boom" src="http://www.craftymind.com/wp-content/uploads/2010/04/html5boom.jpg" alt="" width="600" height="363" /></a></p>
<p style="text-align: left;">Click around the video frame to blow up that part of the video, the exploded pieces will continue to play the video inside them. After a while they retract back to their original place. One feature I didn&#8217;t have time to figure out was adding depth to the explosion, so pieces that are closest to ground zero fly up into the air as they sail outward. With full shadow effects this could look really cool.</p>
<p style="text-align: center;">
<h2 style="text-align: center;">3D Video</h2>
<p style="text-align: center;"><a href="http://www.craftymind.com/factory/html5video/CanvasVideo3D.html"><img class="aligncenter size-full wp-image-68" title="html53d" src="http://www.craftymind.com/wp-content/uploads/2010/04/html53d.jpg" alt="" width="600" height="384" /></a></p>
<p style="text-align: left;">
<p style="text-align: left;">This demo in particular runs really well inside webkit based browsers, but not so much in Firefox. Firefox doesn&#8217;t appear to have any hardware acceleration for Ogg decoding so I had to drop the video size in half in order to run at acceptable framerates. Even still, Firefox chokes pretty badly on my Macbook Pro.</p>
<p style="text-align: left;">*Update* &#8211; I&#8217;ve changed the ogg video to be 640 x 360, prepare to see firefox weep</p>
<h2 style="text-align: left;">Lessons learned</h2>
<p>There&#8217;s a couple hints I found out along the way that are good to know if you want to play around with drawing video. First, you need a bit of hackish code to get this to work effeciently and it flows like this.</p>
<p style="text-align: center;">[Video playing] -&gt; [Draw Video onto Canvas 1] -&gt; [Draw fragments of Canvas 1 onto Canvas 2]</p>
<p style="text-align: left;">Don&#8217;t ask me why, but copying pixel data out of a video tag is expensive, so expensive that drawing it into a temporary canvas, and then drawing pieces of that temp canvas onto a final canvas is faster then just referencing the video tag repeatedly within the same loop. That&#8217;s why you&#8217;ll see 2 Canvases in the source code for the demos. I&#8217;m sure there&#8217;s a technical reason for this duplication process, but it&#8217;s a lazy reason.</p>
<p style="text-align: left;">Secondly, don&#8217;t try copying individual pixels around. You can still see the remnants of my first code attempt inside the explosion demo with getPixel() and setPixel(). This turned out to be horribly slow and completely unnecessary. Canvas.drawImage() + matrix transforms on the canvas space is far more efficient then handcrafted pixel pushing. On the other hand, pixel manipulation allows you to do things like <a href="https://developer.mozilla.org/samples/video/chroma-key/index.xhtml">runtime chroma keying</a>, get ready for a new wave of &#8220;clippy&#8221; style videos with full transparency popping over websites to help you out.</p>
<p style="text-align: left;">Lastly, I&#8217;m learning very quickly that not all browsers are created equal when it comes to performance, it&#8217;s a crapshoot when it comes to heavy video+image manipulation. Safari and Chrome work well with h.264, Firefox slogs along with Ogg Theora, and Opera is somewhere in the middle.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2010/04/20/blowing-up-html5-video-and-mapping-it-into-3d-space/feed/</wfw:commentRss>
		<slash:comments>187</slash:comments>
		</item>
		<item>
		<title>Come see my talk about memory management at Max 2009</title>
		<link>http://www.craftymind.com/2009/08/25/come-see-my-talk-about-memory-management-at-max-2009/</link>
		<comments>http://www.craftymind.com/2009/08/25/come-see-my-talk-about-memory-management-at-max-2009/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 14:22:50 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[AIR]]></category>
		<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/2009/08/25/come-see-my-talk-about-memory-management-at-max-2009/</guid>
		<description><![CDATA[It seems my obsession with the Flash and AIR internals keeps earning me a spot as a Max speaker. Following up on last years talk on general VM performance, I&#8217;ll be back this year to talk specifically about memory management and optimizations. While I covered memory a bit in last years talk, this year I&#8217;ll [...]]]></description>
			<content:encoded><![CDATA[<p>It seems my <a href="http://www.craftymind.com/2008/04/18/updated-elastic-racetrack-for-flash-9-and-avm2/">obsession with the Flash and AIR internals</a> keeps earning me a spot as a Max speaker. Following up on last years <a href="http://www.craftymind.com/2008/11/20/max-2008-session-material/">talk on general VM performance</a>, I&#8217;ll be back this year to talk specifically about memory management and optimizations. While I covered memory a bit in last years talk, this year I&#8217;ll be going more indepth on memory techniques as well as how to profile your apps. As with all my sessions, you can be sure there&#8217;ll be plenty of code handed out by the end.</p>
<p>My session will be running on Tuesday at 1:30 PM and again on Wednesday at 5:00 PM, hope to see you all there.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2009/08/25/come-see-my-talk-about-memory-management-at-max-2009/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>360iDev session materials on Quartz 2D</title>
		<link>http://www.craftymind.com/2009/03/04/360idev-session-materials-on-quartz-2d/</link>
		<comments>http://www.craftymind.com/2009/03/04/360idev-session-materials-on-quartz-2d/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 16:51:45 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/2009/03/04/360idev-session-materials-on-quartz-2d/</guid>
		<description><![CDATA[360iDev San Jose has been awesome so far and it&#8217;s not over yet, still a whole day of sessions to go. I&#8217;m putting my session materials up now during the keynote so I don&#8217;t forget after I&#8217;ve presented. Get the zip file here.
Update: I forgot to mention during my presentation, but the samples within the [...]]]></description>
			<content:encoded><![CDATA[<p>360iDev San Jose has been awesome so far and it&#8217;s not over yet, still a whole day of sessions to go. I&#8217;m putting my session materials up now during the keynote so I don&#8217;t forget after I&#8217;ve presented. Get the zip file <a href="http://www.craftymind.com/wp-content/uploads/2009/360iDev%20session%20materials.zip" title="360 iDev session materials">here</a>.</p>
<p>Update: I forgot to mention during my presentation, but the samples within the zip archive may contain memory leaks for the sake of code brevity. If you copy and paste the code samples into your own projects, you might need to make sure you add cleanup code to the end of it.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2009/03/04/360idev-session-materials-on-quartz-2d/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Creating the &#8216;loupe&#8217; or magnifying glass effect on the iphone.</title>
		<link>http://www.craftymind.com/2009/02/10/creating-the-loupe-or-magnifying-glass-effect-on-the-iphone/</link>
		<comments>http://www.craftymind.com/2009/02/10/creating-the-loupe-or-magnifying-glass-effect-on-the-iphone/#comments</comments>
		<pubDate>Tue, 10 Feb 2009 18:06:57 +0000</pubDate>
		<dc:creator>Sean Christmann</dc:creator>
				<category><![CDATA[Cocoa]]></category>

		<guid isPermaLink="false">http://www.craftymind.com/2009/02/10/creating-the-loupe-or-magnifying-glass-effect-on-the-iphone/</guid>
		<description><![CDATA[One of my recent projects tasked me with figuring out how to recreate the magnifying glass effect that Apple uses inside textfields on the iPhone, but in a more generic way so anything on the screen could be magnified. Getting this effect is pretty simple in any visual framework once you figure out how masking [...]]]></description>
			<content:encoded><![CDATA[<p>One of my recent projects tasked me with figuring out how to recreate the magnifying glass effect that Apple uses inside textfields on the iPhone, but in a more generic way so anything on the screen could be magnified. Getting this effect is pretty simple in any visual framework once you figure out how masking works and which api will let you draw a bitmap of a given graphics layer. While the logic was simple enough, finding the right combination of apis was the painful part but I finally figured it out and wanted to share the code with everyone else trying to accomplish this task.</p>
<p>First up an example of what we&#8217;re able to accomplish with this effect.</p>
<p style="text-align: center"><img src="http://www.craftymind.com/wp-content/uploads/2009/02/loupeexample.png" alt="Magnifying effect on iPhone" /></p>
<p>You can magnify any UIView as well as the children of that view, images, text and 2d vectors are captured and magnified appropriately. There are couple critical pieces of this code to pay attention to.</p>
<p>First up, when a touch has been recorded long enough to kick off the magnifier effect, we create a new magnifier view that is the exact size of the view we want to magnify. This is important due to the way we&#8217;re going to be copying a bitmap of the original view. Once we know the view exists we call setNeedsDisplay on it which triggers drawRect inside of it.</p>
<pre>if(loop == nil){
	loop = [[MagnifierView alloc] initWithFrame:self.bounds];
	loop.viewref = self;
	[self addSubview:loop];
}
UITouch *touch = [touches anyObject];
loop.touchPoint = [touch locationInView:self];
[loop setNeedsDisplay];</pre>
<p>Next, when drawRect gets called inside the magnifier view we want to make a copy of the original view first. The reason the magnifier view is teh same size as the original view is because we are rendering the full context of the original view into our new context before grabbing a bitmap of it. If the magnifying view were smaller, the rendered bitmap would also be smaller. We want to cache the final bitmap so we&#8217;re not redrawing the original view every time the user moves their finger around the view. We&#8217;ll destroy that cached view and the magnifying glass when the user lets up off the screen.</p>
<pre>- (void)drawRect:(CGRect)rect {
	if(cachedImage == nil){
		UIGraphicsBeginImageContext(self.bounds.size);
		[self.viewref.layer renderInContext:UIGraphicsGetCurrentContext()];
		cachedImage = [UIGraphicsGetImageFromCurrentImageContext() retain];
		UIGraphicsEndImageContext();
	}</pre>
<p>Following that we need to generate a masked view for the magnified view to sit in, since the loop is a circle we have to mask out the corners and antialias the outer perimeter. This is accomplished using 2 images, the magnifying glass itself and a mask image with appropriate grayscale levels for masking.</p>
<pre>CGImageRef imageRef = [cachedImage CGImage];
CGImageRef maskRef = [[UIImage imageNamed:@"loopmask.png"] CGImage];
CGImageRef overlay = [[UIImage imageNamed:@"loop.png"] CGImage];
CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
					CGImageGetHeight(maskRef),
					CGImageGetBitsPerComponent(maskRef),
					CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
					CGImageGetDataProvider(maskRef),
					NULL,
					true);
//Create Mask
CGImageRef subImage = CGImageCreateWithImageInRect(imageRef, CGRectMake(touchPoint.x-18, touchPoint.y-18, 36, 36));
CGImageRef xMaskedImage = CGImageCreateWithMask(subImage, mask);</pre>
<p>Lastly, we&#8217;ll draw the magnifying glass and magnfied bitmap copy of our orginal view underneath the mask and we&#8217;re done. Since the iPhone uses a different coordinate system then other languages, we have to remember to flip the view upside down before drawing it.</p>
<pre>CGContextRef context = UIGraphicsGetCurrentContext();
CGAffineTransform xform = CGAffineTransformMake(
					1.0,  0.0,
					0.0, -1.0,
					0.0,  0.0);
CGContextConcatCTM(context, xform);
CGRect area = CGRectMake(touchPoint.x-42, -touchPoint.y, 85, 85);
CGRect area2 = CGRectMake(touchPoint.x-40, -touchPoint.y+2, 80, 80);
CGContextDrawImage(context, area2, xMaskedImage);
CGContextDrawImage(context, area, overlay);</pre>
<p>And that&#8217;s it, now we have a modular magnifying glass that can plug in to any UIView with minimal effort. If you&#8217;re looking for a way to add interactivity underneath the magnifying glass, like moving the cursor within a textfield, that&#8217;s gonna require a bit more custom code on the control you&#8217;re dealing with, and this example doesn&#8217;t really address that.</p>
<p>Download example: <a href="http://www.craftymind.com/wp-content/uploads/2009/02/masktest.zip" title="XCode magnifier example for iPhone">XCode magnifier example for iPhone</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.craftymind.com/2009/02/10/creating-the-loupe-or-magnifying-glass-effect-on-the-iphone/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

