Paint.NET v3.20 Beta 2 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.

Please be sure to report any compatibility problems with plugins.

Enjoy! I’m off to go finish Assassin’s Creed on my PS3.

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: Drawing a “Fixed Size” selection was resulting in a rectangle that was 1 pixel too wide, and 1 pixel too tall
  • Fixed: A small layout glitch in the toolbar that was hiding the “Fixed Size” units selector
  • Fixed: A layout glitch in the Red Eye Removal dialog that caused it to show a scroll bar when it wasn’t necessary
  • Fixed: Header’s etched line control rendering in XP with the Luna visual style
  • Fixed: A few rare crash bugs
  • Fixed: Some corner-case glitches and crashes in the new IndirectUI and property system

Software Development Tip: Write and Maintain a “UI Map”

If the software you work on ever ends up with more than a few dialogs or a non-trivial navigation flow, then you should create a document that I call the “UI Map”. This document is quite simple to create, and the work you put in to it will pay off many, many times over. A UI Map is basically just a Word file (or pick your favorite editor, or wiki, etc.) that documents every single dialog and major state that your application can be in.

For the version 3.0 release of Paint.NET I finally created one of these at the behest of the translation team I’ve been working with, and I’m glad I did! The primary goal of this for them is to document every localizable piece of text in Paint.NET. For the new versions that I put out, it’s important to keep this document up-to-date and to spell out what is new or changed, as well as what text can be localized versus what text is supplied by the operating system (or framework, or user, etc.). Sometimes there are differences between how the UI appears in XP versus Vista (or versus 2000, 95, 98, Lunix, take your pick), and if those affect localization (or whatever your audience is interested in) then it should be noted in this document as well.

It’s very convenient for translators to be able to test that their translation does not cause layout or other visual errors, such as clipped text or worse. (And to point the finger in the right direction, it is not actually the translation that causes the error. It merely helps to expose the bug that was already there! :)) This will give them a visual tool to work with, and also makes it really easy for them to connect the text they’ve translated with where it shows up in the UI! That last part is very important, because usually a translator just sees this:

<data
name=BlockedPluginException.PluginIsNowBuiltIn>

<value>This plugin is now built-in to Paint.NET, so the old plugin DLL has been blocked from loading. You may safely delete this plugin DLL.</value>

</data>

If I hadn’t written the code myself, then I’d have no idea where to find this text in the UI and clueless when it came to validate that it showed up properly (no clipped text, scrunched layout, etc.) It won’t kill you to spend a few minutes to tell them exactly how to reach that text in the UI.

Maintaining this document with every new version also forces me to touch and re-touch every part of the UI, which is important to increase confidence in a release. I’m not always the most diligent when it comes to testing things (shh, don’t tell anyone!) and so this is a very good exercise to require myself to do. In the new Paint.NET v3.20 release I have completely reorganized the Effects menu and revamped most of the effects’ user interfaces using the new IndirectUI system. I even found a bug while I was updating the UI map!*

Notice the scrollbar and the clipped text? Yeah, oops is right. No doubt there will be more bugs like this once I do a test pass with the other languages.

Having a UI map also makes sure that you don’t forget about any part of your UI. Remember that out-of-the-way error dialog you added three days before you shipped? Yeah, that one! On a fully professional project with a large team you might think this is taken care of by the design and documentation process, and you’d be completely wrong. The UI map can also help new developers on your project to get a quick visual tour of the application. Or new managers. Or higher-up managers or marketing folks. A document like this can serve as a valuable quick-summary for all of them, or even as a reference book. There is just so much value in having a UI map.

To get started, I use the outlining feature in Word. This way I can use the indentation level as an implicit navigation guide within the application. Here’s an abbreviated excerpt from the Paint.NET UI Map that shows how I’ve documented part of the File menu (up through “New” and “Open”), with screenshots resized in order to fit more appropriately on the blog. I start out by explaining the specific purpose of the document as well as certain constraints that are important. For example, it is implied from the 2nd paragraph that if text is cut off at 800×600, but looks fine at 1024×768, then that is not something of concern.

(Also, as another tip, I highly recommend using Kenny Kerr’s
WindowClippings program for making the screenshots look super professional. It captures the glass and drop shadow effects in Windows Vista perfectly. It’s what I use. And no, this is not a paid endorsement :))

Paint.NET v3.20 User Interface Map

This document exhaustively details the Paint.NET v3.0 user interface. It is meant primarily for translators to be able to find every location in the user interface for translation-related testing and tuning. Each part of the UI will be presented with a screenshot. The outline hierarchy implicitly shows how one can navigate to a particular part of the UI. This document is not meant to provide sufficient documentation on how to use Paint.NET and its various features. It is also not meant to be instructional on how to prepare a language pack for Paint.NET. Most error dialogs will not be detailed.

