Home | History | Annotate | Line # | Download | only in dist
colour.c revision 1.1
      1 /* $Id: colour.c,v 1.1 2011/03/10 09:15:38 jmmv Exp $ */
      2 
      3 /*
      4  * Copyright (c) 2008 Nicholas Marriott <nicm (at) users.sourceforge.net>
      5  *
      6  * Permission to use, copy, modify, and distribute this software for any
      7  * purpose with or without fee is hereby granted, provided that the above
      8  * copyright notice and this permission notice appear in all copies.
      9  *
     10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     14  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
     15  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
     16  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     17  */
     18 
     19 #include <sys/types.h>
     20 
     21 #include <stdlib.h>
     22 #include <string.h>
     23 
     24 #include "tmux.h"
     25 
     26 /*
     27  * Colour to string conversion functions. Bit 8 of the colour means it is one
     28  * of the 256 colour palette.
     29  */
     30 
     31 void
     32 colour_set_fg(struct grid_cell *gc, int c)
     33 {
     34 	if (c & 0x100)
     35 		gc->flags |= GRID_FLAG_FG256;
     36 	gc->fg = c;
     37 }
     38 
     39 void
     40 colour_set_bg(struct grid_cell *gc, int c)
     41 {
     42 	if (c & 0x100)
     43 		gc->flags |= GRID_FLAG_BG256;
     44 	gc->bg = c;
     45 }
     46 
     47 const char *
     48 colour_tostring(int c)
     49 {
     50 	static char	s[32];
     51 
     52 	if (c & 0x100) {
     53 		xsnprintf(s, sizeof s, "colour%u", c & ~0x100);
     54 		return (s);
     55 	}
     56 
     57 	switch (c) {
     58 	case 0:
     59 		return ("black");
     60 	case 1:
     61 		return ("red");
     62 	case 2:
     63 		return ("green");
     64 	case 3:
     65 		return ("yellow");
     66 	case 4:
     67 		return ("blue");
     68 	case 5:
     69 		return ("magenta");
     70 	case 6:
     71 		return ("cyan");
     72 	case 7:
     73 		return ("white");
     74 	case 8:
     75 		return ("default");
     76 	}
     77 	return (NULL);
     78 }
     79 
     80 int
     81 colour_fromstring(const char *s)
     82 {
     83 	const char	*errstr;
     84 	int		 n;
     85 
     86 	if (strncasecmp(s, "colour", (sizeof "colour") - 1) == 0) {
     87 		n = strtonum(s + (sizeof "colour") - 1, 0, 255, &errstr);
     88 		if (errstr != NULL)
     89 			return (-1);
     90 		return (n | 0x100);
     91 	}
     92 
     93 	if (strcasecmp(s, "black") == 0 || (s[0] == '0' && s[1] == '\0'))
     94 		return (0);
     95 	if (strcasecmp(s, "red") == 0 || (s[0] == '1' && s[1] == '\0'))
     96 		return (1);
     97 	if (strcasecmp(s, "green") == 0 || (s[0] == '2' && s[1] == '\0'))
     98 		return (2);
     99 	if (strcasecmp(s, "yellow") == 0 || (s[0] == '3' && s[1] == '\0'))
    100 		return (3);
    101 	if (strcasecmp(s, "blue") == 0 || (s[0] == '4' && s[1] == '\0'))
    102 		return (4);
    103 	if (strcasecmp(s, "magenta") == 0 || (s[0] == '5' && s[1] == '\0'))
    104 		return (5);
    105 	if (strcasecmp(s, "cyan") == 0 || (s[0] == '6' && s[1] == '\0'))
    106 		return (6);
    107 	if (strcasecmp(s, "white") == 0 || (s[0] == '7' && s[1] == '\0'))
    108 		return (7);
    109 	if (strcasecmp(s, "default") == 0 || (s[0] == '8' && s[1] == '\0'))
    110 		return (8);
    111 	return (-1);
    112 }
    113 
    114 u_char
    115 colour_256to16(u_char c)
    116 {
    117 	static const u_char table[256] = {
    118 		 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    119 		 0,  4,  4,  4, 12, 12,  2,  6,  4,  4, 12, 12,  2,  2,  6,  4,
    120 		12, 12,  2,  2,  2,  6, 12, 12, 10, 10, 10, 10, 14, 12, 10, 10,
    121 		10, 10, 10, 14,  1,  5,  4,  4, 12, 12,  3,  8,  4,  4, 12, 12,
    122 		 2,  2,  6,  4, 12, 12,  2,  2,  2,  6, 12, 12, 10, 10, 10, 10,
    123 		14, 12, 10, 10, 10, 10, 10, 14,  1,  1,  5,  4, 12, 12,  1,  1,
    124 		 5,  4, 12, 12,  3,  3,  8,  4, 12, 12,  2,  2,  2,  6, 12, 12,
    125 		10, 10, 10, 10, 14, 12, 10, 10, 10, 10, 10, 14,  1,  1,  1,  5,
    126 		12, 12,  1,  1,  1,  5, 12, 12,  1,  1,  1,  5, 12, 12,  3,  3,
    127 		 3,  7, 12, 12, 10, 10, 10, 10, 14, 12, 10, 10, 10, 10, 10, 14,
    128 		 9,  9,  9,  9, 13, 12,  9,  9,  9,  9, 13, 12,  9,  9,  9,  9,
    129 		13, 12,  9,  9,  9,  9, 13, 12, 11, 11, 11, 11,  7, 12, 10, 10,
    130 		10, 10, 10, 14,  9,  9,  9,  9,  9, 13,  9,  9,  9,  9,  9, 13,
    131 		 9,  9,  9,  9,  9, 13,  9,  9,  9,  9,  9, 13,  9,  9,  9,  9,
    132 		 9, 13, 11, 11, 11, 11, 11, 15,  0,  0,  0,  0,  0,  0,  8,  8,
    133 		 8,  8,  8,  8,  7,  7,  7,  7,  7,  7, 15, 15, 15, 15, 15, 15
    134 	};
    135 
    136 	return (table[c]);
    137 }
    138 
    139 u_char
    140 colour_256to88(u_char c)
    141 {
    142 	static const u_char table[256] = {
    143 		 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
    144 		16, 17, 17, 18, 18, 19, 20, 21, 21, 22, 22, 23, 20, 21, 21, 22,
    145 		22, 23, 24, 25, 25, 26, 26, 27, 24, 25, 25, 26, 26, 27, 28, 29,
    146 		29, 30, 30, 31, 32, 33, 33, 34, 34, 35, 36, 37, 37, 38, 38, 39,
    147 		36, 37, 37, 38, 38, 39, 40, 41, 41, 42, 42, 43, 40, 41, 41, 42,
    148 		42, 43, 44, 45, 45, 46, 46, 47, 32, 33, 33, 34, 34, 35, 36, 37,
    149 		37, 38, 38, 39, 36, 37, 37, 38, 38, 39, 40, 41, 41, 42, 42, 43,
    150 		40, 41, 41, 42, 42, 43, 44, 45, 45, 46, 46, 47, 48, 49, 49, 50,
    151 		50, 51, 52, 53, 53, 54, 54, 55, 52, 53, 53, 54, 54, 55, 56, 57,
    152 		57, 58, 58, 59, 56, 57, 57, 58, 58, 59, 60, 61, 61, 62, 62, 63,
    153 		48, 49, 49, 50, 50, 51, 52, 53, 53, 54, 54, 55, 52, 53, 53, 54,
    154 		54, 55, 56, 57, 57, 58, 58, 59, 56, 57, 57, 58, 58, 59, 60, 61,
    155 		61, 62, 62, 63, 64, 65, 65, 66, 66, 67, 68, 69, 69, 70, 70, 71,
    156 		68, 69, 69, 70, 70, 71, 72, 73, 73, 74, 74, 75, 72, 73, 73, 74,
    157 		74, 75, 76, 77, 77, 78, 78, 79,  0,  0, 80, 80, 80, 81, 81, 81,
    158 		82, 82, 82, 83, 83, 83, 84, 84, 84, 85, 85, 85, 86, 86, 86, 87
    159 	};
    160 
    161 	return (table[c]);
    162 }
    163