Paint.NET Usability: Why can’t you move the toolbars around?

That’s a good question. Office lets you move the toolbars and even the menubar around (it’s just a differently rendered type of toolbar). Visual Studio lets you, and the “toolstrip” controls in .NET 2.0 supposedly have the capability. So why, then, doesn’t Paint.NET allow you to move them around or do other customization?

As Raymond Chen would say, “Because the alternative is worse.”

It becomes a usability problem, or at least an annoyance, for the people who don’t want to customize their toolbar*, and this is something I was reminded of just now when I looked over at RSS Bandit and saw this:

Why is my menu bar below the toolbar? Because I accidentally dragged something around. I don’t know when or what.

It becomes a usability and support nightmare because people would lose the toolbars, or otherwise be unable to find features they already found. Do not underestimate individuals’ ability for this! And it’s not about stupidity or intelligence, it’s just about usability. I recently had a reasonably intelligent friend ask me, “Where is that new ‘Fixed Size’ functionality for the selection tool that you’ve been talking about?”, and it was right in front of his face.

It also hinders productive troubleshooting or communication between two Paint.NET users.

Bob: “Just click on X in the toolbar.”
John: “I don’t see it.”
Bob: “It’s kinda on the far-right side. Do you have the latest version?”
John: “Yes I have 3.20.”
Bob: “Umm … is part of the window off-screen?”
John: “No the whole thing is only taking up half my monitor.”
Bob: “Yargh. Did you hide or move the toolbar or is the toolbar off-screen or under some other stuff?”
John: “I don’t know?”
Bob: “Click the Reset Toolbars menu item in the Window menu.”
John: “Hmm. We have another problem. I have no menus either.”
Bob: “I will start using four-letter words from now on. Plug your ears.”

Here’s the conversation without customized toolbars:

Bob: “Just click on X in the toolbar.”
John: “I don’t see it.”
Bob: “It’s kinda on the far-right side. Do you have the latest version?”
John: “Oh there it is! And yeah I have 3.20.”

So, because I do not want an inbox full of people asking me how to fix their toolbars or how to find their features, and nor do I want to have to add complicated self-healing code or a “Reset Toolbars” menu item (that people would still lack the psychic powers to find, mind you!), I have disallowed this type of functionality. The toolbars will only ever show up in Paint.NET in one way. Oh, and I also want people to be able to use the software and not have a need to consult documentation or a support line. Because if users have to do that, then you have failed.**

* According to conventional insight, most people do not customize anything about the software they use.

** I think this insight comes from a blog I’ve read elsewhere but for the life of me I can’t find it.

Paint.NET’s plans for 2008

I want to start working on Paint.NET v4.0, and the time has finally come. I have some wicked ideas on pervasive parallel programming that I am hoping to thoroughly integrate throughout the application*. However, this will take a lot of time to engineer, and may involve significant refactoring or a “spiritual rewrite”. It will take at least a year to complete, if not more.

In the meantime, however, the v3.xx architecture still has some life left in it (duh). My plan is to have new, minor releases of the v3.xx branch throughout the course of 2008 at 6-week intervals. To start, I plan on releasing v3.22 in mid-January. It will have some bug fixes, a performance tweak, and Tom’s “Reduce Noise” plugin. After that, you can expect something like a v3.24 release by March. Maybe I’ll add 8-bit and 24-bit support to PNG or something. I’m not sure yet. It will depend on what the user base is clamoring for of course.

For a freeware like Paint.NET, you cannot just have a year-long gap between releases. You have to keep interest in the project alive which means staying on the front page of sites like Neowin. The project grows by having short, large spurts of press coverage. When I released version 3.0 in January of this year, the short-term increase in traffic was enormous and the smaller but long-term, sustained increase was crucially important.

Other revenue opportunities might present themselves as well, such as developing and selling a “Paint.NET Plugins Pack” for $10 or something. These could provide fuel for more rapid development of the major version 4.0 release.

* I have a lot of thoughts in this area, but so far have not distilled them into short-enough blog posts. It’s one of those, “where do I start?” and “who’s my audience?” problems.

Good results with Visual Studio 2008 so far

