# X PixMap

X PixMap (XPM) ist ein ASCII-Text-Format für die Darstellung von Rastergrafiken, hauptsächlich Icons.
Die erste Version von XPM stammt aus dem Jahr 1989 und wurde von Daniel Dardailler und Colas Nahaboo (auch Autor des Window-Managers GWM für das X Window System) entwickelt, die beide am französischen INRIA arbeiteten. Später wurde das Format von Arnaud Le Hors erweitert. Die Intention hinter dem Format ist es, farbige Icons am Computer darzustellen. Die Struktur des Datenformats ist einfach und an das ältere monochrome XBM-Format angelehnt. Die Grafiken bestehen aus reinen Textdateien; sie können mit einem einfachen Texteditor bearbeitet und ebenso wie XBM-Dateien direkt in C-Quellcode eingebunden werden.

## Beispiel

Das folgende Beispiel demonstriert die Syntax des XPM-Formates anhand eines roten Achteckes auf einem transparenten Hintergrund, das von einem blauen Querbalken überdeckt wird.
| XPM-Quelltext | Resultierendes Bild |
| /* XPM */ static char *XPM_example = { "24 20 3 1 12 10 XPMEXT", " c None", ". c #0000FF", "+ c #FF0000", " ", " .. ", " .... ", " ......++++++++ ", " .........+++++++ ", " ..........+++++++ ", " ............++++++ ", " .............++++++ ", " ..............++++ ", " +.............+++ ", " ++.............++ ", " +++.............+ ", " +++++............. ", " ++++++.............. ", " ++++++++............ ", " +++++++++........... ", " +++++++++......... ", " ++++++++++....... ", " ++++++++++..... ", " +++++++++ ... ", "XPMEXT author Anonymous", "XPMEXT address", "Beispielweg 42a", "0815 Beispielstadt", "LUMMERLAND", "mailto:anonymous@beispielstadt.lum", "XPMENDEXT" }; | |

## Formatbeschreibung

Eine XPM-Datei besteht aus sieben Teilen:
* Kopfzeile (engl. „header line“)
* Deklarationszeile (engl. „Declaration and Beginning of Assignment line“)
* Werte (engl. „values“)
* Farben (engl. „cColors“)
* Pixel (engl. „pixels“)
* Erweiterungen (engl. „extensions“)
* Ende (engl. „End of Assignment“)
Das Format ist so definiert worden, dass eine XPM-Datei stets gültiger C-Quellcode ist. Damit können XPM-Dateien über #include-Direktiven direkt in C-Programme eingebunden werden.
Da die meisten Programme, die XPM-Dateien verarbeiten, keine vollwertigen Parser für C-Quellcode besitzen, sollte man sich beim Erzeugen von XPM-Dateien strikt an das in der Formatspezifikation beschriebene Format halten.
Die auf die Deklarationszeile folgenden Zeilen bestehen jeweils aus C-Zeichenkettenkonstanten. Dies bedeutet, ihr Inhalt wird in ASCII-Anführungszeichen eingeschlossen und durch Kommas voneinander getrennt.

### Dateikopf

Die Kopfzeile besteht aus einem C-Kommentar /* XPM */. Dieser dient als Magische Zahl, um XPM-Dateien erkennen zu können.

### Deklarationszeile

Die nächste Zeile ist die sogenannte Deklarationszeile, welche eine Variablendeklaration in C darstellt. Der Variablenname kann dabei beliebig sein, er muss ein gültiger C-Bezeichner sein. Normalerweise wird hierfür der Name der Bilddatei verwendet:

### Werte-Zeile

Die Werte-Zeile enthält vier bzw. sechs Dezimalzahlen mit folgenden Bedeutungen:
* Breite des Bildes (in Pixel)
* Höhe des Bildes (in Pixel)
* Anzahl der Farben im Bild
* Anzahl der Zeichen pro Pixelwert
* (X-Position des „Hotspots“)
* (Y-Position des „Hotspots“)
Die letzten beiden Werte geben die Position eines so genannten „Hotspots“ an. Dies ist etwa bei Mauscursorn der Punkt, auf den der Mauspfeil „zeigt“. Bei normalen Bildern wird dieser Wert nicht benötigt und kann entfallen.
Besitzt die XPM-Datei Erweiterungen (engl. extensions), so folgt auf die letzte Zahl der Werte-Zeile das Wort XPMEXT.

### Farbdefinitionen

