Paint.NET turns 4!

May 6, 2008 – 5:35 pm
According to the Roadmap page, version 1.0 was released four years ago on May 6th, 2004. Happy birthday Paint.NET! As most people know, Paint.NET started as a senior design project at Washington State University's EECS department. When we finished the first version, it was meant as a "hey look we actually made something - neat!" project that we showed off to family and friends. A simple website was put up on the eecs.wsu.edu web server, and the project was neither hyped nor advertised once the semester was over. Fast forward a few months later, after I started working full time at Microsoft, and I was forwarded e-mail from some interns who had managed to find it and were asking about why it wouldn't install on XP SP2. Interesting things to know about the first version of Paint.NET, in no particular order: · It took 15 weeks to complete, from start to finish. · ...

Paint.NET v3.31 is now available!

May 1, 2008 – 6:19 pm
This is mostly a servicing release to fix a few important bugs that have been causing some people a lot of headaches. You can get it in the usual ways: either via the built-in updater (Help -> Check for Updates), or directly from the website: http://www.getpaint.net/. Changes since v3.30: * New: Enabled integration with Window Clippings, which is a high quality screen capture utility by Kenny Kerr. * Fixed: Fixed a crash with the Open/Save dialogs if the Documents or Pictures directories were either inaccessible or if the user did not have certain file system permissions. * Changed / Fixed: The hotkey for Adjustments -> Levels is now Ctrl+Shift+L instead of Ctrl+Alt+L. This was preventing certain characters, such as the Polish 'ł', from being typed. For this update I've also worked with Kenny Kerr to enable integration between Paint.NET and his Window Clippings utility. It now has a built-in "Send to Paint.NET" action so that ...

Paint.NET v3.31 is on the way

April 28, 2008 – 3:52 pm
I'm shooting to have a version 3.31 release by this Thursday, May 1st. There's a nasty bug that's come up in the v3.30 code base that I need to fix! The problem occurs with my use of the native Win32 API, SHGetFolderPathW(). If your Documents or Pictures folder is on a network share, and that path is unavailable (network down, haven't typed in credentials, etc. etc.), then Paint.NET will almost certainly crash when you go to Open or Save. The fix is simple enough, of course, but this is causing a lot of headaches and an inbox full of crash logs for me. In other news, the weather here in Kirkland is great* and I've got the week off. I can finally reliably finish Green Grass and High Tides in Rock Band on Expert (4 stars), and Grand Theft Auto IV comes out tomorrow. * Well, for now ... who knows what ...

Paint.NET merchandise store is now open!

April 21, 2008 – 12:54 pm
I signed up for a Cafepress account awhile ago but never got around to adding merchandise to it. This weekend, I finally uploaded all the images and set up the products: The Official Paint.NET Merchandise store: http://www.cafepress.com/paintdotnet/ There are shirts, a mouse pad, mugs, stickers, buttons, hats, and a tote bag. If you have feedback on the selection, either leave a comment or join the discussion on the forum here: http://paintdotnet.forumer.com/viewtopic.php?f=12&t=24051 Over the next week I’ll add links to the store added in other places, such as the main website. For now I’ve got the link here on the blog and on the forum. Cafepress doesn’t leave much room for profit, so this is mostly a promotional tool. Which means that if your intent is to send $20 to Paint.NET then we’re both better off if you donate directly. Purchasing a $19.99 shirt via Cafepress only nets me $1 or $2. If you ...

Paint.NET v3.30 — Final release now available!

April 10, 2008 – 10:04 pm
It's finally here! You can grab it via the built-in updater from the Help-> Check for Updates menu item, or go get it straight from the website at http://www.getpaint.net/ Enjoy! Changes since v3.22: New: Italian translation. New: Ability to save PNG's at 8- and 24-bit color depths. New: Ability to save BMP's at 8-bit color depth. New: "Auto-detect" bit-depth option for PNG, BMP, and TGA file types. It will analyze the image and determine the lowest bit-depth that can still save the image without quality loss. New: "Fragment" blur effect, by Ed Harvey New: The "Polar Inversion" distortion effect has been enhanced to allow changing the rendering offset, and the behavior for "edge" pixels (clamp, reflect, or wrap). New: For developers, added a Color Wheel ...

