source: libcaca/branches/0.6/NOTES @ 405

Last change on this file since 405 was 281, checked in by Sam Hocevar, 19 years ago
  • NOTES BUGS: + Updated information about the S-Lang colour pair shortage bug.
  • src/graphics.c: + Implemented the solution explained in NOTES.
  • Property svn:keywords set to Id
File size: 7.7 KB
Line 
1$Id: NOTES 281 2003-12-25 21:28:55Z sam $
2
3   o  Colour does not work with all backends and all terminals. I tested
4      many terminal emulators and tried to summarise which combinations
5      worked properly and which ones did not.
6
7      From termcap(5):
8
9       set_a_background              setab        AB        Set background
10                                                            color to #1, using
11                                                            ANSI escape
12       set_a_foreground              setaf        AF        Set foreground
13                                                            color to #1, using
14                                                            ANSI escape
15      From the xterm terminfo:
16
17        setab=\E[4%p1%dm, setaf=\E[3%p1%dm
18
19      From the xterm-16color terminfo:
20      (http://www.sct.gu.edu.au/~anthony/info/X/Xterm_xf86.terminfo)
21
22        setab=\E[%?%p1%{8}%<%t%p1%{40}%+%e%p1%{92}%+%;%dm,
23        setaf=\E[%?%p1%{8}%<%t%p1%{30}%+%e%p1%{82}%+%;%dm,
24
25      These values can be simply retrieved with a tigetstr() call.
26
27   o  I tested the following terminals:
28
29         name             $TERM        $COLORTERM
30        ------------------------------------------
31         Linux console    linux
32         pterm            xterm
33         aterm            xterm        rxvt-xpm
34         wterm            xterm        wterm-xpm
35         Eterm            xterm        Eterm
36         xterm            xterm
37         gnome-terminal   xterm
38         konsole          xterm
39         mlterm           mlterm
40         uxterm           xterm
41
42   o  In most terminals, \e[3xm and \[4xm respectively set the foreground
43      and background colours. x is a colour between 0 and 7 or the value
44      9 for default colour (may be transparent).
45
46      \e[0m sets everything to normal, \e[1m sets bold, \e[5m sets blink
47      and \e[7m sets inverse video.
48
49      In ncurses, only 64 colour pairs are created, and A_BOLD (\e[1m) and
50      A_BLINK (\e[5m) are used for foreground/background colour highlighting,
51      hence creating 256 possible colour pairs.
52
53      Different tests of blue on yellow:
54
55      for invert in '' '\e[7m'; do
56        for blink in '' '\e[5m'; do
57          for bold in '' '\e[1m'; do
58            echo -ne "$bold$blink$invert"'\e[33m\e[44m'hop'\e[0m '
59            echo "($bold$blink$invert)"
60          done
61        done
62      done
63
64      Successfully works on:
65       + Linux console
66       + pterm
67       + Eterm
68       + aterm, wterm, rxvt
69
70      Almost works on:
71       + xterm (bright bg only works when fg is bright and then inverted,
72         but then fg is not bright)
73
74      Fails on:
75       + mlterm (no bright colours, neither fg nor bg)
76       + gnome-terminal (no bright bg)
77       + konsole (no bright bg, $blink really blinks)
78
79   o In an XTerm-compatible terminal, \e[9xm sets bright foreground
80     and \e[10xm bright background colours. Documentation on this can be
81     found at http://ftp.xfree86.org/pub/XFree86/4.2.1/doc/ctlseqs.TXT .
82     Unfortunately all terminals don't support these escape sequences. Here
83     is a testcase:
84
85      for fgpre in 3 9; do for fg in 0 4 2 6 1 5 3 7; do
86        for bgpre in 4 10; do
87          echo -ne '\e['$fgpre$fg'm'
88          for bg in 0 4 2 6 1 5 3 7; do echo -ne '\e['$bgpre$bg'm# '; done
89          echo -ne '\e[0m '
90        done
91        echo ''
92      done; echo ''; done
93
94      Successfully tested on:
95       + gnome-terminal
96       + konsole
97       + xterm
98       + pterm
99
100      Failed (\e[9x and \e[10x don't do anything) on:
101       + Eterm
102       + aterm, wterm, rxvt
103       + mlterm
104       + Linux console
105
106   o  How to draw bright colours on any terminal?
107
108      '\e[93;104m' -> bright yellow on bright blue
109       doesn't work on mlterm, gnome-terminal, konsole
110
111      '\e[5;1;33;44m' -> bright yellow on bright blue
112       doesn't work on mlterm, aterm/wterm/rxvt, Eterm, console
113
114      '\e[5;1;33;44;93;104m' -> bright yellow on bright blue
115       works on gnome-terminal, xterm, pterm, aterm/wterm/rxvt, console
116       doesn't work on konsole
117
118   o  S-Lang:
119
120      256 character pairs are definable, but only 128 can be used. This is
121      because slsmg.c's This_Color variable uses its 8th bit to indicate an
122      alternate character set. Replacing a few 0x7F with 0xFF in sldisply.c
123      works around the problem but gets rid of the alternate charset.
124
125      We can work around this problem. See this usage grid:
126
127                      bg                         1 1 1 1 1 1
128        fg                  0 1 2 3 4 5 6 7  8 9 0 1 2 3 4 5
129
130        0 (black)             C C C C C C F  B c c c c c c F
131        1 (blue)            A   h D h D i f  C C h E h E k g
132        2 (green)           A h   D h i D f  C h C E h k E g
133        3 (cyan)            A D D   i h h f  C E E C k h h g
134        4 (red)             A h h i   D D f  C h h k C E E g
135        5 (magenta)         A D i h D   h f  C E k h E C h g
136        6 (brown)           A i D h D h   f  C k E h E h C g
137        7 (light gray)      A F a a a a a    B C C C C C C B
138
139        8 (dark gray)       A C C C C C C B    d d d d d d F
140        9 (light blue)      A C h E h E j C  e   h D h D l C
141        10 (light green)    A h C E h j E C  e h   D h l D C
142        11 (light cyan)     A E E C j h h C  e D D   l h h C
143        12 (light red)      A h h j C E E C  e h h l   D D C
144        13 (light magenta)  A E j h E C h C  e D l h D   h C
145        14 (yellow)         A j E h E h C C  e l D h D h   C
146        15 (white)          A F b b b b b B  F C C C C C C 
147
148      ' ': useless colour pairs that can be emulated by printing a space in
149           any other colour pair that has the same background
150      'A': black background colour pairs that are needed for the old renderer
151      'B': gray combinations used for grayscale dithering
152      'C': white/light, light/dark, lightgray/light, darkgray/dark, dark/black
153           combinations often used for saturation/value dithering (the two
154           other possible combinations, lightgray/dark and darkgray/light, are
155           not considered here)
156      'D': next colour combinations for hue dithering (magenta/blue, blue/green
157           and so on)
158      'E': next colour combinations for hue/value dithering (blue/lightgreen,
159           green/lightblue and so on)
160      'F': black on light gray, black on white, white on dark gray, dark gray
161           on white, white on blue, light gray on blue (chosen arbitrarily)
162
163      'A': 15 colour pairs
164      'A'+'B': 20 colour pairs
165      'A'+'B'+'C': 74 colour pairs
166      'A'+'B'+'C'+'D': 98 colour pairs
167      'A'+'B'+'C'+'D'+'E': 122 colour pairs
168      'A'+'B'+'C'+'D'+'E'+'F': 128 colour pairs
169
170      The remaining slightly important colour pairs are:
171
172      'a': light gray on dark colour: emulate with light colour on dark colour
173      'b': white on dark colour: emulate with light gray on light colour
174      'c': black on light colour: emulate with dark gray on dark colour
175      'd': dark gray on light colour: emulate with dark colour on light colour
176      'e': light colour on dark gray: emulate with dark colour on dark gray
177      'f': dark colour on light gray: emulate with light colour on light gray
178      'g': dark colour on white: emulate with light colour on white
179
180      And now the seldom used pairs:
181
182      'h': 120 degree hue pairs can be emulated as well; for instance blue on
183           red can be emulated using magenta on red, and blue on green using
184           cyan on green
185
186      And the almost never used pairs:
187
188      'i': dark opposite on dark: emulate with dark opposite on black
189      'j': light opposite on dark: emulate with light opposite on black
190      'k': dark opposite on light: emulate with black on dark
191      'l': light opposite on light: emulate with white on light
192
193   o  MS-DOS: all bright colours, bright backgrounds, and bright combinations
194      work using <conio.h>. No need to kludge anything.
195
Note: See TracBrowser for help on using the repository browser.