X PixMap

{{Short description|Image file format}}

{{Infobox file format

| name = X PixMap

| screenshot = Screenshot-xterm-linux.xpm-GVIM.png

| screenshot_size = 240px

| caption = Some text editors, for example gvim, can display xpm images in graphical form.

| extension = .xpm

| mime = image/x-xpixmap.xpm MIME type not [https://www.iana.org/assignments/media-types/media-types.xhtml#image registered] at IANA

| owner = BULL Research

| creatorcode =

| genre = Image file formats

| containerfor =

| containedby =

| extendedfrom = XBM

| extendedto =

| open = yes

}}

X PixMap (XPM) is an image file format used by the X Window System, created in 1989 by Daniel Dardailler and Colas Nahaboo working at Bull Research Center at Sophia Antipolis, France, and later enhanced by Arnaud Le Hors.{{cite book|last1= Le Hors |first1= Arnaud |title= XPM Manual: The X PixMap Format |url= http://www.xfree86.org/current/xpm.pdf|access-date= 2014-01-01 |date= 1996-02-01 |publisher= Groupe Bull |pages=7–8 |ref= CITEREFLeHors1996 }}{{cite web|url= http://www.w3.org/People/danield/xpm_story.html |archive-url= https://web.archive.org/web/19970607024723/http://www.w3.org/People/danield/xpm_story.html |url-status= dead |archive-date= 1997-06-07 |title= The XPM Story |author=Daniel Dardailler|others= Colas Nahaboo and Arnaud Le Hors |date=1996-07-15|access-date=2014-01-01 }}

It is intended primarily for creating icon pixmaps, and supports transparent pixels. Derived from the earlier XBM syntax, it is a plain text file in the XPM2 format or of a C programming language syntax, which can be included in a C program file.

History

= XPM1 =

The first (1989) XPM format is relatively similar to the XBM format.{{efn|For a description of this format in lieu of the manual (not found on the Internet), use xpm-contrib (formerly part of libXpm proper) converter (xpm2ppm, xpm1to3, xpm1to2c) source code.}} Compared to XBM, it uses additional macro definitions and variables for indexed colors, and replaces bits with characters for describing the image. The following is a black-and-white image in the 1989 XPM format.

  1. define XFACE_format 1
  2. define XFACE_width 48
  3. define XFACE_height 48
  4. define XFACE_ncolors 2
  5. define XFACE_chars_per_pixel 1

static char *XFACE_colors[] = {

"a", "#ffffff",

"b", "#000000"

};

static char *XFACE_pixels[] = {

"abaabaababaaabaabababaabaabaababaabaaababaabaaab",

// and so on for 48 rows with 48 pixels

= XPM2 =

XPM2 (1990) simplifies the format by removing all C code.{{efn|It is also acceptable to use programming language syntaxes for string arrays, but only the C syntax is attested. The "XPM2 C" syntax eventually became the only format in XPM version 3.}}{{efn|For references on this syntax, see https://gitlab.freedesktop.org/xorg/lib/libxpm/-/blob/master/NEWS.old and the "history" section of libXpm 3.4 manual.}} The structure is simplified to

! XPM2

  • The value section describes the overall dimension of the image similar to the #define statements.
  • The color section defines the values, and a new concept of the "type" of the color. The types may be c for "color", m for "monochrome" output, g for "grayscale", and s for "symbolic", explaining what a defined color is supposed to do.
  • The pixels and optional extensions remain as in the original format.

The above file, with width 48, height 4, 2 colors, and 1 character per pixel, becomes:

! XPM2

48 4 2 1

a c #FFFFFF

b c #000000

abaabaababaaabaabababaabaabaababaabaaababaabaaab

abaabaababaaabaabababaabaabaababaabaaababaabaaab

abaabaababaaabaabababaabaabaababaabaaababaabaaab

abaabaababaaabaabababaabaabaababaabaaababaabaaab

== Colors ==

In addition to hexcodes, the colors can be any of the X11 color names. In addition, None indicates transparency.{{cite web|url=http://www.ibiblio.org/pub/X11/contrib/libraries/xpm.FAQ|title=The XPM FAQ|publisher=X.Org Foundation|year=1996|access-date=2016-03-12}}{{cite book|url=https://archive.org/details/mac_Graphics_File_Formats_Second_Edition_1996|title=XPM File Format Summary|isbn=1-56592-161-5|work=Encyclopedia of Graphics File Formats, 2nd Edition|access-date=2014-01-01|url-access=registration |last1=Murray |first1=James D. |last2=Vanryper |first2=William |date=1996 |publisher=O'Reilly & Associates }}

The "symbolic" feature permits adjusting colors depending on the context where they are used. Code such as s border c blue could be adjusted on a blue background.

== Many-color encoding ==

One tool is known to use only a to p for 16 colors, switching to aa up to dp for 64 colors, but still reading single character encodings for 64 colors; compare Base64.

With more colors the codes use more characters, e.g. aa up to pp for 16 × 16 = 256 colors. 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 color code, but might be a bad idea depending on the used text editor. Without control codes, backslash, and quote (needed in XPM1 and XPM3) 128 − 33 − 2 = 93 ASCII characters are available for single character color codes.

Simplified example: 90 US-ASCII characters could be arranged into nine non-overlapping sets of 10 characters. Thus unambiguous strings of nine characters could set the color of each pixel by its XPM palette index with up to 109 = {{val|1000000000}} colors (compare to GIF, which supports only 256).

For XPM2 it is clear how many lines belong to the image – two header lines, the second header line announcing the number of color codes (2 lines in the example above) and rows (height 4 in the example above), e.g. 2 + 2 + 4 = 8 lines.

= XPM3 =

The current and last format is XPM3 (1991). It re-introduces the C wrapper, but instead of explicitly showing a file's structure, the strings stored are essentially identical to XPM2.

/* XPM */

static char * XFACE[] = {

"48 4 2 1",

"a c #ffffff",

"b c #000000",

"abaabaababaaabaabababaabaabaababaabaaababaabaaab",

"abaabaababaaabaabababaabaabaababaabaaababaabaaab",

"abaabaababaaabaabababaabaabaababaabaaababaabaaab",

"abaabaababaaabaabababaabaabaababaabaaababaabaaab"

};

If the "values" line contains six instead of four numbers, the additional values indicate the coordinates of a "hotspot", where 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.

Comparison with other formats

File:Blarg.xbm.png

The following code displays the same blarg file in the XBM, XPM and PBM formats.

XBM version:

  1. define test_width 16
  2. define test_height 7

static char test_bits[] = {

0x13, 0x00, 0x15, 0x00, 0x93, 0xcd, 0x55, 0xa5, 0x93, 0xc5, 0x00, 0x80,

0x00, 0x60 };

File:Blarg.xpm.png

XPM2 version:

! XPM2

16 7 2 1

  • c #000000

. c #ffffff

  • ..*...........
  • .*.*...........
  • ..*..**.**..**
  • .*.*.*.*.*..*.*
  • ..*..**.*...**

...............*

.............**.

XPM3 version:

/* XPM */

static char * blarg_xpm[] = {

"16 7 2 1",

"* c #000000",

". c #ffffff",

"**..*...........",

"*.*.*...........",

"**..*..**.**..**",

"*.*.*.*.*.*..*.*",

"**..*..**.*...**",

"...............*",

".............**."

};

PBM file:

P1

16 7

1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0

1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0

1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 1

1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1

1 1 0 0 1 0 0 1 1 0 1 0 0 0 1 1

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1

0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0

Application support

ACDSee, Amaya, CorelDRAW, GIMP, ImageMagick, IrfanView (formats plugin), PaintShop Pro, PMView, Photoshop (plugins), and XnView among others support XPM.{{cite web|url=http://extension.nirsoft.net/xpm|title=.xpm Extension|author=Nir Sofer|access-date=2014-01-12}}{{cite web|url=http://shell.windows.com/fileassoc/0409/xml/redir.asp?EXT=xpm|publisher=Microsoft|work=Windows File Association

|title=File Type: X Windows Pixmap|year=2013|access-date=2014-01-12}} Gravatar also supports XPM.Gravatar unofficial, no XPM2{{cite web|url=http://kinzler.com/picons/ftp/index.html|title=Picons Archive|author=Steve Kinzler|author-link=Steve Kinzler|year=2005|quote=picons are in either monochrome XBM format or color XPM and GIF formats|access-date=2014-01-06}}

An X11 libXpm vulnerability was fixed in 2005,{{cite web

|url=http://www.kb.cert.org/vuls/id/537878 | id=VU#537878

|title=libXpm library contains multiple integer overflow vulnerabilities

|date=2005-10-06

|work=US-CERT

|access-date=2014-01-01}} and three more in 2023.{{cite web|url=https://lists.x.org/archives/xorg-announce/2023-January/003312.html |title=X.Org Security Advisory: Issues handling XPM files in libXpm prior to 3.5.15|date=2023-01-17}}

FFmpeg version 3.3 or later can decode XPM.{{cite web |url=https://www.ffmpeg.org/index.html#pr3.3 |title=FFmpeg 3.3 "Hilbert" |quote=XPM decoder |publisher=FFmpeg |date=2017-04-13 |access-date=2017-10-28}}

{{-}}

See also

  • {{Annotated link|Netpbm}}
  • {{Annotated link|CLUT}}
  • {{Annotated link|X BitMap}}

Notes

{{notelist}}

References

{{Reflist}}

See also