======================================================================
=                               Sixel                                =
======================================================================

                             Introduction                             
======================================================================
Sixel, short for "six pixels", is a bitmap graphics format supported
by terminals and printers from DEC. It consists of a pattern six
pixels high and one wide, resulting in 64 possible patterns. Each
possible pattern is assigned an ASCII character, making the sixels
easy to transmit on 7-bit serial links.

Sixel was first introduced as a way of sending bitmap graphics to DEC
dot matrix printers like the LA50. After being put into "sixel mode"
the following data was interpreted to directly control six of the pins
in the nine-pin print head. A string of sixel characters encodes a
single 6-pixel high row of the image.

The system was later re-used as a way to send bitmap data to the VT200
series and VT320 terminals when defining custom character sets. A
series of sixels are used to transfer the bitmap for each character.
This feature is known as soft character sets or dynamically
redefinable character sets (DRCS). With the VT240, VT241, VT330, and
VT340, the terminals could decode a complete sixel image to the
screen, like those previously sent to printers.


                             Description                              
======================================================================
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 printable character range of the ASCII character set.
Carriage return (CR) is represented by , and line feeds (LF) with a ;
both had to be sent in turn to return the cursor to the start of the
line, .

Sixel also includes a rudimentary form of compression, using
run-length encoding (RLE). This is 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 cannot
be valid sixel data, lying outside the encoded range, the encoding is
easy to identify and expand back out in software.

"Sixel mode" is entered by sending the sequence . 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.  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 "String Terminator" sequence
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 six pins in the print head. The only
complexity involved expanding the RLEs into the internal print buffer.
Display on a terminal is somewhat more difficult. On terminals
supporting graphics, the ReGIS graphics system was used to directly
draw the sixel pattern into the screen's bitmap. This was done at high
speed by storing the bitmap patterns as a glyph and then blitting
them.

When used for defining custom character sets the format was almost
identical, although the escape codes changed. In terms of the data,
the only major difference is the replacement of the separate CR/LF
with a single /. In the VT300 series for instance, 80-column character
glyphs were 15 pixels wide by 12 high, meaning that a character could
be defined by sending a total of 30 sixels.

Color is also supported using the  character, followed by a number
referring to one of a number of color registers, which varied from
device to device. The colors in the registers are defined using either
RGB or HLS values in a peculiar DEC format. To create a color image on
a printer, a line of sixels is sent several times, each representing a
single bitplane from the register-based colors on the terminals
(normally 2 or 4 bits). Since the capabilities of the hardware vary
widely, a color sixel drawing can only be output to targeted devices.
Non-graphics terminals generally silently ignore sixel escape
sequences.


                                Sample                                
======================================================================
␛Pq
#0;2;0;0;0#1;2;100;100;0#2;2;0;100;0
#1~~@@vv@@~~@@~~$
#2??}}GG}}??}}??-
#1!14@
␛\


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 mode 2 (RGB
mode), set R, G and B to 0%". This sets color 0 to black, and the
following commands set register 1 to yellow (100%, 100%, 0%) and 2 to
green (0%, 100%, 0%). Unlike most modern systems which assign an 8-bit
value (0–255) to each color channel, RGB mode is based on "intensity"
of each channel from 0% to 100%.

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, meaning "repeat @ (0b100000) 14 times". The final
output is 14 pixels by 7 pixels, so the last line simply repeats
0b100000 14 times to fill the last line. $ at the end of a line means
that the next line will overprint the current line, while - means that
the next line represents a new line of sixels.


                               See also                               
======================================================================
*ReGIS - a means of displaying vector graphics on later DEC VT-series
terminals
*Semigraphics - text-based graphics, including "squot" sub-character
square blocks


                              References                              
======================================================================
*[http://www.vt100.net/docs/vt3xx-gp/chapter14.html "VT330/VT340
Programmer Reference Manual, Volume 2: Graphics Programming"],
Digital, EK-VT3XX-GP-002, May 1988
*Chris Chiesa,
[http://www.digiater.nl/openvms/decus/vax90b1/krypton-nasa/all-about-sixels.text
All About SIXELs], 29 September 1990
*


                            External links                            
======================================================================
*[ftp://ftp.invisible-island.net/shuford/terminal/sixel_graphics_news.txt
"Sixel Graphic News"]
*[https://saitoha.github.io/libsixel/ "Sixel software library"]
*[https://www.vt100.net/dec/vt320/soft_characters "VT320 Soft
Character Sets"]
*[https://sourceforge.net/projects/sixelviewer/ "Sixel Viewer and
sample Sixel images"]
*[https://sourceforge.net/projects/bmp2sixel/ "BMP to Sixel
converter"]


 License 
=========
All content on Gopherpedia comes from Wikipedia, and is licensed under CC-BY-SA
License URL: http://creativecommons.org/licenses/by-sa/3.0/
Original Article: http://en.wikipedia.org/wiki/Sixel