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!

Freeware Authors: Beware of “Backspaceware”

Update, 2007-12-15 @ 1pm PST: Welcome Slashdot readers! Please see my other blog posts on the matter before jumping to make a comment: the first, second, third, and fourth.

Paint.NET’s license is very generous, and I even release the source code. All free of charge. Unfortunately it gets taken advantage of every once in awhile by scum who are trying to profit from the work of others. I like to call this backspaceware*. They download the source code for something, load it up in to Visual Studio (or whatever), hit the
backspace key over the software’s name and credits, type in a new name and author, and re-release it. They send it to all the download mirror sites, and don’t always do a good job covering up their tracks.

There is currently an individual who is doing this with Paint.NET. I won’t mention them by name or link to them in order to avoid pumping up their PageRank. Basically what they’ve done is downloaded the Paint.NET v3.10 source code, renamed it and changed the credits, removed the license and copyright notice (which violates the Paint.NET license, btw), plagiarized a bunch of content from the Paint.NET website, and bundled half the plugins from the Paint.NET forum without any of the authors’ permission.

That last one really pisses me off. It’s not enough to take advantage of my generosity, he has to backstab the altruistic community as well. “My paint program supports all sorts of cool effects and file formats!!!” Yeah jerk, because you ripped off the work of 50 people by blatantly violating United States copyright law. What’s even more entertaining is that this is the third time this guy has done this! He’s also been known to do this with all sorts of other freeware applications that are nice enough to release the source code. Oh, and did I mention when you install this guy’s backspaceware that it uninstalls Paint.NET? It also tries to use the same installation directory, %PROGRAMFILES%\Paint.NET.
(Don’t worry I used a virtual PC) He didn’t even remove the LICENSE.TXT files from the plugins he stole, which correctly cite themselves as Paint.NET plugins.

Real innovative work there, bub. I hope he puts this on his resume and someone asks him about it during an interview – that would be an entertaining conversation to watch.

Manager: “So you ripped off Paint.NET and a bunch of plugins, and re-released it with your name on it?”
Him: “Yup!”
Manager: “Cool! Welcome to your new job at Clown Burger. Make sure to ask customers if they want fries with that.”
Him: “I get free lunch right?”

I went and searched through my Inbox for his name because I wanted to find the e-mails I sent him the last two times he did this. What I also found was that awhile ago I actually gave this scumface technical support when he was having trouble installing Paint.NET! It’s so nice that he’s turned around and dumped on my face to show his appreciation.

To combat this and a few other similar instances that have happened over the years, I believe I will change the way that I release the source code for Paint.NET. As a stopgap before the v3.20 release, the version 3.10 source code is no longer available, starting immediately, while I finalize on this decision. It just feels like it’s a disaster waiting to happen with the way I’ve been releasing it so far.

Here are the changes I’m thinking of:

  1. I will no longer be releasing the source code for the installer.
  2. I will no longer be releasing the source code for PaintDotNet.Resources.dll, which has the code for loading resources as well as all the graphics (icons, logo, etc.)
  3. I will no longer be releasing the text and graphic resources in the source code distribution (RESX files, icons, logos). This includes the translations to non-English languages.
  4. I am still contemplating how much of PaintDotNet.exe I want to release. Especially parts such as the updater and core parts of the main UI that I’ve spent a lot of creative energy on.

The goal is to dramatically increase the amount of work required to release a backspaceware version of Paint.NET. The first one clearly does this. The 2nd and 3rd make it much harder to change names, credits, and logos. The 4th one makes it much more difficult to rip off the UI or “shell” of Paint.NET.

Plugin authors often need something to debug with, and I still want to ensure that people can study the source code for educational or honestly innovative purposes. These consumers of the source code don’t need access to the resource files: you can just use the PaintDotNet.Resources.dll and PaintDotNet.Strings.3.resources that ship with the regular download. However, by making it more difficult to commit a “backspace violation”, I am hoping to put an end to this and other lazy copycat schmucks.

A lot of software implements copy protection to save profits, but I’ve never really believed in the stuff. It’s unfortunate that I have to investigate these measures in order to help protect myself and others from lazy ripoff jerks.

* Someone else suggested “thief-ware”, but I think that implies at least a little planning and cunning. I believe that “backspace”-ware correctly infers the level of simple laziness and lack of any real skill.