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