XPM

From MultimediaWiki
Jump to: navigation, search

XPM (X PixMap) is an ASCII image format used by the X Window System. It was created in 1989 by Daniel Dardailler and Colas Nahaboo working at the INRIA, France, and was later enhanced by Arnaud Le Hors. It is intended primarily for creating icon pixmaps, and supports transparent color. It has a simple structure, deriving from the earlier XBM syntax.


Three styles are known, the simple XPM2:

! XPM2
128 128 64 1
z c #f6f6f6
Z c #eeeeee
etc., palette using 1 character codes
@ c #080808
. c #000000
............................................
truncated first row, each dot is a pixel with colour #000000 as defined above.

This is about an XPM2 image with width 128, height 128, 64 colours, using one character per pixel. One tool is known to use only a to p for 16 colours, switching to aa up to dp for 64 colours, but still reading single character encodings for 64 colours, compare Base64.

With more colours the codes use more characters, e.g. aa up to pp for 16*16=256 colours. This is less useful for text editors, because a string ab could be actually the middle of two adjacent pixels dabc. Spaces are allowed as colour code, see links, but might be a bad idea depending on the used text editor. Without control codes, space, and quote (needed in XPM1 and XPM3) 128-33-2=93 ASCII characters are available for single character colour codes.

It's helpful if the converter from other formats to XPM can sort the palette from white to black, because one of the reasons to edit an icon might be to get rid of antialiasing artefacts after a reduction of the number colours, adding affected pixels to #000000 or #ffffff acting as transparency colour (the dots in the example).

For XPM2 it's clear how many lines belong to the image, two header lines, the second header line announcing the number of colour codes (64 lines in the example above) and rows (height 128 in the example above), e.g. 2+64+128=194 lines.

The other styles are designed to be used as is in C sources, example:

#define XFACE_format 1
#define XFACE_width 48
#define XFACE_height 48
#define XFACE_ncolors 2
#define XFACE_chars_per_pixel 1
static char *XFACE_colors[] = {
"a", "#ffffff",
"b", "#000000"
};
static char *XFACE_pixels[] = {
"abaabaababaaabaabababaabaabaababaabaaababaabaaab",
etc., 48 rows with 48 pixels.

This is a black and white image in the first (1989) XPM format. The source icon was in PNG format, and although it defined #ffffff as transparent, this detail was lost in the conversion. The hex. RGB #123456 codes can be also replaced by known colour names found in a "well known location" rgb.txt, where "well known location" depends on the operating system and the used tools. The XPM "colour" name for transparency is none.

Just for the records the same image in the other styles:

! XPM2
48 48 2 1
a c #ffffff
b c #000000
abaabaababaaabaabababaabaabaababaabaaababaabaaab
etc.
/* XPM */
static char * XFACE[] = {
"48 48 2 1",
"a c #ffffff",
"b c #000000",
"abaabaababaaabaabababaabaabaababaabaaababaabaaab",
etc.

The latter format is XPM3, the common format used for the X Window System since about 1991. The c means "colour", it's possible to add m for "monochrome" output, g for "grayscale", and s for "symbolic", explaining what a defined colour is supposed to do.

The "symbolic" feature allows to adjust colours depending on the context where they are used, like say s border c blue could be adjusted on a blue background.

If the width, height, colours, and characters per pixel line contains six instead of four numbers the additional values indicate the coordinates of a "hotspot", 0 0 is the upper left corner of a box containing the icon and the default. A "hotspot" is used for mouse pointers and similar applications.