I installed the 90-day trial of Visual Studio 2008 Professional and have just finished getting Paint.NET to work in it. So far, here’s what I’ve run in to, good and bad:

  • The new version of the C# compiler (csc.exe) produces slightly smaller binaries in a few cases. This is good.
  • It can also understand “Vista icons”. That is, you can embed a 256×256 icon with PNG compression into an EXE. With Visual Studio 2005 you could have a 256×256 icon but not the PNG compression or you’d get a compiler error.
  • Apparently the order in which items is returned via reflection has changed. This in itself is fine, but it has exposed a logic bug in my IndirectUI code! It’s a rather subtle bug that is very obvious once you understand it. This was a case where things were accidentally working because “A” had a superset of the properties that “B” had, and my system was always taking the first item’s list of properties and using it for both (which was the bug). Now for some reason, “B” comes before “A”, so “A” is only getting the 2 properties that “B” specifies instead of the 7 that “A” is stating. Oops.
  • They fixed the build parallelism bug that was really biting me! In Visual Studio 2005, the part of the build which created MSI’s using the built-in “Setup Wizard” project type would not block the rest of your build which was properly flagged as dependeing on it, from building. This caused a major race condition for building the MSI and then building the self-extracting EXE that bundled it. To work around that I had to set the maximum build tasks to 1. Now it works great!

These are all good for me. Faster build times and smaller files to distribute.

Follow up for Slashdot and Source Code Release

First off, welcome Slashdot readers! 🙂 http://developers.slashdot.org/developers/07/12/15/1332207.shtml

I just got done approving all your comments after waking up from a nice 10 hour sleep (yay weekends). Many are supporting, some are not so kind. I’m approving any comment that is non-spam (“free casino games!”), although if there are cuss words I am redacting those portions with asterisks. I’m not trying to censor discussion that I disagree with, in other words.

Anyway, to clarify: I am not closing Paint.NET’s source code. I am still releasing the source code for Paint.NET v3.20. I have the zip file right here (well, 7z file ;)) and I just have to wake up first (not want decaf!) and do uploadings and e-mails and HTML stuff to publish it. The only thing being removed is the installer, and the translated string resource files. The license has changed to move the resource assets under a Creative Commons license. That’s all. I believe this keeps 99% of what 99% of people are interested in, while closing the doors that enable the 0.0001% jerks out there to easily exploit things (“I have to write my own installer? Wah boohoo, I’ll find another target.”) I’ve kept track of some of the “easy exploit” vectors and have found ways to either legally prevent them, or to make the work required to loophole them enough that lazy people will give up quickly. Also, please remember that this is the Internet and I can change my mind later. This isn’t the ten commandments chiseled in to stone tablets 🙂 I could very well decide it’s too much effort to do this, and find a different way to address the problem. Maybe I’m just blowing off steam.

The goal is not to prevent any open use of the source code. Some have suggested that I should sue the guy, but I’ve already dealt with him so that isn’t necessary. Some have suggested that I should have used the GPL or BSD license, but that wouldn’t be possible because first, I don’t like GPL (let’s please not start a battle about it). Second, it would restrict some of the freedoms that I do want to allow: honest incorporation of portions of Paint.NET’s code into another software without licensing stipulations (for starters). Third, I don’t have complete executive privilege here. Portions of Paint.NET are incorporated from elsewhere (with permission of course), or are even owned by Microsoft from way back in the day, and I cannot change those parts of the licensing without consent (or by doing a full rewrite). Nor do I want to chase everyone down to get this consent when I can achieve my goals easier by doing something else. So I have moved the resource assets to a CC license which means if you really want to rip-off Paint.NET then you have to rewrite all the text and redo all the graphics. At that point you have proven you are either not lazy, or that you have OCD, or something. By which time I’ve released 4.0 and you are way behind again.

There was a comment about the Mono guys and their porting efforts. I don’t believe this will hinder them, nor is it a goal of mine to do so. I’ve e-mailed with Miguel de Icaza on occasion with the specific intent of making sure that it is possible for them to port Paint.NET. They wouldn’t be able to make much use of Paint.NET’s installer code anyway because it is very Windows-specific. And they probably won’t need to edit the resource files and can just use them as-is. If/when we find problems in the licensing that impede this, then we can adjust the license for the next release. Or I can provide them with permission to do what they need to do. This is iterative development folks, isn’t that what everyone likes?

To address why I didn’t publish the guy’s name, website, etc. The reason is that I honestly believe there are some extenuating circumstances that are not fully known. From what I have read, some believe the guy is disabled, or is being purposefully defamed by someone who has a grudge against him. The other possibilities that I have considered is that he is mentally deranged in some way – split personality, schizophrenia, etc. This would be congruent with the weird e-mails I’ve had with him in the past. He has been seen under or claiming different last names. In any case, there would be no benefit other than revenge for publishing this information.

