Three Awesome Drawing Apps For OS X Under $30

I’ve discovered three really outstanding, and really reasonably priced, shareware drawing applications for OS X. If you’ve blown your budget on a Wacom pad and suddenly realize you can’t afford something huge and crazy like Painter or Photoshop — and you discover that the Gimp for OS X isn’t hip to pressure-sensitive tablets — check these out.

ArtRage from Ambient Design

My homeboy Adam Black pointed me at this one, I think. It’s cross-platform. It’s kind of like Corel Painter in that it’s oriented towards simulating natural media — chalks, oil paints, pencils, watercolors, crazy things like that. Development is ongoing; it’s been updated a couple times since I bought it. There’s a reasonably functional free version as well.

What’s Awesome: It is really, really, REALLY good at simulating natural media. You can seriously create things that look exactly like chalk drawings on textured paper, or oil paints on canvas, or whatever. It takes a while to learn to control the media, but their forums are really helpful. It has layers, “stencils,” “reference images,” all kinds of crazy things. There is an immense amount of power in Artrage.

What’s Less Awesome: Ironically, it’s kind of hard to make drawings that don’t yell “NATURAL MEDIA!!!!” at the top of their lungs. Getting smooth paper and a simple black line is actually a bit of a hassle. The interface, while really original and cool, seems not to have been originally designed for macs, and if you go fullscreen it kind of fights with the Dock. (So I don’t.)

TabletDraw from mooSoftware

This is seriously minimalist. It is aimed at doing one thing very well: drawing with a tablet.

What’s Awesome: They claim to have an outstanding algorithm/whatever for accurately recording quick, subtle strokes, and my experience bears that claim out. You can sign your name quickly on the tablet and it will look just right on the screen. You can create really nice line drawings with it; you can tweak the “pens” along several axes (size, how much they grow/shrink depending on pressure, transparency, color, and whether they allow darker lines underneath them to show through, which is called “ink mode”). It’s easy to build up a palette of useful brushes. You can do interesting things with it once you learn to work with its minimalism. Essentially everything you do with it is “pen drawing” — but you can have “pens” with any color ink, any transparency, any size, the ability to layer over darker ink, etc.

What’s Less Awesome: The minimalism is extreme. They have no layers, for example. A recent feature is that you can load a reference drawing up in the background, and draw on “onionskin” above it, which is a large fraction of what you’d want to do with layers, but that is unwieldy — you have to save an image and then reload it as a reference. The resizing behavior of canvas vs. window is weird too until you learn how to work with it. These are not dealbreakers by any means, but TabletDraw is something that you have to learn your way around. It’s not always what you expect it to be, and it’s not everything to everybody.

Scribbles from Atebits Software

I’ve only just discovered this one. Scribbles is so slick it looks like it was created for Steve Jobs to demo at a keynote address. It uses the latest Mac imaging technology (so you need OS X 10.4 or better to use it), and it’s — wow.

I haven’t had long to explore it but here are first impressions:

What’s Awesome: Incredibly slick, easy to use interface. All the controls and tools are giant and easy to select. The layers control shows animated layers in perspective and how they’re related to each other. Responsiveness to tablet pressure and movement is good. There are a good number of basic tools (pens with varying degrees of fuzziness, erasers, some wacky coloring tools).

No, Really, What’s Awesome: Resolution-independent infinite canvas. You are drawing on an infinte sheet of paper and can zoom in or out all you want, for an arbitrary level of detail or expansiveness. It’s kind of like Rita (also worth checking out, and free) in that way, but I’m finding it a bit easier to use than Rita. In the other programs I’ve used, I usually create a very large canvas to start with so I don’t have to worry about pixellation… I don’t have to do that here.

More Awesome: “tracing paper” mode, where the *entire application* turns semitransparent, so you can trace, say, an image in your web browser.

What’s Not So Awesome: Haven’t discovered that yet but I’m sure I will. Nobody’s perfect. I guess you can’t use it to do simulated natural media like in ArtRage at all, and I don’t know whether its tablet movement responsiveness is as exquisitely awesome as TabletDraw’s. It doesn’t seem to have the ability to really customize your pen tips to be just what you want, like in TabletDraw, so if you want to do exquisite penwork TabletDraw is probably still the winner. But man. It’s tres slick.

Any one of these is easily worth your money. Check ’em out if you’re in the market.

Stupid Ruby Serialization Tricks

This post is for the small fraction of readers of this blog that dig programming in Ruby… apologies to anyone else….

So, I was fooling around with Ruby when I came up with the following trick.

Let’s say you have an object that you want to be persistent across invocations of your application. A set of configuration settings, history, who knows what. You don’t want to go nuts and worry about a whole database though. There are a couple good super-light-weight transactional persistence libraries built in to Ruby, PStore and YAML::Store, which do the job. You could them like this:

o = MyCoolObject.new

# to store it first
YAML::Store.new(".storage_for_my_app").transaction do | store |
  store['MyCoolObject'] = o
end

# .. and to retrieve it from storage.
YAML::Store.new(".storage_for_my_app").transaction do | store |
  o = store['MyCoolObject']
end

You’ve got to remember to store it again when you’re done with it of course.

I came up with a variation on this:

class MyCoolObject
  def MyCoolObject.stored_in(filename, *newargs)  # class method
    YAML::Store.new(filename).transaction do | store |
      store['self'] ||= MyCoolObject.new(*newargs)
      yield store['self']
   end
  end
end

Now I can make sure everything I do with my cool object “o” is stored persistently. All I have to do is wrap my actions on “o” in a stored_in block:

MyCoolObject.stored_in(".storage_for_my_app", 'a', 'b') do | o |
  # o is either recreated from .storage_for_my_app, or
  # created anew with args 'a' and 'b' passed to its constructor

  # .. here we do stuff with o
end
# and here o is re-serialized, with any changes intact.

When the block opens, ‘o’ is either resurrected from the storage file, or created anew from *new_args if there’s nothing in the file.

When the block ends, any changes to ‘o’ are stored there.

As long as you keep all your interaction with the object inside stored_in blocks, you’re golden. You get persistence!

Note that ‘o’ can hold other objects in its instance variables, which can hold other objects, and so on — anything in there that’s serializable can be stored this way. So you can use this to persist a whole pile of objects in one file as long as they all live in a single object which has a stored_in class method.

I thought this would be cool functionality to include in a module, whereupon I learned that in Ruby, a module’s “class methods” are not added to a class when you include a module in it. (I guess because a module isn’t a class and so it doesn’t really technically have “class methods”…) but you can get the same effect using a tiny bit of trickery with the “included” method of the Module class.

Here’s a module you can use to give any class these kind of storage abilities:

require 'yaml/store'

module StoredInFile
  def self.included(base)
   def base.stored_in(path, *args)
     YAML::Store.new(path).transaction do | store |
       store['self'] ||= self.new(*args)
       yield store['self']
     end
    end
  end
end

You use it like this:

class MyCoolObject
include StoredInFile

# other class stuff goes here

end

And that’s it.

UPDATE:

Stupid WordPress makes including code in a page really hard…  keeps eating my formatting.  I think I’ve got it…