Archive for the 'Actionscript' Category

Actionscript 3 vector speedups

Thursday, September 25th, 2008

Mike Chambers has posted a comparison between the performance of AS3 arrays and the new Vectors available in Flash Player 10. The results look good: he managed a 60% speedup. This is very exciting for us at CleVR, because of the potential impact it has on the Stitcher in particular. This uses massive Arrays and lots of nested loops which seem to be just the kind of thing that would benefit from this. I haven’t had a chance to do any benchmarking of my own (hard at work on CleVR Pro) but when I do I’ll post another entry.

Hiding Flex DataGrid columns using a context menu in AIR

Thursday, August 28th, 2008

A Flex/AIR project I’m working on at the moment uses a DataGrid to display a lot of data. There needs to be lots of columns, but this means that the view can be a bit cluttered. What I wanted was an easy for the user to show or hide columns as they prefer. In Cocoa on Mac OS X you can right-click (or ctrl-click) to show a context menu to do this, which seems to be a good way. I thought there may be a way of doing this in Flex, but there didn’t appear to be. It was quite simple to implement and could be useful in lots of cases, so I thought I’d share the code. I put this in a creationComplete handler.

I’ve attached it as a context menu on the DataGrid, but you could also attach it to the header or to a button. I hope it helpful to someone.