Paint.NET v3.20 (Final) is now available!

Please digg this article: Paint.NET v3.20 new version now available!

Alright, you can either get it from the website, http://www.getpaint.net, or via the built-in updater from the Help menu (“Check for Updates”). Thanks are due to everyone for all the alpha and beta testing help. Enjoy! And now I’m hungry so I’m gonna go eat or something.

New in this release since v3.10:

  • Rectangle Select tool can now draw selections based on a Fixed Size or Fixed Ratio
  • The selection combination mode is now accessible from the toolbar (Replace, Add (union), Subtract, Invert (“xor”)).
  • The “flood mode” for the Magic Wand and Paint Bucket tool are now accessible from the toolbar (Continuous, or Global)
  • Reorganized the Effects menu so that all effects are classified under submenus named Artistic, Blurs, Distort, Noise, Photo, Render, and Stylize.
  • Improved rendering quality for the Motion Blur effect.
  • Enhanced the Radial Blur effect so that the center of blurring can be chosen, as well as the quality.
  • Enhanced the Zoom Blur effect so that the center of zooming can be chosen.
  • Enhanced the Bulge distortion effect so that the center of “bulging” can be chosen.
  • Enhanced the Frosted Glass distortion effect in several ways: 1) performance has been improved from between 1,000% to 10,000% depending on image size and property settings, 2) the scatter radius can now be set up to 200 pixels, 3) a “minimum” scatter radius can be chosen, 4) a smoothness setting is now available.
  • Enhanced the Tile Reflection distortion effect by adding a Quality property.
  • Enhanced the Twist distortion effect by 1) allowing counter-clockwise twisting, 2) allowing the size of the twisted area to be configured, 3) allowing the location/center of twisting to be chosen.
  • Enhanced the Add Noise effect by adding a “coverage” property.
  • New Mandelbrot Fractal and Julia Fractal render effects.
  • New IndirectUI system for plugin authors so that they can develop much more sophisticated effect configuration dialogs with a fraction of the amount of work that used to be required.
  • If an effect plugin crashes, it is much more likely that Paint.NET will be able to recover from the error. The option to restart Paint.NET will then be provided as a recommended course of action.
  • If an effect plugin fails to load, or is blocked from loading, then a “View Plugin Load Errors…” item will be added to the File menu which can be clicked on to show the error and/or diagnostic information.
  • Improved the cursors for the Magic Wand and Paint Bucket tools.
  • Ctrl+Alt+0 now works for View->Actual Size (aka, “Zoom to 100%”), which is a shortcut key that other software uses (e.g., Photoshop).
  • Updates are now installed faster by only creating one System Restore point instead of two (it used to implicitly create one for uninstall, then one for the reinstall).
  • Lots of little bug fixes.

Paint.NET v3.20 … soon! And updated licensing details

All the translations are ready to go, and there was only 1 bug that had to be fixed which you can read about on the forum if you really want to. Now I just have to finish updating the help content. I’m hoping to have the final release of 3.20 available tonight or tomorrow.

Well, that and I have to finish drafting this update to the Paint.NET licensing. I had a discussion with Dioni, who manages the translations of Paint.NET, about the licensing of both the regular release and the source code release. I believe we have come to a good decision about how to change the licensing that won’t affect normal users and that will have minimal or insignificant impact on those who are interested in the source code.

There are 4 types of abuses of Paint.NET, or even simple hazards of otherwise legitimate use, that I want to protect against:

  1. Blatant and insulting “Backspaceware”, as detailed in my two previous fuming posts on the matter (first post, second post).
  2. Paint.NET being sold on eBay, or in an otherwise similar fashion. This includes burned on to a CD by itself and sold for shipping costs, or the typical selling of “information” (“Ooh I know where to get this awesome thing, send me $5 and I’ll tell you!”), or even charging for a mirrored download link. Yes, I’ve seen all of these.
  3. Renamed and resold versions of Paint.NET, such as Office ONE Paint. I find this to be inappropriate, but far less offensive than the aforementioned backspaceware, and so I’m calling it out separately. I believe it’s even within the rights of the Paint.NET license, so I have not pursued it. However, I still don’t like it and want to prevent it going forward.
  4. Honest and appropriate derivative works that are still using Paint.NET’s Internet resources accidentally. For example, the Help menu item, “Send feedback” should not have paint.net AT hotmail.com in the source code release. Otherwise I’ll get crash logs from forked projects. Also, the auto-updater will not be functional because I don’t want derivative projects to be pinging my server, nor do I want those users to get new versions of Paint.NET offered to them (which will uninstall their non-Paint.NET software). Derivative works must not be confused with Paint.NET, or vice versa.

