Sixel is a bitmap graphics format supported by terminals and printers from DEC, most notably the VT320 and VT420. It encodes bitmaps into a character-based format that is easy to interpret, allowing it to be printed on a dot matrix printer with limited internal decoding.
Sixel encodes images by breaking up the bitmap into a series of 6-pixel high horizontal strips. Each 1-pixel-wide vertical column in a particular strip forms a single "sixel". Each sixel's pixels are read as binary and encoded into a single 6-bit number, with "on" pixels encoded as a "1". This number, from 0 to 63 decimal, is then converted into a single ASCII character, offset by 63 so that an all-black sixel, 0 decimal, is encoded as "?". This ensures that the sixels remain within the easily printable range of the character set. Carriage return is represented by "$", and line feeds with a "-", although a line feed operated more like a newline (one source suggests "/" was used instead of "$" in some implementations).
Sixel also included a rudimentary form of compression, using run length encoding (RLE). This was accomplished with the "!" character followed by a decimal number of the times to repeat, and then a single sixel character to be repeated. Since the ! and decimal digits could not be valid sixel data, lying outside the encoded range, the encoding was easy to identify and expand back out in software.
"Sixel mode" was entered by sending the sequence
<ESC>Pp1;p2;p3;q. The p1 through p3 were optional setup parameters, with p1 defining an aspect ratio (deprecated in favor of p3), p2 how to interpret the color of zeros, and p3 with simple grid size parameters.
<ESC>P is the standard DEC "Device Control String", or DCS, which was used to turn on or off a number of special features in DEC's equipment. The "q" is the sixel identifier. Sixel data then followed the q. The "Stop Text" sequence
<ESC>\ returned the device back to normal character mode again.
For printing, sixels are sent to the printer, decoded back into binary, and sent directly to the six pins of the print head. The only complexity involved expanding the RLE's into the internal print buffer. Display on a terminal is somewhat more difficult. On terminals supporting graphics (generally those with a name like "VTx4x") the ReGIS graphics system was used to directly draw the sixels into the screen's bitmap. On other terminals, the majority of DEC's lineup, they defined a custom character set with every possible sixel.
Color was also supported using the "#" character, followed by a number referring to one of a number of "color registers", which varied from device to device. Colors were defined using either RGB or HSV values in a peculiar DEC format. On a printer a line of sixels was sent several times, each representing a single bitplane from the register-based colors on the terminals (normally 2 or 4 bits). For non-graphics terminals, color was simply dropped. Since the capabilities of the hardware varied widely, a color sixel drawing could only be output to targeted devices.
<ESC>Pq #0;2;0;0;0#1;2;100;100;0#2;2;0;100;0 #1~~@@vv@@~~@@~~$ #2??}}GG}}??}}??- #1!14@ <ESC>\
The example above enters sixel mode, sets up three color registers, and then uses those registers to draw sixels in those colors. The
#0;2;0;0;0 is interpreted as "set color register 0, use RGB mode (2), set R, G and B to 0". This sets color 0 to black, and the following commands set register 1 to yellow and 2 to green.
The data lines following select a color, yellow for the first and third and green for the middle, then draw sixels. The last line shows the RLE in use. These sixels form the shape "HI".
- ReGIS, the DEC graphics language
- "VT330/VT340 Programmer Reference Manual, Volume 2: Graphics Programming", Digital, EK-VT3XX-GP-002, May 1988
- Chris Chiesa, All About SIXELs, 29 September 1990