Anschließend folgen mehrere Zeilen, die jeweils eine Farbe im Bild definieren. Die Anzahl dieser Farbdefinitionen geht aus dem dritten Wert der Wertezeile hervor.
Jede Farbdefinition besteht aus einem Zeichencode. Die Länge des Zeichencodes geht aus dem vierten Wert der Wertezeile hervor. Nach einem Leerzeichen folgen eine oder mehrere Farbdefinitionen, die dem Zeichencode eine Farbe zuordnen. Resultierend aus dem ursprünglichen Verwendungszweck von XPM als Dateiformat für Icons, können für verschiedene Darstellungsarten unterschiedliche Farbdefinitionen angegeben werden. Dies hat den Vorteil, dass die Darstellung für verschiedene Farbtiefen optimiert werden kann und nicht aus einer farbigen Darstellung eine Schwarzweißdarstellung errechnet zu werden braucht.
Folgende Darstellungsarten werden unterstützt:
    c: Farbig
    g4: Vier Graustufen
    g: Mehr als vier Graustufen
    m: Monochrom (Schwarzweiß)
    s: Symbolisch (damit kann eine Farbe einen symbolischen Wert bekommen, etwa „Hintergrund“ oder „Vordergrund“. Die Auswertung dieser Symbolinformationen ist abhängig vom verwendeten Programm)
Auf diese Angabe folgt dann die eigentliche Farbdefinition. Diese kann aus einem symbolischen Namen bestehen (z. B. „white“, „red“), eine Farbe im RGB-Farbraum als hexadezimale Farbdefinition (#RRGGBB) oder im HSV-Farbraum (%HHSSVV). Soll eine Farbe als „transparent“ gekennzeichnet sein, so ist die Farbe auf None zu setzen.
Beispiel:

### Bilddaten

Nach den Farbdefinitionen folgen die Bilddaten. Diese sind zeilenweise von oben nach unten, in einer Zeile von links nach rechts abgespeichert. Jede Bildzeile wird in einer Textzeile in der XPM-Datei abgespeichert. Pro Bildpunkt wird – abhängig vom oben angegebenen Wert – ein oder mehrere Zeichen benutzt. Diese Notation hat zur Folge, dass sich einfache Bilder bereits im Quellcode erkennen lassen, siehe ASCII-Art.

### Erweiterungen

Sofern in der Werte-Zeile das Vorhandensein von Erweiterungen angezeigt worden ist, folgen auf die Bilddaten Erweiterungs-Zeilen, die stets folgendes Format haben:
* Einzeilige Erweiterungsdaten:
    "XPMEXT extension_name extension_value"
* Mehrzeilige Erweiterungsdaten:
    "XPMEXT extension_name",
    "data",
Es ist nicht spezifiziert, wie das Ende von mehrzeiligen Erweiterungsdaten gekennzeichnet werden soll.
Die XPM-Spezifikation empfiehlt zur Vermeidung von Namenskollisionen, die Namen der Erweiterung mit dem Firmennamen beginnen zu lassen. Sie lässt allerdings offen, wie dieser im Detail aussehen soll.
Das Ende des gesamten Erweiterungs-Blocks wird durch eine Zeile angezeigt, die nur den Inhalt XPMENDEXT hat.

### Dateiende

Um die C-Deklaration abzuschließen, folgt am Dateiende eine Zeile mit der Zeichenfolge };.

## Praktische Einschränkungen

Da die meisten Programme, die XPM-Dateien verarbeiten können, keine vollständigen C-Parser sind, sollten Programme, die XPM-Dateien erzeugen, nicht von dieser Spezifikation abweichen, insbesondere keine andere Formatierung des „Quellcodes“ vornehmen und keine C-Kommentare (außer der obligatorischen Kopfzeile) oder Ähnliches hinzufügen.
Auch verstehen viele Programme die komplexen Farbdefinitionen nicht, sondern beherrschen nur eine Darstellungsart oder ignorieren diese Angabe völlig und werten nur den Farbcode aus, und verstehen außerdem nur hexadezimale RGB-Farbcodes und None für die transparente Farbe.
Die Zeichencodes, mit denen eine Farbe kodiert wird, dürfen aus beliebigen ASCII-Zeichen bestehen. Es empfiehlt sich jedoch, nur Buchstaben, Ziffern und einige „sichere“ Sonderzeichen zu nehmen, womit sich etwa 70 bis 80 verschiedene Farben darstellen lassen. Enthält ein Bild mehr Farben, muss auf Zeichencodes, die aus zwei Zeichen bestehen, ausgewichen werden. Obwohl die XPM-Spezifikation keine Maximallänge der Zeichencodes vorsieht, sollte man maximal aus zwei Zeichen bestehende Zeichencodes verwenden, was bis zu 80·80=6400 Farben zulässt, da einige Programme die XPM-Datei sonst nicht lesen können. Einige Programme weigern sich außerdem, mehr als 256 Farbdefinitionen zu lesen, oder sie erzeugen beim Speichern eine Farbtabelle mit maximal 256 Farben, obwohl das XPM-Format größere Farbtabellen zulässt.
Die XPM-Spezifikation macht keine Angaben darüber, was in den Erweiterungs-Zeilen inhaltlich stehen soll; sie definiert keine Erweiterungen. Sie werden daher praktisch nicht verwendet und die meisten Programme, die nicht die libxpm zum Lesen von XPM-Dateien benutzen, verstehen sie auch nicht.