Changeset 281
- Timestamp:
- Dec 25, 2003, 10:28:55 PM (19 years ago)
- Location:
- libcaca/trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
libcaca/trunk/BUGS
r270 r281 7 7 scrolling. 8 8 9 o Slang cannot display 256 colour pairs under Unix. 9 o Slang cannot display 256 colour pairs under Unix. This is partially 10 solved by the OPTIMISE_SLANG_PALETTE code. 10 11 11 12 o the X11 driver is very slow. -
libcaca/trunk/NOTES
r279 r281 129 129 130 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 * f C C h E h E Fg132 2 (green) A h D h * D f C h C E h *E g133 3 (cyan) A D D * h h f C E E C *h h g134 4 (red) A h h * D D f C h h *C E E g135 5 (magenta) A D * h D h f C E *h E C h g136 6 (brown) A * D h D h f C *E h E h C g137 7 (light gray) A aa a a a a B C C C C C C B131 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 138 139 8 (dark gray) A C C C C C C B d d d d d d C140 9 (light blue) A C h E h E * C e h D h D *C141 10 (light green) A h C E h * E C e h D h *D C142 11 (light cyan) A E E C * h h C e D D *h h C143 12 (light red) A h h * C E E C e h h *D D C144 13 (light magenta) A E * h E C h C e D *h D h C145 14 (yellow) A F E h E h C C e *D h D h C146 15 (white) A b b b b b b B CC C C C C C139 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 147 148 148 ' ': useless colour pairs that can be emulated by printing a space in … … 158 158 'E': next colour combinations for hue/value dithering (blue/lightgreen, 159 159 green/lightblue and so on) 160 'F': black on light gray, black on white, and yellow/blue (chosen161 arbitrarily)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 162 163 163 'A': 15 colour pairs 164 164 'A'+'B': 20 colour pairs 165 'A'+'B'+'C': 7 6colour pairs166 'A'+'B'+'C'+'D': 100colour pairs167 'A'+'B'+'C'+'D'+'E': 12 4colour pairs165 'A'+'B'+'C': 74 colour pairs 166 'A'+'B'+'C'+'D': 98 colour pairs 167 'A'+'B'+'C'+'D'+'E': 122 colour pairs 168 168 'A'+'B'+'C'+'D'+'E'+'F': 128 colour pairs 169 169 … … 175 175 'd': dark gray on light colour: emulate with dark colour on light colour 176 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 darkgray177 'f': dark colour on light gray: emulate with light colour on light gray 178 178 'g': dark colour on white: emulate with light colour on white 179 179 -
libcaca/trunk/configure.ac
r277 r281 45 45 AC_CHECK_LIB(slang,SLkp_init,:,AC_MSG_ERROR([cannot find slang library])) 46 46 AC_DEFINE(USE_SLANG, 1, Define to activate the slang backend driver) 47 CPPFLAGS="${CPPFLAGS} -DOPTIMISE_SLANG_PALETTE=1" 47 48 CACA_LIBS="${CACA_LIBS} -lslang" 48 49 fi -
libcaca/trunk/src/graphics.c
r274 r281 72 72 #if defined(USE_NCURSES) 73 73 static int ncurses_attr[16*16]; 74 #endif 75 76 #if defined(USE_SLANG) 77 static int slang_assoc[16*16]; 74 78 #endif 75 79 … … 98 102 static unsigned int _caca_rendertime; 99 103 104 #if defined(OPTIMISE_SLANG_PALETTE) 105 static int _caca_fgisbg = 0; 106 #endif 100 107 static enum caca_color _caca_fgcolor = CACA_COLOR_LIGHTGRAY; 101 108 static enum caca_color _caca_bgcolor = CACA_COLOR_BLACK; 109 110 /* 111 * Local functions 112 */ 113 #if defined(USE_SLANG) 114 static void slang_init_palette(void); 115 #endif 116 117 static unsigned int _caca_getticks(void); 102 118 103 119 /** \brief Set the default colour pair. … … 117 133 _caca_fgcolor = fgcolor; 118 134 _caca_bgcolor = bgcolor; 135 119 136 switch(_caca_driver) 120 137 { 121 138 #if defined(USE_SLANG) 122 139 case CACA_DRIVER_SLANG: 123 SLsmg_set_color((bgcolor + 16 * fgcolor) /*% 128*/); 140 141 #if defined(OPTIMISE_SLANG_PALETTE) 142 /* If foreground == background, discard this colour pair. Functions 143 * such as caca_putchar will print spaces instead of characters */ 144 if(fgcolor != bgcolor) 145 _caca_fgisbg = 0; 146 else 147 { 148 _caca_fgisbg = 1; 149 switch(fgcolor) 150 { 151 case CACA_COLOR_BLACK: 152 fgcolor = CACA_COLOR_WHITE; 153 break; 154 case CACA_COLOR_WHITE: 155 fgcolor = CACA_COLOR_BLACK; 156 break; 157 default: 158 if(fgcolor <= CACA_COLOR_LIGHTGRAY) 159 fgcolor = CACA_COLOR_BLACK; 160 else 161 fgcolor = CACA_COLOR_WHITE; 162 } 163 } 164 #endif 165 166 #if defined(OPTIMISE_SLANG_PALETTE) 167 SLsmg_set_color(slang_assoc[fgcolor + 16 * bgcolor]); 168 #else 169 SLsmg_set_color(fgcolor + 16 * bgcolor); 170 #endif 124 171 break; 125 172 #endif … … 193 240 case CACA_DRIVER_SLANG: 194 241 SLsmg_gotorc(y, x); 195 SLsmg_write_char(c); 242 #if defined(OPTIMISE_SLANG_PALETTE) 243 if(_caca_fgisbg) 244 SLsmg_write_char(' '); 245 else 246 #endif 247 SLsmg_write_char(c); 196 248 break; 197 249 #endif … … 259 311 if(x + len >= _caca_width) 260 312 { 261 memcpy(_caca_scratch_line, s, _caca_width - x); 262 _caca_scratch_line[_caca_width - x] = '\0'; 313 len = _caca_width - x; 314 memcpy(_caca_scratch_line, s, len); 315 _caca_scratch_line[len] = '\0'; 263 316 s = _caca_scratch_line; 264 317 } … … 269 322 case CACA_DRIVER_SLANG: 270 323 SLsmg_gotorc(y, x); 271 SLsmg_write_string((char *)(intptr_t)s); 324 #if defined(OPTIMISE_SLANG_PALETTE) 325 if(_caca_fgisbg) 326 SLsmg_write_string(_caca_empty_line + _caca_width - len); 327 else 328 #endif 329 SLsmg_write_string((char *)(intptr_t)s); 272 330 break; 273 331 #endif … … 367 425 if(_caca_driver == CACA_DRIVER_SLANG) 368 426 { 369 /* See SLang ref., 5.4.4. */ 370 static char *slang_colors[16] = 371 { 372 /* Standard colours */ 373 "black", 374 "blue", 375 "green", 376 "cyan", 377 "red", 378 "magenta", 379 "brown", 380 "lightgray", 381 /* Bright colours */ 382 "gray", 383 "brightblue", 384 "brightgreen", 385 "brightcyan", 386 "brightred", 387 "brightmagenta", 388 "yellow", 389 "white", 390 }; 391 392 int fg, bg; 393 394 for(fg = 0; fg < 16; fg++) 395 for(bg = 0; bg < 16; bg++) 396 { 397 int i = bg + 16 * fg; 398 SLtt_set_color(i, NULL, slang_colors[fg], slang_colors[bg]); 399 } 427 slang_init_palette(); 400 428 401 429 /* Disable alt charset support so that we get all 256 colour pairs */ … … 802 830 } 803 831 832 #if defined(USE_SLANG) 833 834 #if defined(OPTIMISE_SLANG_PALETTE) 835 #endif 836 837 static void slang_init_palette(void) 838 { 839 /* See SLang ref., 5.4.4. */ 840 static char *slang_colors[16] = 841 { 842 /* Standard colours */ 843 "black", 844 "blue", 845 "green", 846 "cyan", 847 "red", 848 "magenta", 849 "brown", 850 "lightgray", 851 /* Bright colours */ 852 "gray", 853 "brightblue", 854 "brightgreen", 855 "brightcyan", 856 "brightred", 857 "brightmagenta", 858 "yellow", 859 "white", 860 }; 861 862 #if !defined(OPTIMISE_SLANG_PALETTE) 863 int fg, bg; 864 865 for(bg = 0; bg < 16; bg++) 866 for(fg = 0; fg < 16; fg++) 867 { 868 int i = fg + 16 * bg; 869 SLtt_set_color(i, NULL, slang_colors[fg], slang_colors[bg]); 870 } 871 #else 872 int i, cur = 0; 873 874 /* 6 colours in hue order */ 875 static const enum caca_color hue_list[] = 876 { 877 CACA_COLOR_RED, 878 CACA_COLOR_BROWN, 879 CACA_COLOR_GREEN, 880 CACA_COLOR_CYAN, 881 CACA_COLOR_BLUE, 882 CACA_COLOR_MAGENTA 883 }; 884 885 #define SETPAIR(_fg, _bg, _n) \ 886 do \ 887 { \ 888 int fg = _fg, bg = _bg, n = _n; \ 889 SLtt_set_color(n, NULL, slang_colors[fg], slang_colors[bg]); \ 890 slang_assoc[fg + 16 * bg] = n; \ 891 } \ 892 while(0); 893 894 /* 895 * XXX: See the NOTES file for what follows 896 */ 897 898 /* black background colour pairs that are needed for the old renderer */ 899 for(i = 1; i < 16; i++) 900 SETPAIR(i, CACA_COLOR_BLACK, cur++); 901 902 /* gray combinations used for grayscale dithering */ 903 SETPAIR(CACA_COLOR_BLACK, CACA_COLOR_DARKGRAY, cur++); 904 SETPAIR(CACA_COLOR_DARKGRAY, CACA_COLOR_LIGHTGRAY, cur++); 905 SETPAIR(CACA_COLOR_LIGHTGRAY, CACA_COLOR_DARKGRAY, cur++); 906 SETPAIR(CACA_COLOR_WHITE, CACA_COLOR_LIGHTGRAY, cur++); 907 SETPAIR(CACA_COLOR_LIGHTGRAY, CACA_COLOR_WHITE, cur++); 908 909 /* white/light, light/dark, lightgray/light, darkgray/dark, dark/black 910 * combinations often used for saturation/value dithering (the two 911 * other possible combinations, lightgray/dark and darkgray/light, are 912 * not considered here) */ 913 for(i = 1; i < 7; i++) 914 { 915 SETPAIR(CACA_COLOR_WHITE, i + 8, cur++); 916 SETPAIR(i + 8, CACA_COLOR_WHITE, cur++); 917 SETPAIR(i, i + 8, cur++); 918 SETPAIR(i + 8, i, cur++); 919 SETPAIR(CACA_COLOR_LIGHTGRAY, i + 8, cur++); 920 SETPAIR(i + 8, CACA_COLOR_LIGHTGRAY, cur++); 921 SETPAIR(CACA_COLOR_DARKGRAY, i, cur++); 922 SETPAIR(i, CACA_COLOR_DARKGRAY, cur++); 923 SETPAIR(CACA_COLOR_BLACK, i, cur++); 924 } 925 926 /* next colour combinations for hue dithering (magenta/blue, blue/green 927 * and so on) */ 928 for(i = 0; i < 6; i++) 929 { 930 SETPAIR(hue_list[i], hue_list[(i + 1) % 6], cur++); 931 SETPAIR(hue_list[(i + 1) % 6], hue_list[i], cur++); 932 SETPAIR(hue_list[i] + 8, hue_list[(i + 1) % 6] + 8, cur++); 933 SETPAIR(hue_list[(i + 1) % 6] + 8, hue_list[i] + 8, cur++); 934 } 935 936 /* next colour combinations for hue/value dithering (blue/lightgreen, 937 * green/lightblue and so on) */ 938 for(i = 0; i < 6; i++) 939 { 940 SETPAIR(hue_list[i], hue_list[(i + 1) % 6] + 8, cur++); 941 SETPAIR(hue_list[(i + 1) % 6], hue_list[i] + 8, cur++); 942 SETPAIR(hue_list[i] + 8, hue_list[(i + 1) % 6], cur++); 943 SETPAIR(hue_list[(i + 1) % 6] + 8, hue_list[i], cur++); 944 } 945 946 /* black on light gray, black on white, white on dark gray, dark gray 947 * on white, white on blue, light gray on blue (chosen arbitrarily) */ 948 SETPAIR(CACA_COLOR_BLACK, CACA_COLOR_LIGHTGRAY, cur++); 949 SETPAIR(CACA_COLOR_BLACK, CACA_COLOR_WHITE, cur++); 950 SETPAIR(CACA_COLOR_WHITE, CACA_COLOR_DARKGRAY, cur++); 951 SETPAIR(CACA_COLOR_DARKGRAY, CACA_COLOR_WHITE, cur++); 952 SETPAIR(CACA_COLOR_WHITE, CACA_COLOR_BLUE, cur++); 953 SETPAIR(CACA_COLOR_LIGHTGRAY, CACA_COLOR_BLUE, cur++); 954 955 /* 956 * Now the possibly emulated pairs 957 */ 958 959 /* light gray on dark colour: emulate with light colour on dark colour 960 * white on dark colour: emulate with light gray on light colour 961 * black on light colour: emulate with dark gray on dark colour 962 * dark gray on light colour: emulate with dark colour on light colour 963 * light colour on dark gray: emulate with dark colour on dark gray 964 * dark colour on light gray: emulate with light colour on light gray 965 * dark colour on white: emulate with light colour on white */ 966 for(i = 1; i < 7; i++) 967 { 968 if(i != CACA_COLOR_BLUE) 969 { 970 SETPAIR(CACA_COLOR_LIGHTGRAY, i, 128 + 971 slang_assoc[i + 8 + 16 * i]); 972 SETPAIR(CACA_COLOR_WHITE, i, 128 + 973 slang_assoc[CACA_COLOR_LIGHTGRAY + 16 * (i + 8)]); 974 } 975 SETPAIR(CACA_COLOR_BLACK, i + 8, 976 128 + slang_assoc[CACA_COLOR_DARKGRAY + 16 * i]); 977 SETPAIR(CACA_COLOR_DARKGRAY, i + 8, 978 128 + slang_assoc[i + 16 * (i + 8)]); 979 SETPAIR(i + 8, CACA_COLOR_DARKGRAY, 980 128 + slang_assoc[i + 16 * CACA_COLOR_DARKGRAY]); 981 SETPAIR(i, CACA_COLOR_LIGHTGRAY, 982 128 + slang_assoc[i + 8 + 16 * CACA_COLOR_LIGHTGRAY]); 983 SETPAIR(i, CACA_COLOR_WHITE, 984 128 + slang_assoc[i + 8 + 16 * CACA_COLOR_WHITE]); 985 } 986 987 /* 120 degree hue pairs can be emulated as well; for instance blue on 988 * red can be emulated using magenta on red, and blue on green using 989 * cyan on green */ 990 for(i = 0; i < 6; i++) 991 { 992 SETPAIR(hue_list[(i + 2) % 6], hue_list[i], 993 128 + slang_assoc[hue_list[(i + 1) % 6] + 16 * hue_list[i]]); 994 SETPAIR(hue_list[(i + 2) % 6] + 8, hue_list[i] + 8, 995 128 + slang_assoc[hue_list[(i + 1) % 6] + 16 * hue_list[i] + 136]); 996 SETPAIR(hue_list[(i + 2) % 6] + 8, hue_list[i], 997 128 + slang_assoc[hue_list[(i + 1) % 6] + 16 * hue_list[i] + 8]); 998 SETPAIR(hue_list[(i + 2) % 6], hue_list[i] + 8, 999 128 + slang_assoc[hue_list[(i + 1) % 6] + 16 * hue_list[i] + 128]); 1000 1001 SETPAIR(hue_list[(i + 4) % 6], hue_list[i], 1002 128 + slang_assoc[hue_list[(i + 5) % 6] + 16 * hue_list[i]]); 1003 SETPAIR(hue_list[(i + 4) % 6] + 8, hue_list[i] + 8, 1004 128 + slang_assoc[hue_list[(i + 5) % 6] + 16 * hue_list[i] + 136]); 1005 SETPAIR(hue_list[(i + 4) % 6] + 8, hue_list[i], 1006 128 + slang_assoc[hue_list[(i + 5) % 6] + 16 * hue_list[i] + 8]); 1007 SETPAIR(hue_list[(i + 4) % 6], hue_list[i] + 8, 1008 128 + slang_assoc[hue_list[(i + 5) % 6] + 16 * hue_list[i] + 128]); 1009 } 1010 1011 /* dark opposite on dark: emulate with dark opposite on black 1012 * light opposite on dark: emulate with light opposite on black 1013 * dark opposite on light: emulate with black on dark 1014 * light opposite on light: emulate with white on light */ 1015 for(i = 0; i < 6; i++) 1016 { 1017 SETPAIR(hue_list[i], hue_list[(i + 3) % 6], 1018 128 + slang_assoc[hue_list[i] + 16 * CACA_COLOR_BLACK]); 1019 SETPAIR(hue_list[i] + 8, hue_list[(i + 3) % 6], 1020 128 + slang_assoc[hue_list[i] + 8 + 16 * CACA_COLOR_BLACK]); 1021 SETPAIR(hue_list[(i + 3) % 6], hue_list[i] + 8, 1022 128 + slang_assoc[CACA_COLOR_BLACK + 16 * hue_list[i]]); 1023 SETPAIR(hue_list[(i + 3) % 6] + 8, hue_list[i] + 8, 1024 128 + slang_assoc[CACA_COLOR_WHITE + 16 * (hue_list[i] + 8)]); 1025 } 1026 #endif 1027 } 1028 #endif /* USE_SLANG */ 1029
Note: See TracChangeset
for help on using the changeset viewer.