Here are some of the things I do not want to hinder or prevent:

  1. Normal installation and use of Paint.NET. I don’t want any of Paint.NET’s licensing to “follow” or “infect” any files that are opened, modified, or saved with Paint.NET.
  2. Legitimate educational study of the source code.
  3. Legitimate and honest adoption of portions of Paint.NET source code in to other software. For example, I’m totally fine with someone using the code for Gaussian Blur.
  4. Translation of Paint.NET to another language, by way of releasing a language pack. Note that I am not opposed to someone charging for a language pack – I personally think that’d be weird, but it’s not really a concern of mine.
  5. Free-of-charge distribution of unmodified Paint.NET through channels such as websites or magazine/book CD-ROM’s. This includes the fact that I don’t want to be required to approve every website that wishes to do this. Just do it.

So, here are the changes to Paint.NET and its licensing:

  1. The source code for the installer will not be released. This also includes the project files for creating the MSI.
  2. The text / string and icon / graphic resources, which is *.resources and *.resx as well as all embedded graphics files within PaintDotNet.Resources.dll, will now be licensed under the Creative Commons Attribution-Noncommercial-No Derivate Works 3.0 United States License. An exception is provided for releasing a non-English translation of the text/string resources. I am having to be careful here so that people don’t think I’m trying to force images loaded or saved with Paint.NET to be “infected” with this license.
  3. The non-English translations will not be included in the released source code. This does not affect normal use of Paint.NET – the compiled translations will still be included there.
  4. Any place where URL’s or e-mails are included in the source code will be erased, along with a compiler-error inducing text such as, “You need to provide a URL or e-mail address here.” (Note: This has been in place for several releases, but I’m including it for completeness)
  5. The auto-update functionality will be disabled somehow in the released source code. Most likely this will be done by using the aforementioned “URL erasing”.
  6. The installer that is released will have text during installation that clearly spells out, “Paint.NET is FREE OF CHARGE. If you paid money for it (other than to donate at the Paint.NET website, of course) then we recommend that you get a refund!” (Note: This was in place for v3.20 from the beginning, I’m just including it for completeness)

I believe these will correctly prevent what I don’t want, while still protecting what I want to allow. There are still loophole opportunities in these provisions, but the goal is that any rhetorical loophole will present a huge barrier in the amount of work required to “jump through it”. For example, even though the RESX files are no longer released you can still generate them from the publicly available RESOURCES files. But the RESOURCES file doesn’t allow derivative works, so you’d have to rewrite all the UI text for Paint.NET anyway. And you wouldn’t be able to re-use any of the icons or graphics. Or, maybe you’d decide that you wanted to release a scam version in another language using the translation excuse. Well, then you’ll only be able to target a fraction of the market anyway. Etc. etc.

Paint.NET v3.20 Release Candidate 1 is now available

You can get it either from the website, http://www.getpaint.net, or from within Paint.NET itself via the auto-updater. Note: Make sure you have “Also check for beta releases” enabled. You can access this option by going to Help -> Check for Updates, and then clicking on the “Options” button.

The number of fixes in this release is very small, and that’s a good indicator that we’re almost ready for the final release. I’m hoping to have that out by Friday, in fact.

Please be sure to report any compatibility problems with plugins.