NOTE: Paint.NET’s system requirements list a screen resolution of 1024 x 768. It is important that UI elements work comfortably with a maximized window at this resolution with the Windows task bar set to one (1) unit of height. The main concern here is the help and context texts for the tools, which should not be clipped at this resolution with a maximized window. Paint.NET is not designed or optimized for smaller resolutions or window sizes (e.g. 800×600, or 1024×768 with a smaller window).

1. Application
This is the interface the user sees when they start Paint.NET. By default there are four docked floating toolform windows (aka floating windows, floating tool windows).
(screenshot removed for brevity)

1.1. through 1.4 – (removed for brevity)

1.5. Menu bar

1.5.1. File
(new for v3.20: View Plugin Load Errors…)

1.5.1.1 New
When the user creates a new image, it will be called “Untitled”. This name is localizable.

1.5.1.2 Open
This is a common Windows dialog. Most of the text on it is provided by Windows.

1.5.1.2.1. The file type drop down has some strings that are localizable:
(New for v3.10: “DirectDraw Surface (DDS)” is now a supported file type)

1.5.1.2.2 In Windows Vista, the dialog will look like this instead:

1.5.1.2.3
If the user is transferring files from a location that is not mapped to a file system path (such as from an http:// source, or from a digital camera that is not mapped to a drive letter), then they will see the following UI:

If the user cancels the transfer, they will see this while the transfer is being canceled:

If there is an error while transferring (server error, camera failure / disconnect), then this dialog will be shown. Note that the error message (“A device attached…”) is provided by the OS and/or the .NET Framework, and is not localizable. It will generally be supplied in the language that the OS and/or Framework is configured or installed for.

* To be fair, a member of the forum, “I Like Pi,” actually pointed this out first. I would have discovered this much sooner however, if I had updated my UI map two weeks ago instead of waiting until tonight!

Trying out Kontera advertising

I just signed up for Kontera’s in-text advertising program. I’ve put it on the main Paint.NET website and on the help content. It seems pretty unobtrusive, and hopefully it will help out the bottom line. Maybe it will increase revenue 5%, 10%, maybe 50%? (That would be exciting!) Who knows! I won’t know unless I try.

I’m trying to convince Terrence to try Kontera on his blog, but so far he’s resisted my manipulative logic. So I pointed him to John Chow’s sage wisdom about when you should put ads on your blog. Maybe he can make double what AdSense is sending his way, which is to say … nothin’ so far. (which is fine since he doesn’t have much traffic yet) But at least it’s greater than or equal to zero.

And don’t worry, the Paint.NET software itself is still advertising free. One directive with Paint.NET is to provide software you can use without having to feel embarrassed about it. “Hey look, your paint program has ads! Haha!” Yeah, no. Having ads inside a client application is not something that’s really been done well yet, in my opinion. I have ideas on how to do this, but so far they’re not ones that I can share.

Like I Said: Releasing Often = Success

Back in September I posted a tip stating that freeware authors should release frequent updates to their products. I claimed to be practicing this tip myself, and that it was working. A constant stream of updates creates a constant stream of press and blog coverage. Someone who sees two bits of news about Paint.NET is more likely to try it out than if they’d seen only one bit of news.* I personally don’t recommend going the uTorrent route and updating two new builds every day though – that seems a bit too much. Why should I even bother updating when a new release is just hours away? However, I’ll bet their ad revenue is higher than mine, so I’ll keep my mouth shut beyond that 🙂

For the last few weeks I have been aggressively pushing out pre-release updates to Paint.NET v3.20 (one update per week!), and so I have some new data. Today (or rather yesterday), November 20th, 2007, was my 4th highest traffic day ever as reported by Google AdSense. The #1 and #2 days were right after the huge v3.0 release at the end of January. The #3 day was at the end of March after v3.05 was released. And because of all the new ways I’ve optimized my AdSense, today’s earnings were significantly more than double the average of those 3 days’ earnings: more clicks, much higher CTR, and significantly higher eCPM. Just like John Chow says, there’s really only one secret formula: get traffic, optimize ads. It’s true, and everyone with a monetized website knows it.

As far as data I can actually share**, Google Analytics states that today there were 17,412 unique visitors to http://www.getpaint.net :

Including the help content and other areas I track separately, there were over 24,000 unique visitors. This is obviously chump change to anyone who runs big websites for a living (imagine how much traffic I’d get if I really, really tried). I’ve always wondered how much money one could make if they were able to sneak their AdSense code on to the front page of Google.com or Microsoft.com … even if just for one hour!

My prediction is that with the next beta release, which I should have out by end of next week, I’ll break this record. And we’ll be that much closer to another stable, quality Paint.NET release …

* Just another theory of mine. I could be wrong, but probably not.

** AdSense’s Terms of Service are pretty strict about not sharing most of your statistics other than gross earnings.

Terrence Follows My Advice, But Will He Double His Money?

A friend and former co-worker of mine, Terrence, has started up a new blog called Double Journey. His goal is to double his money from $20,000 to $40,000 using any legal means at his disposal. So far he’s in the hole by almost $100 because of website hosting and domain costs, although that isn’t really a big deal.

Terrence and I have talked extensively about money-related matters over the past year, usually while eating sushi. It’s no secret that I want to be able to retire* as early as possible (like most people!), and I talk a lot about how I make money with Paint.NET even though I’m giving it away for free. I talk about all the reasons why I don’t want to charge money for it. I talk about traffic levels, click-through rates, audience and user base size, ad placement and flow optimization, statistics, etc. I probably talk about it way too much, in fact – maybe I just like to hear my own voice!

Regardless, there’s a few things that I’ve realized over the last few years that I’ve managed to cram in to his head (or down his throat?) over the last year. Namely, that doing something is always better than doing nothing. Even if you don’t make any money on what you’re doing, I can guarantee you’re at least learning something (heck, universities charge thousands of dollars for that!). It may be that you’re learning what doesn’t work, which has its own value. So Terrence came up with an idea and started up this blog, and has been writing posts every day or two for the last few weeks. He recently put up a donate button of his own, and I am quite sure that’ll he’ll make at least $0 from it. This is something I did with Paint.NET in 2006 and I can assure you I’ve made much more than “at least $0” from it. It’s even my #1 tip for freeware authors. (sorry, I still don’t feel comfortable sharing my revenue numbers)

I do think his post regarding his donate button could use a little work, mostly for SEO purposes. Maybe he can get his cat featured on I Can Has Cheezburger? or Cute Overload though.

Do you really want this cat to go hungry? Do you realize by not giving money, you are killing this cat? You can help save this cat by clicking the “donate” button in the right column.”

Terrence has also crammed some important ideas into my head. Namely, that saving money is a smart thing to do! I realize this sounds obvious, but for the longest time I really didn’t have any money in savings: I’d pay rent, make my car payment, buy some DVD’s, etc. My checking account was at equilibrium and wasn’t really going anywhere. I was still in “college kid mode”: I lived, I ate, I bought toys. I didn’t think about my financial needs past the next big computer upgrade. Over the last year I’ve moved past this and finally have enough money to necessitate spending some effort in managing it. I have a large spreadsheet in Excel where I track all my major expenses and incomes. I even met with a financial planner today and he had some good advice that I’ve already started implementing (“put more money into the 401k!”).

Will Terrence double his money? I hope so, because then he’ll be obligated to buy me lunch at Sushi Land. Be sure to go and read his blog, and maybe even send him a dollar so his cat can eat more gourmet food. And then you can send me a dollar 😛 (or 10, or 20, etc… although I prefer Euros!)

* “Retire” in this case really means “have enough money to obviate the need for a day job.” For example, if you have $20 million in the bank and are earning an ultra-conservative 5%, then at the end of the year you can take 1% of that as income ($200,000) and let the remaining 4% ($800,000) stay towards keeping up with inflation. At that point you really don’t need to have a day job.

Paint.NET v3.20 Beta 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.

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.
  • Improved: Updating performance should now be faster. It used to be the case that two system restore points were created during update (one for uninstall, and one for re-install), but now only one is created to cover the entire transaction.
  • Changed: Ctrl+Alt+0 now works for “View actual size”. This is not listed in the View menu as a shortcut, but should help those used to keyboard commands from Photoshop, etc.
  • Changed: Some plugins that were causing stability problems are now blocked from loading. They will show up in the File->View Plugin Load Errors dialog.
  • Changed: Old effect plugin DLL’s that have since been integrated into Paint.NET (Glow, Portrait, etc.) are now blocked from loading.
  • Fixed: For revamped effect configuration dialogs, the first textbox is now auto-selected instead of the OK button. This makes keyboard usage more convenient.
  • Fixed: Close/Cancel button flickering while downloading an update
  • Fixed: The floating tool windows (Tools, History, Layers, Color) will double-check that they are on-screen when they are toggled on/off
  • Fixed: If two images had the text tool active and both had active text being edited, then Backspace would not always be routed to the correct image
  • Fixed: Open/Save dialogs in Windows Vista with high-DPI would sometimes have garbled thumbnail rendering (fixed by adding “high DPI aware” flag to EXE manifest instead of using SetProcessDPIAware function)
  • Fixed: Some minor high-DPI glitches in new UI features
  • Fixed: For newly revamped effect configuration dialogs, the focus rectangle (“dotted rectangle”) for sliders is drawn only when necessary
  • Fixed: Several rare crashes

Enjoy! I’m off to play video games for once. I still haven’t passed the first level of Halo 3.

Paint.NET v3.20 Alpha 2 is now available

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

Please be sure to report any compatibility problems with plugins! Note: The new plugin system is still subject to change. Plugins written for this alpha are not guaranteed to work with the Beta or Final releases (although I will of course do my best to avoid breaking things).

  • 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: Paint.NET would crash if you clicked on the “start cap” or “end cap” buttons for the Line/Curve tool*
  • Fixed: Using Sepia would produce a result identical to Black & White, and would also mess up the undo history
  • Changed: Tolerance slider control is now 25% wider as per request on the forum
  • Changed: Improved the Magic Wand cursor
  • Changed: Improved the Paint Bucket cursor
  • Fixed: OnSetRenderInfo() was being called twice for effects that use the new property system
  • Fixed: Soften Portrait allows “0” for the Softness value again
  • Fixed: Tweaked some of the slider controls in some of the revamped effects
  • Fixed: Compatibility with several plugins

* You would not believe how many e-mails I got about this crash! Good thing it was just an alpha relase!

Sepia is broken in 3.20 Alpha

A forum member who goes by the name Myrddin was quick to point out that the Sepia adjustment has a bug. It does two things … one, it seems to produce a result equivalent to the Black & White adjustment. And two, if you undo it, it doesn’t produce the right result. It breaks the history system, essentially.

So, just to warn everyone. The 3.20 Alpha is way cool (not that I’m biased), but stay away from Sepia for now. I’ve found the bug, and the fix will be in the next update. Thanks for your patience.

Paint.NET v3.20 *ALPHA* is now available

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

Please be sure to report any compatibility problems with plugins!

Change log:

  • 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.
  • New: Ability to do ‘Fixed Size’ and ‘Fixed Ratio’ selection drawing with the Rectangle Select tool
  • New: Added selection ‘combine mode’ (replace, add, subtract, xor) to the toolbar. This makes this feature much more discoverable.
  • New: Added magic wand / paint bucket ‘flood mode’ (contiguous, global) to the toolbar. This makes this feature much more discoverable.
  • New: Mandelbrot and Julia fractal render effects.
  • New: Implemented new property and UI systems that makes it much easier to develop effect plugins. Authors may now specify properties with default, min, and max values and the UI for this will be dynamically generated. (instead of the author having to spend hours writing WinForms code)
  • New: Better error handling for plugin effects. They will no longer crash Paint.NET, and will provide easier access to the diagnostic and support information.
  • New: If a plugin fails to load, then a “View Plugin Load Errors” item will be added to the File menu.
  • New: Added ‘Coverage’ property to the Add Noise effect.
  • New: Added ‘Center’ (offset) property to Radial Blur, Zoom Blur, Bulge, and Twist effects. This allows you to set the center of rendering, complete with an image underlay preview.
  • New: Added ability to do counter-clockwise rotation in the Twist effect. Also added ability to change the size of the twisted area in the Twist effect.
  • Changed: In Frosted Glass effect, the performance was highly optimized. Increased max radius to 200 (instead of 10), and added ‘minimum scatter radius’ and ‘smoothness’ properties.
  • Changed: Enhanced all built-in effects and adjustments (except for Layers, Curves, and Rotate/Zoom) to use the new effect UI system.
  • Changed: Reorganized Effects menu into categories: Artistic, Blurs, Distort, Noise, Photo, Render, Stylize.
  • Changed: Command link buttons now look better in Windows Vista.
  • Changed: Moved ‘Median’ from the Blurs menu to the Noise menu.
  • Changed: Rendering for the ‘angle chooser’ control is nicer now.
  • Fixed: Header label flickering in some parts of the UI.
  • Fixed: Some window activation issues with the Save Configuration Dialog if you switched to another program and back while it was open.
  • Fixed: Some buttons and checkboxes were not honoring the theme animations in Windows Vista.
  • New: Added text to installer to remind people that Paint.NET is free of charge, and if they paid for it (other than to donate), then they should ask for a refund (e.g. eBay swindlers).

Note: The new plugin system is still subject to change. Plugins written for this alpha are not guaranteed to work with the Beta or Final releases (although I will of course do my best to avoid breaking things).

Update on Suspicious Donations

Earlier I wrote that I was receiving many small, suspicious donations. I notified PayPal about the issue, but unfortunately I only got a form-letter response back (and it took a week to get it). I refunded every single suspicious donation, and was getting worried that the refunding would then flag me as some participant. So I started including comments in the refunds to notify the individual that I had reported the activity to PayPal and to STOP IT. There was no “please” or politeness in my wording, but there were also no accusations or anything.

Finally, today I got an e-mail directly from the individual.

    Subject: Sorry

    Definitely no more such donations.

Hopefully that means it is done. I don’t know if the individual was actually trying to send me small donations and did not understand that PayPal takes 100% until you reach about 35 cents, or if it was an attempt at gaming or fraudulent activity. As long as this is the end of it, I consider this case to be closed.