Original URL: http://www.theregister.co.uk/2008/09/02/mac_images/
Discover OS X's hidden artistic side
Jobs' past revisited
Mac secrets One of the most frequently used Cocoa classes is NSImage which, as the name suggests, is all about displaying and manipulating image data. The imageNamed: method of this class retrieves an image reference for you - provided that you know the name of the image you're after.
Many of the images that can be retrieved via the imageNamed: method have well documented names, but there's a lot of stuff in there that's not well-known. It's those images - including some for Windows - that I'll be digging into here. I shall also give you source code to a little utility that uses an entirely different mechanism to retrieve images used by OS X.
Dig into the past with AppKit
Internally, AppKit maintains an extensive list of small bitmaps that are referred to as the built-in icon list. When you call the imageNamed: method, this is one of many places that gets searched for an image of that name. You shouldn't confuse this with documented system image names such as NSImageNameIconViewTemplate, NSImageNameRefreshTemplate, and so on.
In general, the documented images are high-quality scalable images while the built-in icon list contains non-resizable bitmaps, which only look good - well, some do - at their default size.
Before we go any further let's take a trip down memory lane. Fire up our old friend Interface Builder, drop a NSImageView control onto a window and set the image name to NXdefaulticon. Note: capitalization is important.
You should be rewarded with a blast from the past: the old NeXT icon. NeXT, was of course, the company created in 1985 by Apple chief executive Steve Jobs during his brief Apple hiatus. Apple went on to buy NeXT and incorporated much of its programming framework into OS X.
Interestingly, AppKit contains a lot of these historical relics, including NXdefaultappicon, NXHelpBacktrack, and a great deal more. I imagine that a lot of these image names were originally supported to aid in porting existing NeXTSTEP applications across to OS X while the latter was under development.
In addition to a wide variety of NeXT icons, you'll also find a full complement of - horror of horrors! - Windows bitmaps. It's enough to make any self-respecting Mac developer cringe but - yes - they're there!
For example, NSWinSliderKnobAbove will give you a circa Windows-95 horizontal slider knob, with the indicator pointing upwards. NSWinSliderKnobAbovePressed will give you the pressed-in variant of the same image. Among the others, there's NSWinRadio that's a radio button in its unselected state. It's a mystery why this set of bitmaps were added to AppKit and why they're still there.
Now, you might think the built-in icon list only contains only images from the distant past, but not so. With Leopard, Apple recently introduced official support for Heads Up Display (HUD) windows. The new Interface Builder makes it dead easy to crate a HUD window for your own app, but I guess we'll have to wait until Snow Leopard before Apple give us some nice HUD controls.
As you might expect, the glyphs used to build HUD windows are contained within the built-in icon list. Thus, NSHUDActiveTitleBarFill will give you a vertical strip that's used to provide the graduated fill for an active HUD window's title bar.
All the image names are provided in a file called NSImage Names, which I've included along with this month's demo project. You'll find that some of them are old, and some are very new. For example, Apple introduced a new AppKit class called NSDockTile along with Leopard. Amongst other things, this class allows you to customize the appearance of your application's icon as it sits in the Dock.
If you look at the images entitled NSBadge1&2, NSBadge3, NSBadge4, and NSBadge5, you should gain some understanding of how NSDockTile works internally: rather than rendering that jagged-edged red lozenge from scratch, it selects the appropriate glyph depending on how many characters you've asked to display on the icon badge. Clever, eh?
ThemeWidget delivers a scrollbar glyph
Finally, as promised, this month's demo project demonstrates another mechanism whereby AppKit obtains the necessary glyphs used to support the Aqua interface.
My little ThemeWidget application makes use of an undocumented routine, _NSGetThemeWidgetImage, which is very heavily used "under the hood". It takes an image identity and retrieves the requested glyph.
Now, I haven't totally figured this out yet and you'll see from my code the list of valid image ID's is non-contiguous, hence the need to scan forwards or backwards until a new image is found. With that proviso in mind, you can download the demo application and source code here.®