var context:NativeMenu = new NativeMenu();
for each (var col:DataGridColumn in myDataGrid.columns){
	var menuI:NativeMenuItem = new NativeMenuItem(col.headerText);
	menuI.checked = col.visible; = col;
context.addEventListener(Event.SELECT, function(e:Event):void {
	var t:NativeMenuItem = as NativeMenuItem;
	t.checked = !t.checked; = t.checked;
myDataGrid.contextMenu = context;

State change bug in Flex

Sunday, August 17th, 2008

I’ve been trying to track down the source of a bug in the Stitcher. The issue was in the welcome screen, which has states for logging-in, creating a new account etc. The problem was that whenever the login state had been active, moving to another state would throw an error, The supplied DisplayObject must be a child of the caller. After much trial and error I worked out that it was down to the ControlBar that held the login buttons. It seems that the issue is that when Flex adds a controlbar, it doesn’t actually add it as a child of the container in which you place it. This means that when you then try to remove it, it’s in the wrong place. It seems to be related to this bug, which was apparently fixed last year. I’m going to have to produce a minimal version and see if I need to submit a bug report and/or patch.

Anyway, after changing it to use an HBox it’s working. I’ve uploaded a new version of the CleVR Stitcher with that fix and a few others. You can install it from that box in the sidebar (unless you’re reading this via the feed).

Resizing Actionscript images with bicubic or bilinear interpolation

Thursday, July 10th, 2008

I’ve had a few people contact me to ask about how to use clevrlib to resize images with bicubic or bilinear interpolation in Flash or Flex, so I’ll give an overview of how to do this.

The InterpolatedBitmapData class adds the methods getPixelBicubic and getPixelBilinear to the BitmapData class, which allows you to fetch the colour of a point that’s not on a pixel boundary. We use this when reprojecting the source images in the CleVR Stitcher, but it can work just as well for resizing an image. Bear in mind that bicubic is a lot slower than bilinear, and the quality improvement isn’t usually worthwhile. However, you’re welcome to switch to getPixelBicubic if you need to.

The basic method I’m using here for resizing is to loop through the pixels of the output image, getting the equivalent pixels in the source image. As these are found by multiplying by the ratio between the source and output sizes, the coordinates probably won’t be integers. Using regular getPixel would require rounding, and therefore give a jagged (aliased) output. The getPixelXxx methods let you pass them a Number, which needn’t be an integer, giving a much smoother result.

The sample code below shows a way of resizing an image using this method. The InterpolatedBitmapData should be created in the same way as a BitmapData, such as by draw()ing a loader onto it. The example I’ve shown below is an Event.COMPLETE handler for a Loader. Code below the cut.

Important CleVR Stitcher update

Saturday, May 17th, 2008

It’s been a while since the CleVR Stitcher was updated as I’ve been working on some other important projects. I also had a much needed holiday! Today I have released a new version that fixes lots of bugs which have been reported over the past month or so. It also makes some hopefully significant improvements to the stitching algorithms. If you had problems with poor stitches in the past, then give it another try as it should do better. The improvements are mostly related to common problems in panoramas that have been shot by hand without a tripod.

Thank you everyone who submitted bug reports. They have bee very helpful. This release should fix all of the most commonly reported problems. See below for a list of updates, and important information on installing the update.

CleVR Actionscript libraries now on RIAForge

Thursday, September 6th, 2007

I’ve put up the CleVR AS3 libraries on RIAForge, where you can download them as a zip file, or use the svn repository.

The library includes a number of classes that we developed as part of the CleVR Stitcher. They include a set of matrix algebra classes, ported from the Java JAMA library. These let you do standard matrix algebra stuff, and includes support for singular value decomposition and QR decomposition.

There’s also some graphics classes. One is a subclass of BitmapData that adds bicubic and bilinear interpolation. Another is a class for calculating the histogram of an image, with methods to do histogram stretching. This gives results similar to “Auto levels” in Photoshop, or “Enhance” in iPhoto.

You will find them here. They’re released under the Creative Commons attribution licence, which basically lets you do anything with them, so long as you give credit somewhere. A link to would usually suffice. Let me know if you have any comments, patches, or if you’re using it.

Major update to CleVR Stitcher

Wednesday, September 5th, 2007

CleVR StitcherI’ve just pushed out an update to the CleVR Stitcher which is probably the biggest improvement yet. Loads more features, loads of bugs fixed and a much nicer interface. You will find all the details here: CleVR panoramic photo Stitcher. As always, it’s totally free. Let me know what you think.

I decided to enter it into the Adobe AIR Developer Derby. It’s hard to judge its chances, but I’d love to win that squishy stress ball. If they’re going on innovation, I’d say they’d be hard-pressed to find an AIR app that is pushing the boundaries more than this. In terms of using AIR technologies, we’re using almost all of them! We’ll wait and see…

Image enhancement with histogram stretching in Actionscript

Friday, July 27th, 2007

Yesterday’s update to the CleVR Stitcher has a number of new features. One of these is image enhancement for the finished panorama. This corrects under- or over-exposed images, and works in a similar way to “Auto levels” in Photoshop, or Enhance in iPhoto. See below for more details and a demo.

Bicubic and bilinear interpolation in Actionscript 3

Monday, July 2nd, 2007

For the second release of utility code from CleVR Stitcher, the Adobe AIR panoramic photo stitcher, I’m offering our InterpolatedBitmapData class.
The class adds support for bicubic and bilinear interpolation to the Actionscript BitmapData class. It adds two public methods – getPixelBilinear and getPixelBicubic. You can call these with sub-pixel coordinates and it will interpolate the RGB value for that point. This should be useful for anyone doing more complex transformations than those offered by the Matrix class. I hope it will be useful to someone. Do let me know if you’re using it. As ever, a link back to is appreciated but not required.

Download it as part of the CleVR Actionscript Library

Linear algebra and matrix manipulation library for Actionscript 3

Saturday, June 30th, 2007

While developing the CleVR Stitcher, I needed to do quite a bit of linear algebra. I was disappointed to find that there was no Actionscript library out there for doing this, so I had to write my own. Rather than doing it from scratch, I decided to start with NIST’s Java Matrix library: JAMA, which is in the public domain.

For the benefit of anyone else needing to do stuff like this, I’m releasing the library. It’s not a full port, as I only implemented the stuff that I need. It does however support most regular operations for manipulating real matrices. As well as the normal algebra stuff, it includes classes for singular value decomposition and QR decomposition. I hope others find it useful. Let me know if you’re using it. A link back to from your site would be appreciated but is not required.

Download it as part of the CleVR Actionscript Library