Paint.NET v3.30 Release Candidate 1 is now available!

April 7, 2008 – 10:01 pm
Well this has been an interesting release to push out the door ... all sorts of interesting hurdles have come up including hardware threatening to fail, myself being really busy with other cool stuff at my day job, translators with food poisoning (they are better now thankfully!), and pyrochild's computer refusing to work with a test build (pyrochild is an active and popular member of the Paint.NET forum). Have no fear though, it's almost ready to go! I had a few code changes since Beta 2 so I decided to push out a Release Candidate instead of a "Final" build tonight. If all goes as planned, the final release will be pushed out this weekend. As usual, you can get this build from the built-in updater (Help -> Check for Updates), or by downloading it straight off the website: http://www.getpaint.net/ Changes since Beta 2: ...

Validating .NET/RESX translations easily with LINQ-to-XML

April 5, 2008 – 5:21 pm
One of the tools I finally decided to sit down and write was a "ResXCheck" utility. RESX files hold the string resources for many .NET programs, including Paint.NET. At build time, these are compiled into a binary format and then stored in a DLL, or a RESOURCES file (Paint.NET uses the latter). The binary format is simply more efficient to access at run-time, and resgen.exe can even be used to convert between the two formats. Essentially, a RESX is an XML files with a big list of name/value pairs. I will refer to these as string names, and string values. The XML looks like this: <data name="GradientTool.HelpText">   <value>Click and drag to start drawing. Holding shift constrains the angle. Right mouse button reverses colors.</value> </data> ...

A simple C# / LINQ trick shown with Console.ReadLine()

March 31, 2008 – 8:07 pm
I haven't been working on Paint.NET v4.0 at all lately, but I have been reading, learning, and prototyping about a whole sleuth of things related to functional and asynchronous programming. One such topic is that of monads, which I have a blog entry almost completed on. However, I wanted to get a quick blog post to show something simple yet powerful. LINQ brings a lot of power to IEnumerable<T>, and in this case we're going to map the console input into an IEnumerable<T>. Then we'll use standard LINQ methods to only display those lines of text that have ".dll" in them. It's a contrived example, but it's easy enough to find more useful applications of this. I have to go in a minute, so I'll throw this code up on the blog and let the conversation be driven from the comments. public static class Extensions ...

Paint.NET just can’t satisfy an 8-core Opteron

March 23, 2008 – 4:50 pm
Just to make sure, I went and downloaded the trial version of Windows Server 2008 from the Microsoft website. I installed it on this 8-core Opteron workstation with 8 GB of RAM that AMD sent me awhile ago for doing multithreading and performance scaling stuff. I installed version 3.22, then updated it to 3.30 Beta 2 to make sure that would work, and sure enough it does! (click for full size, 1600x1200) I'm not surprised, but I felt the need to verify this anyway :) I'll make sure the website lists Windows Server 2008 as a supported OS on the next update. As an interesting side note, having access to systems with 4 and 8 cores has brought up an interesting performance problem in Paint.NET, and key insights for optimization and design going forward. In the past I have done a lot of work to ensure that certain key rendering code is multithreaded, ...

Thoughts on Component Isolation for Paint.NET v4.0

March 16, 2008 – 6:29 pm
I've been doing a lot of thinking about how Paint.NET needs to change or evolve before it hits version 4.0, and the big thing that keeps coming up is isolation. Right now, the control flow and error handling in Paint.NET lets one component crash or corrupt the whole program. This could be code sitting in a plugin that causes an unhandled exception in a way that my try/catch harnesses don't handle, or it could be a COM component loaded by Windows common file Open/Save dialogs that crashes or locks up. Or maybe a piece of code doesn't throw an exception but it does corrupt some other data, and then that corruption causes a crash later. And then that gets attributed to the wrong component. GDI+ seems to like doing that a lot. Not only does Paint.NET need to be protected by crashing or "bad" plugins, but it needs to ...