Changes:

  • Note: New features will be displayed in English through the Alpha and Beta release(s). The final release will include full translations for the other supported languages.
  • Fixed: If a floating tool window (Colors, History, Layers, Tools) was not docked/snapped, and the screen resolution was lowered or a Remote Desktop session was initiated, then the window would stay off screen and be “lost”. It is now moved to keep it on-screen.
  • Fixed: An issue for plugin developers where Effect`1.Render(3) was incorrectly throwing an exception when indirectly called through Effect.Render(6). This was preventing an updated version of the “Film Noir” plugin from working, even though its code was correct.
  • Integrated updated translations for Spanish, French, Japanese, Korean, Portuguese (Brazil), and Chinese (Simplified). An updated German translation will be present in the final release.

Tips For Dealing With Backspaceware

Prior to my previous blog post, I had sent the “author” of the Paint.NET rip-off an e-mail asking and telling him to remove the software, and why. People suggested that I sue him, but I didn’t think it was necessary to start with that. I am happy to report that I have been successful at having the software taken down and discontinued. So as another tip for freeware authors, I am going to document how I dealt with the situation.

NOTE: This does not constitute, and should not be taken as, legal advice. I am merely documenting what I did as an example of what worked for me, and my thoughts on the matter.

1. I fumed for a few hours. Don’t underestimate the power of letting yourself cool off before sending e-mails. On a side note, I also try to avoid sending e-mail at all until I’m at least past my first cup of coffee in the morning. I am not a morning person, and I found myself sending out snappy replies!

2. I sent him the following e-mail. Notice that I did not attack or insult him, and stuck mostly to a strict “just the facts” writing style. I made no threats of legal action, nor any promise that I would not take legal action. That last part is key – you don’t want to promise yourself into a corner by way of a technicality. Maybe they remove the scam software, only to put it up the next week with a new name (“oh hey look it has an exclamation mark at the end, it’s a totally different name!”).

<Name Removed>,

So we meet again. Once again (this is the 3rd time at least) you are blatantly violating the licensing and copyright of Paint.NET, and ripping off plugins from the Paint.NET forum. The software in question is called “<Name Removed>” located here:

<URL Removed>

You have also plagiarized content from the Paint.NET website, and have removed the copyright and permission notice from what you are distributing. Not only that, but your software removes Paint.NET when you install it and also tries to use the same installation directory (C:\Program Files\Paint.NET). It incorrectly claims to be based on “PaintDotNet” which is a program that does not exist (it’s called Paint.NET). Throughout the program itself it also claims to be Paint.NET (“Choose Tool Defaults”, for instance).

I also don’t think the various plugin authors will be happy to hear that you are blatantly ripping off their plugins without their permission, and without giving them any credit. This is a blatant violation of United States copyright law, and is not just a matter of etiquette.

So, this is another cease-and-desist notice. You must remove the “<Name Removed>” software from your website immediately, and also discontinue the product. I will check back on Thursday and if this is done then I will consider the matter settled.

-Rick Brewster

Here’s the response I got the next day (which was Wednesday)

program will be removed sometime today

It actually took until the next day for it to be removed, but whatever.

3. I found various download sites that were hosting it, such as SoftPedia and Foto-Freeware, and sent them a notice about the software. In fact, I used the links on the page for “Report Spyware” and “Send us update information,” anything that I thought would end up being read by a human being and taken seriously. I informed them that it was a rip-off of Paint.NET and was violating copyright laws, etc. and that they should kindly take it down. Remember, these guys want to be on your side and they deal with a LOT of software updates every day, so it makes NO sense to let any of your anger bleed into your conversations with them. Both of the sites I just mentioned were very understanding and accommodating, and removed the software quickly (thanks!).

4. Since the software was still on download.com, I requested members of the forum to submit civil, articulate reviews stating that it was copyright violation, rip-off, etc. etc. (Yes this means that if you go dig on the forum you will indeed find out more about the culprit’s name, etc.) Thankfully, the reviews they have submitted are tasteful and do not attack download.com itself. Here’s an excerpt from one of them:

“CNET- if you do not remove this illegal and distasteful software from your servers, your reputation among the software community will forever be associated with the aid of copyright violators and warez downloads. Don’t allow your name, which has heretofore been known as a great source of software, become a synonym for theft.”

Unfortunately, their policy on copyright violation is heavily weighed down, no doubt by their lawyers. I have to send an infringement notice by regular mail. It’s ridiculous. Please just let me send you an e-mail and let it escalate through your customer support staff. Or, since I have an account on upload.com so I can manage my own freeware listing, give me an e-mail or contact form for this type of stuff.

Update: The offending software has been pulled from download.com.

Since I started with a [mostly] civil tone and was patient about compliance, I probably saved at least $5,000 in legal costs (that’s a very uneducated guess, mind you). I didn’t see the need to start by threatening a lawsuit, especially because only three things can occur then: 1) they comply, or 2) they don’t comply, and successfully call your bluff and their backspaceware is still online, or 3) they don’t comply, and you have to spend lots of money on lawyer stuff and actually sue them.

By not threatening legal action up-front you leave your options open while you consult with friends and real legal advice as to what you should do. Do not assume the person you are dealing with is a mature, intelligent, respectful adult. You have to treat them like a teenager who would like nothing better than to flaunt in your face the fact that they are pissing you off and that there’s nothing you can do about it. Threatening a lawsuit will just make them more excited!