File: t_color.c

package info (click to toggle)
plotutils 2.4.1-15
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 11,072 kB
  • ctags: 6,952
  • sloc: ansic: 76,305; cpp: 12,402; sh: 8,475; yacc: 2,604; makefile: 894; lex: 144
file content (125 lines) | stat: -rw-r--r-- 3,373 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/* For TekPlotter objects, setting the pen color or background color has no
   effect unless the plotter is using the Tektronix emulation of MS-DOS
   kermit.  If so, we compute a quantized color and output the appropriate
   ANSI escape sequence, if the color is different from the ANSI.SYS color
   the emulation is currently using.

   When the TekPlotter is created, the current ANSI.SYS pen and bg colors
   are set to -1 (see t_defplot.c).  That's a nonsensical value, equivalent
   to `unknown'. */

#include "sys-defines.h"
#include "extern.h"

#define ONEBYTE (0xff)

/* forward references */
static int _kermit_pseudocolor ____P((int red, int green, int blue));

void
#ifdef _HAVE_PROTOS
_t_set_pen_color(S___(Plotter *_plotter))
#else
_t_set_pen_color(S___(_plotter))
     S___(Plotter *_plotter;)
#endif
{
  if (_plotter->tek_display_type == D_KERMIT)
    {
      int new_kermit_fgcolor;

      new_kermit_fgcolor = 
	_kermit_pseudocolor (_plotter->drawstate->fgcolor.red, 
			     _plotter->drawstate->fgcolor.green, 
			     _plotter->drawstate->fgcolor.blue);
      if (new_kermit_fgcolor != _plotter->tek_kermit_fgcolor)
	{
	  _write_string (_plotter->data, 
				  _kermit_fgcolor_escapes[new_kermit_fgcolor]);
	  _plotter->tek_kermit_fgcolor = new_kermit_fgcolor;
	}
    }
}  

void
#ifdef _HAVE_PROTOS
_t_set_bg_color(S___(Plotter *_plotter))
#else
_t_set_bg_color(S___(_plotter))
     S___(Plotter *_plotter;)
#endif
{
  if (_plotter->tek_display_type == D_KERMIT)
    {
      int new_kermit_bgcolor;

      new_kermit_bgcolor = 
	_kermit_pseudocolor (_plotter->drawstate->bgcolor.red, 
			     _plotter->drawstate->bgcolor.green, 
			     _plotter->drawstate->bgcolor.blue);
      if (new_kermit_bgcolor != _plotter->tek_kermit_bgcolor)
	{
	  _write_string (_plotter->data,
				  _kermit_bgcolor_escapes[new_kermit_bgcolor]);
	  _plotter->tek_kermit_bgcolor = new_kermit_bgcolor;
	}
    }
}  

/* _kermit_pseudocolor quantizes to one of kermit's native 16 colors.
   (They provide a [rather strange] partition of the color cube; see
   t_color2.c.) */

/* find closest known point within the RGB color cube, using Euclidean
   distance as our metric */
static int
#ifdef _HAVE_PROTOS
_kermit_pseudocolor (int red, int green, int blue)
#else
_kermit_pseudocolor (red, green, blue)
     int red, green, blue;
#endif
{
  unsigned long int difference = INT_MAX;
  int i;
  int best = 0;
  
  /* reduce to 24 bits */
  red = (red >> 8) & ONEBYTE;
  green = (green >> 8) & ONEBYTE;
  blue = (blue >> 8) & ONEBYTE;

  for (i = 0; i < KERMIT_NUM_STD_COLORS; i++)
    {
      unsigned long int newdifference;
      
      if (_kermit_stdcolors[i].red == 0xff
	  && _kermit_stdcolors[i].green == 0xff
	  && _kermit_stdcolors[i].blue == 0xff)
	/* white is a possible quantization only for white itself (our
           convention) */
	{
	  if (red == 0xff && green == 0xff && blue == 0xff)
	    {
	      difference = 0;
	      best = i;
	    }
	  continue;
	}

      newdifference = (((_kermit_stdcolors[i].red - red) 
			* (_kermit_stdcolors[i].red - red))
		       + ((_kermit_stdcolors[i].green - green) 
			  * (_kermit_stdcolors[i].green - green))
		       + ((_kermit_stdcolors[i].blue - blue) 
			  * (_kermit_stdcolors[i].blue - blue)));
      
      if (newdifference < difference)
	{
	  difference = newdifference;
	  best = i;
	}
    }
  return best;
}