1 #ifndef _global_h
2 #	include "global.h"
3 #endif
4 #ifndef _rgb_h
5 #	include "rgb.h"
6 #endif
7 
8 #define	RGB_FILE		"rgb.txt"
9 
SetColor(const char * name)10 int RGBColor::SetColor( const char *name ) {
11 FILE	*fp;
12 char	buffer[80];
13 char	*bp;
14 int	name_len = strlen(name);
15 
16 	if (SetInternalColor(name))		return 0;
17 
18 	fp = fopen( RGB_FILE, "r" );
19 	if (!fp) {
20 		fp = fopen( "\\borlandc\\bgi\\" RGB_FILE, "r" );
21 		if (!fp) {
22 			fp = fopen( "\\" RGB_FILE, "r" );
23 		}
24 	}
25 	if (!fp) {
26 		fprintf( stderr, "missing colorfile '%s'\n", RGB_FILE );
27 		return -1;
28 	}
29 
30 	while( (bp=fgets( buffer, sizeof(buffer), fp))!=0 ) {
31 		if ( (buffer[24+name_len]=='\n')
32 			&& (!strncmp( buffer+24, name, name_len )) )	break;	// gesucher Name ?
33 	}
34 	fclose(fp);
35 
36 	if (bp) {
37 		// BINGO
38 		if (sscanf(buffer, "%d %d %d", &red, &green, &blue)==3)	return 0;
39 		fprintf( stderr, "bad syntax for colorname '%s'\n", name );
40 		fprintf( stderr, "%s\n", buffer );
41 		return -1;
42 	}
43 
44 	fprintf( stderr, "colorname '%s' not found.\n", name );
45 	return -1;
46 }
47 
48 
49 typedef struct {
50 	const char		*name;
51 	unsigned short	r,g,b;
52 } RGBValue;
53 
54 static RGBValue coltab[] = {
55 { "Brown", 165, 42, 42 },
56 { "DarkGoldenrod", 184, 134, 11 },
57 { "DarkGoldenrod1", 255, 185, 15 },
58 { "DarkGreen", 0, 86, 45 },
59 { "DarkViolet", 148, 0, 211 },
60 { "DeepSkyBlue", 0, 191, 255 },
61 { "HotPink3", 205, 96, 144 },
62 { "LightSalmon", 255, 160, 122 },
63 { "LightSalmon2", 238, 149, 114 },
64 { "LightSteelBlue", 124, 152, 211 },
65 { "LightSteelBlue3", 162, 181, 205 },
66 { "LightSteelBlue4", 110, 123, 139 },
67 { "LimeGreen", 0, 175, 20 },
68 { "Maroon", 143, 0, 82 },
69 { "MediumAquamarine", 0, 147, 143 },
70 { "MediumForestGreen", 50, 129, 75 },
71 { "MidnightBlue", 47, 47, 100 },
72 { "Navy", 35, 35, 117 },
73 { "PaleTurquoise", 175, 238, 238 },
74 { "RosyBrown", 188, 143, 143 },
75 { "SeaGreen", 82, 149, 132 },
76 { "SteelBlue", 84, 112, 170 },
77 { "Tan", 222, 184, 135 },
78 { "White", 255, 255, 255 },
79 { "bisque", 255, 228, 196 },
80 { "black", 0, 0, 0 },
81 { "blue", 0, 0, 255 },
82 { "brown", 165, 42, 42 },
83 { "brown4", 139, 35, 35 },
84 { "coral2", 238, 106, 80 },
85 { "coral3", 205, 91, 69 },
86 { "coral4", 139, 62, 47 },
87 { "cyan", 0, 255, 255 },
88 { "gold1", 255, 215, 0 },
89 { "green4", 0, 139, 0 },
90 { "grey", 126, 126, 126 },
91 { "ivory", 255, 255, 240 },
92 { "orange", 255, 135, 0 },
93 { "red", 255, 0, 0 },
94 { "red3", 205, 0, 0 },
95 { "red4", 139, 0, 0 },
96 { "white", 255, 255, 255 },
97 { "white", 245, 245, 245 },
98 { "yellow", 255, 255, 0 },
99 { "yellow1", 255, 255, 0 },
100 { 0, 0, 0, 0 }			// end coltab
101 };
102 
SetInternalColor(const char * flag_name)103 int RGBColor::SetInternalColor( const char *flag_name ) {
104 	if (!strncmp(flag_name,"rgb:",4)||!strncmp(flag_name,"rgb:",4)) {
105 		if (sscanf(flag_name+4,"%x/%x/%x",&red,&green,&blue)==3) {
106 			switch (strlen(flag_name)) {
107 #if (0)
108 			case 9:						/* 6+3*1 */
109 				red   |= (red<<4);
110 				green |= (green<<4);
111 				blue  |= (blue<<4);
112 			case 12:						/* 6+3*2 */
113 				red   |= (red<<8);
114 				green |= (green<<8);
115 				blue  |= (blue<<8);
116 			case 18:						/* 6+3*4 */
117 #else
118 	// The class was actually meant for DOS-purposes and doesn't store more
119 	// than the 8-Bit resolution of the rgb-values.
120 			case 9:						/* 6+3*1 */
121 				red   |= (red<<4);
122 				green |= (green<<4);
123 				blue  |= (blue<<4);
124 				break;
125 			case 18:						/* 6+3*4 */
126 				red   >>= 8;
127 				green >>= 8;
128 				blue  >>= 8;
129 				break;
130 			case 12:						/* 6+3*2 */
131 #endif
132 				return 1;
133 			}
134 		}
135 		printf( "can't convert color '%s'\n", flag_name );
136 		return 0;
137 	}
138 	for (unsigned i=0;i<sizeof(coltab)/sizeof(RGBValue)-1;i++) {
139 		if (!strcmp(flag_name,coltab[i].name)) {
140 			red   = coltab[i].r;
141 			green = coltab[i].g;
142 			blue  = coltab[i].b;
143 			return 1;
144 		}
145 	}
146 	return 0;
147 }
148