Paint.NET v3.30 Beta 1 is now available

February 28, 2008 – 9:59 pm
Alright, here we go: finally a new update to Paint.NET! Please note that this is a beta, and expires in 60 days on April 28th. You can get this update by downloading it from the website, http://www.getpaint.net/ (no need to uninstall your current version, it will figure it all out for you), or via the built-in updater. For the latter, go to Help -> Check for Updates... and make sure you are set up to receive betas by clicking on the Options button and ensuring that "Also check for beta relases" is checked. Then close the dialogs and click on Help -> Check for Updates... again. The most notable features in this release are the ability to save PNG's at 8- and 24-bit depth, and the integration of Ed Harvey's "Fragment" blur effect. There are also a bunch of other minor things, bug fixes, and a new Italian translation. ...

Paint.NET learns Italian!

February 25, 2008 – 6:06 pm
There's one more feature, so to speak, that's been able to sneak in to the v3.30 release. From the blog title it should be obvious: Paint.NET will soon be available in Italian! I get a lot of e-mails asking for this, and now thanks to the hard working folks in Microsoft Developer Division ("DevDiv"), it will now be available. (DevDiv also handles the other 7 non-English translations)

"Just Add More Cowbell"

February 24, 2008 – 5:11 pm
As an owner of a software project, one trap that's easy to fall into is that of adding more and more features. Quite often these features do in fact add value, but there's a certain point where adding features ends up being superfluous and actually has a negative impact. At that point, adding more features is akin to "more cowbell," as made famous by the Saturday Night Live skit with Christopher Walken and Will Ferrel. When it comes to deciding on the feature set for a new release, you should ask yourself: "Is this feature necessary? Or is it just more cowbell?" With Paint.NET, I believe that I have, for the most part, avoided the trap of "more cowbell." However, it's becoming more difficult. It is very easy for me to add new effects and adjustments and to then put out a new release which results in a spike ...

Paint.NET v3.30 Preview

February 17, 2008 – 2:01 pm
It's time once again to start babbling about the next minor update to Paint.NET, which will be version 3.30. I'm planning to push it out the door in early April. Here's what's coming: Integration of Ed Harvey's Fragment, Vignette, and Posterize effects. An enhanced version of the Polar Inversion effect, also written by Ed Harvey and originally included in his "Polar Inversion +" plugin. PNG will now support saving in 8-bit and 24-bit. There is also an "auto-detect" option where Paint.NET will analyze the image and auto-select the lowest bit-depth that can save the image losslessly. BMP will now support saving in 8-bit. It will also have the "auto-detect" option, but there is still no 32-bit BMP support. GDI+ just refuses to cooperate in allowing me to do that. TGA will also support the "auto-detect" option, for its 24-bit and 32-bit support. For developers, IndirectUI is now available for writing UI for file type codecs. There ...

Another Dumb Way to Start a Business Proposal

February 14, 2008 – 12:40 am
They just keep coming in. Subject: re: advertising proposal Hi, I am a media buyer at Medios One LLC (www.mediosone.com).  I am interested in buying inventory on your site.  MediosOne is a global online advertising network.  We have offices in 5 countries and many more support offices around the world.  Our publisher network model gives us access to large amounts of high  quality inventory from all types of sites, which are targeted to users in many geographic locations. Some of the advertisers we work with include ICICI, Make My Trip, Max New York Life,  Zapak.com, Colgate, Hewlett Packard, Tata Sky, AOL, Citibank, and  India Times. We are  currently looking for publishers to add to our network. Currently, we are running a good  amount of campaigns targeted to the US, Asia, South America, UK as well ...

Paint.NET is going to get 8-bit and 24-bit PNG support

January 28, 2008 – 11:32 pm
"It's about time!!!" -- Many users who keep pestering me for this I just finished about 90% of the code for adding 8-bit and 24-bit support to Paint.NET's PNG codec. Most of the work wasn't even in the PNG codec itself, but rather in adding IndirectUI support for FileType plugins. Once that was done, the extra PNG code just tripped and fell into place. I just really didn't want to write another WinForms widget complete with obnoxious layout and data binding. (dang, I was trying to add a screenshot, but Windows Live Writer refuses to cooperate, oh well -- I'll save it for later I guess?) To be honest, it's that laborious and error-prone WinForms code that was preventing me from adding this support over the last 2 years. After you write it once you realize that you just don't want to write and debug it ever ...

Heterogeneous Catch Clauses for CPS Exception Handling

January 25, 2008 – 2:01 pm
Well, that title is certainly a brain-full and won't win me any search engine rankings for popular query terms. Anyway, Nidonocu had an important question he posted on my previous post about the "Do" class: This looks like this could be quite a useful class but I was wondering how this might work when it comes to wanting to catch specific exceptions rather than just the base Exception type? I know from using FxCop that using ‘catch (Exception)’ is something Paint.net rather a lot and while I’m sure you sleep at night doing that, its something I’m trying to avoid in my own app. ;) Are there any simple ways this code could be tweaked to not use Exception? The issue is that the various TryCatch() helper methods only take a single delegate ...

"Use Paint.NET to Photoshop it"

January 23, 2008 – 11:19 am
I guess "Photoshop" really is turning into a generic verb, something that Adobe is undoubtedly unhappy about. I found this on a Q&A website, paraphrased for readability: Question: "My friend has pictures of her eyes, a different color that really stick out. It's grey and her eyes are bright blue or neon green. Please tell me how to do that." (Note: I believe they are asking how to take a picture of someone's face and apply a grayscale effect to only the eyes.) Answer 1: "Oh yeah, I've seen that but I don't know how to do that either ... let's read what everyone else has to say, I want to know too..." Answer 2: "use paint.net to photoshop it" I won't link to it so as to preserve their anonymity, but it's easy enough to find by ...

More on C# Continuation-Passing Style: The Full "Do" class

January 22, 2008 – 11:00 am
Continuing on from yesterday's post about simplifying exception handling code by using lambdas and continuation-passing style, I'd like to show off some other examples. Another common pattern in code is to generate a value, test it against some condition, and then have an if/else block to execute two other blocks of code dependent on that test. So, let's introduce the TryIgnore() and GenerateTest() helper functions with an example (see below for the trivial implementation). I want to generate a full file path for a log file, delete it if it exists, and then enable logging into that file for the later Windows Installer stuff that will be happening. However, if any of that fails I do not want an exception to be propagated because it isn't critical to the success of what I'm doing. Here's the old code: (I'm omitting the code that initializes the tempPath, dwMsiLogMode, ...

Continuation-Passing Style Simplifies Your C# Exception Handling Code

January 21, 2008 – 3:41 pm
Many lines of code in C# and other imperative languages are seemingly wasted by dealing with overhead such as exception handling and the like. How many times have you written the following type of code? string[] fileNames; try {     fileNames = Directory.GetFiles(...); } catch (Exception) {     // There was an error, like the directory isn't there.     // This isn't an error for us, so just use a 0-length array     // to simplify our later code     fileNames = new string[0]; } ...