[~] BACK



~~ XPM ~~

** LUSTIGE DATEIFORMATE **

[COD] | [20200708] | [0] | [0x17]




In meiner neusten Variante der XMobar sitzt ein kleiner grüner Space Invader oben links im Eck. Das kann man bei XMobar per *.xpm file realisieren.
Deswegen gibt es heute "Spaß mit außergewöhnlichen Fileformaten". XPM steht für "X PixMap" und ist ein ASCII-Text-Format. Es wird dazu benutzt Rastergrafiken darzustellen. Meistens wird es bei Icons verwendet. XPM wurde 1989 von Daniel Dardailler und Colas Nahaboo entwickelt. Letzterer vielleicht bekannt durch den GWM Windowmanager für X-Window-Systeme.

Das *.xpm Format wurde so definiert, dass ein .xpm file stets gültiger C-Quellcode ist. Dadurch können *.xpm files direkt per #include in C-Code eingebunden werden.


Die Syntax eines .xpm File ist überschaubar und leicht verständlich.

Hier mein SpaceInvader:

space_invader.xpm
/* XPM */
static char * spaceinvader_xpm[] = {
"20 20 2 1 XPMEXT",
"       c None",
".      c #afd75f",
"                    ",
"    ..        ..    ",
"    ..        ..    ",
"      ..    ..      ",
"      ..    ..      ",
"    ............    ",
"    ............    ",
"  ....  ....  ....  ",
"  ....  ....  ....  ",
"....................",
"....................",
".. .............. ..",
".. .............. ..",
".. ..          .. ..",
".. ..          .. ..",
"     ....  ....     ",
"     ....  ....     ",
"                    ",
"                    ",
"                    ",
"XPMEXT author PHØ   ",
"mailto:post@nerdbude.com",
"XPMENDEXT           "};


Das *.xpm File besteht aus sieben Teilen:

- header line
- declaration and beginning of assignment line
- values
- cColors
- pixels
- extensions
- end of assignment


header line

Die header line besteht aus einem C-Kommentar.

/* XPM */
Dieser Kommentar gilt hier als "magic number" und definiert, dass es sich um ein .xpm file handelt.

declaration and beginning of assignment line

In der Deklarationszeile wird eine C-Variable deklariert. Der Name der Variable ist frei wählbar, muss allerdings ein gültiger C-Bezeichner sein. Meistens wird hier einfach der Bildname verwendet.

static char * spaceinvader_xpm[] = {

values

Die Values enthalten 4 bzw 6 Dezimalzahlen (im Beispiel nur 4)

20 20 2 1

20 - Breite des Bildes in px
20 - Höhe des Bildes in px
2 - Anzahl der Farben im Bild
1 - Anzahl der Zeichen pro Pixelwert


Die letzten beiden Zeichen (5 + 6) sind Werte die sogenannte Hotspots angeben, etwa bei einem Cursor die Stelle an die der Cursor zeigt.
Bei normalen Bildern kann man diese aber getrost ignorieren und brauch diese auch nicht.
Wenn in der Datei extensions benutzt weden, folgt den 4/6 Zahlen noch XPMEXT (xpm extension).


cColors

Die Anzahl der Farben wurde schon in den Values bestimmt (2).
Nun geht es an die Definition der Farben.

" c None", ". c #afd75f",

Jede Farbdefinition besteht aus einem Zeichencode. Für verschiedene Darstellungsarten können hier auch unterschiedliche Farbdefinitionen angegeben werden. So kann die *.xpm für unterschiedliche Farbtiefen optimiert werden und brauch nicht jedesmal auf b/w runtergerechnet weden. Folgende Optionen stehen zur Verfügung:

c - Farbig
g - mehr als vier Graustufen
g4 - vier Graustufen
m - Monochrom
s - symbolscher Wert (wie Foreground oder Background)

Auf diese Optionen folgt die eigentliche Farbdefinition.
Entweder in HEX (#afd75f) oder HSV (%80, 55.8, 84.3). Transparenz wird einfach mit "None" festgelegt.


pixels

Nun kommt das eigentliche Bild bzw. die Informationen welcher Pixel Farbe abbekommt und welcher transparent bleibt.
Eine Pixelzeile im Bild entspricht auch einer Zeile in der *.xpm Datei. Herrlich für ASCII Art und der Fantasie sind keine Grenzen gesetzt.

Wenn man *.xpm files in C-Code verwendet lässt sich das bild auch schon im Quellcode erahnen.

extensions

Zu guter letzt hat unser *.xpm file noch die extensions. Die extensions sollten in folgendem Format benutzt werden:

"XPMEXT extension_name extension_value"

Im Falle des Space Invaders also so:

"XPMEXT author PHØ" "mailto:post@nerdbude.com", "XPMENDEXT"};

Das XPMENDEXT am Ende schließt die extensions. Und "};" schließt die C-Deklaration ab.

Also wozu *.jpg und *.gif wenn man *.xpm haben kann.
So sieht der kleine Kerl im übrigen aus:


und finden könnt ihr ihn auf Github:

Link (Github)
[~] BACK